| Index: chrome/browser/ui/webui/media_router/media_router_ui.cc
|
| diff --git a/chrome/browser/ui/webui/media_router/media_router_ui.cc b/chrome/browser/ui/webui/media_router/media_router_ui.cc
|
| index 4d05a519aebd76df1736f5ceaba1458dc1516142..798f7f0788be3d9d23f2a969e98e7503875324af 100644
|
| --- a/chrome/browser/ui/webui/media_router/media_router_ui.cc
|
| +++ b/chrome/browser/ui/webui/media_router/media_router_ui.cc
|
| @@ -90,17 +90,23 @@ class MediaRouterUI::UIIssuesObserver : public IssuesObserver {
|
| };
|
|
|
| MediaRouterUI::UIMediaRoutesObserver::UIMediaRoutesObserver(
|
| - MediaRouter* router,
|
| + MediaRouter* router, const MediaSource::Id source_id,
|
| const RoutesUpdatedCallback& callback)
|
| - : MediaRoutesObserver(router), callback_(callback) {
|
| + : MediaRoutesObserver(router, source_id), callback_(callback) {
|
| DCHECK(!callback_.is_null());
|
| }
|
|
|
| MediaRouterUI::UIMediaRoutesObserver::~UIMediaRoutesObserver() {}
|
|
|
| void MediaRouterUI::UIMediaRoutesObserver::OnRoutesUpdated(
|
| - const std::vector<MediaRoute>& routes) {
|
| + const MediaSource::Id source_id,
|
| + const std::vector<MediaRoute>& routes,
|
| + const std::vector<MediaRoute>& joinable_routes) {
|
| + if (source_id.compare(this->source_id()) != 0)
|
| + return;
|
| +
|
| std::vector<MediaRoute> routes_for_display;
|
| + std::vector<MediaRoute> joinable_routes_for_display;
|
| for (const MediaRoute& route : routes) {
|
| if (route.for_display()) {
|
| #ifndef NDEBUG
|
| @@ -116,8 +122,23 @@ void MediaRouterUI::UIMediaRoutesObserver::OnRoutesUpdated(
|
| routes_for_display.push_back(route);
|
| }
|
| }
|
| + for (const MediaRoute& route: joinable_routes) {
|
| + if (route.for_display()) {
|
| +#ifndef NDEBUG
|
| + for (const MediaRoute& existing_route : joinable_routes_for_display) {
|
| + if (existing_route.media_sink_id() == route.media_sink_id()) {
|
| + DVLOG(2) << "Received another route for display with the same sink"
|
| + << " id as an existing route. "
|
| + << route.media_route_id() << " has the same sink id as "
|
| + << existing_route.media_sink_id() << ".";
|
| + }
|
| + }
|
| +#endif
|
| + joinable_routes_for_display.push_back(route);
|
| + }
|
| + }
|
|
|
| - callback_.Run(routes_for_display);
|
| + callback_.Run(routes_for_display, joinable_routes_for_display);
|
| }
|
|
|
| MediaRouterUI::MediaRouterUI(content::WebUI* web_ui)
|
| @@ -209,7 +230,7 @@ void MediaRouterUI::InitCommon(content::WebContents* initiator,
|
|
|
| // Register for MediaRoute updates.
|
| routes_observer_.reset(new UIMediaRoutesObserver(
|
| - router_,
|
| + router_, default_source.id(),
|
| base::Bind(&MediaRouterUI::OnRoutesUpdated, base::Unretained(this))));
|
|
|
| query_result_manager_.reset(new QueryResultManager(router_));
|
| @@ -334,6 +355,44 @@ bool MediaRouterUI::CreateRoute(const MediaSink::Id& sink_id,
|
| return true;
|
| }
|
|
|
| +bool MediaRouterUI::JoinRoute(const MediaSink::Id& sink_id,
|
| + const MediaRoute::Id& route_id) {
|
| + DCHECK(query_result_manager_.get());
|
| + DCHECK(initiator_);
|
| +
|
| + current_route_request_id_ = ++route_request_counter_;
|
| + GURL origin = frame_url_.GetOrigin();
|
| +
|
| + MediaSource source =
|
| + query_result_manager_->GetSourceForCastMode(MediaCastMode::DEFAULT);
|
| +
|
| + if (source.Empty()) {
|
| + LOG(ERROR) << "No MediaSource to join";
|
| + return false;
|
| + }
|
| +
|
| + DCHECK(origin.is_valid());
|
| +
|
| + std::vector<MediaRouteResponseCallback> route_response_callbacks;
|
| + route_response_callbacks.push_back(base::Bind(
|
| + &MediaRouterUI::OnRouteResponseReceived, weak_factory_.GetWeakPtr(),
|
| + current_route_request_id_, sink_id));
|
| +
|
| + if (presentation_service_delegate_) {
|
| + route_response_callbacks.push_back(
|
| + base::Bind(&PresentationServiceDelegateImpl::OnRouteResponse,
|
| + presentation_service_delegate_));
|
| + }
|
| +
|
| + // Start the timer.
|
| + route_creation_timer_.Start(
|
| + FROM_HERE, base::TimeDelta::FromSeconds(kCreateRouteTimeoutSeconds), this,
|
| + &MediaRouterUI::RouteCreationTimeout);
|
| + router_->JoinRouteByRouteId(source.id(), route_id, origin,
|
| + initiator_, route_response_callbacks);
|
| + return true;
|
| +}
|
| +
|
| void MediaRouterUI::CloseRoute(const MediaRoute::Id& route_id) {
|
| router_->CloseRoute(route_id);
|
| }
|
| @@ -358,10 +417,13 @@ void MediaRouterUI::SetIssue(const Issue* issue) {
|
| handler_->UpdateIssue(issue);
|
| }
|
|
|
| -void MediaRouterUI::OnRoutesUpdated(const std::vector<MediaRoute>& routes) {
|
| +void MediaRouterUI::OnRoutesUpdated(
|
| + const std::vector<MediaRoute>& routes,
|
| + const std::vector<MediaRoute>& joinable_routes) {
|
| routes_ = routes;
|
| + joinable_routes_ = joinable_routes;
|
| if (ui_initialized_)
|
| - handler_->UpdateRoutes(routes_);
|
| + handler_->UpdateRoutes(routes_, joinable_routes_);
|
| }
|
|
|
| void MediaRouterUI::OnRouteResponseReceived(const int route_request_id,
|
|
|