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 d2228e537504843ad86382a6a6f869f894188e55..e45b394d7254ed0824c23f607e1dc9881074332a 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_connection_request.h" |
+#include "chrome/browser/media/router/create_presentation_session_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,6 +37,10 @@ |
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) { |
@@ -80,7 +84,6 @@ |
void ListenForSessionMessages( |
const content::PresentationSessionInfo& session, |
const content::PresentationSessionMessageCallback& message_cb); |
- |
void Reset(); |
const MediaRoute::Id GetRouteId(const std::string& presentation_id) const; |
@@ -88,6 +91,7 @@ |
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; |
@@ -131,12 +135,15 @@ |
} |
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( |
@@ -204,7 +211,6 @@ |
sinks_observer_.reset(); |
if (session_state_observer_) |
session_state_observer_->Reset(); |
- |
session_messages_observers_.clear(); |
} |
@@ -259,23 +265,9 @@ |
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, |
@@ -284,10 +276,7 @@ |
void OnPresentationSessionStarted( |
const RenderFrameHostId& render_frame_host_id, |
- const content::PresentationSessionInfo& session, |
- const MediaRoute::Id& route_id); |
- void OnDefaultPresentationSessionStarted( |
- const PresentationRequest& request, |
+ bool is_default_presentation, |
const content::PresentationSessionInfo& session, |
const MediaRoute::Id& route_id); |
@@ -299,43 +288,14 @@ |
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_; |
@@ -357,26 +317,13 @@ |
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(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); |
- } |
+ presentation_frame->OnPresentationSessionStarted(is_default_presentation, |
+ session, route_id); |
} |
void PresentationFrameManager::OnPresentationSessionClosed( |
@@ -450,25 +397,6 @@ |
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) { |
@@ -485,29 +413,11 @@ |
} |
} |
-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( |
@@ -519,37 +429,6 @@ |
new PresentationFrame(web_contents_, router_))); |
} |
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) { |
@@ -615,24 +494,60 @@ |
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 content::PresentationSessionStartedCallback& callback) { |
+ const std::string& default_presentation_url) { |
RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
- frame_manager_->SetDefaultPresentationUrl(render_frame_host_id, |
- default_presentation_url, callback); |
+ 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_)); |
+ } |
} |
void PresentationServiceDelegateImpl::OnJoinRouteResponse( |
int render_process_id, |
int render_frame_id, |
const content::PresentationSessionInfo& session, |
- const content::PresentationSessionStartedCallback& success_cb, |
- const content::PresentationSessionErrorCallback& error_cb, |
+ const PresentationSessionSuccessCallback& success_cb, |
+ const PresentationSessionErrorCallback& error_cb, |
const MediaRoute* route, |
const std::string& presentation_id, |
const std::string& error_text) { |
@@ -646,7 +561,7 @@ |
<< ", presentation ID: " << session.presentation_id; |
DCHECK_EQ(session.presentation_id, presentation_id); |
frame_manager_->OnPresentationSessionStarted( |
- RenderFrameHostId(render_process_id, render_frame_id), session, |
+ RenderFrameHostId(render_process_id, render_frame_id), false, session, |
route->media_route_id()); |
success_cb.Run(session); |
} |
@@ -655,7 +570,7 @@ |
void PresentationServiceDelegateImpl::OnStartSessionSucceeded( |
int render_process_id, |
int render_frame_id, |
- const content::PresentationSessionStartedCallback& success_cb, |
+ const PresentationSessionSuccessCallback& success_cb, |
const content::PresentationSessionInfo& new_session, |
const MediaRoute::Id& route_id) { |
DVLOG(1) << "OnStartSessionSucceeded: " |
@@ -663,7 +578,7 @@ |
<< ", presentation URL: " << new_session.presentation_url |
<< ", presentation ID: " << new_session.presentation_id; |
frame_manager_->OnPresentationSessionStarted( |
- RenderFrameHostId(render_process_id, render_frame_id), new_session, |
+ RenderFrameHostId(render_process_id, render_frame_id), false, new_session, |
route_id); |
success_cb.Run(new_session); |
} |
@@ -672,26 +587,25 @@ |
int render_process_id, |
int render_frame_id, |
const std::string& presentation_url, |
- const content::PresentationSessionStartedCallback& success_cb, |
- const content::PresentationSessionErrorCallback& error_cb) { |
+ const PresentationSessionSuccessCallback& success_cb, |
+ const 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<CreatePresentationConnectionRequest> request( |
- new CreatePresentationConnectionRequest( |
- render_frame_host_id, presentation_url, |
- GetLastCommittedURLForFrame(render_frame_host_id), |
+ |
+ scoped_ptr<CreatePresentationSessionRequest> context( |
+ new CreatePresentationSessionRequest( |
+ 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(request.Pass())) { |
+ if (!controller->ShowMediaRouterDialogForPresentation(context.Pass())) { |
LOG(ERROR) << "Media router dialog already exists. Ignoring StartSession."; |
error_cb.Run(content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, |
"Unable to create dialog.")); |
@@ -704,8 +618,8 @@ |
int render_frame_id, |
const std::string& presentation_url, |
const std::string& presentation_id, |
- const content::PresentationSessionStartedCallback& success_cb, |
- const content::PresentationSessionErrorCallback& error_cb) { |
+ const PresentationSessionSuccessCallback& success_cb, |
+ const PresentationSessionErrorCallback& error_cb) { |
std::vector<MediaRouteResponseCallback> route_response_callbacks; |
route_response_callbacks.push_back(base::Bind( |
&PresentationServiceDelegateImpl::OnJoinRouteResponse, |
@@ -775,37 +689,34 @@ |
} |
void PresentationServiceDelegateImpl::OnRouteResponse( |
- const PresentationRequest& presentation_request, |
const MediaRoute* route, |
const std::string& presentation_id, |
const std::string& error) { |
if (!route) |
return; |
- |
- 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); |
-} |
- |
-PresentationRequest |
-PresentationServiceDelegateImpl::GetDefaultPresentationRequest() const { |
- DCHECK(HasDefaultPresentationRequest()); |
- return *frame_manager_->default_presentation_request(); |
-} |
- |
-bool PresentationServiceDelegateImpl::HasDefaultPresentationRequest() const { |
- return frame_manager_->default_presentation_request() != nullptr; |
+ 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()); |
+} |
+ |
+void PresentationServiceDelegateImpl::AddDefaultMediaSourceObserver( |
+ DefaultMediaSourceObserver* observer) { |
+ default_media_source_observers_.AddObserver(observer); |
+} |
+ |
+void PresentationServiceDelegateImpl::RemoveDefaultMediaSourceObserver( |
+ DefaultMediaSourceObserver* observer) { |
+ default_media_source_observers_.RemoveObserver(observer); |
} |
base::WeakPtr<PresentationServiceDelegateImpl> |