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

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

Powered by Google App Engine
This is Rietveld 408576698