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()); |
Kevin M
2015/07/13 21:55:26
Assign route_response_callback in an "else" block?
imcheng
2015/07/14 01:00:24
The value here is used inside "if" so I can avoid
|
+ 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( |
+ 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; |
} |