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

Side by Side Diff: chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc

Issue 2487673003: [Media Router] Make per-hostname cast mode selections persist (Closed)
Patch Set: Address Jennifer's comments, rebase 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 "chrome/browser/ui/webui/media_router/media_router_ui.h" 5 #include "chrome/browser/ui/webui/media_router/media_router_ui.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
12 #include "chrome/browser/media/router/create_presentation_connection_request.h" 12 #include "chrome/browser/media/router/create_presentation_connection_request.h"
13 #include "chrome/browser/media/router/media_route.h" 13 #include "chrome/browser/media/router/media_route.h"
14 #include "chrome/browser/media/router/media_source_helper.h" 14 #include "chrome/browser/media/router/media_source_helper.h"
15 #include "chrome/browser/media/router/mock_media_router.h" 15 #include "chrome/browser/media/router/mock_media_router.h"
16 #include "chrome/browser/media/router/route_request_result.h" 16 #include "chrome/browser/media/router/route_request_result.h"
17 #include "chrome/browser/media/router/test_helper.h" 17 #include "chrome/browser/media/router/test_helper.h"
18 #include "chrome/browser/sessions/session_tab_helper.h" 18 #include "chrome/browser/sessions/session_tab_helper.h"
19 #include "chrome/browser/ui/webui/media_router/media_router_webui_message_handle r.h" 19 #include "chrome/browser/ui/webui/media_router/media_router_webui_message_handle r.h"
20 #include "chrome/grit/generated_resources.h" 20 #include "chrome/grit/generated_resources.h"
21 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
21 #include "chrome/test/base/testing_profile.h" 22 #include "chrome/test/base/testing_profile.h"
22 #include "content/public/test/test_browser_thread_bundle.h"
23 #include "content/public/test/test_web_ui.h" 23 #include "content/public/test/test_web_ui.h"
24 #include "extensions/browser/extension_registry.h" 24 #include "extensions/browser/extension_registry.h"
25 #include "extensions/common/extension.h" 25 #include "extensions/common/extension.h"
26 #include "extensions/common/extension_builder.h" 26 #include "extensions/common/extension_builder.h"
27 #include "extensions/common/test_util.h" 27 #include "extensions/common/test_util.h"
28 #include "extensions/common/value_builder.h" 28 #include "extensions/common/value_builder.h"
29 #include "testing/gmock/include/gmock/gmock.h" 29 #include "testing/gmock/include/gmock/gmock.h"
30 #include "testing/gtest/include/gtest/gtest.h" 30 #include "testing/gtest/include/gtest/gtest.h"
31 #include "ui/base/l10n/l10n_util.h" 31 #include "ui/base/l10n/l10n_util.h"
32 32
33 using content::WebContents;
33 using testing::_; 34 using testing::_;
34 using testing::AnyNumber; 35 using testing::AnyNumber;
35 using testing::Invoke; 36 using testing::Invoke;
37 using testing::Return;
36 using testing::SaveArg; 38 using testing::SaveArg;
37 using testing::Return;
38 39
39 namespace media_router { 40 namespace media_router {
40 41
41 class PresentationRequestCallbacks { 42 class PresentationRequestCallbacks {
42 public: 43 public:
43 explicit PresentationRequestCallbacks( 44 explicit PresentationRequestCallbacks(
44 const content::PresentationError& expected_error) 45 const content::PresentationError& expected_error)
45 : expected_error_(expected_error) {} 46 : expected_error_(expected_error) {}
46 47
47 void Success(const content::PresentationSessionInfo&, const MediaRoute::Id&) { 48 void Success(const content::PresentationSessionInfo&, const MediaRoute::Id&) {
48 } 49 }
49 50
50 void Error(const content::PresentationError& error) { 51 void Error(const content::PresentationError& error) {
51 EXPECT_EQ(expected_error_.error_type, error.error_type); 52 EXPECT_EQ(expected_error_.error_type, error.error_type);
52 EXPECT_EQ(expected_error_.message, error.message); 53 EXPECT_EQ(expected_error_.message, error.message);
53 } 54 }
54 55
55 private: 56 private:
56 content::PresentationError expected_error_; 57 content::PresentationError expected_error_;
57 }; 58 };
58 59
59 class MockRoutesUpdatedCallback { 60 class MockRoutesUpdatedCallback {
60 public: 61 public:
61 MOCK_METHOD2(OnRoutesUpdated, 62 MOCK_METHOD2(OnRoutesUpdated,
62 void(const std::vector<MediaRoute>& routes, 63 void(const std::vector<MediaRoute>& routes,
63 const std::vector<MediaRoute::Id>& joinable_route_ids)); 64 const std::vector<MediaRoute::Id>& joinable_route_ids));
64 }; 65 };
65 66
66 class MediaRouterUITest : public ::testing::Test { 67 class MediaRouterUITest : public ChromeRenderViewHostTestHarness {
67 public: 68 public:
68 ~MediaRouterUITest() override { 69 void TearDown() override {
69 EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)) 70 EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_))
70 .Times(AnyNumber()); 71 .Times(AnyNumber());
71 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_)) 72 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_))
72 .Times(AnyNumber()); 73 .Times(AnyNumber());
74 web_ui_contents_.reset();
75 create_session_request_.reset();
76 media_router_ui_.reset();
77 message_handler_.reset();
78 ChromeRenderViewHostTestHarness::TearDown();
79 }
80
81 void CreateMediaRouterUIForURL(Profile* profile, const GURL& url) {
82 web_contents()->GetController().LoadURL(url, content::Referrer(),
83 ui::PAGE_TRANSITION_LINK, "");
84 content::RenderFrameHostTester::CommitPendingLoad(
85 &web_contents()->GetController());
86 CreateMediaRouterUI(profile);
73 } 87 }
74 88
75 void CreateMediaRouterUI(Profile* profile) { 89 void CreateMediaRouterUI(Profile* profile) {
76 initiator_.reset(content::WebContents::Create( 90 SessionTabHelper::CreateForWebContents(web_contents());
77 content::WebContents::CreateParams(profile))); 91 web_ui_contents_.reset(
78 SessionTabHelper::CreateForWebContents(initiator_.get()); 92 WebContents::Create(WebContents::CreateParams(profile)));
79 web_contents_.reset(content::WebContents::Create( 93 web_ui_.set_web_contents(web_ui_contents_.get());
80 content::WebContents::CreateParams(profile)));
81 web_ui_.set_web_contents(web_contents_.get());
82 media_router_ui_.reset(new MediaRouterUI(&web_ui_)); 94 media_router_ui_.reset(new MediaRouterUI(&web_ui_));
83 message_handler_.reset( 95 message_handler_.reset(
84 new MediaRouterWebUIMessageHandler(media_router_ui_.get())); 96 new MediaRouterWebUIMessageHandler(media_router_ui_.get()));
85 EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_)) 97 EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_))
86 .WillRepeatedly(Invoke([this](MediaSinksObserver* observer) { 98 .WillRepeatedly(Invoke([this](MediaSinksObserver* observer) {
87 this->media_sinks_observers_.push_back(observer); 99 this->media_sinks_observers_.push_back(observer);
88 return true; 100 return true;
89 })); 101 }));
90 EXPECT_CALL(mock_router_, RegisterMediaRoutesObserver(_)) 102 EXPECT_CALL(mock_router_, RegisterMediaRoutesObserver(_))
91 .Times(AnyNumber()); 103 .Times(AnyNumber());
92 media_router_ui_->InitForTest(&mock_router_, initiator_.get(), 104 media_router_ui_->InitForTest(&mock_router_, web_contents(),
93 message_handler_.get(), 105 message_handler_.get(),
94 std::move(create_session_request_)); 106 std::move(create_session_request_));
95 message_handler_->SetWebUIForTest(&web_ui_); 107 message_handler_->SetWebUIForTest(&web_ui_);
96 } 108 }
97 109
98 MediaSink CreateSinkCompatibleWithAllSources() { 110 MediaSink CreateSinkCompatibleWithAllSources() {
99 MediaSink sink("sinkId", "sinkName", MediaSink::GENERIC); 111 MediaSink sink("sinkId", "sinkName", MediaSink::GENERIC);
100 for (auto* observer : media_sinks_observers_) 112 for (auto* observer : media_sinks_observers_)
101 observer->OnSinksUpdated({sink}, std::vector<GURL>()); 113 observer->OnSinksUpdated({sink}, std::vector<GURL>());
102 return sink; 114 return sink;
103 } 115 }
104 116
105 protected: 117 protected:
106 MockMediaRouter mock_router_; 118 MockMediaRouter mock_router_;
107 content::TestBrowserThreadBundle thread_bundle_;
108 TestingProfile profile_;
109 std::unique_ptr<content::WebContents> initiator_;
110 content::TestWebUI web_ui_; 119 content::TestWebUI web_ui_;
111 std::unique_ptr<content::WebContents> web_contents_; 120 std::unique_ptr<WebContents> web_ui_contents_;
112 std::unique_ptr<CreatePresentationConnectionRequest> create_session_request_; 121 std::unique_ptr<CreatePresentationConnectionRequest> create_session_request_;
113 std::unique_ptr<MediaRouterUI> media_router_ui_; 122 std::unique_ptr<MediaRouterUI> media_router_ui_;
114 std::unique_ptr<MediaRouterWebUIMessageHandler> message_handler_; 123 std::unique_ptr<MediaRouterWebUIMessageHandler> message_handler_;
115 std::vector<MediaSinksObserver*> media_sinks_observers_; 124 std::vector<MediaSinksObserver*> media_sinks_observers_;
116 }; 125 };
117 126
118 TEST_F(MediaRouterUITest, RouteCreationTimeoutForTab) { 127 TEST_F(MediaRouterUITest, RouteCreationTimeoutForTab) {
119 CreateMediaRouterUI(&profile_); 128 CreateMediaRouterUI(profile());
120 std::vector<MediaRouteResponseCallback> callbacks; 129 std::vector<MediaRouteResponseCallback> callbacks;
121 EXPECT_CALL( 130 EXPECT_CALL(
122 mock_router_, 131 mock_router_,
123 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(60), false)) 132 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(60), false))
124 .WillOnce(SaveArg<4>(&callbacks)); 133 .WillOnce(SaveArg<4>(&callbacks));
125 media_router_ui_->CreateRoute(CreateSinkCompatibleWithAllSources().id(), 134 media_router_ui_->CreateRoute(CreateSinkCompatibleWithAllSources().id(),
126 MediaCastMode::TAB_MIRROR); 135 MediaCastMode::TAB_MIRROR);
127 136
128 std::string expected_title = l10n_util::GetStringUTF8( 137 std::string expected_title = l10n_util::GetStringUTF8(
129 IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT_FOR_TAB); 138 IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT_FOR_TAB);
130 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title))); 139 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title)));
131 std::unique_ptr<RouteRequestResult> result = 140 std::unique_ptr<RouteRequestResult> result =
132 RouteRequestResult::FromError("Timed out", RouteRequestResult::TIMED_OUT); 141 RouteRequestResult::FromError("Timed out", RouteRequestResult::TIMED_OUT);
133 for (const auto& callback : callbacks) 142 for (const auto& callback : callbacks)
134 callback.Run(*result); 143 callback.Run(*result);
135 } 144 }
136 145
137 TEST_F(MediaRouterUITest, RouteCreationTimeoutForDesktop) { 146 TEST_F(MediaRouterUITest, RouteCreationTimeoutForDesktop) {
138 CreateMediaRouterUI(&profile_); 147 CreateMediaRouterUI(profile());
139 std::vector<MediaRouteResponseCallback> callbacks; 148 std::vector<MediaRouteResponseCallback> callbacks;
140 EXPECT_CALL( 149 EXPECT_CALL(
141 mock_router_, 150 mock_router_,
142 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(120), false)) 151 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(120), false))
143 .WillOnce(SaveArg<4>(&callbacks)); 152 .WillOnce(SaveArg<4>(&callbacks));
144 media_router_ui_->CreateRoute(CreateSinkCompatibleWithAllSources().id(), 153 media_router_ui_->CreateRoute(CreateSinkCompatibleWithAllSources().id(),
145 MediaCastMode::DESKTOP_MIRROR); 154 MediaCastMode::DESKTOP_MIRROR);
146 155
147 std::string expected_title = l10n_util::GetStringUTF8( 156 std::string expected_title = l10n_util::GetStringUTF8(
148 IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT_FOR_DESKTOP); 157 IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT_FOR_DESKTOP);
149 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title))); 158 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title)));
150 std::unique_ptr<RouteRequestResult> result = 159 std::unique_ptr<RouteRequestResult> result =
151 RouteRequestResult::FromError("Timed out", RouteRequestResult::TIMED_OUT); 160 RouteRequestResult::FromError("Timed out", RouteRequestResult::TIMED_OUT);
152 for (const auto& callback : callbacks) 161 for (const auto& callback : callbacks)
153 callback.Run(*result); 162 callback.Run(*result);
154 } 163 }
155 164
156 TEST_F(MediaRouterUITest, RouteCreationTimeoutForPresentation) { 165 TEST_F(MediaRouterUITest, RouteCreationTimeoutForPresentation) {
157 CreateMediaRouterUI(&profile_); 166 CreateMediaRouterUI(profile());
158 PresentationRequest presentation_request( 167 PresentationRequest presentation_request(
159 RenderFrameHostId(0, 0), {GURL("https://presentationurl.com")}, 168 RenderFrameHostId(0, 0), {GURL("https://presentationurl.com")},
160 GURL("https://frameurl.fakeurl")); 169 GURL("https://frameurl.fakeurl"));
161 media_router_ui_->OnDefaultPresentationChanged(presentation_request); 170 media_router_ui_->OnDefaultPresentationChanged(presentation_request);
162 std::vector<MediaRouteResponseCallback> callbacks; 171 std::vector<MediaRouteResponseCallback> callbacks;
163 EXPECT_CALL( 172 EXPECT_CALL(
164 mock_router_, 173 mock_router_,
165 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(20), false)) 174 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(20), false))
166 .WillOnce(SaveArg<4>(&callbacks)); 175 .WillOnce(SaveArg<4>(&callbacks));
167 media_router_ui_->CreateRoute(CreateSinkCompatibleWithAllSources().id(), 176 media_router_ui_->CreateRoute(CreateSinkCompatibleWithAllSources().id(),
168 MediaCastMode::DEFAULT); 177 MediaCastMode::DEFAULT);
169 178
170 std::string expected_title = 179 std::string expected_title =
171 l10n_util::GetStringFUTF8(IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT, 180 l10n_util::GetStringFUTF8(IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT,
172 base::UTF8ToUTF16("frameurl.fakeurl")); 181 base::UTF8ToUTF16("frameurl.fakeurl"));
173 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title))); 182 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title)));
174 std::unique_ptr<RouteRequestResult> result = 183 std::unique_ptr<RouteRequestResult> result =
175 RouteRequestResult::FromError("Timed out", RouteRequestResult::TIMED_OUT); 184 RouteRequestResult::FromError("Timed out", RouteRequestResult::TIMED_OUT);
176 for (const auto& callback : callbacks) 185 for (const auto& callback : callbacks)
177 callback.Run(*result); 186 callback.Run(*result);
178 } 187 }
179 188
180 TEST_F(MediaRouterUITest, RouteCreationParametersCantBeCreated) { 189 TEST_F(MediaRouterUITest, RouteCreationParametersCantBeCreated) {
181 CreateMediaRouterUI(&profile_); 190 CreateMediaRouterUI(profile());
182 MediaSinkSearchResponseCallback sink_callback; 191 MediaSinkSearchResponseCallback sink_callback;
183 EXPECT_CALL(mock_router_, SearchSinks(_, _, _, _, _)) 192 EXPECT_CALL(mock_router_, SearchSinks(_, _, _, _, _))
184 .WillOnce(SaveArg<4>(&sink_callback)); 193 .WillOnce(SaveArg<4>(&sink_callback));
185 194
186 // Use DEFAULT mode without setting a PresentationRequest. 195 // Use DEFAULT mode without setting a PresentationRequest.
187 media_router_ui_->SearchSinksAndCreateRoute("sinkId", "search input", 196 media_router_ui_->SearchSinksAndCreateRoute("sinkId", "search input",
188 "domain", MediaCastMode::DEFAULT); 197 "domain", MediaCastMode::DEFAULT);
189 std::string expected_title = l10n_util::GetStringUTF8( 198 std::string expected_title = l10n_util::GetStringUTF8(
190 IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT_FOR_TAB); 199 IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT_FOR_TAB);
191 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title))); 200 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title)));
192 sink_callback.Run("foundSinkId"); 201 sink_callback.Run("foundSinkId");
193 } 202 }
194 203
195 TEST_F(MediaRouterUITest, RouteRequestFromIncognito) { 204 TEST_F(MediaRouterUITest, RouteRequestFromIncognito) {
196 CreateMediaRouterUI(profile_.GetOffTheRecordProfile()); 205 CreateMediaRouterUI(profile()->GetOffTheRecordProfile());
197 206
198 PresentationRequest presentation_request(RenderFrameHostId(0, 0), 207 PresentationRequest presentation_request(RenderFrameHostId(0, 0),
199 {GURL("https://foo.url.com/")}, 208 {GURL("https://foo.url.com/")},
200 GURL("https://frameUrl")); 209 GURL("https://frameUrl"));
201 media_router_ui_->OnDefaultPresentationChanged(presentation_request); 210 media_router_ui_->OnDefaultPresentationChanged(presentation_request);
202 211
203 EXPECT_CALL( 212 EXPECT_CALL(
204 mock_router_, 213 mock_router_,
205 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(20), true)); 214 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(20), true));
206 media_router_ui_->CreateRoute(CreateSinkCompatibleWithAllSources().id(), 215 media_router_ui_->CreateRoute(CreateSinkCompatibleWithAllSources().id(),
207 MediaCastMode::DEFAULT); 216 MediaCastMode::DEFAULT);
208 } 217 }
209 218
210 TEST_F(MediaRouterUITest, SortedSinks) { 219 TEST_F(MediaRouterUITest, SortedSinks) {
211 CreateMediaRouterUI(&profile_); 220 CreateMediaRouterUI(profile());
212 std::vector<MediaSinkWithCastModes> unsorted_sinks; 221 std::vector<MediaSinkWithCastModes> unsorted_sinks;
213 std::string sink_id1("sink3"); 222 std::string sink_id1("sink3");
214 std::string sink_name1("B sink"); 223 std::string sink_name1("B sink");
215 MediaSinkWithCastModes sink1( 224 MediaSinkWithCastModes sink1(
216 MediaSink(sink_id1, sink_name1, MediaSink::IconType::CAST)); 225 MediaSink(sink_id1, sink_name1, MediaSink::IconType::CAST));
217 unsorted_sinks.push_back(sink1); 226 unsorted_sinks.push_back(sink1);
218 227
219 std::string sink_id2("sink1"); 228 std::string sink_id2("sink1");
220 std::string sink_name2("A sink"); 229 std::string sink_name2("A sink");
221 MediaSinkWithCastModes sink2( 230 MediaSinkWithCastModes sink2(
222 MediaSink(sink_id2, sink_name2, MediaSink::IconType::CAST)); 231 MediaSink(sink_id2, sink_name2, MediaSink::IconType::CAST));
223 unsorted_sinks.push_back(sink2); 232 unsorted_sinks.push_back(sink2);
224 233
225 std::string sink_id3("sink2"); 234 std::string sink_id3("sink2");
226 std::string sink_name3("B sink"); 235 std::string sink_name3("B sink");
227 MediaSinkWithCastModes sink3( 236 MediaSinkWithCastModes sink3(
228 MediaSink(sink_id3, sink_name3, MediaSink::IconType::CAST)); 237 MediaSink(sink_id3, sink_name3, MediaSink::IconType::CAST));
229 unsorted_sinks.push_back(sink3); 238 unsorted_sinks.push_back(sink3);
230 239
231 // Sorted order is 2, 3, 1. 240 // Sorted order is 2, 3, 1.
232 media_router_ui_->OnResultsUpdated(unsorted_sinks); 241 media_router_ui_->OnResultsUpdated(unsorted_sinks);
233 const auto& sorted_sinks = media_router_ui_->sinks_; 242 const auto& sorted_sinks = media_router_ui_->sinks_;
234 EXPECT_EQ(sink_name2, sorted_sinks[0].sink.name()); 243 EXPECT_EQ(sink_name2, sorted_sinks[0].sink.name());
235 EXPECT_EQ(sink_id3, sorted_sinks[1].sink.id()); 244 EXPECT_EQ(sink_id3, sorted_sinks[1].sink.id());
236 EXPECT_EQ(sink_id1, sorted_sinks[2].sink.id()); 245 EXPECT_EQ(sink_id1, sorted_sinks[2].sink.id());
237 } 246 }
238 247
239 TEST_F(MediaRouterUITest, SortSinksByIconType) { 248 TEST_F(MediaRouterUITest, SortSinksByIconType) {
240 CreateMediaRouterUI(&profile_); 249 CreateMediaRouterUI(profile());
241 std::vector<MediaSinkWithCastModes> unsorted_sinks; 250 std::vector<MediaSinkWithCastModes> unsorted_sinks;
242 251
243 MediaSinkWithCastModes sink1( 252 MediaSinkWithCastModes sink1(
244 MediaSink("id1", "sink", MediaSink::IconType::HANGOUT)); 253 MediaSink("id1", "sink", MediaSink::IconType::HANGOUT));
245 unsorted_sinks.push_back(sink1); 254 unsorted_sinks.push_back(sink1);
246 MediaSinkWithCastModes sink2( 255 MediaSinkWithCastModes sink2(
247 MediaSink("id2", "B sink", MediaSink::IconType::CAST_AUDIO_GROUP)); 256 MediaSink("id2", "B sink", MediaSink::IconType::CAST_AUDIO_GROUP));
248 unsorted_sinks.push_back(sink2); 257 unsorted_sinks.push_back(sink2);
249 MediaSinkWithCastModes sink3( 258 MediaSinkWithCastModes sink3(
250 MediaSink("id3", "sink", MediaSink::IconType::GENERIC)); 259 MediaSink("id3", "sink", MediaSink::IconType::GENERIC));
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 351
343 ASSERT_EQ(2u, filtered_joinable_route_ids.size()); 352 ASSERT_EQ(2u, filtered_joinable_route_ids.size());
344 EXPECT_EQ(display_route_1.media_route_id(), filtered_joinable_route_ids[0]); 353 EXPECT_EQ(display_route_1.media_route_id(), filtered_joinable_route_ids[0]);
345 EXPECT_EQ(display_route_2.media_route_id(), filtered_joinable_route_ids[1]); 354 EXPECT_EQ(display_route_2.media_route_id(), filtered_joinable_route_ids[1]);
346 355
347 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_)).Times(1); 356 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_)).Times(1);
348 observer.reset(); 357 observer.reset();
349 } 358 }
350 359
351 TEST_F(MediaRouterUITest, UIMediaRoutesObserverAssignsCurrentCastModes) { 360 TEST_F(MediaRouterUITest, UIMediaRoutesObserverAssignsCurrentCastModes) {
352 CreateMediaRouterUI(&profile_); 361 CreateMediaRouterUI(profile());
353 SessionID::id_type tab_id = SessionTabHelper::IdForTab(initiator_.get()); 362 SessionID::id_type tab_id = SessionTabHelper::IdForTab(web_contents());
354 MediaSource media_source_1(MediaSourceForTab(tab_id)); 363 MediaSource media_source_1(MediaSourceForTab(tab_id));
355 MediaSource media_source_2("mediaSource"); 364 MediaSource media_source_2("mediaSource");
356 MediaSource media_source_3(MediaSourceForDesktop()); 365 MediaSource media_source_3(MediaSourceForDesktop());
357 MockRoutesUpdatedCallback mock_callback; 366 MockRoutesUpdatedCallback mock_callback;
358 std::unique_ptr<MediaRouterUI::UIMediaRoutesObserver> observer( 367 std::unique_ptr<MediaRouterUI::UIMediaRoutesObserver> observer(
359 new MediaRouterUI::UIMediaRoutesObserver( 368 new MediaRouterUI::UIMediaRoutesObserver(
360 &mock_router_, MediaSource::Id(), 369 &mock_router_, MediaSource::Id(),
361 base::Bind(&MediaRouterUI::OnRoutesUpdated, 370 base::Bind(&MediaRouterUI::OnRoutesUpdated,
362 base::Unretained(media_router_ui_.get())))); 371 base::Unretained(media_router_ui_.get()))));
363 372
(...skipping 28 matching lines...) Expand all
392 EXPECT_EQ(end(current_cast_modes), cast_mode_entry); 401 EXPECT_EQ(end(current_cast_modes), cast_mode_entry);
393 cast_mode_entry = current_cast_modes.find(display_route_2.media_route_id()); 402 cast_mode_entry = current_cast_modes.find(display_route_2.media_route_id());
394 EXPECT_NE(end(current_cast_modes), cast_mode_entry); 403 EXPECT_NE(end(current_cast_modes), cast_mode_entry);
395 EXPECT_EQ(MediaCastMode::DESKTOP_MIRROR, cast_mode_entry->second); 404 EXPECT_EQ(MediaCastMode::DESKTOP_MIRROR, cast_mode_entry->second);
396 405
397 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_)).Times(1); 406 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_)).Times(1);
398 observer.reset(); 407 observer.reset();
399 } 408 }
400 409
401 TEST_F(MediaRouterUITest, UIMediaRoutesObserverSkipsUnavailableCastModes) { 410 TEST_F(MediaRouterUITest, UIMediaRoutesObserverSkipsUnavailableCastModes) {
402 CreateMediaRouterUI(&profile_); 411 CreateMediaRouterUI(profile());
403 MediaSource media_source_1("mediaSource1"); 412 MediaSource media_source_1("mediaSource1");
404 MediaSource media_source_2("mediaSource2"); 413 MediaSource media_source_2("mediaSource2");
405 MediaSource media_source_3(MediaSourceForDesktop()); 414 MediaSource media_source_3(MediaSourceForDesktop());
406 MockRoutesUpdatedCallback mock_callback; 415 MockRoutesUpdatedCallback mock_callback;
407 std::unique_ptr<MediaRouterUI::UIMediaRoutesObserver> observer( 416 std::unique_ptr<MediaRouterUI::UIMediaRoutesObserver> observer(
408 new MediaRouterUI::UIMediaRoutesObserver( 417 new MediaRouterUI::UIMediaRoutesObserver(
409 &mock_router_, MediaSource::Id(), 418 &mock_router_, MediaSource::Id(),
410 base::Bind(&MediaRouterUI::OnRoutesUpdated, 419 base::Bind(&MediaRouterUI::OnRoutesUpdated,
411 base::Unretained(media_router_ui_.get())))); 420 base::Unretained(media_router_ui_.get()))));
412 421
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 content::PresentationErrorType::PRESENTATION_ERROR_NO_AVAILABLE_SCREENS, 496 content::PresentationErrorType::PRESENTATION_ERROR_NO_AVAILABLE_SCREENS,
488 "No screens found."); 497 "No screens found.");
489 PresentationRequestCallbacks request_callbacks(expected_error); 498 PresentationRequestCallbacks request_callbacks(expected_error);
490 create_session_request_.reset(new CreatePresentationConnectionRequest( 499 create_session_request_.reset(new CreatePresentationConnectionRequest(
491 RenderFrameHostId(0, 0), GURL("http://google.com/presentation"), 500 RenderFrameHostId(0, 0), GURL("http://google.com/presentation"),
492 GURL("http://google.com"), 501 GURL("http://google.com"),
493 base::Bind(&PresentationRequestCallbacks::Success, 502 base::Bind(&PresentationRequestCallbacks::Success,
494 base::Unretained(&request_callbacks)), 503 base::Unretained(&request_callbacks)),
495 base::Bind(&PresentationRequestCallbacks::Error, 504 base::Bind(&PresentationRequestCallbacks::Error,
496 base::Unretained(&request_callbacks)))); 505 base::Unretained(&request_callbacks))));
497 CreateMediaRouterUI(&profile_); 506 CreateMediaRouterUI(profile());
498 // Destroying the UI should return the expected error from above to the error 507 // Destroying the UI should return the expected error from above to the error
499 // callback. 508 // callback.
500 media_router_ui_.reset(); 509 media_router_ui_.reset();
501 } 510 }
502 511
503 TEST_F(MediaRouterUITest, NotFoundErrorOnCloseWithNoCompatibleSinks) { 512 TEST_F(MediaRouterUITest, NotFoundErrorOnCloseWithNoCompatibleSinks) {
504 content::PresentationError expected_error( 513 content::PresentationError expected_error(
505 content::PresentationErrorType::PRESENTATION_ERROR_NO_AVAILABLE_SCREENS, 514 content::PresentationErrorType::PRESENTATION_ERROR_NO_AVAILABLE_SCREENS,
506 "No screens found."); 515 "No screens found.");
507 PresentationRequestCallbacks request_callbacks(expected_error); 516 PresentationRequestCallbacks request_callbacks(expected_error);
508 GURL presentation_url("http://google.com/presentation"); 517 GURL presentation_url("http://google.com/presentation");
509 create_session_request_.reset(new CreatePresentationConnectionRequest( 518 create_session_request_.reset(new CreatePresentationConnectionRequest(
510 RenderFrameHostId(0, 0), presentation_url, GURL("http://google.com"), 519 RenderFrameHostId(0, 0), presentation_url, GURL("http://google.com"),
511 base::Bind(&PresentationRequestCallbacks::Success, 520 base::Bind(&PresentationRequestCallbacks::Success,
512 base::Unretained(&request_callbacks)), 521 base::Unretained(&request_callbacks)),
513 base::Bind(&PresentationRequestCallbacks::Error, 522 base::Bind(&PresentationRequestCallbacks::Error,
514 base::Unretained(&request_callbacks)))); 523 base::Unretained(&request_callbacks))));
515 CreateMediaRouterUI(&profile_); 524 CreateMediaRouterUI(profile());
516 525
517 // Send a sink to the UI that is compatible with sources other than the 526 // Send a sink to the UI that is compatible with sources other than the
518 // presentation url to cause a NotFoundError. 527 // presentation url to cause a NotFoundError.
519 std::vector<MediaSink> sinks; 528 std::vector<MediaSink> sinks;
520 sinks.emplace_back("sink id", "sink name", MediaSink::GENERIC); 529 sinks.emplace_back("sink id", "sink name", MediaSink::GENERIC);
521 std::vector<GURL> origins; 530 std::vector<GURL> origins;
522 for (auto* observer : media_sinks_observers_) { 531 for (auto* observer : media_sinks_observers_) {
523 if (observer->source().id() != presentation_url.spec()) { 532 if (observer->source().id() != presentation_url.spec()) {
524 observer->OnSinksUpdated(sinks, origins); 533 observer->OnSinksUpdated(sinks, origins);
525 } 534 }
526 } 535 }
527 // Destroying the UI should return the expected error from above to the error 536 // Destroying the UI should return the expected error from above to the error
528 // callback. 537 // callback.
529 media_router_ui_.reset(); 538 media_router_ui_.reset();
530 } 539 }
531 540
532 TEST_F(MediaRouterUITest, AbortErrorOnClose) { 541 TEST_F(MediaRouterUITest, AbortErrorOnClose) {
533 content::PresentationError expected_error( 542 content::PresentationError expected_error(
534 content::PresentationErrorType:: 543 content::PresentationErrorType::
535 PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, 544 PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED,
536 "Dialog closed."); 545 "Dialog closed.");
537 PresentationRequestCallbacks request_callbacks(expected_error); 546 PresentationRequestCallbacks request_callbacks(expected_error);
538 GURL presentation_url("http://google.com/presentation"); 547 GURL presentation_url("http://google.com/presentation");
539 create_session_request_.reset(new CreatePresentationConnectionRequest( 548 create_session_request_.reset(new CreatePresentationConnectionRequest(
540 RenderFrameHostId(0, 0), presentation_url, GURL("http://google.com"), 549 RenderFrameHostId(0, 0), presentation_url, GURL("http://google.com"),
541 base::Bind(&PresentationRequestCallbacks::Success, 550 base::Bind(&PresentationRequestCallbacks::Success,
542 base::Unretained(&request_callbacks)), 551 base::Unretained(&request_callbacks)),
543 base::Bind(&PresentationRequestCallbacks::Error, 552 base::Bind(&PresentationRequestCallbacks::Error,
544 base::Unretained(&request_callbacks)))); 553 base::Unretained(&request_callbacks))));
545 CreateMediaRouterUI(&profile_); 554 CreateMediaRouterUI(profile());
546 555
547 // Send a sink to the UI that is compatible with the presentation url to avoid 556 // Send a sink to the UI that is compatible with the presentation url to avoid
548 // a NotFoundError. 557 // a NotFoundError.
549 std::vector<MediaSink> sinks; 558 std::vector<MediaSink> sinks;
550 sinks.emplace_back("sink id", "sink name", MediaSink::GENERIC); 559 sinks.emplace_back("sink id", "sink name", MediaSink::GENERIC);
551 std::vector<GURL> origins; 560 std::vector<GURL> origins;
552 MediaSource::Id presentation_source_id = 561 MediaSource::Id presentation_source_id =
553 MediaSourceForPresentationUrl(presentation_url).id(); 562 MediaSourceForPresentationUrl(presentation_url).id();
554 for (auto* observer : media_sinks_observers_) { 563 for (auto* observer : media_sinks_observers_) {
555 if (observer->source().id() == presentation_source_id) { 564 if (observer->source().id() == presentation_source_id) {
556 observer->OnSinksUpdated(sinks, origins); 565 observer->OnSinksUpdated(sinks, origins);
557 } 566 }
558 } 567 }
559 // Destroying the UI should return the expected error from above to the error 568 // Destroying the UI should return the expected error from above to the error
560 // callback. 569 // callback.
561 media_router_ui_.reset(); 570 media_router_ui_.reset();
562 } 571 }
572
573 TEST_F(MediaRouterUITest, RecordCastModeSelections) {
574 const GURL url_1a = GURL("https://www.example.com/watch?v=AAAA");
575 const GURL url_1b = GURL("https://www.example.com/watch?v=BBBB");
576 const GURL url_2 = GURL("https://example2.com/0000");
577 const GURL url_3 = GURL("https://www3.example.com/index.html");
578
579 CreateMediaRouterUIForURL(profile(), url_1a);
580 // When the user hasn't selected a cast mode for the hostname, it should
581 // default to the default cast mode.
582 EXPECT_EQ(media_router_ui_->GetCastModeSelectionForCurrentHost(),
583 MediaCastMode::DEFAULT);
584 media_router_ui_->RecordCastModeSelection(MediaCastMode::TAB_MIRROR);
585 EXPECT_EQ(media_router_ui_->GetCastModeSelectionForCurrentHost(),
586 MediaCastMode::TAB_MIRROR);
587
588 CreateMediaRouterUIForURL(profile(), url_2);
589 EXPECT_EQ(media_router_ui_->GetCastModeSelectionForCurrentHost(),
590 MediaCastMode::DEFAULT);
591
592 CreateMediaRouterUIForURL(profile(), url_1b);
593 // |url_1a| and |url_1b| have the same hostname, so the selection made for
594 // |url_1a| should be retrieved.
595 EXPECT_EQ(media_router_ui_->GetCastModeSelectionForCurrentHost(),
596 MediaCastMode::TAB_MIRROR);
597 media_router_ui_->RecordCastModeSelection(MediaCastMode::DEFAULT);
598 EXPECT_EQ(media_router_ui_->GetCastModeSelectionForCurrentHost(),
599 MediaCastMode::DEFAULT);
600
601 media_router_ui_->RecordCastModeSelection(MediaCastMode::TAB_MIRROR);
602 CreateMediaRouterUIForURL(profile(), url_3);
603 // |url_1a| and |url_3| have the same domain "example.com" but different
604 // hostnames, so their preferences should be separate.
605 EXPECT_EQ(media_router_ui_->GetCastModeSelectionForCurrentHost(),
606 MediaCastMode::DEFAULT);
607 }
608
609 TEST_F(MediaRouterUITest, RecordDesktopMirroringCastModeSelection) {
610 const GURL url = GURL("https://www.example.com/watch?v=AAAA");
611 CreateMediaRouterUIForURL(profile(), url);
612
613 EXPECT_EQ(media_router_ui_->GetCastModeSelectionForCurrentHost(),
614 MediaCastMode::DEFAULT);
615 media_router_ui_->RecordCastModeSelection(MediaCastMode::DESKTOP_MIRROR);
616 // Selecting desktop mirroring should not change the recorded preferences.
617 EXPECT_EQ(media_router_ui_->GetCastModeSelectionForCurrentHost(),
618 MediaCastMode::DEFAULT);
619
620 media_router_ui_->RecordCastModeSelection(MediaCastMode::TAB_MIRROR);
621 EXPECT_EQ(media_router_ui_->GetCastModeSelectionForCurrentHost(),
622 MediaCastMode::TAB_MIRROR);
623 media_router_ui_->RecordCastModeSelection(MediaCastMode::DESKTOP_MIRROR);
624 // Selecting desktop mirroring should not change the recorded preferences.
625 EXPECT_EQ(media_router_ui_->GetCastModeSelectionForCurrentHost(),
626 MediaCastMode::TAB_MIRROR);
627 }
563 } // namespace media_router 628 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698