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

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

Issue 1415103006: Non-Local Join for Media Router and Presentation API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removing default parameter for OnRoutesUpdated Created 5 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 <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/guid.h" 10 #include "base/guid.h"
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 void OnIssueUpdated(const Issue* issue) override { ui_->SetIssue(issue); } 96 void OnIssueUpdated(const Issue* issue) override { ui_->SetIssue(issue); }
97 97
98 private: 98 private:
99 // Reference back to the owning MediaRouterUI instance. 99 // Reference back to the owning MediaRouterUI instance.
100 MediaRouterUI* ui_; 100 MediaRouterUI* ui_;
101 101
102 DISALLOW_COPY_AND_ASSIGN(UIIssuesObserver); 102 DISALLOW_COPY_AND_ASSIGN(UIIssuesObserver);
103 }; 103 };
104 104
105 MediaRouterUI::UIMediaRoutesObserver::UIMediaRoutesObserver( 105 MediaRouterUI::UIMediaRoutesObserver::UIMediaRoutesObserver(
106 MediaRouter* router, const RoutesUpdatedCallback& callback) 106 MediaRouter* router,
107 : MediaRoutesObserver(router), callback_(callback) { 107 const RoutesUpdatedCallback& callback) :
108 UIMediaRoutesObserver(router, MediaSource::Id(), callback) {
109 }
110
111 MediaRouterUI::UIMediaRoutesObserver::UIMediaRoutesObserver(
112 MediaRouter* router, const MediaSource::Id& source_id,
113 const RoutesUpdatedCallback& callback)
114 : MediaRoutesObserver(router, source_id), callback_(callback) {
108 DCHECK(!callback_.is_null()); 115 DCHECK(!callback_.is_null());
109 } 116 }
110 117
111 MediaRouterUI::UIMediaRoutesObserver::~UIMediaRoutesObserver() {} 118 MediaRouterUI::UIMediaRoutesObserver::~UIMediaRoutesObserver() {}
112 119
113 void MediaRouterUI::UIMediaRoutesObserver::OnRoutesUpdated( 120 void MediaRouterUI::UIMediaRoutesObserver::OnRoutesUpdated(
114 const std::vector<MediaRoute>& routes) { 121 const std::vector<MediaRoute>& routes,
122 const std::vector<MediaRoute::Id>& joinable_route_ids) {
115 std::vector<MediaRoute> routes_for_display; 123 std::vector<MediaRoute> routes_for_display;
124 std::vector<MediaRoute::Id> joinable_route_ids_for_display;
116 for (const MediaRoute& route : routes) { 125 for (const MediaRoute& route : routes) {
117 if (route.for_display()) { 126 if (route.for_display()) {
118 #ifndef NDEBUG 127 #ifndef NDEBUG
119 for (const MediaRoute& existing_route : routes_for_display) { 128 for (const MediaRoute& existing_route : routes_for_display) {
120 if (existing_route.media_sink_id() == route.media_sink_id()) { 129 if (existing_route.media_sink_id() == route.media_sink_id()) {
121 DVLOG(2) << "Received another route for display with the same sink" 130 DVLOG(2) << "Received another route for display with the same sink"
122 << " id as an existing route. " << route.media_route_id() 131 << " id as an existing route. " << route.media_route_id()
123 << " has the same sink id as " 132 << " has the same sink id as "
124 << existing_route.media_sink_id() << "."; 133 << existing_route.media_sink_id() << ".";
125 } 134 }
126 } 135 }
127 #endif 136 #endif
137 if (ContainsValue(joinable_route_ids, route.media_route_id())) {
138 joinable_route_ids_for_display.push_back(route.media_route_id());
139 }
140
128 routes_for_display.push_back(route); 141 routes_for_display.push_back(route);
129 } 142 }
130 } 143 }
131 144
132 callback_.Run(routes_for_display); 145 callback_.Run(routes_for_display, joinable_route_ids_for_display);
133 } 146 }
134 147
135 MediaRouterUI::MediaRouterUI(content::WebUI* web_ui) 148 MediaRouterUI::MediaRouterUI(content::WebUI* web_ui)
136 : ConstrainedWebDialogUI(web_ui), 149 : ConstrainedWebDialogUI(web_ui),
137 handler_(new MediaRouterWebUIMessageHandler(this)), 150 handler_(new MediaRouterWebUIMessageHandler(this)),
138 ui_initialized_(false), 151 ui_initialized_(false),
139 requesting_route_for_default_source_(false), 152 requesting_route_for_default_source_(false),
140 current_route_request_id_(-1), 153 current_route_request_id_(-1),
141 route_request_counter_(0), 154 route_request_counter_(0),
142 initiator_(nullptr), 155 initiator_(nullptr),
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 InitCommon(initiator); 226 InitCommon(initiator);
214 OnDefaultPresentationChanged(create_session_request_->presentation_request()); 227 OnDefaultPresentationChanged(create_session_request_->presentation_request());
215 } 228 }
216 229
217 void MediaRouterUI::InitCommon(content::WebContents* initiator) { 230 void MediaRouterUI::InitCommon(content::WebContents* initiator) {
218 DCHECK(initiator); 231 DCHECK(initiator);
219 DCHECK(router_); 232 DCHECK(router_);
220 233
221 TRACE_EVENT_NESTABLE_ASYNC_INSTANT1("media_router", "UI", initiator, 234 TRACE_EVENT_NESTABLE_ASYNC_INSTANT1("media_router", "UI", initiator,
222 "MediaRouterUI::InitCommon", this); 235 "MediaRouterUI::InitCommon", this);
223 // Register for MediaRoute updates. 236 // Register for MediaRoute updates without a media source.
224 routes_observer_.reset(new UIMediaRoutesObserver( 237 routes_observer_.reset(new UIMediaRoutesObserver(
imcheng 2015/12/29 00:24:42 This should go somewhere else now that we set up r
matt.boetger 2016/01/05 00:19:48 Done.
225 router_, 238 router_,
226 base::Bind(&MediaRouterUI::OnRoutesUpdated, base::Unretained(this)))); 239 base::Bind(&MediaRouterUI::OnRoutesUpdated, base::Unretained(this))));
227 240
228 // Create |collator_| before |query_result_manager_| so that |collator_| is 241 // Create |collator_| before |query_result_manager_| so that |collator_| is
229 // already set up when we get a callback from |query_result_manager_|. 242 // already set up when we get a callback from |query_result_manager_|.
230 UErrorCode error = U_ZERO_ERROR; 243 UErrorCode error = U_ZERO_ERROR;
231 const std::string& locale = g_browser_process->GetApplicationLocale(); 244 const std::string& locale = g_browser_process->GetApplicationLocale();
232 collator_.reset( 245 collator_.reset(
233 icu::Collator::createInstance(icu::Locale(locale.c_str()), error)); 246 icu::Collator::createInstance(icu::Locale(locale.c_str()), error));
234 if (U_FAILURE(error)) { 247 if (U_FAILURE(error)) {
235 DLOG(ERROR) << "Failed to create collator for locale " << locale; 248 DLOG(ERROR) << "Failed to create collator for locale " << locale;
236 collator_.reset(); 249 collator_.reset();
237 } 250 }
238 251
239 query_result_manager_.reset(new QueryResultManager(router_)); 252 query_result_manager_.reset(new QueryResultManager(router_));
240 query_result_manager_->AddObserver(this); 253 query_result_manager_->AddObserver(this);
241 254
242 // These modes are always available. 255 // These modes are always available.
243 query_result_manager_->StartSinksQuery(MediaCastMode::DESKTOP_MIRROR, 256 query_result_manager_->StartSinksQuery(MediaCastMode::DESKTOP_MIRROR,
244 MediaSourceForDesktop()); 257 MediaSourceForDesktop());
245 initiator_ = initiator; 258 initiator_ = initiator;
246 MediaSource mirroring_source( 259 MediaSource mirroring_source(
247 MediaSourceForTab(SessionTabHelper::IdForTab(initiator))); 260 MediaSourceForTab(SessionTabHelper::IdForTab(initiator)));
248 query_result_manager_->StartSinksQuery(MediaCastMode::TAB_MIRROR, 261 query_result_manager_->StartSinksQuery(MediaCastMode::TAB_MIRROR,
249 mirroring_source); 262 mirroring_source);
250 UpdateCastModes(); 263 UpdateCastModes();
251 } 264 }
252 265
253 void MediaRouterUI::OnDefaultPresentationChanged( 266 void MediaRouterUI::OnDefaultPresentationChanged(
254 const PresentationRequest& presentation_request) { 267 const PresentationRequest& presentation_request) {
268 MediaSource source = presentation_request.GetMediaSource();
255 presentation_request_.reset(new PresentationRequest(presentation_request)); 269 presentation_request_.reset(new PresentationRequest(presentation_request));
256 query_result_manager_->StartSinksQuery( 270 query_result_manager_->StartSinksQuery(MediaCastMode::DEFAULT, source);
257 MediaCastMode::DEFAULT, presentation_request_->GetMediaSource()); 271 // Register for MediaRoute updates.
272 routes_observer_.reset(new UIMediaRoutesObserver(
273 router_, source.id(),
274 base::Bind(&MediaRouterUI::OnRoutesUpdated, base::Unretained(this))));
275
258 UpdateCastModes(); 276 UpdateCastModes();
259 } 277 }
260 278
261 void MediaRouterUI::OnDefaultPresentationRemoved() { 279 void MediaRouterUI::OnDefaultPresentationRemoved() {
262 presentation_request_.reset(); 280 presentation_request_.reset();
263 query_result_manager_->StopSinksQuery(MediaCastMode::DEFAULT); 281 query_result_manager_->StopSinksQuery(MediaCastMode::DEFAULT);
282 // Register for MediaRoute updates without a media source.
283 routes_observer_.reset(new UIMediaRoutesObserver(
284 router_,
285 base::Bind(&MediaRouterUI::OnRoutesUpdated, base::Unretained(this))));
264 UpdateCastModes(); 286 UpdateCastModes();
265 } 287 }
266 288
267 void MediaRouterUI::UpdateCastModes() { 289 void MediaRouterUI::UpdateCastModes() {
268 // Gets updated cast modes from |query_result_manager_| and forwards it to UI. 290 // Gets updated cast modes from |query_result_manager_| and forwards it to UI.
269 query_result_manager_->GetSupportedCastModes(&cast_modes_); 291 query_result_manager_->GetSupportedCastModes(&cast_modes_);
270 if (ui_initialized_) { 292 if (ui_initialized_) {
271 handler_->UpdateCastModes(cast_modes_, GetPresentationRequestSourceName()); 293 handler_->UpdateCastModes(cast_modes_, GetPresentationRequestSourceName());
272 } 294 }
273 } 295 }
(...skipping 11 matching lines...) Expand all
285 ui_initialized_ = true; 307 ui_initialized_ = true;
286 308
287 // Register for Issue updates. 309 // Register for Issue updates.
288 if (!issues_observer_) 310 if (!issues_observer_)
289 issues_observer_.reset(new UIIssuesObserver(router_, this)); 311 issues_observer_.reset(new UIIssuesObserver(router_, this));
290 issues_observer_->RegisterObserver(); 312 issues_observer_->RegisterObserver();
291 } 313 }
292 314
293 bool MediaRouterUI::CreateRoute(const MediaSink::Id& sink_id, 315 bool MediaRouterUI::CreateRoute(const MediaSink::Id& sink_id,
294 MediaCastMode cast_mode) { 316 MediaCastMode cast_mode) {
317 return CreateOrConnectRoute(sink_id, cast_mode, MediaRoute::Id());
318 }
319
320 bool MediaRouterUI::CreateOrConnectRoute(const MediaSink::Id& sink_id,
321 MediaCastMode cast_mode,
322 const MediaRoute::Id& route_id) {
295 DCHECK(query_result_manager_.get()); 323 DCHECK(query_result_manager_.get());
296 DCHECK(initiator_); 324 DCHECK(initiator_);
297 325
298 // Note that there is a rarely-encountered bug, where the MediaCastMode to 326 // Note that there is a rarely-encountered bug, where the MediaCastMode to
299 // MediaSource mapping could have been updated, between when the user clicked 327 // MediaSource mapping could have been updated, between when the user clicked
300 // on the UI to start a create route request, and when this function is 328 // on the UI to start a create route request, and when this function is
301 // called. However, since the user does not have visibility into the 329 // called. However, since the user does not have visibility into the
302 // MediaSource, and that it occurs very rarely in practice, we leave it as-is 330 // MediaSource, and that it occurs very rarely in practice, we leave it as-is
303 // for now. 331 // for now.
304 MediaSource source = query_result_manager_->GetSourceForCastMode(cast_mode); 332 MediaSource source = query_result_manager_->GetSourceForCastMode(cast_mode);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 base::Bind(&PresentationServiceDelegateImpl::OnRouteResponse, 382 base::Bind(&PresentationServiceDelegateImpl::OnRouteResponse,
355 presentation_service_delegate_, *presentation_request_)); 383 presentation_service_delegate_, *presentation_request_));
356 } 384 }
357 } 385 }
358 386
359 // Start the timer. 387 // Start the timer.
360 route_creation_timer_.Start( 388 route_creation_timer_.Start(
361 FROM_HERE, base::TimeDelta::FromSeconds(kCreateRouteTimeoutSeconds), this, 389 FROM_HERE, base::TimeDelta::FromSeconds(kCreateRouteTimeoutSeconds), this,
362 &MediaRouterUI::RouteCreationTimeout); 390 &MediaRouterUI::RouteCreationTimeout);
363 391
364 router_->CreateRoute(source.id(), sink_id, origin, initiator_, 392 if (route_id.empty()) {
365 route_response_callbacks); 393 router_->CreateRoute(source.id(), sink_id, origin, initiator_,
394 route_response_callbacks);
395 } else {
396 router_->ConnectRouteByRouteId(source.id(), route_id, origin,
397 initiator_, route_response_callbacks);
398 }
366 return true; 399 return true;
367 } 400 }
368 401
402 bool MediaRouterUI::ConnectRemoteRoute(const MediaSink::Id& sink_id,
403 const MediaRoute::Id& route_id) {
404 return CreateOrConnectRoute(sink_id, MediaCastMode::DEFAULT, route_id);
405 }
406
369 void MediaRouterUI::CloseRoute(const MediaRoute::Id& route_id) { 407 void MediaRouterUI::CloseRoute(const MediaRoute::Id& route_id) {
370 router_->CloseRoute(route_id); 408 router_->CloseRoute(route_id);
371 } 409 }
372 410
373 void MediaRouterUI::AddIssue(const Issue& issue) { router_->AddIssue(issue); } 411 void MediaRouterUI::AddIssue(const Issue& issue) { router_->AddIssue(issue); }
374 412
375 void MediaRouterUI::ClearIssue(const std::string& issue_id) { 413 void MediaRouterUI::ClearIssue(const std::string& issue_id) {
376 router_->ClearIssue(issue_id); 414 router_->ClearIssue(issue_id);
377 } 415 }
378 416
(...skipping 24 matching lines...) Expand all
403 return sink1.sink.id() < sink2.sink.id(); 441 return sink1.sink.id() < sink2.sink.id();
404 }); 442 });
405 443
406 if (ui_initialized_) handler_->UpdateSinks(sinks_); 444 if (ui_initialized_) handler_->UpdateSinks(sinks_);
407 } 445 }
408 446
409 void MediaRouterUI::SetIssue(const Issue* issue) { 447 void MediaRouterUI::SetIssue(const Issue* issue) {
410 if (ui_initialized_) handler_->UpdateIssue(issue); 448 if (ui_initialized_) handler_->UpdateIssue(issue);
411 } 449 }
412 450
413 void MediaRouterUI::OnRoutesUpdated(const std::vector<MediaRoute>& routes) { 451 void MediaRouterUI::OnRoutesUpdated(
452 const std::vector<MediaRoute>& routes,
453 const std::vector<MediaRoute::Id>& joinable_route_ids) {
414 routes_ = routes; 454 routes_ = routes;
415 if (ui_initialized_) handler_->UpdateRoutes(routes_); 455 joinable_route_ids_ = joinable_route_ids;
456 if (ui_initialized_) handler_->UpdateRoutes(routes_, joinable_route_ids_);
416 } 457 }
417 458
418 void MediaRouterUI::OnRouteResponseReceived(const int route_request_id, 459 void MediaRouterUI::OnRouteResponseReceived(const int route_request_id,
419 const MediaSink::Id& sink_id, 460 const MediaSink::Id& sink_id,
420 const MediaRoute* route, 461 const MediaRoute* route,
421 const std::string& presentation_id, 462 const std::string& presentation_id,
422 const std::string& error) { 463 const std::string& error) {
423 DVLOG(1) << "OnRouteResponseReceived"; 464 DVLOG(1) << "OnRouteResponseReceived";
424 // If we receive a new route that we aren't expecting, do nothing. 465 // If we receive a new route that we aren't expecting, do nothing.
425 if (route_request_id != current_route_request_id_) return; 466 if (route_request_id != current_route_request_id_) return;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 537
497 void MediaRouterUI::OnUIInitialDataReceived() { 538 void MediaRouterUI::OnUIInitialDataReceived() {
498 if (!start_time_.is_null()) { 539 if (!start_time_.is_null()) {
499 MediaRouterMetrics::RecordMediaRouterDialogLoaded( 540 MediaRouterMetrics::RecordMediaRouterDialogLoaded(
500 base::Time::Now() - start_time_); 541 base::Time::Now() - start_time_);
501 start_time_ = base::Time(); 542 start_time_ = base::Time();
502 } 543 }
503 } 544 }
504 545
505 } // namespace media_router 546 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698