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

Side by Side Diff: chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc

Issue 2630473003: MacViews: Harmony for toolbar actions bubbles. (Closed)
Patch Set: respond to comments Created 3 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/auto_reset.h"
5 #include "base/macros.h" 6 #include "base/macros.h"
6 #include "chrome/browser/ui/extensions/extension_message_bubble_browsertest.h" 7 #include "chrome/browser/ui/extensions/extension_message_bubble_browsertest.h"
7 #include "chrome/browser/ui/toolbar/toolbar_actions_bar.h" 8 #include "chrome/browser/ui/test/test_browser_dialog.h"
8 #include "chrome/browser/ui/views/frame/browser_view.h"
9 #include "chrome/browser/ui/views/toolbar/app_menu_button.h"
10 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
11 #include "chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.h" 9 #include "chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.h"
12 #include "chrome/browser/ui/views/toolbar/toolbar_view.h" 10 #include "ui/base/ui_base_switches.h"
13 #include "ui/views/bubble/bubble_dialog_delegate.h" 11 #include "ui/views/bubble/bubble_dialog_delegate.h"
14 #include "ui/views/controls/link.h" 12 #include "ui/views/controls/link.h"
15 #include "ui/views/controls/link_listener.h" 13 #include "ui/views/controls/link_listener.h"
16 #include "ui/views/window/dialog_client_view.h" 14 #include "ui/views/window/dialog_client_view.h"
17 15
18 namespace { 16 namespace {
19 17
20 // Returns the ToolbarView for the given |browser|. 18 // Checks that the |bubble| is showing. Uses |reference_bounds| to ensure it is
21 ToolbarView* GetToolbarViewForBrowser(Browser* browser) { 19 // in approximately the correct position.
22 return BrowserView::GetBrowserViewForBrowser(browser)->toolbar(); 20 void CheckBubbleAgainstReferenceBounds(views::BubbleDialogDelegateView* bubble,
23 } 21 const gfx::Rect& reference_bounds) {
24
25 ToolbarActionsBarBubbleViews* GetBubbleForBrowser(Browser* browser) {
26 return static_cast<ToolbarActionsBarBubbleViews*>(
27 GetToolbarViewForBrowser(browser)->browser_actions()->active_bubble());
28 }
29
30 // Checks that the |bubble| is using the |expected_reference_view|, and is in
31 // approximately the correct position.
32 void CheckBubbleAndReferenceView(views::BubbleDialogDelegateView* bubble,
33 views::View* expected_reference_view) {
34 ASSERT_TRUE(bubble); 22 ASSERT_TRUE(bubble);
35 ASSERT_TRUE(expected_reference_view);
36 EXPECT_EQ(expected_reference_view, bubble->GetAnchorView());
37 23
38 // Do a rough check that the bubble is in the right place. 24 // Do a rough check that the bubble is in the right place.
39 gfx::Rect bubble_bounds = bubble->GetWidget()->GetWindowBoundsInScreen(); 25 gfx::Rect bubble_bounds = bubble->GetWidget()->GetWindowBoundsInScreen();
40 gfx::Rect reference_bounds = expected_reference_view->GetBoundsInScreen();
41 // It should be below the reference view, but not too far below. 26 // It should be below the reference view, but not too far below.
42 EXPECT_GE(bubble_bounds.y(), reference_bounds.y()); 27 EXPECT_GE(bubble_bounds.y(), reference_bounds.y());
43 // The arrow should be poking into the anchor. 28 // The arrow should be poking into the anchor.
44 const int kShadowWidth = 1; 29 const int kShadowWidth = 1;
45 EXPECT_LE(bubble_bounds.y(), reference_bounds.bottom() + kShadowWidth); 30 EXPECT_LE(bubble_bounds.y(), reference_bounds.bottom() + kShadowWidth);
46 // The bubble should intersect the reference view somewhere along the x-axis. 31 // The bubble should intersect the reference view somewhere along the x-axis.
47 EXPECT_FALSE(bubble_bounds.x() > reference_bounds.right()); 32 EXPECT_FALSE(bubble_bounds.x() > reference_bounds.right());
48 EXPECT_FALSE(reference_bounds.x() > bubble_bounds.right()); 33 EXPECT_FALSE(reference_bounds.x() > bubble_bounds.right());
49 34
50 // And, of course, the bubble should be visible... 35 // And, of course, the bubble should be visible...
51 EXPECT_TRUE(bubble->visible()); 36 EXPECT_TRUE(bubble->visible());
52 // ... as should its Widget. 37 // ... as should its Widget.
53 EXPECT_TRUE(bubble->GetWidget()->IsVisible()); 38 EXPECT_TRUE(bubble->GetWidget()->IsVisible());
54 } 39 }
55 40
56 } // namespace 41 } // namespace
57 42
58 class ExtensionMessageBubbleViewBrowserTest 43 class ExtensionMessageBubbleViewBrowserTest
59 : public ExtensionMessageBubbleBrowserTest { 44 : public SupportsTestDialog<ExtensionMessageBubbleBrowserTest> {
60 protected: 45 protected:
61 ExtensionMessageBubbleViewBrowserTest() {} 46 ExtensionMessageBubbleViewBrowserTest() {}
62 ~ExtensionMessageBubbleViewBrowserTest() override {} 47 ~ExtensionMessageBubbleViewBrowserTest() override {}
63 48
49 // ExtensionMessageBubbleBrowserTest:
50 void SetUpCommandLine(base::CommandLine* command_line) override;
51
52 // TestBrowserDialog:
53 void ShowDialog(const std::string& name) override;
54
64 private: 55 private:
65 // ExtensionMessageBubbleBrowserTest: 56 // ExtensionMessageBubbleBrowserTest:
66 void CheckBubbleNative(Browser* browser, AnchorPosition anchor) override; 57 void CheckBubbleNative(Browser* browser, AnchorPosition anchor) override;
58 void CloseBubble(Browser* browser) override;
67 void CloseBubbleNative(Browser* browser) override; 59 void CloseBubbleNative(Browser* browser) override;
68 void CheckBubbleIsNotPresentNative(Browser* browser) override; 60 void CheckBubbleIsNotPresentNative(Browser* browser) override;
69 void ClickLearnMoreButton(Browser* browser) override; 61 void ClickLearnMoreButton(Browser* browser) override;
70 void ClickActionButton(Browser* browser) override; 62 void ClickActionButton(Browser* browser) override;
71 void ClickDismissButton(Browser* browser) override; 63 void ClickDismissButton(Browser* browser) override;
72 64
65 // Whether to ignore requests from ExtensionMessageBubbleBrowserTest to
66 // CloseBubble().
67 bool block_close_ = false;
68
73 DISALLOW_COPY_AND_ASSIGN(ExtensionMessageBubbleViewBrowserTest); 69 DISALLOW_COPY_AND_ASSIGN(ExtensionMessageBubbleViewBrowserTest);
74 }; 70 };
75 71
76 class ExtensionMessageBubbleViewBrowserTestLegacy 72 class ExtensionMessageBubbleViewBrowserTestLegacy
77 : public ExtensionMessageBubbleViewBrowserTest { 73 : public ExtensionMessageBubbleViewBrowserTest {
78 protected: 74 protected:
79 void SetUpCommandLine(base::CommandLine* command_line) override { 75 void SetUpCommandLine(base::CommandLine* command_line) override {
80 ExtensionMessageBubbleViewBrowserTest::SetUpCommandLine(command_line); 76 ExtensionMessageBubbleViewBrowserTest::SetUpCommandLine(command_line);
81 override_redesign_.reset(); 77 override_redesign_.reset();
82 override_redesign_.reset(new extensions::FeatureSwitch::ScopedOverride( 78 override_redesign_.reset(new extensions::FeatureSwitch::ScopedOverride(
83 extensions::FeatureSwitch::extension_action_redesign(), false)); 79 extensions::FeatureSwitch::extension_action_redesign(), false));
84 } 80 }
85 }; 81 };
86 82
83 void ExtensionMessageBubbleViewBrowserTest::SetUpCommandLine(
84 base::CommandLine* command_line) {
85 ExtensionMessageBubbleBrowserTest::SetUpCommandLine(command_line);
86 // MD is required on Mac to get a Views bubble. On other platforms, it should
87 // not affect the behavior of the bubble (just the appearance), so enable for
88 // all platforms.
89 command_line->AppendSwitch(switches::kExtendMdToSecondaryUi);
90 }
91
92 void ExtensionMessageBubbleViewBrowserTest::ShowDialog(
93 const std::string& name) {
94 // TODO(tapted): Add cases for all bubble types.
95 EXPECT_EQ("devmode_warning", name);
96
97 // When invoked this way, the dialog test harness must close the bubble.
98 base::AutoReset<bool> guard(&block_close_, true);
99 TestBubbleAnchoredToExtensionAction();
100 }
101
87 void ExtensionMessageBubbleViewBrowserTest::CheckBubbleNative( 102 void ExtensionMessageBubbleViewBrowserTest::CheckBubbleNative(
88 Browser* browser, 103 Browser* browser,
89 AnchorPosition anchor) { 104 AnchorPosition anchor) {
90 ToolbarView* toolbar_view = GetToolbarViewForBrowser(browser); 105 gfx::Rect reference_bounds =
91 BrowserActionsContainer* container = toolbar_view->browser_actions(); 106 GetAnchorReferenceBoundsForBrowser(browser, anchor);
92 views::BubbleDialogDelegateView* bubble = container->active_bubble(); 107 CheckBubbleAgainstReferenceBounds(GetViewsBubbleForBrowser(browser),
93 views::View* anchor_view = nullptr; 108 reference_bounds);
94 switch (anchor) { 109 }
95 case ANCHOR_BROWSER_ACTION: 110
96 DCHECK_GT(container->num_toolbar_actions(), 0u); 111 void ExtensionMessageBubbleViewBrowserTest::CloseBubble(Browser* browser) {
97 anchor_view = container->GetToolbarActionViewAt(0); 112 if (!block_close_)
98 break; 113 ExtensionMessageBubbleBrowserTest::CloseBubble(browser);
99 case ANCHOR_APP_MENU:
100 anchor_view = toolbar_view->app_menu_button();
101 break;
102 }
103 CheckBubbleAndReferenceView(bubble, anchor_view);
104 } 114 }
105 115
106 void ExtensionMessageBubbleViewBrowserTest::CloseBubbleNative( 116 void ExtensionMessageBubbleViewBrowserTest::CloseBubbleNative(
107 Browser* browser) { 117 Browser* browser) {
108 BrowserActionsContainer* container = 118 views::BubbleDialogDelegateView* bubble = GetViewsBubbleForBrowser(browser);
109 GetToolbarViewForBrowser(browser)->browser_actions();
110 views::BubbleDialogDelegateView* bubble = container->active_bubble();
111 ASSERT_TRUE(bubble); 119 ASSERT_TRUE(bubble);
112 bubble->GetWidget()->Close(); 120 bubble->GetWidget()->Close();
113 EXPECT_EQ(nullptr, container->active_bubble()); 121 EXPECT_EQ(nullptr, GetViewsBubbleForBrowser(browser));
114 } 122 }
115 123
116 void ExtensionMessageBubbleViewBrowserTest::CheckBubbleIsNotPresentNative( 124 void ExtensionMessageBubbleViewBrowserTest::CheckBubbleIsNotPresentNative(
117 Browser* browser) { 125 Browser* browser) {
118 EXPECT_EQ( 126 EXPECT_EQ(nullptr, GetViewsBubbleForBrowser(browser));
119 nullptr,
120 GetToolbarViewForBrowser(browser)->browser_actions()->active_bubble());
121 } 127 }
122 128
123 void ExtensionMessageBubbleViewBrowserTest::ClickLearnMoreButton( 129 void ExtensionMessageBubbleViewBrowserTest::ClickLearnMoreButton(
124 Browser* browser) { 130 Browser* browser) {
125 ToolbarActionsBarBubbleViews* bubble = GetBubbleForBrowser(browser); 131 ToolbarActionsBarBubbleViews* bubble = GetViewsBubbleForBrowser(browser);
126 static_cast<views::LinkListener*>(bubble)->LinkClicked( 132 static_cast<views::LinkListener*>(bubble)->LinkClicked(
127 const_cast<views::Link*>(bubble->learn_more_button()), 0); 133 const_cast<views::Link*>(bubble->learn_more_button()), 0);
128 } 134 }
129 135
130 void ExtensionMessageBubbleViewBrowserTest::ClickActionButton( 136 void ExtensionMessageBubbleViewBrowserTest::ClickActionButton(
131 Browser* browser) { 137 Browser* browser) {
132 ToolbarActionsBarBubbleViews* bubble = GetBubbleForBrowser(browser); 138 ToolbarActionsBarBubbleViews* bubble = GetViewsBubbleForBrowser(browser);
133 bubble->GetDialogClientView()->AcceptWindow(); 139 bubble->GetDialogClientView()->AcceptWindow();
134 } 140 }
135 141
136 void ExtensionMessageBubbleViewBrowserTest::ClickDismissButton( 142 void ExtensionMessageBubbleViewBrowserTest::ClickDismissButton(
137 Browser* browser) { 143 Browser* browser) {
138 ToolbarActionsBarBubbleViews* bubble = GetBubbleForBrowser(browser); 144 ToolbarActionsBarBubbleViews* bubble = GetViewsBubbleForBrowser(browser);
139 bubble->GetDialogClientView()->CancelWindow(); 145 bubble->GetDialogClientView()->CancelWindow();
140 } 146 }
141 147
142 IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest, 148 IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest,
143 ExtensionBubbleAnchoredToExtensionAction) { 149 ExtensionBubbleAnchoredToExtensionAction) {
144 TestBubbleAnchoredToExtensionAction(); 150 TestBubbleAnchoredToExtensionAction();
145 } 151 }
146 152
147 IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTestLegacy, 153 IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTestLegacy,
148 ExtensionBubbleAnchoredToAppMenu) { 154 ExtensionBubbleAnchoredToAppMenu) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 232
227 IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest, 233 IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest,
228 TestClickingActionButton) { 234 TestClickingActionButton) {
229 TestClickingActionButton(); 235 TestClickingActionButton();
230 } 236 }
231 237
232 IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest, 238 IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest,
233 TestClickingDismissButton) { 239 TestClickingDismissButton) {
234 TestClickingDismissButton(); 240 TestClickingDismissButton();
235 } 241 }
242
243 // BrowserDialogTest for the warning bubble that appears at startup when there
244 // are extensions installed in developer mode. Can be invoked interactively with
245 // --gtest_filter=BrowserDialogTest.Invoke.
246 IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest,
247 InvokeDialog_devmode_warning) {
248 RunDialog();
249 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698