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

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/macros.h" 5 #include "base/macros.h"
6 #include "chrome/browser/ui/extensions/extension_message_bubble_browsertest.h" 6 #include "chrome/browser/ui/extensions/extension_message_bubble_browsertest.h"
7 #include "chrome/browser/ui/toolbar/toolbar_actions_bar.h" 7 #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" 8 #include "chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.h"
12 #include "chrome/browser/ui/views/toolbar/toolbar_view.h" 9 #include "ui/base/ui_base_switches.h"
13 #include "ui/views/bubble/bubble_dialog_delegate.h" 10 #include "ui/views/bubble/bubble_dialog_delegate.h"
14 #include "ui/views/controls/link.h" 11 #include "ui/views/controls/link.h"
15 #include "ui/views/controls/link_listener.h" 12 #include "ui/views/controls/link_listener.h"
16 #include "ui/views/window/dialog_client_view.h" 13 #include "ui/views/window/dialog_client_view.h"
17 14
18 namespace { 15 namespace {
19 16
20 // Returns the ToolbarView for the given |browser|. 17 // Checks that the |bubble| is showing. Uses |reference_bounds| to ensure it is
21 ToolbarView* GetToolbarViewForBrowser(Browser* browser) { 18 // in approximately the correct position.
22 return BrowserView::GetBrowserViewForBrowser(browser)->toolbar(); 19 void CheckBubbleAgainstReferenceBounds(views::BubbleDialogDelegateView* bubble,
23 } 20 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); 21 ASSERT_TRUE(bubble);
35 ASSERT_TRUE(expected_reference_view);
36 EXPECT_EQ(expected_reference_view, bubble->GetAnchorView());
37 22
38 // Do a rough check that the bubble is in the right place. 23 // Do a rough check that the bubble is in the right place.
39 gfx::Rect bubble_bounds = bubble->GetWidget()->GetWindowBoundsInScreen(); 24 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. 25 // It should be below the reference view, but not too far below.
42 EXPECT_GE(bubble_bounds.y(), reference_bounds.y()); 26 EXPECT_GE(bubble_bounds.y(), reference_bounds.y());
43 // The arrow should be poking into the anchor. 27 // The arrow should be poking into the anchor.
44 const int kShadowWidth = 1; 28 const int kShadowWidth = 1;
45 EXPECT_LE(bubble_bounds.y(), reference_bounds.bottom() + kShadowWidth); 29 EXPECT_LE(bubble_bounds.y(), reference_bounds.bottom() + kShadowWidth);
46 // The bubble should intersect the reference view somewhere along the x-axis. 30 // The bubble should intersect the reference view somewhere along the x-axis.
47 EXPECT_FALSE(bubble_bounds.x() > reference_bounds.right()); 31 EXPECT_FALSE(bubble_bounds.x() > reference_bounds.right());
48 EXPECT_FALSE(reference_bounds.x() > bubble_bounds.right()); 32 EXPECT_FALSE(reference_bounds.x() > bubble_bounds.right());
49 33
50 // And, of course, the bubble should be visible... 34 // And, of course, the bubble should be visible...
51 EXPECT_TRUE(bubble->visible()); 35 EXPECT_TRUE(bubble->visible());
52 // ... as should its Widget. 36 // ... as should its Widget.
53 EXPECT_TRUE(bubble->GetWidget()->IsVisible()); 37 EXPECT_TRUE(bubble->GetWidget()->IsVisible());
54 } 38 }
55 39
56 } // namespace 40 } // namespace
57 41
58 class ExtensionMessageBubbleViewBrowserTest 42 class ExtensionMessageBubbleViewBrowserTest
59 : public ExtensionMessageBubbleBrowserTest { 43 : public SupportsTestDialog<ExtensionMessageBubbleBrowserTest> {
60 protected: 44 protected:
61 ExtensionMessageBubbleViewBrowserTest() {} 45 ExtensionMessageBubbleViewBrowserTest() {}
62 ~ExtensionMessageBubbleViewBrowserTest() override {} 46 ~ExtensionMessageBubbleViewBrowserTest() override {}
63 47
48 // ExtensionMessageBubbleBrowserTest:
49 void SetUpCommandLine(base::CommandLine* command_line) override;
50
51 // TestBrowserDialog:
52 void ShowDialog(const std::string& name) override;
53
64 private: 54 private:
65 // ExtensionMessageBubbleBrowserTest: 55 // ExtensionMessageBubbleBrowserTest:
56 void CloseBubble(Browser* browser) override;
Peter Kasting 2017/03/10 08:29:54 Nit: Goes after CheckBubbleNative() (match base cl
tapted 2017/03/13 06:04:57 Done.
66 void CheckBubbleNative(Browser* browser, AnchorPosition anchor) override; 57 void CheckBubbleNative(Browser* browser, AnchorPosition anchor) override;
67 void CloseBubbleNative(Browser* browser) override; 58 void CloseBubbleNative(Browser* browser) override;
68 void CheckBubbleIsNotPresentNative(Browser* browser) override; 59 void CheckBubbleIsNotPresentNative(Browser* browser) override;
69 void ClickLearnMoreButton(Browser* browser) override; 60 void ClickLearnMoreButton(Browser* browser) override;
70 void ClickActionButton(Browser* browser) override; 61 void ClickActionButton(Browser* browser) override;
71 void ClickDismissButton(Browser* browser) override; 62 void ClickDismissButton(Browser* browser) override;
72 63
64 // Whether to ignore requests from ExtensionMessageBubbleBrowserTest to
65 // CloseBubble().
66 bool block_close_ = false;
67
73 DISALLOW_COPY_AND_ASSIGN(ExtensionMessageBubbleViewBrowserTest); 68 DISALLOW_COPY_AND_ASSIGN(ExtensionMessageBubbleViewBrowserTest);
74 }; 69 };
75 70
76 class ExtensionMessageBubbleViewBrowserTestLegacy 71 class ExtensionMessageBubbleViewBrowserTestLegacy
77 : public ExtensionMessageBubbleViewBrowserTest { 72 : public ExtensionMessageBubbleViewBrowserTest {
78 protected: 73 protected:
79 void SetUpCommandLine(base::CommandLine* command_line) override { 74 void SetUpCommandLine(base::CommandLine* command_line) override {
80 ExtensionMessageBubbleViewBrowserTest::SetUpCommandLine(command_line); 75 ExtensionMessageBubbleViewBrowserTest::SetUpCommandLine(command_line);
81 override_redesign_.reset(); 76 override_redesign_.reset();
82 override_redesign_.reset(new extensions::FeatureSwitch::ScopedOverride( 77 override_redesign_.reset(new extensions::FeatureSwitch::ScopedOverride(
83 extensions::FeatureSwitch::extension_action_redesign(), false)); 78 extensions::FeatureSwitch::extension_action_redesign(), false));
84 } 79 }
85 }; 80 };
86 81
82 void ExtensionMessageBubbleViewBrowserTest::SetUpCommandLine(
83 base::CommandLine* command_line) {
84 ExtensionMessageBubbleBrowserTest::SetUpCommandLine(command_line);
85 // MD is required on Mac to get a Views bubble. On other platforms, it should
86 // not affect the behavior of the bubble (just the appearance), so enable for
87 // all platforms.
88 command_line->AppendSwitch(switches::kExtendMdToSecondaryUi);
89 }
90
91 void ExtensionMessageBubbleViewBrowserTest::ShowDialog(
92 const std::string& name) {
93 // TODO(tapted): Add cases for all bubble types.
94 EXPECT_EQ("devmode_warning", name);
95
96 // When invoked this way, the dialog test harness must close the bubble.
97 block_close_ = true;
Peter Kasting 2017/03/10 08:29:54 Nit: Use base::AutoReset<> rather than manually to
tapted 2017/03/13 06:04:57 Done.
98 TestBubbleAnchoredToExtensionAction();
99 block_close_ = false;
100 }
101
102 void ExtensionMessageBubbleViewBrowserTest::CloseBubble(Browser* browser) {
103 if (!block_close_)
104 ExtensionMessageBubbleBrowserTest::CloseBubble(browser);
105 }
106
87 void ExtensionMessageBubbleViewBrowserTest::CheckBubbleNative( 107 void ExtensionMessageBubbleViewBrowserTest::CheckBubbleNative(
88 Browser* browser, 108 Browser* browser,
89 AnchorPosition anchor) { 109 AnchorPosition anchor) {
90 ToolbarView* toolbar_view = GetToolbarViewForBrowser(browser); 110 gfx::Rect reference_bounds =
91 BrowserActionsContainer* container = toolbar_view->browser_actions(); 111 GetAnchorReferenceBoundsForBrowser(browser, anchor);
92 views::BubbleDialogDelegateView* bubble = container->active_bubble(); 112 CheckBubbleAgainstReferenceBounds(GetViewsBubbleForBrowser(browser),
93 views::View* anchor_view = nullptr; 113 reference_bounds);
94 switch (anchor) {
95 case ANCHOR_BROWSER_ACTION:
96 DCHECK_GT(container->num_toolbar_actions(), 0u);
97 anchor_view = container->GetToolbarActionViewAt(0);
98 break;
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