diff options
-rw-r--r-- | chrome/browser/automation/automation_provider.cc | 11 | ||||
-rw-r--r-- | chrome/browser/automation/automation_provider.h | 4 | ||||
-rw-r--r-- | chrome/browser/extensions/theme_installed_infobar_delegate.cc | 35 | ||||
-rw-r--r-- | chrome/browser/extensions/theme_installed_infobar_delegate.h | 19 | ||||
-rw-r--r-- | chrome/test/automation/automation_messages_internal.h | 6 | ||||
-rw-r--r-- | chrome/test/automation/automation_proxy.cc | 8 | ||||
-rw-r--r-- | chrome/test/automation/automation_proxy.h | 11 | ||||
-rw-r--r-- | chrome/test/automation/extension_proxy_uitest.cc | 4 | ||||
-rw-r--r-- | chrome/test/interactive_ui/infobars_uitest.cc | 50 | ||||
-rw-r--r-- | chrome/test/interactive_ui/interactive_ui_tests.gypi | 1 | ||||
-rw-r--r-- | chrome/test/pyautolib/pyautolib.cc | 4 | ||||
-rw-r--r-- | chrome/test/pyautolib/pyautolib.h | 2 | ||||
-rw-r--r-- | chrome/test/pyautolib/pyautolib.i | 2 |
13 files changed, 138 insertions, 19 deletions
diff --git a/chrome/browser/automation/automation_provider.cc b/chrome/browser/automation/automation_provider.cc index dadc49b..8fcdf03 100644 --- a/chrome/browser/automation/automation_provider.cc +++ b/chrome/browser/automation/automation_provider.cc @@ -567,6 +567,7 @@ void AutomationProvider::OnMessageReceived(const IPC::Message& message) { IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForPopupMenuToOpen, WaitForPopupMenuToOpen) #endif + IPC_MESSAGE_HANDLER(AutomationMsg_ResetToDefaultTheme, ResetToDefaultTheme) IPC_END_MESSAGE_MAP() } @@ -2823,7 +2824,7 @@ void AutomationProvider::WaitForExtensionTestResult( } void AutomationProvider::InstallExtensionAndGetHandle( - const FilePath& crx_path, IPC::Message* reply_message) { + const FilePath& crx_path, bool with_ui, IPC::Message* reply_message) { ExtensionsService* service = profile_->GetExtensionsService(); ExtensionProcessManager* manager = profile_->GetExtensionProcessManager(); if (service && manager) { @@ -2834,10 +2835,12 @@ void AutomationProvider::InstallExtensionAndGetHandle( AutomationMsg_InstallExtensionAndGetHandle::ID, reply_message); + ExtensionInstallUI* client = + (with_ui ? new ExtensionInstallUI(profile_) : NULL); scoped_refptr<CrxInstaller> installer( new CrxInstaller(service->install_directory(), service, - NULL)); // silent install, no UI + client)); installer->set_allow_privilege_increase(true); installer->InstallCrx(crx_path); } else { @@ -3037,3 +3040,7 @@ void AutomationProvider::WaitForPopupMenuToOpen(IPC::Message* reply_message) { NOTIMPLEMENTED(); } #endif // !defined(TOOLKIT_VIEWS) + +void AutomationProvider::ResetToDefaultTheme() { + profile_->ClearTheme(); +} diff --git a/chrome/browser/automation/automation_provider.h b/chrome/browser/automation/automation_provider.h index 9c502ec..cb07f1c 100644 --- a/chrome/browser/automation/automation_provider.h +++ b/chrome/browser/automation/automation_provider.h @@ -402,6 +402,7 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>, void WaitForExtensionTestResult(IPC::Message* reply_message); void InstallExtensionAndGetHandle(const FilePath& crx_path, + bool with_ui, IPC::Message* reply_message); void UninstallExtension(int extension_handle, @@ -565,6 +566,9 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>, bool value, bool* success); + // Resets to the default theme. + void ResetToDefaultTheme(); + // Gets the current used encoding name of the page in the specified tab. void GetPageCurrentEncoding(int tab_handle, std::string* current_encoding); diff --git a/chrome/browser/extensions/theme_installed_infobar_delegate.cc b/chrome/browser/extensions/theme_installed_infobar_delegate.cc index 196f9ff..345a57f 100644 --- a/chrome/browser/extensions/theme_installed_infobar_delegate.cc +++ b/chrome/browser/extensions/theme_installed_infobar_delegate.cc @@ -14,20 +14,28 @@ #include "chrome/browser/profile.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/common/extensions/extension.h" +#include "chrome/common/notification_service.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" ThemeInstalledInfoBarDelegate::ThemeInstalledInfoBarDelegate( TabContents* tab_contents, const Extension* new_theme, const std::string& previous_theme_id) - : ConfirmInfoBarDelegate(tab_contents), - profile_(tab_contents->profile()), - name_(new_theme->name()), - previous_theme_id_(previous_theme_id) { + : ConfirmInfoBarDelegate(tab_contents), + profile_(tab_contents->profile()), + name_(new_theme->name()), + theme_id_(new_theme->id()), + previous_theme_id_(previous_theme_id), + tab_contents_(tab_contents) { profile_->GetThemeProvider()->OnInfobarDisplayed(); + registrar_.Add(this, NotificationType::BROWSER_THEME_CHANGED, + NotificationService::AllSources()); } ThemeInstalledInfoBarDelegate::~ThemeInstalledInfoBarDelegate() { + // We don't want any notifications while we're running our destructor. + registrar_.RemoveAll(); + profile_->GetThemeProvider()->OnInfobarDestroyed(); } @@ -85,3 +93,22 @@ bool ThemeInstalledInfoBarDelegate::Cancel() { profile_->ClearTheme(); return true; } + +void ThemeInstalledInfoBarDelegate::Observe( + NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + switch (type.value) { + case NotificationType::BROWSER_THEME_CHANGED: { + // If the new theme is different from what this info bar is associated + // with, close this info bar since it is no longer relevant. + Extension* extension = Details<Extension>(details).ptr(); + if (!extension || theme_id_ != extension->id()) + tab_contents_->RemoveInfoBar(this); + break; + } + + default: + NOTREACHED(); + } +} diff --git a/chrome/browser/extensions/theme_installed_infobar_delegate.h b/chrome/browser/extensions/theme_installed_infobar_delegate.h index b8baf41..beb99c6 100644 --- a/chrome/browser/extensions/theme_installed_infobar_delegate.h +++ b/chrome/browser/extensions/theme_installed_infobar_delegate.h @@ -6,6 +6,7 @@ #define CHROME_BROWSER_EXTENSIONS_THEME_INSTALLED_INFOBAR_DELEGATE_H_ #include "chrome/browser/tab_contents/infobar_delegate.h" +#include "chrome/common/notification_registrar.h" class Extension; class SkBitmap; @@ -13,7 +14,8 @@ class TabContents; // When a user installs a theme, we display it immediately, but provide an // infobar allowing them to cancel. -class ThemeInstalledInfoBarDelegate : public ConfirmInfoBarDelegate { +class ThemeInstalledInfoBarDelegate : public ConfirmInfoBarDelegate, + public NotificationObserver { public: ThemeInstalledInfoBarDelegate(TabContents* tab_contents, const Extension* new_theme, @@ -28,15 +30,30 @@ class ThemeInstalledInfoBarDelegate : public ConfirmInfoBarDelegate { ConfirmInfoBarDelegate::InfoBarButton button) const; virtual bool Cancel(); + // NotificationObserver implementation. + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); protected: Profile* profile() { return profile_; } private: Profile* profile_; + // Name of theme that's just been installed. std::string name_; + + // ID of theme that's just been installed. + std::string theme_id_; + // Used to undo theme install. std::string previous_theme_id_; + + // Tab to which this info bar is associated. + TabContents* tab_contents_; + + // Registers and unregisters us for notifications. + NotificationRegistrar registrar_; }; #endif // CHROME_BROWSER_EXTENSIONS_THEME_INSTALLED_INFOBAR_DELEGATE_H_ diff --git a/chrome/test/automation/automation_messages_internal.h b/chrome/test/automation/automation_messages_internal.h index d938b9f..02ee3e4 100644 --- a/chrome/test/automation/automation_messages_internal.h +++ b/chrome/test/automation/automation_messages_internal.h @@ -1327,8 +1327,9 @@ IPC_BEGIN_MESSAGES(Automation) // Installs an extension from the crx file and returns its id. // On error, |extension handle| will be 0. - IPC_SYNC_MESSAGE_ROUTED1_1(AutomationMsg_InstallExtensionAndGetHandle, + IPC_SYNC_MESSAGE_ROUTED2_1(AutomationMsg_InstallExtensionAndGetHandle, FilePath /* full path to crx file */, + bool /* with UI */, int /* extension handle */) // Waits for the next extension test result. Sets |test result| as the @@ -1377,4 +1378,7 @@ IPC_BEGIN_MESSAGES(Automation) bool /* success */, std::string /* property value */) + // Resets to the default theme. + IPC_SYNC_MESSAGE_ROUTED0_0(AutomationMsg_ResetToDefaultTheme) + IPC_END_MESSAGES(Automation) diff --git a/chrome/test/automation/automation_proxy.cc b/chrome/test/automation/automation_proxy.cc index ecaf5d8..d49ae9a 100644 --- a/chrome/test/automation/automation_proxy.cc +++ b/chrome/test/automation/automation_proxy.cc @@ -234,9 +234,9 @@ bool AutomationProxy::SavePackageShouldPromptUser(bool should_prompt) { } scoped_refptr<ExtensionProxy> AutomationProxy::InstallExtension( - const FilePath& crx_file) { + const FilePath& crx_file, bool with_ui) { int handle = 0; - if (!Send(new AutomationMsg_InstallExtensionAndGetHandle(0, crx_file, + if (!Send(new AutomationMsg_InstallExtensionAndGetHandle(0, crx_file, with_ui, &handle))) return NULL; @@ -531,3 +531,7 @@ bool AutomationProxy::LoginWithUserAndPass(const std::string& username, return sent && success; } #endif + +bool AutomationProxy::ResetToDefaultTheme() { + return Send(new AutomationMsg_ResetToDefaultTheme(0)); +} diff --git a/chrome/test/automation/automation_proxy.h b/chrome/test/automation/automation_proxy.h index f68633e..45286fe 100644 --- a/chrome/test/automation/automation_proxy.h +++ b/chrome/test/automation/automation_proxy.h @@ -183,10 +183,12 @@ class AutomationProxy : public IPC::Channel::Listener, // sent. bool SavePackageShouldPromptUser(bool should_prompt) WARN_UNUSED_RESULT; - // Installs the extension crx. Returns the ExtensionProxy for the - // installed extension, or NULL on failure. + // Installs the extension crx. If |with_ui| is true an install confirmation + // and notification UI is shown, otherwise the install is silent. Returns the + // ExtensionProxy for the installed extension, or NULL on failure. // Note: Overinstalls and downgrades will return NULL. - scoped_refptr<ExtensionProxy> InstallExtension(const FilePath& crx_file); + scoped_refptr<ExtensionProxy> InstallExtension(const FilePath& crx_file, + bool with_ui); // Asserts that the next extension test result is true. void EnsureExtensionTestResult(); @@ -195,6 +197,9 @@ class AutomationProxy : public IPC::Channel::Listener, // Returns true on success. bool GetEnabledExtensions(std::vector<FilePath>* extension_directories); + // Resets to the default theme. Returns true on success. + bool ResetToDefaultTheme(); + #if defined(OS_CHROMEOS) // Logs in through the Chrome OS login wizard with given |username| // and |password|. Returns true on success. diff --git a/chrome/test/automation/extension_proxy_uitest.cc b/chrome/test/automation/extension_proxy_uitest.cc index 18d385c..0954f5a 100644 --- a/chrome/test/automation/extension_proxy_uitest.cc +++ b/chrome/test/automation/extension_proxy_uitest.cc @@ -32,7 +32,7 @@ class ExtensionProxyUITest : public UITest { scoped_refptr<ExtensionProxy> InstallSimpleBrowserActionExtension() { return automation()->InstallExtension( test_data_directory_.AppendASCII("extensions").AppendASCII("uitest"). - AppendASCII("simple_browser_action.crx")); + AppendASCII("simple_browser_action.crx"), false); } // Installs a extension which, when clicking the browser action, renames @@ -41,7 +41,7 @@ class ExtensionProxyUITest : public UITest { scoped_refptr<ExtensionProxy> InstallRenameTabExtension() { return automation()->InstallExtension( test_data_directory_.AppendASCII("extensions").AppendASCII("uitest"). - AppendASCII("rename_tab.crx")); + AppendASCII("rename_tab.crx"), false); } // The google translate extension, which is installed on test setup. diff --git a/chrome/test/interactive_ui/infobars_uitest.cc b/chrome/test/interactive_ui/infobars_uitest.cc new file mode 100644 index 0000000..4670ad6 --- /dev/null +++ b/chrome/test/interactive_ui/infobars_uitest.cc @@ -0,0 +1,50 @@ +// Copyright (c) 2010 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 "chrome/test/automation/browser_proxy.h" +#include "chrome/test/automation/extension_proxy.h" +#include "chrome/test/automation/tab_proxy.h" +#include "chrome/test/ui/ui_test.h" +#include "net/url_request/url_request_unittest.h" + +class InfoBarsUITest : public UITest { + public: + InfoBarsUITest() { + show_window_ = true; + } +}; + +TEST_F(InfoBarsUITest, TestInfoBarsCloseOnNewTheme) { + const wchar_t kDocRoot[] = L"chrome/test/data"; + scoped_refptr<HTTPTestServer> server = + HTTPTestServer::CreateServer(kDocRoot, NULL); + ASSERT_TRUE(server.get() != NULL); + scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0)); + ASSERT_TRUE(browser.get()); + + scoped_refptr<TabProxy> tab_1(browser->GetActiveTab()); + ASSERT_TRUE(tab_1.get()); + EXPECT_TRUE(tab_1->NavigateToURL( + server->TestServerPageW(L"files/simple.html"))); + scoped_refptr<ExtensionProxy> theme = automation()->InstallExtension( + test_data_directory_.AppendASCII("extensions").AppendASCII("theme.crx"), + true); + ASSERT_TRUE(theme != NULL); + EXPECT_TRUE(tab_1->WaitForInfoBarCount(1, action_max_timeout_ms())); + + EXPECT_TRUE(browser->AppendTab( + server->TestServerPageW(L"files/simple.html"))); + WaitUntilTabCount(2); + scoped_refptr<TabProxy> tab_2(browser->GetActiveTab()); + ASSERT_TRUE(tab_2.get()); + theme = automation()->InstallExtension( + test_data_directory_.AppendASCII("extensions").AppendASCII("theme2.crx"), + true); + ASSERT_TRUE(theme != NULL); + EXPECT_TRUE(tab_2->WaitForInfoBarCount(1, action_max_timeout_ms())); + EXPECT_TRUE(tab_1->WaitForInfoBarCount(0, action_max_timeout_ms())); + + EXPECT_TRUE(automation()->ResetToDefaultTheme()); + EXPECT_TRUE(tab_2->WaitForInfoBarCount(0, action_max_timeout_ms())); +} diff --git a/chrome/test/interactive_ui/interactive_ui_tests.gypi b/chrome/test/interactive_ui/interactive_ui_tests.gypi index 603b7fa..880dfb3 100644 --- a/chrome/test/interactive_ui/interactive_ui_tests.gypi +++ b/chrome/test/interactive_ui/interactive_ui_tests.gypi @@ -38,6 +38,7 @@ '<(DEPTH)/chrome/browser/views/tabs/tab_dragging_test.cc', '<(DEPTH)/chrome/test/in_process_browser_test.cc', '<(DEPTH)/chrome/test/in_process_browser_test.h', + '<(DEPTH)/chrome/test/interactive_ui/infobars_uitest.cc', '<(DEPTH)/chrome/test/interactive_ui/keyboard_access_uitest.cc', '<(DEPTH)/chrome/test/interactive_ui/npapi_interactive_test.cc', '<(DEPTH)/chrome/test/interactive_ui/view_event_test_base.cc', diff --git a/chrome/test/pyautolib/pyautolib.cc b/chrome/test/pyautolib/pyautolib.cc index 39a5b32..fab3832 100644 --- a/chrome/test/pyautolib/pyautolib.cc +++ b/chrome/test/pyautolib/pyautolib.cc @@ -156,9 +156,9 @@ bool PyUITestBase::OpenNewBrowserWindow(bool show) { return automation()->OpenNewBrowserWindow(Browser::TYPE_NORMAL, show); } -bool PyUITestBase::InstallExtension(const FilePath& crx_file) { +bool PyUITestBase::InstallExtension(const FilePath& crx_file, bool with_ui) { scoped_refptr<ExtensionProxy> proxy = - automation()->InstallExtension(crx_file); + automation()->InstallExtension(crx_file, with_ui); return proxy.get() != NULL; } diff --git a/chrome/test/pyautolib/pyautolib.h b/chrome/test/pyautolib/pyautolib.h index 1093fda..321cfde 100644 --- a/chrome/test/pyautolib/pyautolib.h +++ b/chrome/test/pyautolib/pyautolib.h @@ -100,7 +100,7 @@ class PyUITestBase : public UITestBase { // Installs the extension crx. Returns true only if extension was installed // and loaded successfully. Overinstalls will fail. - bool InstallExtension(const FilePath& crx_file); + bool InstallExtension(const FilePath& crx_file, bool with_ui); // Returns bookmark bar visibility state. bool GetBookmarkBarVisibility(); diff --git a/chrome/test/pyautolib/pyautolib.i b/chrome/test/pyautolib/pyautolib.i index 3fdddc4..e974319 100644 --- a/chrome/test/pyautolib/pyautolib.i +++ b/chrome/test/pyautolib/pyautolib.i @@ -312,7 +312,7 @@ class PyUITestBase { %feature("docstring", "Install an extension from the given file. Returns " "True if successfully installed and loaded.") InstallExtension; - bool InstallExtension(const FilePath& crx_file); + bool InstallExtension(const FilePath& crx_file, bool with_ui); %feature("docstring", "Get a proxy to the browser window at the given " "zero-based index.") GetBrowserWindow; |