Chromium Code Reviews| 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 658a368924e85d1cad18e8533f08ae8e0763b4aa..de3fad78e9b95fbf83c933b833cc0042a01e1dc7 100644 |
| --- a/chrome/browser/ui/webui/media_router/media_router_ui.cc |
| +++ b/chrome/browser/ui/webui/media_router/media_router_ui.cc |
| @@ -22,6 +22,7 @@ |
| #include "chrome/browser/media/router/presentation_service_delegate_impl.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/sessions/session_tab_helper.h" |
| +#include "chrome/browser/ui/webui/media_router/media_router_dialog_controller.h" |
| #include "chrome/browser/ui/webui/media_router/media_router_localized_strings_provider.h" |
| #include "chrome/browser/ui/webui/media_router/media_router_resources_provider.h" |
| #include "chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h" |
| @@ -121,15 +122,22 @@ MediaRouterUI::~MediaRouterUI() { |
| 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 |
| + // request was never attempted. |
| + if (presentation_request_) { |
| + presentation_request_->MaybeInvokeErrorCallback(content::PresentationError( |
| + content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, |
| + "Dialog closed.")); |
| + } |
| } |
| void MediaRouterUI::InitWithDefaultMediaSource( |
| - PresentationServiceDelegateImpl* delegate) { |
| + const base::WeakPtr<PresentationServiceDelegateImpl>& delegate) { |
| DCHECK(delegate); |
| DCHECK(!presentation_service_delegate_); |
| DCHECK(!query_result_manager_.get()); |
| - presentation_service_delegate_ = delegate->GetWeakPtr(); |
| + presentation_service_delegate_ = delegate; |
| presentation_service_delegate_->AddDefaultMediaSourceObserver(this); |
| InitCommon(presentation_service_delegate_->web_contents(), |
| presentation_service_delegate_->default_source(), |
| @@ -137,18 +145,19 @@ void MediaRouterUI::InitWithDefaultMediaSource( |
| } |
| void MediaRouterUI::InitWithPresentationSessionRequest( |
| - const content::WebContents* initiator, |
| - scoped_ptr<CreateSessionRequest> request) { |
| - DCHECK(request.get()); |
| - DCHECK(!presentation_session_request_.get()); |
| - DCHECK(!query_result_manager_.get()); |
| + content::WebContents* initiator, |
| + scoped_ptr<CreateSessionRequest> presentation_request) { |
| + DCHECK(initiator); |
| + DCHECK(presentation_request); |
| + DCHECK(!presentation_request_); |
| + DCHECK(!query_result_manager_); |
| - presentation_session_request_ = request.Pass(); |
| - InitCommon(initiator, presentation_session_request_->GetMediaSource(), |
| - presentation_session_request_->frame_url()); |
| + presentation_request_ = presentation_request.Pass(); |
| + InitCommon(initiator, presentation_request_->GetMediaSource(), |
| + presentation_request_->frame_url()); |
| } |
| -void MediaRouterUI::InitCommon(const content::WebContents* initiator, |
| +void MediaRouterUI::InitCommon(content::WebContents* initiator, |
| const MediaSource& default_source, |
| const GURL& default_frame_url) { |
| DCHECK(initiator); |
| @@ -186,20 +195,6 @@ void MediaRouterUI::OnDefaultMediaSourceChanged(const MediaSource& source, |
| UpdateSourceHostAndCastModes(frame_url); |
| } |
| -void MediaRouterUI::HandleRouteResponseForPresentation( |
| - const MediaRoute* route, |
| - const std::string& error) { |
| - if (!route) { |
| - presentation_session_request_->MaybeInvokeErrorCallback( |
| - content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, error)); |
| - } else { |
| - // TODO(imcheng): Presentation ID should come from the response |
| - // as the IDs might not be the same. |
| - presentation_session_request_->MaybeInvokeSuccessCallback( |
| - route->media_route_id()); |
| - } |
| -} |
| - |
| void MediaRouterUI::UpdateSourceHostAndCastModes(const GURL& frame_url) { |
| DCHECK(query_result_manager_); |
| frame_url_ = frame_url; |
| @@ -209,13 +204,6 @@ void MediaRouterUI::UpdateSourceHostAndCastModes(const GURL& frame_url) { |
| } |
| void MediaRouterUI::Close() { |
| - if (presentation_session_request_.get()) { |
| - presentation_session_request_->MaybeInvokeErrorCallback( |
| - content::PresentationError( |
| - content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, |
| - "Dialog closed.")); |
| - } |
| - |
| ConstrainedWebDialogDelegate* delegate = GetConstrainedDelegate(); |
| if (delegate) { |
| delegate->GetWebDialogDelegate()->OnDialogClosed(std::string()); |
| @@ -282,18 +270,6 @@ void MediaRouterUI::OnRouteResponseReceived(scoped_ptr<MediaRoute> route, |
| else |
| handler_->AddRoute(*route); |
| - if (requesting_route_for_default_source_) { |
| - if (presentation_session_request_.get()) { |
| - HandleRouteResponseForPresentation(route.get(), error); |
| - } else { |
| - // Dialog initiated via browser action. Let |
| - // PresentationServiceDelegateImpl perform the match against the default |
| - // presentation URL. |
| - if (route && presentation_service_delegate_.get()) |
| - presentation_service_delegate_->OnRouteCreated(*route); |
| - } |
| - } |
| - |
| has_pending_route_request_ = false; |
| requesting_route_for_default_source_ = false; |
| } |
| @@ -329,10 +305,22 @@ bool MediaRouterUI::DoCreateRoute(const MediaSink::Id& sink_id, |
| DVLOG(1) << "DoCreateRoute: origin: " << origin; |
| + MediaRouteResponseCallback route_response_callback = base::Bind( |
| + &MediaRouterUI::OnRouteResponseReceived, weak_factory_.GetWeakPtr()); |
| + if (requesting_route_for_default_source_) { |
| + // For presentation route requests, we need to make sure the route response |
| + // callback will outlive this dialog in order to propagate presentation |
| + // API responses correctly. |
| + MediaRouterDialogController* dialog_controller = |
| + MediaRouterDialogController::FromWebContents(initiator_); |
| + DCHECK(dialog_controller); |
| + route_response_callback = dialog_controller->AddPresentationRouteRequest( |
|
haibinlu
2015/07/14 01:44:55
AddPresentationRouteRequest --> AddCreateRouteRequ
imcheng
2015/07/14 16:45:37
ditto
|
| + route_response_callback, presentation_request_.Pass()); |
| + } |
| + |
| router_->CreateRoute(source.id(), sink_id, origin, |
| SessionTabHelper::IdForTab(initiator_), |
| - base::Bind(&MediaRouterUI::OnRouteResponseReceived, |
| - weak_factory_.GetWeakPtr())); |
| + route_response_callback); |
| return true; |
| } |