diff options
27 files changed, 264 insertions, 284 deletions
diff --git a/chrome/browser/extensions/api/management/management_api_browsertest.cc b/chrome/browser/extensions/api/management/management_api_browsertest.cc index 26d7a19..22e2f27 100644 --- a/chrome/browser/extensions/api/management/management_api_browsertest.cc +++ b/chrome/browser/extensions/api/management/management_api_browsertest.cc @@ -8,7 +8,6 @@ #include "base/strings/stringprintf.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/extensions/extension_function_test_utils.h" -#include "chrome/browser/extensions/extension_install_prompt.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" @@ -19,6 +18,7 @@ #include "content/public/test/test_utils.h" #include "extensions/browser/api/management/management_api.h" #include "extensions/browser/api/management/management_api_constants.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_host.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_system.h" @@ -110,51 +110,6 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementApiBrowserTest, } IN_PROC_BROWSER_TEST_F(ExtensionManagementApiBrowserTest, - UninstallWithConfirmDialog) { - ExtensionService* service = ExtensionSystem::Get(browser()->profile())-> - extension_service(); - - // Install an extension. - const Extension* extension = InstallExtension( - test_data_dir_.AppendASCII("api_test/management/enabled_extension"), 1); - ASSERT_TRUE(extension); - - const std::string id = extension->id(); - - scoped_refptr<Extension> empty_extension(test_util::CreateEmptyExtension()); - // Uninstall, then cancel via the confirm dialog. - scoped_refptr<ManagementUninstallFunction> uninstall_function( - new ManagementUninstallFunction()); - uninstall_function->set_extension(empty_extension.get()); - uninstall_function->set_user_gesture(true); - ManagementUninstallFunction::SetAutoConfirmForTest(false); - - EXPECT_TRUE(MatchPattern( - util::RunFunctionAndReturnError( - uninstall_function.get(), - base::StringPrintf("[\"%s\", {\"showConfirmDialog\": true}]", - id.c_str()), - browser()), - keys::kUninstallCanceledError)); - - // Make sure the extension wasn't uninstalled. - EXPECT_TRUE(service->GetExtensionById(id, false) != NULL); - - // Uninstall, then accept via the confirm dialog. - uninstall_function = new ManagementUninstallFunction(); - uninstall_function->set_extension(empty_extension.get()); - ManagementUninstallFunction::SetAutoConfirmForTest(true); - uninstall_function->set_user_gesture(true); - util::RunFunctionAndReturnSingleResult( - uninstall_function.get(), - base::StringPrintf("[\"%s\", {\"showConfirmDialog\": true}]", id.c_str()), - browser()); - - // Make sure the extension was uninstalled. - EXPECT_TRUE(service->GetExtensionById(id, false) == NULL); -} - -IN_PROC_BROWSER_TEST_F(ExtensionManagementApiBrowserTest, CreateAppShortcutConfirmDialog) { const Extension* app = InstallExtension( test_data_dir_.AppendASCII("api_test/management/packaged_app"), 1); @@ -299,31 +254,40 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementApiEscalationTest, // Expect an error about no gesture. SetEnabled(true, false, keys::kGestureNeededForEscalationError); - // Expect an error that user cancelled the dialog. - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::CANCEL; - SetEnabled(true, true, keys::kUserDidNotReEnableError); - - // This should succeed when user accepts dialog. We must wait for the process - // to connect *and* for the channel to finish initializing before trying to - // crash it. (NOTIFICATION_RENDERER_PROCESS_CREATED does not wait for the - // latter and can cause KillProcess to fail on Windows.) - content::WindowedNotificationObserver observer( - extensions::NOTIFICATION_EXTENSION_HOST_CREATED, - content::NotificationService::AllSources()); - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; - SetEnabled(true, true, std::string()); - observer.Wait(); - - // Crash the extension. Mock a reload by disabling and then enabling. The - // extension should be reloaded and enabled. - ASSERT_TRUE(CrashEnabledExtension(kId)); - SetEnabled(false, true, std::string()); - SetEnabled(true, true, std::string()); - const Extension* extension = ExtensionSystem::Get(browser()->profile()) - ->extension_service()->GetExtensionById(kId, false); - EXPECT_TRUE(extension); + { + // Expect an error that user cancelled the dialog. + ScopedTestDialogAutoConfirm auto_confirm( + ScopedTestDialogAutoConfirm::CANCEL); + SetEnabled(true, true, keys::kUserDidNotReEnableError); + } + + { + // This should succeed when user accepts dialog. We must wait for the + // process to connect *and* for the channel to finish initializing before + // trying to crash it. (NOTIFICATION_RENDERER_PROCESS_CREATED does not wait + // for the latter and can cause KillProcess to fail on Windows.) + content::WindowedNotificationObserver observer( + extensions::NOTIFICATION_EXTENSION_HOST_CREATED, + content::NotificationService::AllSources()); + ScopedTestDialogAutoConfirm auto_confirm( + ScopedTestDialogAutoConfirm::ACCEPT); + SetEnabled(true, true, std::string()); + observer.Wait(); + } + + { + // Crash the extension. Mock a reload by disabling and then enabling. The + // extension should be reloaded and enabled. + ScopedTestDialogAutoConfirm auto_confirm( + ScopedTestDialogAutoConfirm::ACCEPT); + ASSERT_TRUE(CrashEnabledExtension(kId)); + SetEnabled(false, true, std::string()); + SetEnabled(true, true, std::string()); + const Extension* extension = ExtensionSystem::Get(browser()->profile()) + ->extension_service() + ->GetExtensionById(kId, false); + EXPECT_TRUE(extension); + } } } // namespace extensions diff --git a/chrome/browser/extensions/api/management/management_api_unittest.cc b/chrome/browser/extensions/api/management/management_api_unittest.cc index e783a7f..4d0a4d9 100644 --- a/chrome/browser/extensions/api/management/management_api_unittest.cc +++ b/chrome/browser/extensions/api/management/management_api_unittest.cc @@ -13,6 +13,7 @@ #include "extensions/browser/api/management/management_api.h" #include "extensions/browser/api/management/management_api_constants.h" #include "extensions/browser/event_router_factory.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" @@ -156,60 +157,70 @@ TEST_F(ManagementApiUnitTest, ManagementUninstall) { uninstall_args.AppendString(extension->id()); // Auto-accept any uninstalls. - ManagementUninstallFunctionBase::SetAutoConfirmForTest(true); - - // Uninstall requires a user gesture, so this should fail. - scoped_refptr<UIThreadExtensionFunction> function( - new ManagementUninstallFunction()); - EXPECT_FALSE(RunFunction(function, uninstall_args)); - EXPECT_EQ(std::string(constants::kGestureNeededForUninstallError), - function->GetError()); - - ExtensionFunction::ScopedUserGestureForTests scoped_user_gesture; - - function = new ManagementUninstallFunction(); - EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id)); - EXPECT_TRUE(RunFunction(function, uninstall_args)) << function->GetError(); - // The extension should be uninstalled. - EXPECT_FALSE(registry()->GetExtensionById( - extension_id, ExtensionRegistry::EVERYTHING)); + { + ScopedTestDialogAutoConfirm auto_confirm( + ScopedTestDialogAutoConfirm::ACCEPT); + + // Uninstall requires a user gesture, so this should fail. + scoped_refptr<UIThreadExtensionFunction> function( + new ManagementUninstallFunction()); + EXPECT_FALSE(RunFunction(function, uninstall_args)); + EXPECT_EQ(std::string(constants::kGestureNeededForUninstallError), + function->GetError()); + + ExtensionFunction::ScopedUserGestureForTests scoped_user_gesture; + + function = new ManagementUninstallFunction(); + EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id)); + EXPECT_TRUE(RunFunction(function, uninstall_args)) << function->GetError(); + // The extension should be uninstalled. + EXPECT_FALSE(registry()->GetExtensionById(extension_id, + ExtensionRegistry::EVERYTHING)); + } // Install the extension again, and try uninstalling, auto-canceling the // dialog. - service()->AddExtension(extension.get()); - function = new ManagementUninstallFunction(); - ManagementUninstallFunctionBase::SetAutoConfirmForTest(false); - EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id)); - EXPECT_FALSE(RunFunction(function, uninstall_args)); - // The uninstall should have failed. - EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id)); - EXPECT_EQ(ErrorUtils::FormatErrorMessage(constants::kUninstallCanceledError, - extension_id), - function->GetError()); - - // Try again, using showConfirmDialog: false. - scoped_ptr<base::DictionaryValue> options(new base::DictionaryValue()); - options->SetBoolean("showConfirmDialog", false); - uninstall_args.Append(options.release()); - function = new ManagementUninstallFunction(); - EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id)); - EXPECT_FALSE(RunFunction(function, uninstall_args)); - // This should still fail, since extensions can only suppress the dialog for - // uninstalling themselves. - EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id)); - EXPECT_EQ(ErrorUtils::FormatErrorMessage(constants::kUninstallCanceledError, - extension_id), - function->GetError()); - - // If we try uninstall the extension itself, the uninstall should succeed - // (even though we auto-cancel any dialog), because the dialog is never shown. - uninstall_args.Remove(0u, nullptr); - function = new ManagementUninstallSelfFunction(); - function->set_extension(extension); - EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id)); - EXPECT_TRUE(RunFunction(function, uninstall_args)) << function->GetError(); - EXPECT_FALSE(registry()->GetExtensionById( - extension_id, ExtensionRegistry::EVERYTHING)); + { + ScopedTestDialogAutoConfirm auto_confirm( + ScopedTestDialogAutoConfirm::CANCEL); + ExtensionFunction::ScopedUserGestureForTests scoped_user_gesture; + + service()->AddExtension(extension.get()); + scoped_refptr<UIThreadExtensionFunction> function = + new ManagementUninstallFunction(); + EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id)); + EXPECT_FALSE(RunFunction(function, uninstall_args)); + // The uninstall should have failed. + EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id)); + EXPECT_EQ(ErrorUtils::FormatErrorMessage(constants::kUninstallCanceledError, + extension_id), + function->GetError()); + + // Try again, using showConfirmDialog: false. + scoped_ptr<base::DictionaryValue> options(new base::DictionaryValue()); + options->SetBoolean("showConfirmDialog", false); + uninstall_args.Append(options.release()); + function = new ManagementUninstallFunction(); + EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id)); + EXPECT_FALSE(RunFunction(function, uninstall_args)); + // This should still fail, since extensions can only suppress the dialog for + // uninstalling themselves. + EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id)); + EXPECT_EQ(ErrorUtils::FormatErrorMessage(constants::kUninstallCanceledError, + extension_id), + function->GetError()); + + // If we try uninstall the extension itself, the uninstall should succeed + // (even though we auto-cancel any dialog), because the dialog is never + // shown. + uninstall_args.Remove(0u, nullptr); + function = new ManagementUninstallSelfFunction(); + function->set_extension(extension); + EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_id)); + EXPECT_TRUE(RunFunction(function, uninstall_args)) << function->GetError(); + EXPECT_FALSE(registry()->GetExtensionById(extension_id, + ExtensionRegistry::EVERYTHING)); + } } } // namespace extensions diff --git a/chrome/browser/extensions/api/management/management_apitest.cc b/chrome/browser/extensions/api/management/management_apitest.cc index d64a32e..91d0b66b 100644 --- a/chrome/browser/extensions/api/management/management_apitest.cc +++ b/chrome/browser/extensions/api/management/management_apitest.cc @@ -19,6 +19,7 @@ #include "chrome/common/extensions/extension_constants.h" #include "content/public/test/test_utils.h" #include "extensions/browser/api/management/management_api.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_system.h" #include "extensions/browser/test_management_policy.h" #include "extensions/common/manifest.h" @@ -128,7 +129,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, NoPermission) { IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, MAYBE_Uninstall) { LoadExtensions(); // Confirmation dialog will be shown for uninstallations except for self. - extensions::ManagementUninstallFunction::SetAutoConfirmForTest(true); + extensions::ScopedTestDialogAutoConfirm auto_confirm( + extensions::ScopedTestDialogAutoConfirm::ACCEPT); ASSERT_TRUE(RunExtensionSubtest("management/test", "uninstall.html")); } @@ -158,7 +160,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, GenerateAppForLink) { IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, MAYBE_ManagementPolicyAllowed) { LoadExtensions(); - extensions::ManagementUninstallFunction::SetAutoConfirmForTest(true); + extensions::ScopedTestDialogAutoConfirm auto_confirm( + extensions::ScopedTestDialogAutoConfirm::ACCEPT); ExtensionService* service = extensions::ExtensionSystem::Get( browser()->profile())->extension_service(); EXPECT_TRUE(service->GetExtensionById(extension_ids_["enabled_extension"], diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc index 245d053..a304a04 100644 --- a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc +++ b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc @@ -26,6 +26,7 @@ #include "content/public/browser/notification_registrar.h" #include "content/public/test/browser_test_utils.h" #include "extensions/browser/api/management/management_api.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_system.h" #include "extensions/browser/install/extension_install_ui.h" #include "gpu/config/gpu_feature_type.h" @@ -117,8 +118,8 @@ class ExtensionWebstorePrivateApiTest : public ExtensionApiTest { void SetUpOnMainThread() override { ExtensionApiTest::SetUpOnMainThread(); - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; + auto_confirm_install_.reset( + new ScopedTestDialogAutoConfirm(ScopedTestDialogAutoConfirm::ACCEPT)); ASSERT_TRUE(webstore_install_dir_.CreateUniqueTempDir()); webstore_install_dir_copy_ = webstore_install_dir_.path(); @@ -148,8 +149,6 @@ class ExtensionWebstorePrivateApiTest : public ExtensionApiTest { // Navigates to |page| and runs the Extension API test there. Any downloads // of extensions will return the contents of |crx_file|. bool RunInstallTest(const std::string& page, const std::string& crx_file) { - // Auto-confirm the uninstallation dialog. - ManagementUninstallFunction::SetAutoConfirmForTest(true); #if defined(OS_WIN) && !defined(NDEBUG) // See http://crbug.com/177163 for details. return true; @@ -176,6 +175,10 @@ class ExtensionWebstorePrivateApiTest : public ExtensionApiTest { // WebstoreInstaller needs a reference to a FilePath when setting the download // directory for testing. base::FilePath webstore_install_dir_copy_; + + scoped_ptr<ScopedTestDialogAutoConfirm> auto_confirm_install_; + + DISALLOW_COPY_AND_ASSIGN(ExtensionWebstorePrivateApiTest); }; // Test cases for webstore origin frame blocking. @@ -238,8 +241,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, InstallLocalized) { // Now test the case where the user cancels the confirmation dialog. IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, InstallCancelled) { - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::CANCEL; + ScopedTestDialogAutoConfirm auto_cancel(ScopedTestDialogAutoConfirm::CANCEL); ASSERT_TRUE(RunInstallTest("cancelled.html", "extension.crx")); } diff --git a/chrome/browser/extensions/extension_disabled_ui_browsertest.cc b/chrome/browser/extensions/extension_disabled_ui_browsertest.cc index 34eaa7c..c35d8b4 100644 --- a/chrome/browser/extensions/extension_disabled_ui_browsertest.cc +++ b/chrome/browser/extensions/extension_disabled_ui_browsertest.cc @@ -19,6 +19,7 @@ #include "chrome/common/chrome_switches.h" #include "content/public/browser/browser_thread.h" #include "content/public/test/test_utils.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" @@ -147,8 +148,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionDisabledGlobalErrorTest, Uninstall) { // Tests uninstalling a disabled extension with an uninstall dialog. IN_PROC_BROWSER_TEST_F(ExtensionDisabledGlobalErrorTest, UninstallFromDialog) { - extensions::ExtensionUninstallDialog::ScopedAutoConfirm auto_confirm( - extensions::ExtensionUninstallDialog::ACCEPT); + extensions::ScopedTestDialogAutoConfirm auto_confirm( + extensions::ScopedTestDialogAutoConfirm::ACCEPT); const Extension* extension = InstallAndUpdateIncreasingPermissionsExtension(); ASSERT_TRUE(extension); std::string extension_id = extension->id(); diff --git a/chrome/browser/extensions/extension_install_prompt.cc b/chrome/browser/extensions/extension_install_prompt.cc index 6ad4358..5599116 100644 --- a/chrome/browser/extensions/extension_install_prompt.cc +++ b/chrome/browser/extensions/extension_install_prompt.cc @@ -24,6 +24,7 @@ #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "content/public/browser/web_contents.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_util.h" #include "extensions/browser/image_loader.h" @@ -154,19 +155,22 @@ SkBitmap GetDefaultIconBitmapForMaxScaleFactor(bool is_app) { // If auto confirm is enabled then posts a task to proceed with or cancel the // install and returns true. Otherwise returns false. bool AutoConfirmPrompt(ExtensionInstallPrompt::Delegate* delegate) { - switch (ExtensionInstallPrompt::g_auto_confirm_for_tests) { - case ExtensionInstallPrompt::NONE: + switch (extensions::ScopedTestDialogAutoConfirm::GetAutoConfirmValue()) { + case extensions::ScopedTestDialogAutoConfirm::NONE: + LOG(WARNING) << "None!"; return false; // We use PostTask instead of calling the delegate directly here, because in // the real implementations it's highly likely the message loop will be // pumping a few times before the user clicks accept or cancel. - case ExtensionInstallPrompt::ACCEPT: + case extensions::ScopedTestDialogAutoConfirm::ACCEPT: + LOG(WARNING) << "Proceeding!"; base::MessageLoop::current()->PostTask( FROM_HERE, base::Bind(&ExtensionInstallPrompt::Delegate::InstallUIProceed, base::Unretained(delegate))); return true; - case ExtensionInstallPrompt::CANCEL: + case extensions::ScopedTestDialogAutoConfirm::CANCEL: + LOG(WARNING) << "Canceling!"; base::MessageLoop::current()->PostTask( FROM_HERE, base::Bind(&ExtensionInstallPrompt::Delegate::InstallUIAbort, @@ -194,10 +198,6 @@ ExtensionInstallPrompt::Prompt::InstallPromptPermissions:: ~InstallPromptPermissions() { } -// static -ExtensionInstallPrompt::AutoConfirmForTests -ExtensionInstallPrompt::g_auto_confirm_for_tests = ExtensionInstallPrompt::NONE; - ExtensionInstallPrompt::PromptType ExtensionInstallPrompt::g_last_prompt_type_for_tests = ExtensionInstallPrompt::UNSET_PROMPT_TYPE; diff --git a/chrome/browser/extensions/extension_install_prompt.h b/chrome/browser/extensions/extension_install_prompt.h index da1dd30..1613d2b 100644 --- a/chrome/browser/extensions/extension_install_prompt.h +++ b/chrome/browser/extensions/extension_install_prompt.h @@ -52,15 +52,6 @@ class InfoBarDelegate; class ExtensionInstallPrompt : public base::SupportsWeakPtr<ExtensionInstallPrompt> { public: - // A setting to cause extension/app installs from the webstore skip the normal - // confirmation dialog. This should only be used in tests. - enum AutoConfirmForTests { - NONE, // The prompt will show normally. - ACCEPT, // The prompt will always accept. - CANCEL, // The prompt will always cancel. - }; - static AutoConfirmForTests g_auto_confirm_for_tests; - // This enum is associated with Extensions.InstallPrompt_Type UMA histogram. // Do not modify existing values and add new values only to the end. enum PromptType { diff --git a/chrome/browser/extensions/extension_reenabler_unittest.cc b/chrome/browser/extensions/extension_reenabler_unittest.cc index 9e5d883..3c6f7c1 100644 --- a/chrome/browser/extensions/extension_reenabler_unittest.cc +++ b/chrome/browser/extensions/extension_reenabler_unittest.cc @@ -11,6 +11,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/test/base/testing_profile.h" #include "components/crx_file/id_util.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/management_policy.h" #include "extensions/browser/test_extensions_browser_client.h" @@ -160,8 +161,8 @@ TEST_F(ExtensionReenablerUnitTest, TestReenablingDisabledExtension) { EXPECT_TRUE(registry()->disabled_extensions().Contains(extension->id())); // Automatically confirm install prompts. - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; + ScopedTestDialogAutoConfirm auto_confirm( + ScopedTestDialogAutoConfirm::ACCEPT); // Run the ExtensionReenabler. scoped_ptr<ExtensionReenabler> extension_reenabler = @@ -181,6 +182,9 @@ TEST_F(ExtensionReenablerUnitTest, TestReenablingDisabledExtension) { // Check that we don't re-enable extensions that must remain disabled, and // that the re-enabler reports failure correctly. { + ScopedTestDialogAutoConfirm auto_confirm( + ScopedTestDialogAutoConfirm::ACCEPT); + ManagementPolicy* management_policy = ExtensionSystem::Get(browser_context())->management_policy(); ASSERT_TRUE(management_policy); @@ -210,8 +214,8 @@ TEST_F(ExtensionReenablerUnitTest, TestReenablingDisabledExtension) { // Disable it again, and try canceling the prompt. service()->DisableExtension(extension->id(), Extension::DISABLE_PERMISSIONS_INCREASE); - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::CANCEL; + ScopedTestDialogAutoConfirm auto_confirm( + ScopedTestDialogAutoConfirm::CANCEL); scoped_ptr<ExtensionReenabler> extension_reenabler = ExtensionReenabler::PromptForReenable(extension, profile(), @@ -229,9 +233,6 @@ TEST_F(ExtensionReenablerUnitTest, TestReenablingDisabledExtension) { // Test that if the extension is re-enabled while the prompt is active, the // prompt exits and reports success. { - // Don't auto-confirm, so that the prompt "stays around". - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::NONE; base::RunLoop run_loop; scoped_ptr<ExtensionReenabler> extension_reenabler = ExtensionReenabler::PromptForReenableWithPromptForTest( diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc index 919f925..854f043 100644 --- a/chrome/browser/extensions/extension_service_unittest.cc +++ b/chrome/browser/extensions/extension_service_unittest.cc @@ -86,6 +86,7 @@ #include "content/public/common/content_constants.h" #include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_utils.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" @@ -2849,8 +2850,9 @@ TEST_F(ExtensionServiceTest, LoadExtensionsWithPlugins) { service()->set_show_extensions_prompts(true); // Start by canceling any install prompts. - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::CANCEL; + scoped_ptr<extensions::ScopedTestDialogAutoConfirm> auto_confirm( + new extensions::ScopedTestDialogAutoConfirm( + extensions::ScopedTestDialogAutoConfirm::CANCEL)); // The extension that has a plugin should not install. extensions::UnpackedInstaller::Create(service()) @@ -2873,8 +2875,9 @@ TEST_F(ExtensionServiceTest, LoadExtensionsWithPlugins) { EXPECT_TRUE(registry()->enabled_extensions().Contains(good2)); // The plugin extension should install if we accept the dialog. - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; + auto_confirm.reset(); + auto_confirm.reset(new extensions::ScopedTestDialogAutoConfirm( + extensions::ScopedTestDialogAutoConfirm::ACCEPT)); ExtensionErrorReporter::GetInstance()->ClearErrors(); extensions::UnpackedInstaller::Create(service()) @@ -2897,8 +2900,9 @@ TEST_F(ExtensionServiceTest, LoadExtensionsWithPlugins) { // We should be able to reload the extension without getting another prompt. loaded_.clear(); - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::CANCEL; + auto_confirm.reset(); + auto_confirm.reset(new extensions::ScopedTestDialogAutoConfirm( + extensions::ScopedTestDialogAutoConfirm::CANCEL)); service()->ReloadExtension(good1); base::RunLoop().RunUntilIdle(); diff --git a/chrome/browser/extensions/extension_storage_monitor_browsertest.cc b/chrome/browser/extensions/extension_storage_monitor_browsertest.cc index f60adb6..295331d 100644 --- a/chrome/browser/extensions/extension_storage_monitor_browsertest.cc +++ b/chrome/browser/extensions/extension_storage_monitor_browsertest.cc @@ -12,6 +12,7 @@ #include "chrome/browser/ui/extensions/app_launch_params.h" #include "chrome/browser/ui/extensions/application_launch.h" #include "content/public/test/test_utils.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" @@ -323,8 +324,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionStorageMonitorTest, UninstallExtension) { // Fake clicking the notification button to uninstall and accepting the // uninstall. - ExtensionUninstallDialog::ScopedAutoConfirm scoped_autoconfirm( - ExtensionUninstallDialog::ACCEPT); + ScopedTestDialogAutoConfirm scoped_autoconfirm( + ScopedTestDialogAutoConfirm::ACCEPT); TestExtensionRegistryObserver observer(ExtensionRegistry::Get(profile()), extension->id()); message_center::MessageCenter::Get()->ClickOnNotificationButton( diff --git a/chrome/browser/extensions/extension_uninstall_dialog.cc b/chrome/browser/extensions/extension_uninstall_dialog.cc index 82d3487..16c6a72 100644 --- a/chrome/browser/extensions/extension_uninstall_dialog.cc +++ b/chrome/browser/extensions/extension_uninstall_dialog.cc @@ -14,6 +14,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/grit/generated_resources.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" #include "extensions/browser/image_loader.h" @@ -48,21 +49,6 @@ SkBitmap GetDefaultIconBitmapForMaxScaleFactor(bool is_app) { } // namespace -// static -ExtensionUninstallDialog::AutoConfirmForTests -ExtensionUninstallDialog::g_auto_confirm_for_testing = - ExtensionUninstallDialog::NONE; - -ExtensionUninstallDialog::ScopedAutoConfirm::ScopedAutoConfirm( - AutoConfirmForTests new_value) - : original_value_(g_auto_confirm_for_testing) { - g_auto_confirm_for_testing = new_value; -} - -ExtensionUninstallDialog::ScopedAutoConfirm::~ScopedAutoConfirm() { - g_auto_confirm_for_testing = original_value_; -} - ExtensionUninstallDialog::ExtensionUninstallDialog( Profile* profile, ExtensionUninstallDialog::Delegate* delegate) @@ -137,14 +123,14 @@ void ExtensionUninstallDialog::OnImageLoaded(const std::string& extension_id, SetIcon(image); - switch (g_auto_confirm_for_testing) { - case NONE: + switch (ScopedTestDialogAutoConfirm::GetAutoConfirmValue()) { + case ScopedTestDialogAutoConfirm::NONE: Show(); break; - case ACCEPT: + case ScopedTestDialogAutoConfirm::ACCEPT: OnDialogClosed(CLOSE_ACTION_UNINSTALL); break; - case CANCEL: + case ScopedTestDialogAutoConfirm::CANCEL: OnDialogClosed(CLOSE_ACTION_CANCELED); break; } diff --git a/chrome/browser/extensions/extension_uninstall_dialog.h b/chrome/browser/extensions/extension_uninstall_dialog.h index e8039c3..9691906 100644 --- a/chrome/browser/extensions/extension_uninstall_dialog.h +++ b/chrome/browser/extensions/extension_uninstall_dialog.h @@ -34,24 +34,6 @@ class ExtensionUninstallDialog CLOSE_ACTION_LAST = 3, }; - // A setting to cause extension/app installs from the webstore skip the normal - // confirmation dialog. This should only be used in tests. - enum AutoConfirmForTests { - NONE, // The prompt will show normally. - ACCEPT, // The prompt will always accept. - CANCEL, // The prompt will always cancel. - }; - class ScopedAutoConfirm { - public: - explicit ScopedAutoConfirm(AutoConfirmForTests new_value); - ~ScopedAutoConfirm(); - - private: - AutoConfirmForTests original_value_; - - DISALLOW_COPY_AND_ASSIGN(ScopedAutoConfirm); - }; - // TODO(devlin): For a single method like this, a callback is probably more // appropriate than a delegate. class Delegate { @@ -111,8 +93,6 @@ class ExtensionUninstallDialog const gfx::ImageSkia& icon() const { return icon_; } private: - static AutoConfirmForTests g_auto_confirm_for_testing; - // Handles the "report abuse" checkbox being checked at the close of the // dialog. void HandleReportAbuse(); diff --git a/chrome/browser/extensions/unpacked_installer.cc b/chrome/browser/extensions/unpacked_installer.cc index 36368aca..5f702b9b 100644 --- a/chrome/browser/extensions/unpacked_installer.cc +++ b/chrome/browser/extensions/unpacked_installer.cc @@ -19,6 +19,7 @@ #include "chrome/common/extensions/api/plugins/plugins_handler.h" #include "components/crx_file/id_util.h" #include "content/public/browser/browser_thread.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/install/extension_install_ui.h" @@ -79,18 +80,19 @@ SimpleExtensionLoadPrompt::~SimpleExtensionLoadPrompt() { } void SimpleExtensionLoadPrompt::ShowPrompt() { - switch (ExtensionInstallPrompt::g_auto_confirm_for_tests) { - case ExtensionInstallPrompt::NONE: + switch (extensions::ScopedTestDialogAutoConfirm::GetAutoConfirmValue()) { + case extensions::ScopedTestDialogAutoConfirm::NONE: install_ui_->ConfirmInstall( this, extension_.get(), ExtensionInstallPrompt::GetDefaultShowDialogCallback()); break; - case ExtensionInstallPrompt::ACCEPT: + case extensions::ScopedTestDialogAutoConfirm::ACCEPT: InstallUIProceed(); break; - case ExtensionInstallPrompt::CANCEL: + case extensions::ScopedTestDialogAutoConfirm::CANCEL: InstallUIAbort(false); + break; } } diff --git a/chrome/browser/extensions/webstore_inline_installer_browsertest.cc b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc index 270d7cf..352f17f 100644 --- a/chrome/browser/extensions/webstore_inline_installer_browsertest.cc +++ b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc @@ -167,8 +167,7 @@ IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerTest, IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerTest, ReinstallDisabledExtension) { // Install an extension via inline install, and confirm it is successful. - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; + AutoAcceptInstall(); ui_test_utils::NavigateToURL( browser(), GenerateTestServerUrl(kAppDomain, "install.html")); RunTest("runTest"); @@ -224,8 +223,7 @@ class WebstoreInlineInstallerListenerTest : public WebstoreInlineInstallerTest { protected: void RunTest(const std::string& file_name) { - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; + AutoAcceptInstall(); ui_test_utils::NavigateToURL(browser(), GenerateTestServerUrl(kAppDomain, file_name)); WebstoreInstallerTest::RunTest("runTest"); diff --git a/chrome/browser/extensions/webstore_installer_test.cc b/chrome/browser/extensions/webstore_installer_test.cc index cb3b790..73192e0 100644 --- a/chrome/browser/extensions/webstore_installer_test.cc +++ b/chrome/browser/extensions/webstore_installer_test.cc @@ -138,11 +138,13 @@ void WebstoreInstallerTest::RunTestAsync( } void WebstoreInstallerTest::AutoAcceptInstall() { - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; + install_auto_confirm_.reset(); // Destroy any old override first. + install_auto_confirm_.reset(new extensions::ScopedTestDialogAutoConfirm( + extensions::ScopedTestDialogAutoConfirm::ACCEPT)); } void WebstoreInstallerTest::AutoCancelInstall() { - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::CANCEL; + install_auto_confirm_.reset(); // Destroy any old override first. + install_auto_confirm_.reset(new extensions::ScopedTestDialogAutoConfirm( + extensions::ScopedTestDialogAutoConfirm::CANCEL)); } diff --git a/chrome/browser/extensions/webstore_installer_test.h b/chrome/browser/extensions/webstore_installer_test.h index a70e35a..be22671 100644 --- a/chrome/browser/extensions/webstore_installer_test.h +++ b/chrome/browser/extensions/webstore_installer_test.h @@ -9,6 +9,7 @@ #include "base/files/scoped_temp_dir.h" #include "chrome/browser/extensions/extension_browsertest.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "url/gurl.h" namespace base { @@ -68,6 +69,10 @@ class WebstoreInstallerTest : public ExtensionBrowserTest { std::string test_gallery_url_; base::ScopedTempDir download_directory_; + + scoped_ptr<extensions::ScopedTestDialogAutoConfirm> install_auto_confirm_; + + DISALLOW_COPY_AND_ASSIGN(WebstoreInstallerTest); }; #endif // CHROME_BROWSER_EXTENSIONS_WEBSTORE_INSTALLER_TEST_H_ diff --git a/chrome/browser/extensions/webstore_startup_installer_browsertest.cc b/chrome/browser/extensions/webstore_startup_installer_browsertest.cc index 1662694..2c142b4 100644 --- a/chrome/browser/extensions/webstore_startup_installer_browsertest.cc +++ b/chrome/browser/extensions/webstore_startup_installer_browsertest.cc @@ -5,7 +5,6 @@ #include "base/command_line.h" #include "base/scoped_observer.h" #include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/extensions/extension_install_prompt.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/startup_helper.h" #include "chrome/browser/extensions/webstore_installer_test.h" @@ -57,8 +56,7 @@ class WebstoreStartupInstallerTest : public WebstoreInstallerTest { }; IN_PROC_BROWSER_TEST_F(WebstoreStartupInstallerTest, Install) { - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; + AutoAcceptInstall(); ui_test_utils::NavigateToURL( browser(), GenerateTestServerUrl(kAppDomain, "install.html")); @@ -74,8 +72,7 @@ IN_PROC_BROWSER_TEST_F(WebstoreStartupInstallerTest, Install) { IN_PROC_BROWSER_TEST_F(WebstoreStartupInstallerTest, InstallNotAllowedFromNonVerifiedDomains) { - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::CANCEL; + AutoCancelInstall(); ui_test_utils::NavigateToURL( browser(), GenerateTestServerUrl(kNonAppDomain, "install_non_verified_domain.html")); @@ -94,8 +91,7 @@ IN_PROC_BROWSER_TEST_F(WebstoreStartupInstallerTest, FindLink) { // Flakes on all platforms: http://crbug.com/95713, http://crbug.com/229947 IN_PROC_BROWSER_TEST_F(WebstoreStartupInstallerTest, DISABLED_ArgumentValidation) { - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::CANCEL; + AutoCancelInstall(); // Each of these tests has to run separately, since one page/tab can // only have one in-progress install request. These tests don't all pass @@ -111,8 +107,7 @@ IN_PROC_BROWSER_TEST_F(WebstoreStartupInstallerTest, } IN_PROC_BROWSER_TEST_F(WebstoreStartupInstallerTest, MultipleInstallCalls) { - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::CANCEL; + AutoCancelInstall(); ui_test_utils::NavigateToURL( browser(), @@ -121,8 +116,7 @@ IN_PROC_BROWSER_TEST_F(WebstoreStartupInstallerTest, MultipleInstallCalls) { } IN_PROC_BROWSER_TEST_F(WebstoreStartupInstallerTest, InstallNotSupported) { - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::CANCEL; + AutoCancelInstall(); ui_test_utils::NavigateToURL( browser(), GenerateTestServerUrl(kAppDomain, "install_not_supported.html")); @@ -141,8 +135,7 @@ IN_PROC_BROWSER_TEST_F(WebstoreStartupInstallerTest, InstallNotSupported) { // Regression test for http://crbug.com/144991. IN_PROC_BROWSER_TEST_F(WebstoreStartupInstallerTest, InstallFromHostedApp) { - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; + AutoAcceptInstall(); const GURL kInstallUrl = GenerateTestServerUrl(kAppDomain, "install.html"); @@ -195,8 +188,7 @@ IN_PROC_BROWSER_TEST_F(WebstoreStartupInstallerSupervisedUsersTest, return; #endif - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; + AutoAcceptInstall(); ui_test_utils::NavigateToURL( browser(), GenerateTestServerUrl(kAppDomain, "install_prohibited.html")); @@ -231,8 +223,7 @@ class WebstoreStartupInstallUnpackFailureTest IN_PROC_BROWSER_TEST_F(WebstoreStartupInstallUnpackFailureTest, WebstoreStartupInstallUnpackFailureTest) { - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; + AutoAcceptInstall(); ui_test_utils::NavigateToURL(browser(), GenerateTestServerUrl(kAppDomain, "install_unpack_failure.html")); @@ -295,8 +286,7 @@ IN_PROC_BROWSER_TEST_F(CommandLineWebstoreInstall, CannotInstallNonEphemeral) { base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); command_line->AppendSwitchASCII( switches::kInstallEphemeralAppFromWebstore, kTestExtensionId); - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; + AutoAcceptInstall(); extensions::StartupHelper helper; EXPECT_FALSE(helper.InstallEphemeralApp(*command_line, browser()->profile())); EXPECT_FALSE(saw_install()); diff --git a/chrome/browser/infobars/infobars_browsertest.cc b/chrome/browser/infobars/infobars_browsertest.cc index 175022b..db81e6e 100644 --- a/chrome/browser/infobars/infobars_browsertest.cc +++ b/chrome/browser/infobars/infobars_browsertest.cc @@ -18,6 +18,7 @@ #include "chrome/test/base/test_switches.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/notification_service.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_system.h" #include "net/test/embedded_test_server/embedded_test_server.h" @@ -48,8 +49,8 @@ class InfoBarsTest : public InProcessBrowserTest { }; IN_PROC_BROWSER_TEST_F(InfoBarsTest, TestInfoBarsCloseOnNewTheme) { - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; + extensions::ScopedTestDialogAutoConfirm auto_confirm( + extensions::ScopedTestDialogAutoConfirm::ACCEPT); #if defined(OS_WIN) && defined(USE_ASH) // Disable this test in Metro+Ash for now (http://crbug.com/262796). diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc index 32c83e5..31e3c79 100644 --- a/chrome/browser/policy/policy_browsertest.cc +++ b/chrome/browser/policy/policy_browsertest.cc @@ -132,6 +132,7 @@ #include "content/public/test/mock_notification_observer.h" #include "content/public/test/test_navigation_observer.h" #include "content/public/test/test_utils.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_host.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" @@ -1968,8 +1969,8 @@ IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionAllowedTypes) { #define MAYBE_ExtensionInstallSources ExtensionInstallSources #endif IN_PROC_BROWSER_TEST_F(PolicyTest, MAYBE_ExtensionInstallSources) { - ExtensionInstallPrompt::g_auto_confirm_for_tests = - ExtensionInstallPrompt::ACCEPT; + extensions::ScopedTestDialogAutoConfirm auto_confirm( + extensions::ScopedTestDialogAutoConfirm::ACCEPT); const GURL install_source_url(URLRequestMockHTTPJob::GetMockUrl( base::FilePath(FILE_PATH_LITERAL("extensions/*")))); diff --git a/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc b/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc index aef43a8..97c5b6b 100644 --- a/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc +++ b/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc @@ -24,7 +24,6 @@ #include "content/public/browser/render_view_host.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_utils.h" -#include "extensions/browser/api/management/management_api.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" #include "extensions/browser/test_extension_registry_observer.h" @@ -87,7 +86,8 @@ void ExtensionSettingsUIBrowserTest::AddManagedPolicyProvider() { } void ExtensionSettingsUIBrowserTest::SetAutoConfirmUninstall() { - extensions::ManagementUninstallFunctionBase::SetAutoConfirmForTest(true); + uninstall_auto_confirm_.reset(new extensions::ScopedTestDialogAutoConfirm( + extensions::ScopedTestDialogAutoConfirm::ACCEPT)); } void ExtensionSettingsUIBrowserTest::EnableErrorConsole() { diff --git a/chrome/browser/ui/webui/extensions/extension_settings_browsertest.h b/chrome/browser/ui/webui/extensions/extension_settings_browsertest.h index 9730dff..6a43a77 100644 --- a/chrome/browser/ui/webui/extensions/extension_settings_browsertest.h +++ b/chrome/browser/ui/webui/extensions/extension_settings_browsertest.h @@ -8,6 +8,7 @@ #include "chrome/browser/extensions/extension_test_notification_observer.h" #include "chrome/common/extensions/features/feature_channel.h" #include "chrome/test/base/web_ui_browser_test.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/test_management_policy.h" #include "extensions/common/extension.h" #include "extensions/common/feature_switch.h" @@ -64,6 +65,8 @@ class ExtensionSettingsUIBrowserTest : public WebUIBrowserTest { // Used to enable the error console. scoped_ptr<extensions::FeatureSwitch::ScopedOverride> error_console_override_; + scoped_ptr<extensions::ScopedTestDialogAutoConfirm> uninstall_auto_confirm_; + DISALLOW_COPY_AND_ASSIGN(ExtensionSettingsUIBrowserTest); }; diff --git a/extensions/browser/api/management/management_api.cc b/extensions/browser/api/management/management_api.cc index 7b2e687..1000e64 100644 --- a/extensions/browser/api/management/management_api.cc +++ b/extensions/browser/api/management/management_api.cc @@ -541,39 +541,14 @@ ExtensionFunction::ResponseAction ManagementUninstallFunctionBase::Uninstall( return RespondNow(Error(keys::kGestureNeededForUninstallError)); if (show_confirm_dialog) { - switch (auto_confirm_for_test) { - case DO_NOT_SKIP: { - // We show the programmatic uninstall ui for extensions uninstalling - // other extensions. - bool show_programmatic_uninstall_ui = !self_uninstall && extension(); - AddRef(); // Balanced in OnExtensionUninstallDialogClosed. - // TODO(devlin): A method called "UninstallFunctionDelegate" does not in - // any way imply that this actually creates a dialog and runs it. - uninstall_dialog_ = - delegate->UninstallFunctionDelegate( - this, - target_extension, - show_programmatic_uninstall_ui); - break; - } - case PROCEED: { - // Skip the confirm dialog for testing. - base::MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind(&ManagementUninstallFunctionBase::UninstallExtension, - this)); - break; - } - case ABORT: { - // Fake the user canceling. - base::MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind( - &ManagementUninstallFunctionBase::Finish, this, false, - ErrorUtils::FormatErrorMessage(keys::kUninstallCanceledError, - target_extension_id_))); - } - } + // We show the programmatic uninstall ui for extensions uninstalling + // other extensions. + bool show_programmatic_uninstall_ui = !self_uninstall && extension(); + AddRef(); // Balanced in OnExtensionUninstallDialogClosed. + // TODO(devlin): A method called "UninstallFunctionDelegate" does not in + // any way imply that this actually creates a dialog and runs it. + uninstall_dialog_ = delegate->UninstallFunctionDelegate( + this, target_extension, show_programmatic_uninstall_ui); } else { // No confirm dialog. base::MessageLoop::current()->PostTask( FROM_HERE, @@ -591,7 +566,9 @@ void ManagementUninstallFunctionBase::Finish(bool did_start_uninstall, void ManagementUninstallFunctionBase::OnExtensionUninstallDialogClosed( bool did_start_uninstall, const base::string16& error) { - Finish(did_start_uninstall, base::UTF16ToUTF8(error)); + Finish(did_start_uninstall, + ErrorUtils::FormatErrorMessage(keys::kUninstallCanceledError, + target_extension_id_)); Release(); // Balanced in Uninstall(). } @@ -621,12 +598,6 @@ void ManagementUninstallFunctionBase::UninstallExtension() { Finish(success, error); } -// static -void ManagementUninstallFunctionBase::SetAutoConfirmForTest( - bool should_proceed) { - auto_confirm_for_test = should_proceed ? PROCEED : ABORT; -} - ManagementUninstallFunction::ManagementUninstallFunction() { } diff --git a/extensions/browser/api/management/management_api.h b/extensions/browser/api/management/management_api.h index c8687c2..8b77ff6 100644 --- a/extensions/browser/api/management/management_api.h +++ b/extensions/browser/api/management/management_api.h @@ -135,8 +135,6 @@ class ManagementUninstallFunctionBase : public UIThreadExtensionFunction { public: ManagementUninstallFunctionBase(); - static void SetAutoConfirmForTest(bool should_proceed); - void OnExtensionUninstallDialogClosed(bool did_start_uninstall, const base::string16& error); diff --git a/extensions/browser/api/runtime/runtime_apitest.cc b/extensions/browser/api/runtime/runtime_apitest.cc index 49614d0..c316189 100644 --- a/extensions/browser/api/runtime/runtime_apitest.cc +++ b/extensions/browser/api/runtime/runtime_apitest.cc @@ -8,8 +8,8 @@ #include "chrome/browser/extensions/test_extension_dir.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/notification_service.h" -#include "extensions/browser/api/management/management_api.h" #include "extensions/browser/api/runtime/runtime_api.h" +#include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_registry.h" #include "extensions/test/result_catcher.h" #include "net/test/embedded_test_server/embedded_test_server.h" @@ -34,7 +34,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ChromeRuntimeUnprivileged) { IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ChromeRuntimeUninstallURL) { // Auto-confirm the uninstall dialog. - extensions::ManagementUninstallFunction::SetAutoConfirmForTest(true); + extensions::ScopedTestDialogAutoConfirm auto_confirm( + extensions::ScopedTestDialogAutoConfirm::ACCEPT); ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("runtime") .AppendASCII("uninstall_url") .AppendASCII("sets_uninstall_url"))); diff --git a/extensions/browser/extension_dialog_auto_confirm.cc b/extensions/browser/extension_dialog_auto_confirm.cc new file mode 100644 index 0000000..e17fa6a --- /dev/null +++ b/extensions/browser/extension_dialog_auto_confirm.cc @@ -0,0 +1,29 @@ +// Copyright 2015 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 "extensions/browser/extension_dialog_auto_confirm.h" + +namespace extensions { + +namespace { +ScopedTestDialogAutoConfirm::AutoConfirm g_extension_dialog_auto_confirm = + ScopedTestDialogAutoConfirm::NONE; +} + +ScopedTestDialogAutoConfirm::ScopedTestDialogAutoConfirm( + ScopedTestDialogAutoConfirm::AutoConfirm override_value) + : old_value_(g_extension_dialog_auto_confirm) { + g_extension_dialog_auto_confirm = override_value; +} + +ScopedTestDialogAutoConfirm::~ScopedTestDialogAutoConfirm() { + g_extension_dialog_auto_confirm = old_value_; +} + +ScopedTestDialogAutoConfirm::AutoConfirm +ScopedTestDialogAutoConfirm::GetAutoConfirmValue() { + return g_extension_dialog_auto_confirm; +} + +} // namespace extensions diff --git a/extensions/browser/extension_dialog_auto_confirm.h b/extensions/browser/extension_dialog_auto_confirm.h new file mode 100644 index 0000000..5b4303e --- /dev/null +++ b/extensions/browser/extension_dialog_auto_confirm.h @@ -0,0 +1,33 @@ +// Copyright 2015 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. + +#ifndef EXTENSIONS_BROWSER_EXTENSION_DIALOG_AUTO_CONFIRM_H_ +#define EXTENSIONS_BROWSER_EXTENSION_DIALOG_AUTO_CONFIRM_H_ + +#include "base/auto_reset.h" + +namespace extensions { + +class ScopedTestDialogAutoConfirm { + public: + enum AutoConfirm { + NONE, // The prompt will show normally. + ACCEPT, // The prompt will always accept. + CANCEL, // The prompt will always cancel. + }; + + explicit ScopedTestDialogAutoConfirm(AutoConfirm override_value); + ~ScopedTestDialogAutoConfirm(); + + static AutoConfirm GetAutoConfirmValue(); + + private: + AutoConfirm old_value_; + + DISALLOW_COPY_AND_ASSIGN(ScopedTestDialogAutoConfirm); +}; + +} // namespace extensions + +#endif // EXTENSIONS_BROWSER_EXTENSION_DIALOG_AUTO_CONFIRM_H_ diff --git a/extensions/extensions.gypi b/extensions/extensions.gypi index e1c4b35..cc225c3 100644 --- a/extensions/extensions.gypi +++ b/extensions/extensions.gypi @@ -567,6 +567,8 @@ 'browser/event_router.h', 'browser/event_router_factory.cc', 'browser/event_router_factory.h', + 'browser/extension_dialog_auto_confirm.cc', + 'browser/extension_dialog_auto_confirm.h', 'browser/extension_error.cc', 'browser/extension_error.h', 'browser/extension_function.cc', |