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

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: Deleted the first patch set on accident, responded to Mark's comments inline below Created 4 years, 2 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/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 for (auto* action : toolbar_actions_bar_->GetActions()) {
86 if (action->GetId() ==
87 ComponentToolbarActionsFactory::kMediaRouterActionId) {
88 return static_cast<MediaRouterAction*>(action);
89 }
90 }
91 NOTREACHED();
92 return nullptr;
93 }
94
105 void ExecuteMediaRouterAction(AppMenuButton* app_menu_button) { 95 void ExecuteMediaRouterAction(AppMenuButton* app_menu_button) {
106 EXPECT_TRUE(app_menu_button->IsMenuShowing()); 96 EXPECT_TRUE(app_menu_button->IsMenuShowing());
107 media_router_action_->ExecuteAction(true); 97 GetMediaRouterAction()->ExecuteAction(true);
108 } 98 }
109 99
110 bool ActionExists() { 100 bool ActionExists() {
111 return ToolbarActionsModel::Get(browser()->profile()) 101 return ToolbarActionsModel::Get(browser()->profile())
112 ->HasComponentAction( 102 ->HasComponentAction(
113 ComponentToolbarActionsFactory::kMediaRouterActionId); 103 ComponentToolbarActionsFactory::kMediaRouterActionId);
114 } 104 }
115 105
116 void SetAlwaysShowActionPref(bool always_show) { 106 void SetAlwaysShowActionPref(bool always_show) {
117 return ToolbarActionsModel::Get(browser()->profile()) 107 return ToolbarActionsModel::Get(browser()->profile())
118 ->component_migration_helper() 108 ->component_migration_helper()
119 ->SetComponentActionPref( 109 ->SetComponentActionPref(
120 ComponentToolbarActionsFactory::kMediaRouterActionId, always_show); 110 ComponentToolbarActionsFactory::kMediaRouterActionId, always_show);
121 } 111 }
122 112
123 protected: 113 protected:
124 // Must be initialized after |InProcessBrowserTest::SetUpOnMainThread|. 114 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 115
135 std::unique_ptr<Issue> issue_; 116 std::unique_ptr<Issue> issue_;
136 117
137 // A vector of MediaRoutes that includes a local route. 118 // A vector of MediaRoutes that includes a local route.
138 std::vector<MediaRoute> routes_; 119 std::vector<MediaRoute> routes_;
139 120
140 MediaRouterActionController* action_controller_ = nullptr; 121 MediaRouterActionController* action_controller_ = nullptr;
141 }; 122 };
142 123
143 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest, 124 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest,
144 OpenDialogWithMediaRouterAction) { 125 OpenDialogWithMediaRouterAction) {
145 // We start off at about:blank page. 126 // We start off at about:blank page.
146 // Make sure there is 1 tab and media router is enabled. 127 // Make sure there is 1 tab and media router is enabled.
147 ASSERT_EQ(1, browser()->tab_strip_model()->count()); 128 ASSERT_EQ(1, browser()->tab_strip_model()->count());
148 129
130 SetAlwaysShowActionPref(true);
131 EXPECT_TRUE(ActionExists());
132
149 OpenMediaRouterDialogAndWaitForNewWebContents(); 133 OpenMediaRouterDialogAndWaitForNewWebContents();
150 134
151 // Reload the browser and wait. 135 // Reload the browser and wait.
152 content::TestNavigationObserver reload_observer( 136 content::TestNavigationObserver reload_observer(
153 browser()->tab_strip_model()->GetActiveWebContents()); 137 browser()->tab_strip_model()->GetActiveWebContents());
154 chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); 138 chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
155 reload_observer.Wait(); 139 reload_observer.Wait();
156 140
157 // The reload should have removed the previously created dialog. 141 // The reload should have removed the previously created dialog.
158 // We expect a new dialog WebContents to be created by calling this. 142 // We expect a new dialog WebContents to be created by calling this.
159 OpenMediaRouterDialogAndWaitForNewWebContents(); 143 OpenMediaRouterDialogAndWaitForNewWebContents();
160 144
161 // Navigate away. 145 // Navigate away.
162 ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); 146 ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
163 147
164 // The navigation should have removed the previously created dialog. 148 // The navigation should have removed the previously created dialog.
165 // We expect a new dialog WebContents to be created by calling this. 149 // We expect a new dialog WebContents to be created by calling this.
166 OpenMediaRouterDialogAndWaitForNewWebContents(); 150 OpenMediaRouterDialogAndWaitForNewWebContents();
151
152 SetAlwaysShowActionPref(false);
167 } 153 }
168 154
169 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest, EphemeralToolbarIcon) { 155 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest,
156 EphemeralToolbarIconForRoutesAndIssues) {
170 action_controller_->OnIssueUpdated(issue_.get()); 157 action_controller_->OnIssueUpdated(issue_.get());
171 EXPECT_TRUE(ActionExists()); 158 EXPECT_TRUE(ActionExists());
172 action_controller_->OnIssueUpdated(nullptr); 159 action_controller_->OnIssueUpdated(nullptr);
173 EXPECT_FALSE(ActionExists()); 160 EXPECT_FALSE(ActionExists());
174 161
175 action_controller_->OnRoutesUpdated(routes_, std::vector<MediaRoute::Id>()); 162 action_controller_->OnRoutesUpdated(routes_, std::vector<MediaRoute::Id>());
176 EXPECT_TRUE(ActionExists()); 163 EXPECT_TRUE(ActionExists());
177 action_controller_->OnRoutesUpdated(std::vector<MediaRoute>(), 164 action_controller_->OnRoutesUpdated(std::vector<MediaRoute>(),
178 std::vector<MediaRoute::Id>()); 165 std::vector<MediaRoute::Id>());
179 EXPECT_FALSE(ActionExists()); 166 EXPECT_FALSE(ActionExists());
180 167
181 SetAlwaysShowActionPref(true); 168 SetAlwaysShowActionPref(true);
182 EXPECT_TRUE(ActionExists()); 169 EXPECT_TRUE(ActionExists());
183 SetAlwaysShowActionPref(false); 170 SetAlwaysShowActionPref(false);
184 EXPECT_FALSE(ActionExists()); 171 EXPECT_FALSE(ActionExists());
185 } 172 }
186 173
187 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest, 174 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest,
175 EphemeralToolbarIconForDialog) {
176 MediaRouterDialogControllerImpl* dialog_controller =
177 MediaRouterDialogControllerImpl::GetOrCreateForWebContents(
178 browser()->tab_strip_model()->GetActiveWebContents());
179
180 dialog_controller->ShowMediaRouterDialog();
181 EXPECT_TRUE(ActionExists());
182 dialog_controller->HideMediaRouterDialog();
183 EXPECT_FALSE(ActionExists());
184
185 dialog_controller->ShowMediaRouterDialog();
186 EXPECT_TRUE(ActionExists());
187 // Clicking on the toolbar icon should hide both the dialog and the icon.
188 GetMediaRouterAction()->ExecuteAction(true);
189 EXPECT_FALSE(dialog_controller->IsShowingMediaRouterDialog());
190 EXPECT_FALSE(ActionExists());
191
192 dialog_controller->ShowMediaRouterDialog();
193 SetAlwaysShowActionPref(true);
194 // When the pref is set to true, hiding the dialog shouldn't hide the icon.
195 dialog_controller->HideMediaRouterDialog();
196 EXPECT_TRUE(ActionExists());
197 dialog_controller->ShowMediaRouterDialog();
198 // While the dialog is showing, setting the pref to false shouldn't hide the
199 // icon.
200 SetAlwaysShowActionPref(false);
201 EXPECT_TRUE(ActionExists());
202 dialog_controller->HideMediaRouterDialog();
203 EXPECT_FALSE(ActionExists());
204 }
205
206 IN_PROC_BROWSER_TEST_F(MediaRouterUIBrowserTest,
188 EphemeralToolbarIconWithMultipleWindows) { 207 EphemeralToolbarIconWithMultipleWindows) {
189 action_controller_->OnRoutesUpdated(routes_, std::vector<MediaRoute::Id>()); 208 action_controller_->OnRoutesUpdated(routes_, std::vector<MediaRoute::Id>());
190 EXPECT_TRUE(ActionExists()); 209 EXPECT_TRUE(ActionExists());
191 210
192 // Opening and closing a window shouldn't affect the state of the ephemeral 211 // Opening and closing a window shouldn't affect the state of the ephemeral
193 // icon. Creating and removing the icon with multiple windows open should also 212 // icon. Creating and removing the icon with multiple windows open should also
194 // work. 213 // work.
195 Browser* browser2 = CreateBrowser(browser()->profile()); 214 Browser* browser2 = CreateBrowser(browser()->profile());
196 EXPECT_TRUE(ActionExists()); 215 EXPECT_TRUE(ActionExists());
197 action_controller_->OnRoutesUpdated(std::vector<MediaRoute>(), 216 action_controller_->OnRoutesUpdated(std::vector<MediaRoute>(),
198 std::vector<MediaRoute::Id>()); 217 std::vector<MediaRoute::Id>());
199 EXPECT_FALSE(ActionExists()); 218 EXPECT_FALSE(ActionExists());
200 action_controller_->OnRoutesUpdated(routes_, std::vector<MediaRoute::Id>()); 219 action_controller_->OnRoutesUpdated(routes_, std::vector<MediaRoute::Id>());
201 EXPECT_TRUE(ActionExists()); 220 EXPECT_TRUE(ActionExists());
202 browser2->window()->Close(); 221 browser2->window()->Close();
203 EXPECT_TRUE(ActionExists()); 222 EXPECT_TRUE(ActionExists());
204 } 223 }
205 224
206 } // namespace media_router 225 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698