Commit e6097b43 authored by msw@chromium.org's avatar msw@chromium.org

Close ExtensionPopup on tab switches; add test.

Make ExtensionPopup a TabStripModelObserver.
Close the ExtensionPopup's Widget on ActiveTabChanged.
Add an interactive_ui_test for this behavior.

BUG=303479
TEST=Extension popups close on switching tabs via CTRL+TAB, CTRL+1, CTRL+2, etc.
R=sky@chromium.org,jyasskin@chromium.org

Review URL: https://codereview.chromium.org/119633002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@242170 0039d316-1c4b-4281-b951-d872f2087c98
parent be6aea00
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/extension_system.h"
#include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/extensions/extension_test_message_listener.h" #include "chrome/browser/extensions/extension_test_message_listener.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
...@@ -238,5 +239,29 @@ IN_PROC_BROWSER_TEST_F(BrowserActionInteractiveTest, BrowserClickClosesPopup2) { ...@@ -238,5 +239,29 @@ IN_PROC_BROWSER_TEST_F(BrowserActionInteractiveTest, BrowserClickClosesPopup2) {
EXPECT_FALSE(BrowserActionTestUtil(browser()).HasPopup()); EXPECT_FALSE(BrowserActionTestUtil(browser()).HasPopup());
} }
// Test that the extension popup is closed on browser tab switches.
IN_PROC_BROWSER_TEST_F(BrowserActionInteractiveTest, TabSwitchClosesPopup) {
if (!ShouldRunPopupTest())
return;
// Add a second tab to the browser.
chrome::NewTab(browser());
ASSERT_EQ(2, browser()->tab_strip_model()->count());
// Open an extension popup via the chrome.browserAction.openPopup API.
content::WindowedNotificationObserver frame_observer(
content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
content::NotificationService::AllSources());
ASSERT_TRUE(RunExtensionSubtest("browser_action/open_popup",
"open_popup_succeeds.html")) << message_;
frame_observer.Wait();
EXPECT_TRUE(BrowserActionTestUtil(browser()).HasPopup());
// Press CTRL+TAB to change active tabs, the extension popup should close.
ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
browser(), ui::VKEY_TAB, true, false, false, false));
EXPECT_FALSE(BrowserActionTestUtil(browser()).HasPopup());
}
} // namespace } // namespace
} // namespace extensions } // namespace extensions
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/host_desktop.h" #include "chrome/browser/ui/host_desktop.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/browser_view.h"
#include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/devtools_agent_host.h"
#include "content/public/browser/devtools_manager.h" #include "content/public/browser/devtools_manager.h"
...@@ -94,11 +95,15 @@ ExtensionPopup::ExtensionPopup(extensions::ExtensionViewHost* host, ...@@ -94,11 +95,15 @@ ExtensionPopup::ExtensionPopup(extensions::ExtensionViewHost* host,
content::Source<BrowserContext>(host->browser_context())); content::Source<BrowserContext>(host->browser_context()));
content::DevToolsManager::GetInstance()->AddAgentStateCallback( content::DevToolsManager::GetInstance()->AddAgentStateCallback(
devtools_callback_); devtools_callback_);
host_->view()->browser()->tab_strip_model()->AddObserver(this);
} }
ExtensionPopup::~ExtensionPopup() { ExtensionPopup::~ExtensionPopup() {
content::DevToolsManager::GetInstance()->RemoveAgentStateCallback( content::DevToolsManager::GetInstance()->RemoveAgentStateCallback(
devtools_callback_); devtools_callback_);
host_->view()->browser()->tab_strip_model()->RemoveObserver(this);
} }
void ExtensionPopup::Observe(int type, void ExtensionPopup::Observe(int type,
...@@ -197,6 +202,13 @@ void ExtensionPopup::OnWindowActivated(aura::Window* gained_active, ...@@ -197,6 +202,13 @@ void ExtensionPopup::OnWindowActivated(aura::Window* gained_active,
} }
#endif #endif
void ExtensionPopup::ActiveTabChanged(content::WebContents* old_contents,
content::WebContents* new_contents,
int index,
int reason) {
GetWidget()->Close();
}
// static // static
ExtensionPopup* ExtensionPopup::ShowPopup(const GURL& url, ExtensionPopup* ExtensionPopup::ShowPopup(const GURL& url,
Browser* browser, Browser* browser,
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
#include "chrome/browser/ui/views/extensions/extension_view_views.h" #include "chrome/browser/ui/views/extensions/extension_view_views.h"
#include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h" #include "content/public/browser/notification_registrar.h"
...@@ -36,7 +37,8 @@ class ExtensionPopup : public views::BubbleDelegateView, ...@@ -36,7 +37,8 @@ class ExtensionPopup : public views::BubbleDelegateView,
public aura::client::ActivationChangeObserver, public aura::client::ActivationChangeObserver,
#endif #endif
public ExtensionViewViews::Container, public ExtensionViewViews::Container,
public content::NotificationObserver { public content::NotificationObserver,
public TabStripModelObserver {
public: public:
enum ShowAction { enum ShowAction {
SHOW, SHOW,
...@@ -84,6 +86,12 @@ class ExtensionPopup : public views::BubbleDelegateView, ...@@ -84,6 +86,12 @@ class ExtensionPopup : public views::BubbleDelegateView,
aura::Window* lost_active) OVERRIDE; aura::Window* lost_active) OVERRIDE;
#endif #endif
// TabStripModelObserver overrides.
virtual void ActiveTabChanged(content::WebContents* old_contents,
content::WebContents* new_contents,
int index,
int reason) OVERRIDE;
// The min/max height of popups. // The min/max height of popups.
static const int kMinWidth; static const int kMinWidth;
static const int kMinHeight; static const int kMinHeight;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment