Index: chrome/browser/ui/toolbar/browser_actions_bar_browsertest.cc |
diff --git a/chrome/browser/ui/toolbar/browser_actions_bar_browsertest.cc b/chrome/browser/ui/toolbar/browser_actions_bar_browsertest.cc |
index a99e8605d74190d573b409fabf8b96b27e5dc4dd..04de2ffd0c66fda5131b864d6cf826a795a19e5c 100644 |
--- a/chrome/browser/ui/toolbar/browser_actions_bar_browsertest.cc |
+++ b/chrome/browser/ui/toolbar/browser_actions_bar_browsertest.cc |
@@ -4,6 +4,7 @@ |
#include "chrome/browser/ui/toolbar/browser_actions_bar_browsertest.h" |
+#include "base/run_loop.h" |
#include "chrome/browser/extensions/api/extension_action/extension_action_api.h" |
#include "chrome/browser/extensions/browser_action_test_util.h" |
#include "chrome/browser/extensions/extension_action.h" |
@@ -13,11 +14,16 @@ |
#include "chrome/browser/extensions/extension_service.h" |
#include "chrome/browser/extensions/extension_toolbar_model.h" |
#include "chrome/browser/sessions/session_tab_helper.h" |
+#include "chrome/browser/ui/extensions/extension_action_view_controller.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "chrome/browser/ui/toolbar/toolbar_action_view_controller.h" |
#include "chrome/browser/ui/toolbar/toolbar_actions_bar.h" |
#include "components/crx_file/id_util.h" |
+#include "content/public/browser/notification_service.h" |
+#include "content/public/test/test_utils.h" |
#include "extensions/browser/extension_prefs.h" |
#include "extensions/browser/extension_registry.h" |
+#include "extensions/browser/notification_types.h" |
#include "extensions/common/extension.h" |
#include "extensions/common/extension_builder.h" |
#include "extensions/common/value_builder.h" |
@@ -329,3 +335,73 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsBarRedesignBrowserTest, |
toolbar_model()->SetVisibleIconCount(4); |
EXPECT_FALSE(browser_actions_bar()->OverflowedActionButtonWantsToRun()); |
} |
+ |
+IN_PROC_BROWSER_TEST_F(BrowserActionsBarBrowserTest, BrowserActionPopupTest) { |
+ // Load up two extensions that have browser action popups. |
+ base::FilePath data_dir = |
+ test_data_dir_.AppendASCII("api_test").AppendASCII("browser_action"); |
+ const extensions::Extension* first_extension = |
+ LoadExtension(data_dir.AppendASCII("open_popup")); |
+ ASSERT_TRUE(first_extension); |
+ const extensions::Extension* second_extension = |
+ LoadExtension(data_dir.AppendASCII("remove_popup")); |
+ ASSERT_TRUE(second_extension); |
+ |
+ // Verify state: two actions, in the order of [first, second]. |
+ EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions()); |
+ EXPECT_EQ(first_extension->id(), browser_actions_bar()->GetExtensionId(0)); |
+ EXPECT_EQ(second_extension->id(), browser_actions_bar()->GetExtensionId(1)); |
+ |
+ // Do a little piping to get at the underlying ExtensionActionViewControllers. |
+ ToolbarActionsBar* toolbar_actions_bar = |
+ browser_actions_bar()->GetToolbarActionsBar(); |
+ const std::vector<ToolbarActionViewController*>& toolbar_actions = |
+ toolbar_actions_bar->toolbar_actions(); |
+ ASSERT_EQ(2u, toolbar_actions.size()); |
+ EXPECT_EQ(first_extension->id(), toolbar_actions[0]->GetId()); |
+ EXPECT_EQ(second_extension->id(), toolbar_actions[1]->GetId()); |
+ ExtensionActionViewController* first_controller = |
+ static_cast<ExtensionActionViewController*>(toolbar_actions[0]); |
+ ExtensionActionViewController* second_controller = |
+ static_cast<ExtensionActionViewController*>(toolbar_actions[1]); |
+ |
+ // Neither should yet be showing a popup. |
+ EXPECT_FALSE(browser_actions_bar()->HasPopup()); |
+ EXPECT_FALSE(first_controller->is_showing_popup()); |
+ EXPECT_FALSE(second_controller->is_showing_popup()); |
+ |
+ // Click on the first extension's browser action. This should open a popup. |
+ browser_actions_bar()->Press(0); |
+ EXPECT_TRUE(browser_actions_bar()->HasPopup()); |
+ EXPECT_TRUE(first_controller->is_showing_popup()); |
+ EXPECT_FALSE(second_controller->is_showing_popup()); |
+ |
+ { |
+ content::WindowedNotificationObserver observer( |
+ extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED, |
+ content::NotificationService::AllSources()); |
+ // Clicking on the second extension's browser action should open the |
+ // second's popup. Since we only allow one extension popup at a time, this |
+ // should also close the first popup. |
+ browser_actions_bar()->Press(1); |
+ // Closing an extension popup isn't always synchronous; wait for a |
+ // notification. |
+ observer.Wait(); |
+ EXPECT_TRUE(browser_actions_bar()->HasPopup()); |
+ EXPECT_FALSE(first_controller->is_showing_popup()); |
+ EXPECT_TRUE(second_controller->is_showing_popup()); |
+ } |
+ |
+ { |
+ // Clicking on the second extension's browser action a second time should |
+ // result in closing the popup. |
+ content::WindowedNotificationObserver observer( |
+ extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED, |
+ content::NotificationService::AllSources()); |
+ browser_actions_bar()->Press(1); |
+ observer.Wait(); |
+ EXPECT_FALSE(browser_actions_bar()->HasPopup()); |
+ EXPECT_FALSE(first_controller->is_showing_popup()); |
+ EXPECT_FALSE(second_controller->is_showing_popup()); |
+ } |
+} |