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 cf6182d90097c642478d7fcbd367ca3cdc18f306..54adeec85dcb34ac51fba3c224370bc8e32247e4 100644 |
--- a/chrome/browser/ui/webui/media_router/media_router_ui.cc |
+++ b/chrome/browser/ui/webui/media_router/media_router_ui.cc |
@@ -7,7 +7,7 @@ |
#include <string> |
#include "base/strings/string_util.h" |
-#include "chrome/browser/media/router/create_session_request.h" |
+#include "chrome/browser/media/router/create_presentation_session_request.h" |
#include "chrome/browser/media/router/issue.h" |
#include "chrome/browser/media/router/issues_observer.h" |
#include "chrome/browser/media/router/media_route.h" |
@@ -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" |
@@ -35,6 +36,19 @@ namespace media_router { |
namespace { |
+void HandleRouteResponseForPresentationApi( |
+ scoped_ptr<CreatePresentationSessionRequest> presentation_request, |
+ const MediaRoute* route, |
+ const std::string& error) { |
+ DCHECK(presentation_request); |
+ if (!route) { |
+ presentation_request->MaybeInvokeErrorCallback( |
+ content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, error)); |
+ } else { |
+ presentation_request->MaybeInvokeSuccessCallback(route->media_route_id()); |
+ } |
+} |
+ |
std::string GetHostFromURL(const GURL& gurl) { |
if (gurl.is_empty()) |
return std::string(); |
@@ -121,15 +135,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 +158,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<CreatePresentationSessionRequest> 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); |
@@ -182,20 +204,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; |
@@ -205,13 +213,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()); |
@@ -269,7 +270,7 @@ void MediaRouterUI::OnRoutesUpdated(const std::vector<MediaRoute>& routes) { |
handler_->UpdateRoutes(routes_); |
} |
-void MediaRouterUI::OnRouteResponseReceived(scoped_ptr<MediaRoute> route, |
+void MediaRouterUI::OnRouteResponseReceived(const MediaRoute* route, |
const std::string& error) { |
DVLOG(1) << "OnRouteResponseReceived"; |
// TODO(imcheng): Display error in UI. (crbug.com/490372) |
@@ -278,18 +279,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; |
} |
@@ -325,10 +314,35 @@ bool MediaRouterUI::DoCreateRoute(const MediaSink::Id& sink_id, |
DVLOG(1) << "DoCreateRoute: origin: " << origin; |
+ // There are 3 cases. In all cases the MediaRouterUI will need to be notified. |
+ // (1) Non-presentation route request (e.g., mirroring). No additional |
+ // notification necessary. |
+ // (2) Presentation route request for a Presentation API startSession call. |
+ // The startSession (CreatePresentationSessionRequest) will need to be |
+ // answered with the |
+ // route response. |
+ // (3) Browser-initiated presentation route request. If successful, |
+ // PresentationServiceDelegateImpl will have to be notified. |
+ std::vector<MediaRouteResponseCallback> route_response_callbacks; |
+ route_response_callbacks.push_back(base::Bind( |
+ &MediaRouterUI::OnRouteResponseReceived, weak_factory_.GetWeakPtr())); |
+ if (requesting_route_for_default_source_) { |
+ if (presentation_request_) { |
+ // |presentation_request_| will be nullptr after this call, as the |
+ // object will be transferred to the callback. |
+ route_response_callbacks.push_back( |
+ base::Bind(&HandleRouteResponseForPresentationApi, |
+ base::Passed(&presentation_request_))); |
+ } else if (presentation_service_delegate_) { |
+ route_response_callbacks.push_back( |
+ base::Bind(&PresentationServiceDelegateImpl::OnRouteResponse, |
+ presentation_service_delegate_)); |
+ } |
+ } |
+ |
router_->CreateRoute(source.id(), sink_id, origin, |
SessionTabHelper::IdForTab(initiator_), |
- base::Bind(&MediaRouterUI::OnRouteResponseReceived, |
- weak_factory_.GetWeakPtr())); |
+ route_response_callbacks); |
return true; |
} |