Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4493)

Unified Diff: chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc

Issue 2105393002: [Extensions UI] Handle multiple warning bubbles racing to show (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2743
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc
diff --git a/chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc b/chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc
index 27c3e60e3fcab2f8f76ff6a92c4ecb63c1606648..7599a9adf8950838f8094162f1bcf87a84ebf1da 100644
--- a/chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc
+++ b/chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc
@@ -15,9 +15,15 @@
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/extensions/extension_message_bubble_factory.h"
#include "chrome/browser/ui/location_bar/location_bar.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/toolbar/toolbar_actions_bar.h"
#include "chrome/common/pref_names.h"
+#include "chrome/common/url_constants.h"
+#include "components/omnibox/browser/omnibox_edit_model.h"
#include "components/omnibox/browser/omnibox_view.h"
+#include "content/public/test/browser_test_utils.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/common/extension.h"
#include "extensions/common/feature_switch.h"
#include "extensions/test/extension_test_message_listener.h"
@@ -65,6 +71,34 @@ void ExtensionMessageBubbleBrowserTest::AddSettingsOverrideExtension(
ASSERT_TRUE(LoadExtension(custom_extension_dir_->unpacked_path()));
}
+void ExtensionMessageBubbleBrowserTest::CheckBubble(
+ Browser* browser,
+ AnchorPosition position,
+ bool should_be_highlighting) {
+ EXPECT_EQ(should_be_highlighting, toolbar_model()->is_highlighting());
+ EXPECT_TRUE(toolbar_model()->has_active_bubble());
+ EXPECT_TRUE(browser->window()->GetToolbarActionsBar()->is_showing_bubble());
+ CheckBubbleNative(browser, position);
+}
+
+void ExtensionMessageBubbleBrowserTest::CheckBubbleIsNotPresent(
+ Browser* browser,
+ bool should_profile_have_bubble,
+ bool should_be_highlighting) {
+ // We should never be highlighting without an active bubble.
+ ASSERT_TRUE(!should_be_highlighting || should_profile_have_bubble);
+ EXPECT_EQ(should_be_highlighting, toolbar_model()->is_highlighting());
+ EXPECT_EQ(should_profile_have_bubble, toolbar_model()->has_active_bubble());
+ EXPECT_FALSE(browser->window()->GetToolbarActionsBar()->is_showing_bubble());
+ CheckBubbleIsNotPresentNative(browser);
+}
+
+void ExtensionMessageBubbleBrowserTest::CloseBubble(Browser* browser) {
+ CloseBubbleNative(browser);
+ base::RunLoop().RunUntilIdle();
+ CheckBubbleIsNotPresent(browser, false, false);
+}
+
void ExtensionMessageBubbleBrowserTest::TestBubbleAnchoredToExtensionAction() {
scoped_refptr<const extensions::Extension> action_extension =
extensions::extension_action_test_util::CreateActionExtension(
@@ -76,7 +110,7 @@ void ExtensionMessageBubbleBrowserTest::TestBubbleAnchoredToExtensionAction() {
Browser* second_browser = new Browser(Browser::CreateParams(profile()));
base::RunLoop().RunUntilIdle();
- CheckBubble(second_browser, ANCHOR_BROWSER_ACTION);
+ CheckBubble(second_browser, ANCHOR_BROWSER_ACTION, true);
CloseBubble(second_browser);
}
@@ -89,7 +123,7 @@ void ExtensionMessageBubbleBrowserTest::TestBubbleAnchoredToAppMenu() {
extension_service()->AddExtension(no_action_extension.get());
Browser* second_browser = new Browser(Browser::CreateParams(profile()));
base::RunLoop().RunUntilIdle();
- CheckBubble(second_browser, ANCHOR_APP_MENU);
+ CheckBubble(second_browser, ANCHOR_APP_MENU, false);
CloseBubble(second_browser);
}
@@ -112,7 +146,7 @@ void ExtensionMessageBubbleBrowserTest::
Browser* second_browser = new Browser(Browser::CreateParams(profile()));
base::RunLoop().RunUntilIdle();
- CheckBubble(second_browser, ANCHOR_APP_MENU);
+ CheckBubble(second_browser, ANCHOR_APP_MENU, false);
CloseBubble(second_browser);
}
@@ -136,7 +170,7 @@ void ExtensionMessageBubbleBrowserTest::TestUninstallDangerousExtension() {
extension->id(), extensions::UNINSTALL_REASON_FOR_TESTING,
base::Bind(&base::DoNothing), nullptr);
base::RunLoop().RunUntilIdle();
- CheckBubbleIsNotPresent(second_browser);
+ CheckBubbleIsNotPresent(second_browser, false, false);
}
void ExtensionMessageBubbleBrowserTest::PreBubbleShowsOnStartup() {
@@ -145,7 +179,7 @@ void ExtensionMessageBubbleBrowserTest::PreBubbleShowsOnStartup() {
void ExtensionMessageBubbleBrowserTest::TestBubbleShowsOnStartup() {
base::RunLoop().RunUntilIdle();
- CheckBubble(browser(), ANCHOR_BROWSER_ACTION);
+ CheckBubble(browser(), ANCHOR_BROWSER_ACTION, true);
CloseBubble(browser());
}
@@ -160,24 +194,24 @@ void ExtensionMessageBubbleBrowserTest::TestDevModeBubbleIsntShownTwice() {
Browser* second_browser = new Browser(Browser::CreateParams(profile()));
base::RunLoop().RunUntilIdle();
- CheckBubble(second_browser, ANCHOR_BROWSER_ACTION);
+ CheckBubble(second_browser, ANCHOR_BROWSER_ACTION, true);
CloseBubble(second_browser);
base::RunLoop().RunUntilIdle();
// The bubble was already shown, so it shouldn't be shown again.
Browser* third_browser = new Browser(Browser::CreateParams(profile()));
base::RunLoop().RunUntilIdle();
- CheckBubbleIsNotPresent(third_browser);
+ CheckBubbleIsNotPresent(third_browser, false, false);
}
void ExtensionMessageBubbleBrowserTest::TestControlledNewTabPageBubbleShown() {
ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test")
.AppendASCII("override")
.AppendASCII("newtab")));
- CheckBubbleIsNotPresent(browser());
+ CheckBubbleIsNotPresent(browser(), false, false);
chrome::NewTab(browser());
base::RunLoop().RunUntilIdle();
- CheckBubble(browser(), ANCHOR_BROWSER_ACTION);
+ CheckBubble(browser(), ANCHOR_BROWSER_ACTION, false);
CloseBubble(browser());
}
@@ -187,13 +221,13 @@ void ExtensionMessageBubbleBrowserTest::TestControlledHomeBubbleShown() {
const char kHomePage[] = "'homepage': 'https://www.google.com'\n";
AddSettingsOverrideExtension(kHomePage);
- CheckBubbleIsNotPresent(browser());
+ CheckBubbleIsNotPresent(browser(), false, false);
chrome::ExecuteCommandWithDisposition(browser(),
IDC_HOME, NEW_FOREGROUND_TAB);
base::RunLoop().RunUntilIdle();
- CheckBubble(browser(), ANCHOR_BROWSER_ACTION);
+ CheckBubble(browser(), ANCHOR_BROWSER_ACTION, false);
CloseBubble(browser());
}
@@ -209,7 +243,7 @@ void ExtensionMessageBubbleBrowserTest::TestControlledSearchBubbleShown() {
"}\n";
AddSettingsOverrideExtension(kSearchProvider);
- CheckBubbleIsNotPresent(browser());
+ CheckBubbleIsNotPresent(browser(), false, false);
OmniboxView* omnibox =
browser()->window()->GetLocationBar()->GetOmniboxView();
@@ -219,6 +253,77 @@ void ExtensionMessageBubbleBrowserTest::TestControlledSearchBubbleShown() {
omnibox->model()->AcceptInput(CURRENT_TAB, false);
base::RunLoop().RunUntilIdle();
- CheckBubble(browser(), ANCHOR_BROWSER_ACTION);
+ CheckBubble(browser(), ANCHOR_BROWSER_ACTION, false);
CloseBubble(browser());
}
+
+void ExtensionMessageBubbleBrowserTest::TestBubbleWithMultipleWindows() {
+ CheckBubbleIsNotPresent(browser(), false, false);
+ LoadExtension(test_data_dir_.AppendASCII("good_unpacked"));
+ Browser* second_browser = new Browser(Browser::CreateParams(profile()));
+ Browser* third_browser = new Browser(Browser::CreateParams(profile()));
+ Browser* fourth_browser = new Browser(Browser::CreateParams(profile()));
+ base::RunLoop().RunUntilIdle();
+ CheckBubble(second_browser, ANCHOR_BROWSER_ACTION, true);
+ // Even though the bubble isn't present on these browser windows, highlighting
+ // is per-profile.
+ CheckBubbleIsNotPresent(browser(), true, true);
+ CheckBubbleIsNotPresent(third_browser, true, true);
+ CheckBubbleIsNotPresent(fourth_browser, true, true);
+ CloseBubble(second_browser);
+}
+
+void ExtensionMessageBubbleBrowserTest::TestClickingLearnMoreButton() {
+ CheckBubbleIsNotPresent(browser(), false, false);
+ LoadExtension(test_data_dir_.AppendASCII("good_unpacked"));
+ Browser* second_browser = new Browser(Browser::CreateParams(profile()));
+ base::RunLoop().RunUntilIdle();
+ CheckBubble(second_browser, ANCHOR_BROWSER_ACTION, true);
+ ClickLearnMoreButton(second_browser);
+ base::RunLoop().RunUntilIdle();
+ CheckBubbleIsNotPresent(second_browser, false, false);
+ // The learn more link goes to the chrome://extensions page, so it should be
+ // opened in the active tab.
+ content::WebContents* active_web_contents =
+ second_browser->tab_strip_model()->GetActiveWebContents();
+ content::WaitForLoadStop(active_web_contents);
+ EXPECT_EQ(GURL(chrome::kChromeUIExtensionsURL),
+ active_web_contents->GetLastCommittedURL());
+}
+
+void ExtensionMessageBubbleBrowserTest::TestClickingActionButton() {
+ CheckBubbleIsNotPresent(browser(), false, false);
+ const extensions::Extension* extension =
+ LoadExtension(test_data_dir_.AppendASCII("good_unpacked"));
+ extensions::ExtensionRegistry* registry =
+ extensions::ExtensionRegistry::Get(profile());
+ std::string id = extension->id();
+ EXPECT_TRUE(registry->enabled_extensions().GetByID(id));
+ Browser* second_browser = new Browser(Browser::CreateParams(profile()));
+ base::RunLoop().RunUntilIdle();
+ CheckBubble(second_browser, ANCHOR_BROWSER_ACTION, true);
+ ClickActionButton(second_browser);
+ base::RunLoop().RunUntilIdle();
+ CheckBubbleIsNotPresent(browser(), false, false);
+ // Clicking the action button disabled the extension.
+ EXPECT_FALSE(registry->enabled_extensions().GetByID(id));
+}
+
+void ExtensionMessageBubbleBrowserTest::TestClickingDismissButton() {
+ CheckBubbleIsNotPresent(browser(), false, false);
+ const extensions::Extension* extension =
+ LoadExtension(test_data_dir_.AppendASCII("good_unpacked"));
+ extensions::ExtensionRegistry* registry =
+ extensions::ExtensionRegistry::Get(profile());
+ std::string id = extension->id();
+ EXPECT_TRUE(registry->enabled_extensions().GetByID(id));
+ Browser* second_browser = new Browser(Browser::CreateParams(profile()));
+ base::RunLoop().RunUntilIdle();
+ CheckBubble(second_browser, ANCHOR_BROWSER_ACTION, true);
+ ClickDismissButton(second_browser);
+ base::RunLoop().RunUntilIdle();
+ CheckBubbleIsNotPresent(browser(), false, false);
+ // Clicking dismiss should have no affect, so the extension should still be
+ // active.
+ EXPECT_TRUE(registry->enabled_extensions().GetByID(id));
+}

Powered by Google App Engine
This is Rietveld 408576698