OLD | NEW |
---|---|
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 Loading... | |
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 } | |
OLD | NEW |