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

Side by Side Diff: chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc

Issue 2410553002: Show Media Router toolbar icon ephemerally for MR dialogs (Closed)
Patch Set: Address Mike's comments Created 4 years, 1 month 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/bind.h" 5 #include "base/bind.h"
6 #include "base/threading/thread_task_runner_handle.h" 6 #include "base/threading/thread_task_runner_handle.h"
7 #include "chrome/browser/extensions/browser_action_test_util.h" 7 #include "chrome/browser/extensions/browser_action_test_util.h"
8 #include "chrome/browser/media/router/media_router_ui_service.h" 8 #include "chrome/browser/media/router/media_router_ui_service.h"
9 #include "chrome/browser/ui/browser.h" 9 #include "chrome/browser/ui/browser.h"
10 #include "chrome/browser/ui/browser_commands.h" 10 #include "chrome/browser/ui/browser_commands.h"
11 #include "chrome/browser/ui/tabs/tab_strip_model.h" 11 #include "chrome/browser/ui/tabs/tab_strip_model.h"
12 #include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h" 12 #include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h"
13 #include "chrome/browser/ui/toolbar/media_router_action.h" 13 #include "chrome/browser/ui/toolbar/media_router_action.h"
14 #include "chrome/browser/ui/toolbar/media_router_action_controller.h" 14 #include "chrome/browser/ui/toolbar/media_router_action_controller.h"
15 #include "chrome/browser/ui/toolbar/toolbar_action_view_delegate.h" 15 #include "chrome/browser/ui/toolbar/toolbar_action_view_delegate.h"
16 #include "chrome/browser/ui/views/frame/browser_view.h" 16 #include "chrome/browser/ui/views/frame/browser_view.h"
17 #include "chrome/browser/ui/views/toolbar/app_menu_button.h" 17 #include "chrome/browser/ui/views/toolbar/app_menu_button.h"
18 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h" 18 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
19 #include "chrome/browser/ui/views/toolbar/toolbar_action_view.h" 19 #include "chrome/browser/ui/views/toolbar/toolbar_action_view.h"
20 #include "chrome/browser/ui/views/toolbar/toolbar_view.h" 20 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
21 #include "chrome/browser/ui/webui/media_router/media_router_dialog_controller_im pl.h"
21 #include "chrome/common/url_constants.h" 22 #include "chrome/common/url_constants.h"
22 #include "chrome/test/base/in_process_browser_test.h" 23 #include "chrome/test/base/in_process_browser_test.h"
23 #include "chrome/test/base/ui_test_utils.h" 24 #include "chrome/test/base/ui_test_utils.h"
24 #include "content/public/browser/web_contents.h" 25 #include "content/public/browser/web_contents.h"
25 #include "content/public/test/test_navigation_observer.h" 26 #include "content/public/test/test_navigation_observer.h"
26 #include "content/public/test/test_utils.h" 27 #include "content/public/test/test_utils.h"
27 #include "ui/views/widget/widget.h" 28 #include "ui/views/widget/widget.h"
28 29
29 namespace media_router { 30 namespace media_router {
30 31
31 class MediaRouterUIBrowserTest : public InProcessBrowserTest { 32 class MediaRouterUIBrowserTest : public InProcessBrowserTest {
32 public: 33 public:
33 MediaRouterUIBrowserTest() {} 34 MediaRouterUIBrowserTest() {}
34 ~MediaRouterUIBrowserTest() override {} 35 ~MediaRouterUIBrowserTest() override {}
35 36
36 void SetUpOnMainThread() override { 37 void SetUpOnMainThread() override {
37 InProcessBrowserTest::SetUpOnMainThread(); 38 InProcessBrowserTest::SetUpOnMainThread();
38 39
39 BrowserActionsContainer* browser_actions_container = 40 BrowserActionsContainer* browser_actions_container =
40 BrowserView::GetBrowserViewForBrowser(browser()) 41 BrowserView::GetBrowserViewForBrowser(browser())
41 ->toolbar() 42 ->toolbar()
42 ->browser_actions(); 43 ->browser_actions();
43 ASSERT_TRUE(browser_actions_container); 44 ASSERT_TRUE(browser_actions_container);
44 45 toolbar_actions_bar_ = browser_actions_container->toolbar_actions_bar();
45 browser_action_test_util_.reset(new BrowserActionTestUtil(browser(),
46 false));
47 media_router_action_.reset(new MediaRouterAction(browser(),
48 browser_action_test_util_->GetToolbarActionsBar()));
49
50 toolbar_action_view_widget_ = new views::Widget();
51 views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
52 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
53 toolbar_action_view_widget_->Init(params);
54 toolbar_action_view_widget_->Show();
55
56 // Sets delegate on |media_router_action_|.
57 toolbar_action_view_ = new ToolbarActionView(media_router_action_.get(),
58 browser_actions_container);
59 toolbar_action_view_widget_->SetContentsView(toolbar_action_view_);
60 46
61 action_controller_ = 47 action_controller_ =
62 &MediaRouterUIService::Get(browser()->profile())->action_controller_; 48 MediaRouterUIService::Get(browser()->profile())->action_controller();
63 49
64 issue_.reset(new Issue( 50 issue_.reset(new Issue(
65 "title notification", "message notification", 51 "title notification", "message notification",
66 media_router::IssueAction(media_router::IssueAction::TYPE_DISMISS), 52 media_router::IssueAction(media_router::IssueAction::TYPE_DISMISS),
67 std::vector<media_router::IssueAction>(), "route_id", 53 std::vector<media_router::IssueAction>(), "route_id",
68 media_router::Issue::NOTIFICATION, false, -1)); 54 media_router::Issue::NOTIFICATION, false, -1));
69 55
70 routes_ = {MediaRoute("routeId1", MediaSource("sourceId"), "sinkId1", 56 routes_ = {MediaRoute("routeId1", MediaSource("sourceId"), "sinkId1",
71 "description", true, std::string(), true)}; 57 "description", true, std::string(), true)};
72 } 58 }
73 59
74 void TearDownOnMainThread() override {
75 toolbar_action_view_widget_->Close();
76 media_router_action_.reset();
77 browser_action_test_util_.reset();
78 InProcessBrowserTest::TearDownOnMainThread();
79 }
80
81 void OpenMediaRouterDialogAndWaitForNewWebContents() { 60 void OpenMediaRouterDialogAndWaitForNewWebContents() {
82 content::TestNavigationObserver nav_observer(NULL); 61 content::TestNavigationObserver nav_observer(NULL);
83 nav_observer.StartWatchingNewWebContents(); 62 nav_observer.StartWatchingNewWebContents();
84 63
85 AppMenuButton* app_menu_button = 64 AppMenuButton* app_menu_button =
86 BrowserView::GetBrowserViewForBrowser(browser()) 65 BrowserView::GetBrowserViewForBrowser(browser())
87 ->toolbar() 66 ->toolbar()
88 ->app_menu_button(); 67 ->app_menu_button();
89 68
90 // When the Media Router Action executes, it opens a dialog with web 69 // When the Media Router Action executes, it opens a dialog with web
91 // contents to chrome://media-router. 70 // contents to chrome://media-router.
92 base::ThreadTaskRunnerHandle::Get()->PostTask( 71 base::ThreadTaskRunnerHandle::Get()->PostTask(
93 FROM_HERE, 72 FROM_HERE,
94 base::Bind(&MediaRouterUIBrowserTest::ExecuteMediaRouterAction, 73 base::Bind(&MediaRouterUIBrowserTest::ExecuteMediaRouterAction,
95 base::Unretained(this), app_menu_button)); 74 base::Unretained(this), app_menu_button));
96 app_menu_button->ShowMenu(false); 75 app_menu_button->ShowMenu(false);
97 76
98 nav_observer.Wait(); 77 nav_observer.Wait();
99 EXPECT_FALSE(app_menu_button->IsMenuShowing()); 78 EXPECT_FALSE(app_menu_button->IsMenuShowing());
100 ASSERT_EQ(chrome::kChromeUIMediaRouterURL, 79 ASSERT_EQ(chrome::kChromeUIMediaRouterURL,
101 nav_observer.last_navigation_url().spec()); 80 nav_observer.last_navigation_url().spec());
102 nav_observer.StopWatchingNewWebContents(); 81 nav_observer.StopWatchingNewWebContents();
103 } 82 }
104 83
84 MediaRouterAction* GetMediaRouterAction() {
85 return MediaRouterDialogControllerImpl::GetOrCreateForWebContents(
86 browser()->tab_strip_model()->GetActiveWebContents())
87 ->action();
88 }
89
105 void ExecuteMediaRouterAction(AppMenuButton* app_menu_button) { 90 void ExecuteMediaRouterAction(AppMenuButton* app_menu_button) {
106 EXPECT_TRUE(app_menu_button->IsMenuShowing()); 91 EXPECT_TRUE(app_menu_button->IsMenuShowing());
107 media_router_action_->ExecuteAction(true); 92 GetMediaRouterAction()->ExecuteAction(true);
108 } 93 }
109 94
110 bool ActionExists() { 95 bool ActionExists() {
111 return ToolbarActionsModel::Get(browser()->profile()) 96 return ToolbarActionsModel::Get(browser()->profile())
112 ->HasComponentAction( 97 ->HasComponentAction(
113 ComponentToolbarActionsFactory::kMediaRouterActionId); 98 ComponentToolbarActionsFactory::kMediaRouterActionId);
114 } 99 }
115 100
116 void SetAlwaysShowActionPref(bool always_show) { 101 void SetAlwaysShowActionPref(bool always_show) {
117 return ToolbarActionsModel::Get(browser()->profile()) 102 return ToolbarActionsModel::Get(browser()->profile())
118 ->component_migration_helper() 103 ->component_migration_helper()
119 ->SetComponentActionPref( 104 ->SetComponentActionPref(
120 ComponentToolbarActionsFactory::kMediaRouterActionId, always_show); 105 ComponentToolbarActionsFactory::kMediaRouterActionId, always_show);
121 } 106 }
122 107
123 protected: 108 protected:
124 // Must be initialized after |InProcessBrowserTest::SetUpOnMainThread|. 109 ToolbarActionsBar* toolbar_actions_bar_ = nullptr;
125 std::unique_ptr<BrowserActionTestUtil> browser_action_test_util_;
126 std::unique_ptr<MediaRouterAction> media_router_action_;
127
128 // ToolbarActionView constructed to set the delegate on
129 // |media_router_action_|.
130 ToolbarActionView* toolbar_action_view_ = nullptr;
131
132 // Hosts the |toolbar_action_view_|.
133 views::Widget* toolbar_action_view_widget_ = nullptr;
134 110
135 std::unique_ptr<Issue> issue_; 111 std::unique_ptr<Issue> issue_;
136 112
137 // A vector of MediaRoutes that includes a local route. 113 // A vector of MediaRoutes that includes a local route.
138 std::vector<MediaRoute> routes_; 114 std::vector<MediaRoute> routes_;
139 115
140 MediaRouterActionController* action_controller_ = nullptr; 116 MediaRouterActionController* action_controller_ = nullptr;
141 }; 117 };
142 118
143 // TODO(crbug.com/658005): Fails on multiple platforms. 119 // TODO(crbug.com/658005): Fails on multiple platforms.
144 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest, 120 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest,
145 DISABLED_OpenDialogWithMediaRouterAction) { 121 DISABLED_OpenDialogWithMediaRouterAction) {
146 // We start off at about:blank page. 122 // We start off at about:blank page.
147 // Make sure there is 1 tab and media router is enabled. 123 // Make sure there is 1 tab and media router is enabled.
148 ASSERT_EQ(1, browser()->tab_strip_model()->count()); 124 ASSERT_EQ(1, browser()->tab_strip_model()->count());
149 125
126 SetAlwaysShowActionPref(true);
127 EXPECT_TRUE(ActionExists());
128
150 OpenMediaRouterDialogAndWaitForNewWebContents(); 129 OpenMediaRouterDialogAndWaitForNewWebContents();
151 130
152 // Reload the browser and wait. 131 // Reload the browser and wait.
153 content::TestNavigationObserver reload_observer( 132 content::TestNavigationObserver reload_observer(
154 browser()->tab_strip_model()->GetActiveWebContents()); 133 browser()->tab_strip_model()->GetActiveWebContents());
155 chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); 134 chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
156 reload_observer.Wait(); 135 reload_observer.Wait();
157 136
158 // The reload should have removed the previously created dialog. 137 // The reload should have removed the previously created dialog.
159 // We expect a new dialog WebContents to be created by calling this. 138 // We expect a new dialog WebContents to be created by calling this.
160 OpenMediaRouterDialogAndWaitForNewWebContents(); 139 OpenMediaRouterDialogAndWaitForNewWebContents();
161 140
162 // Navigate away. 141 // Navigate away.
163 ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); 142 ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
164 143
165 // The navigation should have removed the previously created dialog. 144 // The navigation should have removed the previously created dialog.
166 // We expect a new dialog WebContents to be created by calling this. 145 // We expect a new dialog WebContents to be created by calling this.
167 OpenMediaRouterDialogAndWaitForNewWebContents(); 146 OpenMediaRouterDialogAndWaitForNewWebContents();
147
148 SetAlwaysShowActionPref(false);
168 } 149 }
169 150
170 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest, EphemeralToolbarIcon) { 151 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest,
152 EphemeralToolbarIconForRoutesAndIssues) {
171 action_controller_->OnIssueUpdated(issue_.get()); 153 action_controller_->OnIssueUpdated(issue_.get());
172 EXPECT_TRUE(ActionExists()); 154 EXPECT_TRUE(ActionExists());
173 action_controller_->OnIssueUpdated(nullptr); 155 action_controller_->OnIssueUpdated(nullptr);
174 EXPECT_FALSE(ActionExists()); 156 EXPECT_FALSE(ActionExists());
175 157
176 action_controller_->OnRoutesUpdated(routes_, std::vector<MediaRoute::Id>()); 158 action_controller_->OnRoutesUpdated(routes_, std::vector<MediaRoute::Id>());
177 EXPECT_TRUE(ActionExists()); 159 EXPECT_TRUE(ActionExists());
178 action_controller_->OnRoutesUpdated(std::vector<MediaRoute>(), 160 action_controller_->OnRoutesUpdated(std::vector<MediaRoute>(),
179 std::vector<MediaRoute::Id>()); 161 std::vector<MediaRoute::Id>());
180 EXPECT_FALSE(ActionExists()); 162 EXPECT_FALSE(ActionExists());
181 163
182 SetAlwaysShowActionPref(true); 164 SetAlwaysShowActionPref(true);
183 EXPECT_TRUE(ActionExists()); 165 EXPECT_TRUE(ActionExists());
184 SetAlwaysShowActionPref(false); 166 SetAlwaysShowActionPref(false);
185 EXPECT_FALSE(ActionExists()); 167 EXPECT_FALSE(ActionExists());
186 } 168 }
187 169
188 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest, 170 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest,
171 EphemeralToolbarIconForDialog) {
172 MediaRouterDialogController* dialog_controller =
173 MediaRouterDialogController::GetOrCreateForWebContents(
174 browser()->tab_strip_model()->GetActiveWebContents());
175
176 EXPECT_FALSE(ActionExists());
177 dialog_controller->ShowMediaRouterDialog();
178 EXPECT_TRUE(ActionExists());
179 dialog_controller->HideMediaRouterDialog();
180 EXPECT_FALSE(ActionExists());
181
182 dialog_controller->ShowMediaRouterDialog();
183 EXPECT_TRUE(ActionExists());
184 // Clicking on the toolbar icon should hide both the dialog and the icon.
185 GetMediaRouterAction()->ExecuteAction(true);
186 EXPECT_FALSE(dialog_controller->IsShowingMediaRouterDialog());
187 EXPECT_FALSE(ActionExists());
188
189 dialog_controller->ShowMediaRouterDialog();
190 SetAlwaysShowActionPref(true);
191 // When the pref is set to true, hiding the dialog shouldn't hide the icon.
192 dialog_controller->HideMediaRouterDialog();
193 EXPECT_TRUE(ActionExists());
194 dialog_controller->ShowMediaRouterDialog();
195 // While the dialog is showing, setting the pref to false shouldn't hide the
196 // icon.
197 SetAlwaysShowActionPref(false);
198 EXPECT_TRUE(ActionExists());
199 dialog_controller->HideMediaRouterDialog();
200 EXPECT_FALSE(ActionExists());
201 }
202
203 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest,
189 EphemeralToolbarIconWithMultipleWindows) { 204 EphemeralToolbarIconWithMultipleWindows) {
190 action_controller_->OnRoutesUpdated(routes_, std::vector<MediaRoute::Id>()); 205 action_controller_->OnRoutesUpdated(routes_, std::vector<MediaRoute::Id>());
191 EXPECT_TRUE(ActionExists()); 206 EXPECT_TRUE(ActionExists());
192 207
193 // Opening and closing a window shouldn't affect the state of the ephemeral 208 // Opening and closing a window shouldn't affect the state of the ephemeral
194 // icon. Creating and removing the icon with multiple windows open should also 209 // icon. Creating and removing the icon with multiple windows open should also
195 // work. 210 // work.
196 Browser* browser2 = CreateBrowser(browser()->profile()); 211 Browser* browser2 = CreateBrowser(browser()->profile());
197 EXPECT_TRUE(ActionExists()); 212 EXPECT_TRUE(ActionExists());
198 action_controller_->OnRoutesUpdated(std::vector<MediaRoute>(), 213 action_controller_->OnRoutesUpdated(std::vector<MediaRoute>(),
199 std::vector<MediaRoute::Id>()); 214 std::vector<MediaRoute::Id>());
200 EXPECT_FALSE(ActionExists()); 215 EXPECT_FALSE(ActionExists());
201 action_controller_->OnRoutesUpdated(routes_, std::vector<MediaRoute::Id>()); 216 action_controller_->OnRoutesUpdated(routes_, std::vector<MediaRoute::Id>());
202 EXPECT_TRUE(ActionExists()); 217 EXPECT_TRUE(ActionExists());
203 browser2->window()->Close(); 218 browser2->window()->Close();
204 EXPECT_TRUE(ActionExists()); 219 EXPECT_TRUE(ActionExists());
205 } 220 }
206 221
207 } // namespace media_router 222 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698