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 30b76029fc9654d52c1987a02cea80fc4e7c5bc4..47c9f58a62a0d2953e2ce542dd8f9b77a69e38da 100644 |
--- a/chrome/browser/ui/webui/media_router/media_router_ui.cc |
+++ b/chrome/browser/ui/webui/media_router/media_router_ui.cc |
@@ -163,11 +163,12 @@ MediaRouterUI::~MediaRouterUI() { |
if (query_result_manager_.get()) |
query_result_manager_->RemoveObserver(this); |
if (presentation_service_delegate_.get()) |
- presentation_service_delegate_->RemoveDefaultMediaSourceObserver(this); |
- // If |presentation_request_| still exists, then it means presentation route |
+ presentation_service_delegate_->RemoveDefaultPresentationRequestObserver( |
+ this); |
+ // If |create_session_request_| still exists, then it means presentation route |
// request was never attempted. |
- if (presentation_request_) { |
- presentation_request_->InvokeErrorCallback(content::PresentationError( |
+ if (create_session_request_) { |
+ create_session_request_->InvokeErrorCallback(content::PresentationError( |
content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, |
"Dialog closed.")); |
} |
@@ -180,30 +181,29 @@ void MediaRouterUI::InitWithDefaultMediaSource( |
DCHECK(!query_result_manager_.get()); |
presentation_service_delegate_ = delegate; |
- presentation_service_delegate_->AddDefaultMediaSourceObserver(this); |
- InitCommon(presentation_service_delegate_->web_contents(), |
- presentation_service_delegate_->default_source(), |
- presentation_service_delegate_->default_frame_url()); |
+ presentation_service_delegate_->AddDefaultPresentationRequestObserver(this); |
+ InitCommon(presentation_service_delegate_->web_contents()); |
+ OnDefaultPresentationChanged( |
+ presentation_service_delegate_->GetDefaultPresentationRequest()); |
} |
void MediaRouterUI::InitWithPresentationSessionRequest( |
content::WebContents* initiator, |
const base::WeakPtr<PresentationServiceDelegateImpl>& delegate, |
- scoped_ptr<CreatePresentationSessionRequest> presentation_request) { |
+ scoped_ptr<CreatePresentationSessionRequest> create_session_request) { |
DCHECK(initiator); |
- DCHECK(presentation_request); |
- DCHECK(!presentation_request_); |
+ DCHECK(create_session_request); |
+ DCHECK(!create_session_request_); |
DCHECK(!query_result_manager_); |
- presentation_request_ = presentation_request.Pass(); |
+ create_session_request_ = create_session_request.Pass(); |
presentation_service_delegate_ = delegate; |
- InitCommon(initiator, presentation_request_->media_source(), |
- presentation_request_->frame_url()); |
+ InitCommon(initiator); |
+ OnDefaultPresentationChanged( |
+ &create_session_request_->presentation_request()); |
} |
-void MediaRouterUI::InitCommon(content::WebContents* initiator, |
- const MediaSource& default_source, |
- const GURL& default_frame_url) { |
+void MediaRouterUI::InitCommon(content::WebContents* initiator) { |
DCHECK(initiator); |
DCHECK(router_); |
@@ -223,26 +223,28 @@ void MediaRouterUI::InitCommon(content::WebContents* initiator, |
MediaSourceForTab(SessionTabHelper::IdForTab(initiator))); |
query_result_manager_->StartSinksQuery( |
MediaCastMode::TAB_MIRROR, mirroring_source); |
- |
- OnDefaultMediaSourceChanged(default_source, default_frame_url); |
} |
-void MediaRouterUI::OnDefaultMediaSourceChanged(const MediaSource& source, |
- const GURL& frame_url) { |
- if (source.Empty()) { |
+void MediaRouterUI::OnDefaultPresentationChanged( |
+ const PresentationRequest* presentation_request) { |
+ if (!presentation_request) { |
+ presentation_request_.reset(); |
query_result_manager_->StopSinksQuery(MediaCastMode::DEFAULT); |
} else { |
+ presentation_request_.reset(new PresentationRequest(*presentation_request)); |
+ MediaSource source(MediaSourceForPresentationUrl( |
+ presentation_request_->presentation_url())); |
query_result_manager_->StartSinksQuery(MediaCastMode::DEFAULT, source); |
} |
- UpdateSourceHostAndCastModes(frame_url); |
-} |
-void MediaRouterUI::UpdateSourceHostAndCastModes(const GURL& frame_url) { |
- DCHECK(query_result_manager_); |
- frame_url_ = frame_url; |
+ // Gets updated cast modes from |query_result_manager_| and forwards it to UI. |
query_result_manager_->GetSupportedCastModes(&cast_modes_); |
- if (ui_initialized_) |
- handler_->UpdateCastModes(cast_modes_, GetHostFromURL(frame_url_)); |
+ if (ui_initialized_) { |
+ handler_->UpdateCastModes( |
+ cast_modes_, presentation_request_ |
+ ? GetHostFromURL(presentation_request_->frame_url()) |
mark a. foltz
2015/10/20 20:15:25
Is frame_url a GURL? Can you say presentation_req
imcheng
2015/10/24 00:41:19
There's some additional truncating logic in GetHos
|
+ : std::string()); |
+ } |
} |
void MediaRouterUI::Close() { |
@@ -268,11 +270,11 @@ bool MediaRouterUI::CreateRoute(const MediaSink::Id& sink_id, |
DCHECK(initiator_); |
// Note that there is a rarely-encountered bug, where the MediaCastMode to |
- // MediaSource mapping could have been updated, between when the user |
- // clicked on the UI to start a create route request, |
- // and when this function is called. |
- // However, since the user does not have visibility into the MediaSource, and |
- // that it occurs very rarely in practice, we leave it as-is for now. |
+ // MediaSource mapping could have been updated, between when the user clicked |
+ // on the UI to start a create route request, and when this function is |
+ // called. However, since the user does not have visibility into the |
+ // MediaSource, and that it occurs very rarely in practice, we leave it as-is |
+ // for now. |
MediaSource source = query_result_manager_->GetSourceForCastMode(cast_mode); |
if (source.Empty()) { |
LOG(ERROR) << "No corresponding MediaSource for cast mode " << cast_mode; |
@@ -280,11 +282,17 @@ bool MediaRouterUI::CreateRoute(const MediaSink::Id& sink_id, |
} |
requesting_route_for_default_source_ = cast_mode == MediaCastMode::DEFAULT; |
+ DCHECK_IMPLIES(requesting_route_for_default_source_, presentation_request_); |
mark a. foltz
2015/10/20 20:15:25
Remove DCHECK since you're handling this below.
imcheng
2015/10/24 00:41:19
Below is how I would handle it in release builds.
|
+ if (requesting_route_for_default_source_ && !presentation_request_) { |
+ DLOG(ERROR) << "Requested to create a route for presentation, but " |
+ << "presentation request is missing."; |
+ return false; |
+ } |
+ |
current_route_request_id_ = ++route_request_counter_; |
GURL origin; |
- // TODO(imcheng): What is the origin if not creating route in DEFAULT mode? |
if (requesting_route_for_default_source_) { |
- origin = frame_url_.GetOrigin(); |
+ origin = presentation_request_->frame_url().GetOrigin(); |
} else { |
// Requesting route for mirroring. Use a placeholder URL as origin. |
origin = GURL(chrome::kChromeUIMediaRouterURL); |
@@ -310,16 +318,16 @@ bool MediaRouterUI::CreateRoute(const MediaSink::Id& sink_id, |
weak_factory_.GetWeakPtr(), current_route_request_id_, |
sink_id)); |
if (requesting_route_for_default_source_) { |
- if (presentation_request_) { |
- // |presentation_request_| will be nullptr after this call, as the |
+ if (create_session_request_) { |
+ // |create_session_request_| will be nullptr after this call, as the |
// object will be transferred to the callback. |
route_response_callbacks.push_back( |
base::Bind(&CreatePresentationSessionRequest::HandleRouteResponse, |
- base::Passed(&presentation_request_))); |
+ base::Passed(&create_session_request_))); |
} else if (presentation_service_delegate_) { |
route_response_callbacks.push_back( |
base::Bind(&PresentationServiceDelegateImpl::OnRouteResponse, |
- presentation_service_delegate_)); |
+ presentation_service_delegate_, *presentation_request_)); |
} |
} |