blob: 12bb3ed6df8c5e084ebe1fc8bbe53a646da07c71 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/macros.h"
#include "base/run_loop.h"
#include "chrome/browser/extensions/extension_uninstall_dialog.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/test/test_utils.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_builder.h"
#include "extensions/common/value_builder.h"
namespace {
scoped_refptr<extensions::Extension> BuildTestExtension() {
return extensions::ExtensionBuilder()
.SetManifest(extensions::DictionaryBuilder()
.Set("name", "foo")
.Set("version", "1.0")
.Build())
.Build();
}
class TestExtensionUninstallDialogDelegate
: public extensions::ExtensionUninstallDialog::Delegate {
public:
explicit TestExtensionUninstallDialogDelegate(
const base::Closure& quit_closure)
: quit_closure_(quit_closure), canceled_(false) {}
~TestExtensionUninstallDialogDelegate() override {}
bool canceled() { return canceled_; }
private:
void OnExtensionUninstallDialogClosed(bool did_start_uninstall,
const base::string16& error) override {
canceled_ = !did_start_uninstall;
quit_closure_.Run();
}
base::Closure quit_closure_;
bool canceled_;
DISALLOW_COPY_AND_ASSIGN(TestExtensionUninstallDialogDelegate);
};
} // namespace
typedef InProcessBrowserTest ExtensionUninstallDialogViewBrowserTest;
// Test that ExtensionUninstallDialog cancels the uninstall if the aura::Window
// which is passed to ExtensionUninstallDialog::Create() is destroyed.
IN_PROC_BROWSER_TEST_F(ExtensionUninstallDialogViewBrowserTest,
TrackParentWindowDestruction) {
// Create a second browser to prevent the app from exiting when the browser is
// closed.
CreateBrowser(browser()->profile());
scoped_refptr<extensions::Extension> extension(BuildTestExtension());
base::RunLoop run_loop;
TestExtensionUninstallDialogDelegate delegate(run_loop.QuitClosure());
scoped_ptr<extensions::ExtensionUninstallDialog> dialog(
extensions::ExtensionUninstallDialog::Create(
browser()->profile(), browser()->window()->GetNativeWindow(),
&delegate));
browser()->window()->Close();
content::RunAllPendingInMessageLoop();
dialog->ConfirmUninstall(extension.get(),
extensions::UNINSTALL_REASON_FOR_TESTING,
extensions::UNINSTALL_SOURCE_FOR_TESTING);
run_loop.Run();
EXPECT_TRUE(delegate.canceled());
}