Index: chrome/browser/media/router/presentation_service_delegate_impl.cc |
diff --git a/chrome/browser/media/router/presentation_service_delegate_impl.cc b/chrome/browser/media/router/presentation_service_delegate_impl.cc |
index e45b394d7254ed0824c23f607e1dc9881074332a..d2228e537504843ad86382a6a6f869f894188e55 100644 |
--- a/chrome/browser/media/router/presentation_service_delegate_impl.cc |
+++ b/chrome/browser/media/router/presentation_service_delegate_impl.cc |
@@ -11,7 +11,7 @@ |
#include "base/guid.h" |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
-#include "chrome/browser/media/router/create_presentation_session_request.h" |
+#include "chrome/browser/media/router/create_presentation_connection_request.h" |
#include "chrome/browser/media/router/media_route.h" |
#include "chrome/browser/media/router/media_router.h" |
#include "chrome/browser/media/router/media_router_dialog_controller.h" |
@@ -37,10 +37,6 @@ namespace media_router { |
namespace { |
using DelegateObserver = content::PresentationServiceDelegate::Observer; |
-using PresentationSessionErrorCallback = |
- content::PresentationServiceDelegate::PresentationSessionErrorCallback; |
-using PresentationSessionSuccessCallback = |
- content::PresentationServiceDelegate::PresentationSessionSuccessCallback; |
// Returns the unique identifier for the supplied RenderFrameHost. |
RenderFrameHostId GetRenderFrameHostId(RenderFrameHost* render_frame_host) { |
@@ -84,6 +80,7 @@ class PresentationFrame { |
void ListenForSessionMessages( |
const content::PresentationSessionInfo& session, |
const content::PresentationSessionMessageCallback& message_cb); |
+ |
void Reset(); |
const MediaRoute::Id GetRouteId(const std::string& presentation_id) const; |
@@ -91,7 +88,6 @@ class PresentationFrame { |
void OnPresentationSessionClosed(const std::string& presentation_id); |
void OnPresentationSessionStarted( |
- bool is_default_presentation, |
const content::PresentationSessionInfo& session, |
const MediaRoute::Id& route_id); |
void OnPresentationServiceDelegateDestroyed() const; |
@@ -135,15 +131,12 @@ void PresentationFrame::OnPresentationServiceDelegateDestroyed() const { |
} |
void PresentationFrame::OnPresentationSessionStarted( |
- bool is_default_presentation, |
const content::PresentationSessionInfo& session, |
const MediaRoute::Id& route_id) { |
presentation_id_to_route_id_[session.presentation_id] = route_id; |
route_id_to_presentation_.Add(route_id, session); |
if (session_state_observer_) |
session_state_observer_->OnPresentationSessionConnected(route_id); |
- if (is_default_presentation && delegate_observer_) |
- delegate_observer_->OnDefaultPresentationStarted(session); |
} |
void PresentationFrame::OnPresentationSessionClosed( |
@@ -211,6 +204,7 @@ void PresentationFrame::Reset() { |
sinks_observer_.reset(); |
if (session_state_observer_) |
session_state_observer_->Reset(); |
+ |
session_messages_observers_.clear(); |
} |
@@ -265,9 +259,23 @@ class PresentationFrameManager { |
const RenderFrameHostId& render_frame_host_id, |
const content::PresentationSessionInfo& session, |
const content::PresentationSessionMessageCallback& message_cb); |
+ |
+ // Sets or clears the default presentation request and callback for the given |
+ // frame. Also sets / clears the default presentation requests for the owning |
+ // tab WebContents. |
+ void SetDefaultPresentationUrl( |
+ const RenderFrameHostId& render_frame_host_id, |
+ const std::string& default_presentation_url, |
+ const content::PresentationSessionStartedCallback& callback); |
void AddDelegateObserver(const RenderFrameHostId& render_frame_host_id, |
DelegateObserver* observer); |
void RemoveDelegateObserver(const RenderFrameHostId& render_frame_host_id); |
+ void AddDefaultPresentationRequestObserver( |
+ PresentationServiceDelegateImpl::DefaultPresentationRequestObserver* |
+ observer); |
+ void RemoveDefaultPresentationRequestObserver( |
+ PresentationServiceDelegateImpl::DefaultPresentationRequestObserver* |
+ observer); |
void Reset(const RenderFrameHostId& render_frame_host_id); |
bool HasScreenAvailabilityListenerForTest( |
const RenderFrameHostId& render_frame_host_id, |
@@ -276,7 +284,10 @@ class PresentationFrameManager { |
void OnPresentationSessionStarted( |
const RenderFrameHostId& render_frame_host_id, |
- bool is_default_presentation, |
+ const content::PresentationSessionInfo& session, |
+ const MediaRoute::Id& route_id); |
+ void OnDefaultPresentationSessionStarted( |
+ const PresentationRequest& request, |
const content::PresentationSessionInfo& session, |
const MediaRoute::Id& route_id); |
@@ -288,15 +299,44 @@ class PresentationFrameManager { |
const std::vector<MediaRoute::Id> GetRouteIds( |
const RenderFrameHostId& render_frame_host_id) const; |
+ const PresentationRequest* default_presentation_request() const { |
+ return default_presentation_request_.get(); |
+ } |
+ |
private: |
PresentationFrame* GetOrAddPresentationFrame( |
const RenderFrameHostId& render_frame_host_id); |
+ // Sets the default presentation request for the owning WebContents and |
+ // notifies observers of changes. |
+ void SetDefaultPresentationRequest( |
+ const PresentationRequest& default_presentation_request); |
+ |
+ // Clears the default presentation request for the owning WebContents and |
+ // notifies observers of changes. Also resets |
+ // |default_presentation_started_callback_|. |
+ void ClearDefaultPresentationRequest(); |
+ |
+ bool IsMainFrame(const RenderFrameHostId& render_frame_host_id) const; |
+ |
// Maps a frame identifier to a PresentationFrame object for frames |
// that are using presentation API. |
base::ScopedPtrHashMap<RenderFrameHostId, scoped_ptr<PresentationFrame>> |
presentation_frames_; |
+ // Default presentation request for the owning tab WebContents. |
+ scoped_ptr<PresentationRequest> default_presentation_request_; |
+ |
+ // Callback to invoke when default presentation has started. |
+ content::PresentationSessionStartedCallback |
+ default_presentation_started_callback_; |
+ |
+ // References to the observers listening for changes to this tab WebContent's |
+ // default presentation. |
+ base::ObserverList< |
+ PresentationServiceDelegateImpl::DefaultPresentationRequestObserver> |
+ default_presentation_request_observers_; |
+ |
// References to the owning WebContents, and the corresponding MediaRouter. |
MediaRouter* router_; |
content::WebContents* web_contents_; |
@@ -317,13 +357,26 @@ PresentationFrameManager::~PresentationFrameManager() { |
void PresentationFrameManager::OnPresentationSessionStarted( |
const RenderFrameHostId& render_frame_host_id, |
- bool is_default_presentation, |
const content::PresentationSessionInfo& session, |
const MediaRoute::Id& route_id) { |
auto presentation_frame = presentation_frames_.get(render_frame_host_id); |
if (presentation_frame) |
- presentation_frame->OnPresentationSessionStarted(is_default_presentation, |
- session, route_id); |
+ presentation_frame->OnPresentationSessionStarted(session, route_id); |
+} |
+ |
+void PresentationFrameManager::OnDefaultPresentationSessionStarted( |
+ const PresentationRequest& request, |
+ const content::PresentationSessionInfo& session, |
+ const MediaRoute::Id& route_id) { |
+ auto presentation_frame = |
+ presentation_frames_.get(request.render_frame_host_id()); |
+ if (presentation_frame) |
+ presentation_frame->OnPresentationSessionStarted(session, route_id); |
+ |
+ if (default_presentation_request_ && |
+ default_presentation_request_->Equals(request)) { |
+ default_presentation_started_callback_.Run(session); |
+ } |
} |
void PresentationFrameManager::OnPresentationSessionClosed( |
@@ -397,6 +450,25 @@ void PresentationFrameManager::ListenForSessionMessages( |
presentation_frame->ListenForSessionMessages(session, message_cb); |
} |
+void PresentationFrameManager::SetDefaultPresentationUrl( |
+ const RenderFrameHostId& render_frame_host_id, |
+ const std::string& default_presentation_url, |
+ const content::PresentationSessionStartedCallback& callback) { |
+ if (!IsMainFrame(render_frame_host_id)) |
+ return; |
+ |
+ if (default_presentation_url.empty()) { |
+ ClearDefaultPresentationRequest(); |
+ } else { |
+ DCHECK(!callback.is_null()); |
+ GURL frame_url(GetLastCommittedURLForFrame(render_frame_host_id)); |
+ PresentationRequest request(render_frame_host_id, default_presentation_url, |
+ frame_url); |
+ default_presentation_started_callback_ = callback; |
+ SetDefaultPresentationRequest(request); |
+ } |
+} |
+ |
void PresentationFrameManager::AddDelegateObserver( |
const RenderFrameHostId& render_frame_host_id, |
DelegateObserver* observer) { |
@@ -413,11 +485,29 @@ void PresentationFrameManager::RemoveDelegateObserver( |
} |
} |
+void PresentationFrameManager::AddDefaultPresentationRequestObserver( |
+ PresentationServiceDelegateImpl::DefaultPresentationRequestObserver* |
+ observer) { |
+ default_presentation_request_observers_.AddObserver(observer); |
+} |
+ |
+void PresentationFrameManager::RemoveDefaultPresentationRequestObserver( |
+ PresentationServiceDelegateImpl::DefaultPresentationRequestObserver* |
+ observer) { |
+ default_presentation_request_observers_.RemoveObserver(observer); |
+} |
+ |
void PresentationFrameManager::Reset( |
const RenderFrameHostId& render_frame_host_id) { |
auto presentation_frame = presentation_frames_.get(render_frame_host_id); |
if (presentation_frame) |
presentation_frame->Reset(); |
+ |
+ if (default_presentation_request_ && |
+ render_frame_host_id == |
+ default_presentation_request_->render_frame_host_id()) { |
+ ClearDefaultPresentationRequest(); |
+ } |
} |
PresentationFrame* PresentationFrameManager::GetOrAddPresentationFrame( |
@@ -431,6 +521,37 @@ PresentationFrame* PresentationFrameManager::GetOrAddPresentationFrame( |
return presentation_frames_.get(render_frame_host_id); |
} |
+void PresentationFrameManager::ClearDefaultPresentationRequest() { |
+ default_presentation_started_callback_.Reset(); |
+ if (!default_presentation_request_) |
+ return; |
+ |
+ default_presentation_request_.reset(); |
+ FOR_EACH_OBSERVER( |
+ PresentationServiceDelegateImpl::DefaultPresentationRequestObserver, |
+ default_presentation_request_observers_, OnDefaultPresentationRemoved()); |
+} |
+ |
+bool PresentationFrameManager::IsMainFrame( |
+ const RenderFrameHostId& render_frame_host_id) const { |
+ RenderFrameHost* main_frame = web_contents_->GetMainFrame(); |
+ return main_frame && GetRenderFrameHostId(main_frame) == render_frame_host_id; |
+} |
+ |
+void PresentationFrameManager::SetDefaultPresentationRequest( |
+ const PresentationRequest& default_presentation_request) { |
+ if (default_presentation_request_ && |
+ default_presentation_request_->Equals(default_presentation_request)) |
+ return; |
+ |
+ default_presentation_request_.reset( |
+ new PresentationRequest(default_presentation_request)); |
+ FOR_EACH_OBSERVER( |
+ PresentationServiceDelegateImpl::DefaultPresentationRequestObserver, |
+ default_presentation_request_observers_, |
+ OnDefaultPresentationChanged(*default_presentation_request_)); |
+} |
+ |
void PresentationFrameManager::SetMediaRouterForTest(MediaRouter* router) { |
router_ = router; |
} |
@@ -494,60 +615,24 @@ void PresentationServiceDelegateImpl::Reset(int render_process_id, |
int render_frame_id) { |
RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
frame_manager_->Reset(render_frame_host_id); |
- if (render_frame_host_id == default_presentation_render_frame_host_id_) { |
- UpdateDefaultMediaSourceAndNotifyObservers(RenderFrameHostId(), |
- MediaSource(), GURL()); |
- } |
} |
void PresentationServiceDelegateImpl::SetDefaultPresentationUrl( |
int render_process_id, |
int render_frame_id, |
- const std::string& default_presentation_url) { |
+ const std::string& default_presentation_url, |
+ const content::PresentationSessionStartedCallback& callback) { |
RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
- if (IsMainFrame(render_process_id, render_frame_id)) { |
- // This is the main frame, which means tab-level default presentation |
- // might have been updated. |
- MediaSource default_source; |
- if (!default_presentation_url.empty()) |
- default_source = MediaSourceForPresentationUrl(default_presentation_url); |
- |
- GURL default_frame_url = GetLastCommittedURLForFrame(render_frame_host_id); |
- UpdateDefaultMediaSourceAndNotifyObservers( |
- render_frame_host_id, default_source, default_frame_url); |
- } |
-} |
- |
-bool PresentationServiceDelegateImpl::IsMainFrame(int render_process_id, |
- int render_frame_id) const { |
- RenderFrameHost* main_frame = web_contents_->GetMainFrame(); |
- return main_frame && |
- GetRenderFrameHostId(main_frame) == |
- RenderFrameHostId(render_process_id, render_frame_id); |
-} |
- |
-void PresentationServiceDelegateImpl:: |
- UpdateDefaultMediaSourceAndNotifyObservers( |
- const RenderFrameHostId& render_frame_host_id, |
- const MediaSource& new_default_source, |
- const GURL& new_default_frame_url) { |
- default_presentation_render_frame_host_id_ = render_frame_host_id; |
- if (!new_default_source.Equals(default_source_) || |
- new_default_frame_url != default_frame_url_) { |
- default_source_ = new_default_source; |
- default_frame_url_ = new_default_frame_url; |
- FOR_EACH_OBSERVER( |
- DefaultMediaSourceObserver, default_media_source_observers_, |
- OnDefaultMediaSourceChanged(default_source_, default_frame_url_)); |
- } |
+ frame_manager_->SetDefaultPresentationUrl(render_frame_host_id, |
+ default_presentation_url, callback); |
} |
void PresentationServiceDelegateImpl::OnJoinRouteResponse( |
int render_process_id, |
int render_frame_id, |
const content::PresentationSessionInfo& session, |
- const PresentationSessionSuccessCallback& success_cb, |
- const PresentationSessionErrorCallback& error_cb, |
+ const content::PresentationSessionStartedCallback& success_cb, |
+ const content::PresentationSessionErrorCallback& error_cb, |
const MediaRoute* route, |
const std::string& presentation_id, |
const std::string& error_text) { |
@@ -561,7 +646,7 @@ void PresentationServiceDelegateImpl::OnJoinRouteResponse( |
<< ", presentation ID: " << session.presentation_id; |
DCHECK_EQ(session.presentation_id, presentation_id); |
frame_manager_->OnPresentationSessionStarted( |
- RenderFrameHostId(render_process_id, render_frame_id), false, session, |
+ RenderFrameHostId(render_process_id, render_frame_id), session, |
route->media_route_id()); |
success_cb.Run(session); |
} |
@@ -570,7 +655,7 @@ void PresentationServiceDelegateImpl::OnJoinRouteResponse( |
void PresentationServiceDelegateImpl::OnStartSessionSucceeded( |
int render_process_id, |
int render_frame_id, |
- const PresentationSessionSuccessCallback& success_cb, |
+ const content::PresentationSessionStartedCallback& success_cb, |
const content::PresentationSessionInfo& new_session, |
const MediaRoute::Id& route_id) { |
DVLOG(1) << "OnStartSessionSucceeded: " |
@@ -578,7 +663,7 @@ void PresentationServiceDelegateImpl::OnStartSessionSucceeded( |
<< ", presentation URL: " << new_session.presentation_url |
<< ", presentation ID: " << new_session.presentation_id; |
frame_manager_->OnPresentationSessionStarted( |
- RenderFrameHostId(render_process_id, render_frame_id), false, new_session, |
+ RenderFrameHostId(render_process_id, render_frame_id), new_session, |
route_id); |
success_cb.Run(new_session); |
} |
@@ -587,25 +672,26 @@ void PresentationServiceDelegateImpl::StartSession( |
int render_process_id, |
int render_frame_id, |
const std::string& presentation_url, |
- const PresentationSessionSuccessCallback& success_cb, |
- const PresentationSessionErrorCallback& error_cb) { |
+ const content::PresentationSessionStartedCallback& success_cb, |
+ const content::PresentationSessionErrorCallback& error_cb) { |
if (presentation_url.empty() || !IsValidPresentationUrl(presentation_url)) { |
error_cb.Run(content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, |
"Invalid presentation arguments.")); |
return; |
} |
- RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
- scoped_ptr<CreatePresentationSessionRequest> context( |
- new CreatePresentationSessionRequest( |
- presentation_url, GetLastCommittedURLForFrame(render_frame_host_id), |
+ RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
+ scoped_ptr<CreatePresentationConnectionRequest> request( |
+ new CreatePresentationConnectionRequest( |
+ render_frame_host_id, presentation_url, |
+ GetLastCommittedURLForFrame(render_frame_host_id), |
base::Bind(&PresentationServiceDelegateImpl::OnStartSessionSucceeded, |
weak_factory_.GetWeakPtr(), render_process_id, |
render_frame_id, success_cb), |
error_cb)); |
MediaRouterDialogController* controller = |
MediaRouterDialogController::GetOrCreateForWebContents(web_contents_); |
- if (!controller->ShowMediaRouterDialogForPresentation(context.Pass())) { |
+ if (!controller->ShowMediaRouterDialogForPresentation(request.Pass())) { |
LOG(ERROR) << "Media router dialog already exists. Ignoring StartSession."; |
error_cb.Run(content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, |
"Unable to create dialog.")); |
@@ -618,8 +704,8 @@ void PresentationServiceDelegateImpl::JoinSession( |
int render_frame_id, |
const std::string& presentation_url, |
const std::string& presentation_id, |
- const PresentationSessionSuccessCallback& success_cb, |
- const PresentationSessionErrorCallback& error_cb) { |
+ const content::PresentationSessionStartedCallback& success_cb, |
+ const content::PresentationSessionErrorCallback& error_cb) { |
std::vector<MediaRouteResponseCallback> route_response_callbacks; |
route_response_callbacks.push_back(base::Bind( |
&PresentationServiceDelegateImpl::OnJoinRouteResponse, |
@@ -689,34 +775,37 @@ void PresentationServiceDelegateImpl::ListenForSessionStateChange( |
} |
void PresentationServiceDelegateImpl::OnRouteResponse( |
+ const PresentationRequest& presentation_request, |
const MediaRoute* route, |
const std::string& presentation_id, |
const std::string& error) { |
if (!route) |
return; |
- const MediaSource& source = route->media_source(); |
- DCHECK(!source.Empty()); |
- if (!default_source_.Equals(source)) |
- return; |
- RenderFrameHost* main_frame = web_contents_->GetMainFrame(); |
- if (!main_frame) |
- return; |
- RenderFrameHostId render_frame_host_id(GetRenderFrameHostId(main_frame)); |
- frame_manager_->OnPresentationSessionStarted( |
- render_frame_host_id, true, |
- content::PresentationSessionInfo(PresentationUrlFromMediaSource(source), |
- presentation_id), |
- route->media_route_id()); |
+ |
+ content::PresentationSessionInfo session_info( |
+ presentation_request.presentation_url(), presentation_id); |
+ frame_manager_->OnDefaultPresentationSessionStarted( |
+ presentation_request, session_info, route->media_route_id()); |
+} |
+ |
+void PresentationServiceDelegateImpl::AddDefaultPresentationRequestObserver( |
+ DefaultPresentationRequestObserver* observer) { |
+ frame_manager_->AddDefaultPresentationRequestObserver(observer); |
+} |
+ |
+void PresentationServiceDelegateImpl::RemoveDefaultPresentationRequestObserver( |
+ DefaultPresentationRequestObserver* observer) { |
+ frame_manager_->RemoveDefaultPresentationRequestObserver(observer); |
} |
-void PresentationServiceDelegateImpl::AddDefaultMediaSourceObserver( |
- DefaultMediaSourceObserver* observer) { |
- default_media_source_observers_.AddObserver(observer); |
+PresentationRequest |
+PresentationServiceDelegateImpl::GetDefaultPresentationRequest() const { |
+ DCHECK(HasDefaultPresentationRequest()); |
+ return *frame_manager_->default_presentation_request(); |
} |
-void PresentationServiceDelegateImpl::RemoveDefaultMediaSourceObserver( |
- DefaultMediaSourceObserver* observer) { |
- default_media_source_observers_.RemoveObserver(observer); |
+bool PresentationServiceDelegateImpl::HasDefaultPresentationRequest() const { |
+ return frame_manager_->default_presentation_request() != nullptr; |
} |
base::WeakPtr<PresentationServiceDelegateImpl> |