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 1942d62a9d67bf259b4755800f69f44b9cd42c50..8827de8373f83802671f87e80e64fb6cd5aa9ca8 100644 |
--- a/chrome/browser/media/router/presentation_service_delegate_impl.cc |
+++ b/chrome/browser/media/router/presentation_service_delegate_impl.cc |
@@ -70,16 +70,13 @@ url::Origin GetLastCommittedURLForFrame( |
} // namespace |
-// Used by PresentationServiceDelegateImpl to manage |
-// listeners and default presentation info in a render frame. |
-// Its lifetime: |
-// * Create an instance with |render_frame_host_id_| if no instance with the |
-// same |render_frame_host_id_| exists in: |
-// PresentationFrameManager::OnPresentationConnection |
-// PresentationFrameManager::OnDefaultPresentationStarted |
-// PresentationFrameManager::SetScreenAvailabilityListener |
-// * Destroy the instance in: |
-// PresentationFrameManager::Reset |
+// PresentationFrame interfaces with MediaRouter to maintain the current state |
+// of Presentation API within a single render frame, such as the set of |
+// PresentationAvailability listeners and PresentationConnections. |
+// Instances are lazily created when certain Presentation API is invoked on a |
+// frame, and are owned by PresentationServiceDelegateImpl. |
+// Instances are destroyed when the corresponding frame navigates, or when it |
+// is destroyed. |
class PresentationFrame { |
public: |
PresentationFrame(const RenderFrameHostId& render_frame_host_id, |
@@ -94,31 +91,24 @@ class PresentationFrame { |
content::PresentationScreenAvailabilityListener* listener); |
bool HasScreenAvailabilityListenerForTest( |
const MediaSource::Id& source_id) const; |
- std::string GetDefaultPresentationId() const; |
void ListenForConnectionStateChange( |
const content::PresentationInfo& connection, |
const content::PresentationConnectionStateChangedCallback& |
state_changed_cb); |
void Reset(); |
- void RemoveConnection(const std::string& presentation_id, |
- const MediaRoute::Id& route_id); |
- const MediaRoute::Id GetRouteId(const std::string& presentation_id) const; |
- |
- void OnPresentationConnection( |
- const content::PresentationInfo& presentation_info, |
- const MediaRoute& route); |
- void OnPresentationServiceDelegateDestroyed() const; |
+ MediaRoute::Id GetRouteId(const std::string& presentation_id) const; |
+ void AddPresentation(const content::PresentationInfo& presentation_info, |
+ const MediaRoute& route); |
void ConnectToPresentation( |
const content::PresentationInfo& presentation_info, |
content::PresentationConnectionPtr controller_connection_ptr, |
content::PresentationConnectionRequest receiver_connection_request); |
+ void RemovePresentation(const std::string& presentation_id); |
private: |
- MediaSource GetMediaSourceFromListener( |
- content::PresentationScreenAvailabilityListener* listener) const; |
base::small_map<std::map<std::string, MediaRoute>> presentation_id_to_route_; |
base::small_map< |
std::map<std::string, std::unique_ptr<PresentationMediaSinksObserver>>> |
@@ -149,17 +139,9 @@ PresentationFrame::PresentationFrame( |
DCHECK(router_); |
} |
-PresentationFrame::~PresentationFrame() { |
-} |
+PresentationFrame::~PresentationFrame() = default; |
-void PresentationFrame::OnPresentationConnection( |
- const content::PresentationInfo& presentation_info, |
- const MediaRoute& route) { |
- presentation_id_to_route_.insert( |
- std::make_pair(presentation_info.presentation_id, route)); |
-} |
- |
-const MediaRoute::Id PresentationFrame::GetRouteId( |
+MediaRoute::Id PresentationFrame::GetRouteId( |
const std::string& presentation_id) const { |
auto it = presentation_id_to_route_.find(presentation_id); |
return it != presentation_id_to_route_.end() ? it->second.media_route_id() |
@@ -168,7 +150,8 @@ const MediaRoute::Id PresentationFrame::GetRouteId( |
bool PresentationFrame::SetScreenAvailabilityListener( |
content::PresentationScreenAvailabilityListener* listener) { |
- MediaSource source(GetMediaSourceFromListener(listener)); |
+ MediaSource source = |
+ MediaSourceForPresentationUrl(listener->GetAvailabilityUrl()); |
if (!IsValidPresentationUrl(source.url())) { |
listener->OnScreenAvailabilityChanged( |
blink::mojom::ScreenAvailability::SOURCE_NOT_SUPPORTED); |
@@ -195,7 +178,8 @@ bool PresentationFrame::SetScreenAvailabilityListener( |
void PresentationFrame::RemoveScreenAvailabilityListener( |
content::PresentationScreenAvailabilityListener* listener) { |
- MediaSource source(GetMediaSourceFromListener(listener)); |
+ MediaSource source = |
+ MediaSourceForPresentationUrl(listener->GetAvailabilityUrl()); |
auto sinks_observer_it = url_to_sinks_observer_.find(source.id()); |
if (sinks_observer_it != url_to_sinks_observer_.end() && |
sinks_observer_it->second->listener() == listener) { |
@@ -227,47 +211,11 @@ void PresentationFrame::Reset() { |
browser_connection_proxies_.clear(); |
} |
-void PresentationFrame::RemoveConnection(const std::string& presentation_id, |
- const MediaRoute::Id& route_id) { |
- // Remove the presentation id mapping so a later call to Reset is a no-op. |
- presentation_id_to_route_.erase(presentation_id); |
- |
- browser_connection_proxies_.erase(route_id); |
- // We keep the PresentationConnectionStateChangedCallback registered with MR |
- // so the MRP can tell us when terminate() completed. |
-} |
- |
-void PresentationFrame::ListenForConnectionStateChange( |
- const content::PresentationInfo& connection, |
- const content::PresentationConnectionStateChangedCallback& |
- state_changed_cb) { |
- auto it = presentation_id_to_route_.find(connection.presentation_id); |
- if (it == presentation_id_to_route_.end()) { |
- DLOG(ERROR) << __func__ << "route id not found for presentation: " |
- << connection.presentation_id; |
- return; |
- } |
- |
- const MediaRoute::Id& route_id = it->second.media_route_id(); |
- if (connection_state_subscriptions_.find(route_id) != |
- connection_state_subscriptions_.end()) { |
- DLOG(ERROR) << __func__ |
- << "Already listening connection state change for route: " |
- << route_id; |
- return; |
- } |
- |
- connection_state_subscriptions_.insert(std::make_pair( |
- route_id, router_->AddPresentationConnectionStateChangedCallback( |
- route_id, state_changed_cb))); |
-} |
- |
-MediaSource PresentationFrame::GetMediaSourceFromListener( |
- content::PresentationScreenAvailabilityListener* listener) const { |
- // If the default presentation URL is empty then fall back to tab mirroring. |
- return listener->GetAvailabilityUrl().is_empty() |
- ? MediaSourceForTab(SessionTabHelper::IdForTab(web_contents_)) |
- : MediaSourceForPresentationUrl(listener->GetAvailabilityUrl()); |
+void PresentationFrame::AddPresentation( |
+ const content::PresentationInfo& presentation_info, |
+ const MediaRoute& route) { |
+ presentation_id_to_route_.insert( |
+ std::make_pair(presentation_info.presentation_id, route)); |
} |
void PresentationFrame::ConnectToPresentation( |
@@ -311,296 +259,42 @@ void PresentationFrame::ConnectToPresentation( |
} |
} |
-// Used by PresentationServiceDelegateImpl to manage PresentationFrames. |
-class PresentationFrameManager { |
- public: |
- PresentationFrameManager(content::WebContents* web_contents, |
- MediaRouter* router); |
- ~PresentationFrameManager(); |
- |
- // Mirror corresponding APIs in PresentationServiceDelegateImpl. |
- bool SetScreenAvailabilityListener( |
- const RenderFrameHostId& render_frame_host_id, |
- content::PresentationScreenAvailabilityListener* listener); |
- void RemoveScreenAvailabilityListener( |
- const RenderFrameHostId& render_frame_host_id, |
- content::PresentationScreenAvailabilityListener* listener); |
- void ListenForConnectionStateChange( |
- const RenderFrameHostId& render_frame_host_id, |
- const content::PresentationInfo& connection, |
- const content::PresentationConnectionStateChangedCallback& |
- state_changed_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 SetDefaultPresentationUrls( |
- const RenderFrameHostId& render_frame_host_id, |
- const std::vector<GURL>& default_presentation_urls, |
- content::DefaultPresentationConnectionCallback 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); |
- void RemoveConnection(const RenderFrameHostId& render_frame_host_id, |
- const MediaRoute::Id& route_id, |
- const std::string& presentation_id); |
- bool HasScreenAvailabilityListenerForTest( |
- const RenderFrameHostId& render_frame_host_id, |
- const MediaSource::Id& source_id) const; |
- void SetMediaRouterForTest(MediaRouter* router); |
- |
- void OnPresentationConnection( |
- const RenderFrameHostId& render_frame_host_id, |
- const content::PresentationInfo& presentation_info, |
- const MediaRoute& route); |
- void OnDefaultPresentationStarted( |
- const PresentationRequest& request, |
- const content::PresentationInfo& presentation_info, |
- const MediaRoute& route); |
- |
- void ConnectToPresentation( |
- const RenderFrameHostId& render_frame_host_id, |
- const content::PresentationInfo& presentation_info, |
- content::PresentationConnectionPtr controller_connection_ptr, |
- content::PresentationConnectionRequest receiver_connection_request); |
- |
- const MediaRoute::Id GetRouteId(const RenderFrameHostId& render_frame_host_id, |
- const std::string& presentation_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. |
- std::unordered_map<RenderFrameHostId, std::unique_ptr<PresentationFrame>, |
- RenderFrameHostIdHasher> |
- presentation_frames_; |
- |
- // Default presentation request for the owning tab WebContents. |
- std::unique_ptr<PresentationRequest> default_presentation_request_; |
- |
- // Callback to invoke when default presentation has started. |
- content::DefaultPresentationConnectionCallback |
- 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_; |
-}; |
- |
-PresentationFrameManager::PresentationFrameManager( |
- content::WebContents* web_contents, |
- MediaRouter* router) |
- : router_(router), web_contents_(web_contents) { |
- DCHECK(web_contents_); |
- DCHECK(router_); |
-} |
- |
-PresentationFrameManager::~PresentationFrameManager() {} |
- |
-void PresentationFrameManager::OnPresentationConnection( |
- const RenderFrameHostId& render_frame_host_id, |
- const content::PresentationInfo& presentation_info, |
- const MediaRoute& route) { |
- auto* presentation_frame = GetOrAddPresentationFrame(render_frame_host_id); |
- presentation_frame->OnPresentationConnection(presentation_info, route); |
-} |
- |
-void PresentationFrameManager::OnDefaultPresentationStarted( |
- const PresentationRequest& request, |
- const content::PresentationInfo& presentation_info, |
- const MediaRoute& route) { |
- OnPresentationConnection(request.render_frame_host_id(), presentation_info, |
- route); |
- |
- if (default_presentation_request_ && |
- default_presentation_request_->Equals(request)) { |
- default_presentation_started_callback_.Run(presentation_info); |
- } |
-} |
- |
-void PresentationFrameManager::ConnectToPresentation( |
- const RenderFrameHostId& render_frame_host_id, |
- const content::PresentationInfo& presentation_info, |
- content::PresentationConnectionPtr controller_connection_ptr, |
- content::PresentationConnectionRequest receiver_connection_request) { |
- auto* presentation_frame = GetOrAddPresentationFrame(render_frame_host_id); |
- presentation_frame->ConnectToPresentation( |
- presentation_info, std::move(controller_connection_ptr), |
- std::move(receiver_connection_request)); |
-} |
- |
-const MediaRoute::Id PresentationFrameManager::GetRouteId( |
- const RenderFrameHostId& render_frame_host_id, |
- const std::string& presentation_id) const { |
- const auto it = presentation_frames_.find(render_frame_host_id); |
- return it != presentation_frames_.end() |
- ? it->second->GetRouteId(presentation_id) |
- : MediaRoute::Id(); |
-} |
- |
-bool PresentationFrameManager::SetScreenAvailabilityListener( |
- const RenderFrameHostId& render_frame_host_id, |
- content::PresentationScreenAvailabilityListener* listener) { |
- DCHECK(listener); |
- auto* presentation_frame = GetOrAddPresentationFrame(render_frame_host_id); |
- return presentation_frame->SetScreenAvailabilityListener(listener); |
-} |
- |
-void PresentationFrameManager::RemoveScreenAvailabilityListener( |
- const RenderFrameHostId& render_frame_host_id, |
- content::PresentationScreenAvailabilityListener* listener) { |
- DCHECK(listener); |
- const auto it = presentation_frames_.find(render_frame_host_id); |
- if (it != presentation_frames_.end()) |
- it->second->RemoveScreenAvailabilityListener(listener); |
-} |
+void PresentationFrame::RemovePresentation(const std::string& presentation_id) { |
+ // Remove the presentation id mapping so a later call to Reset is a no-op. |
+ auto it = presentation_id_to_route_.find(presentation_id); |
+ if (it == presentation_id_to_route_.end()) |
+ return; |
-bool PresentationFrameManager::HasScreenAvailabilityListenerForTest( |
- const RenderFrameHostId& render_frame_host_id, |
- const MediaSource::Id& source_id) const { |
- const auto it = presentation_frames_.find(render_frame_host_id); |
- return it != presentation_frames_.end() && |
- it->second->HasScreenAvailabilityListenerForTest(source_id); |
+ auto route_id = it->second.media_route_id(); |
+ presentation_id_to_route_.erase(presentation_id); |
+ browser_connection_proxies_.erase(route_id); |
+ // We keep the PresentationConnectionStateChangedCallback registered with MR |
+ // so the MRP can tell us when terminate() completed. |
} |
-void PresentationFrameManager::ListenForConnectionStateChange( |
- const RenderFrameHostId& render_frame_host_id, |
+void PresentationFrame::ListenForConnectionStateChange( |
const content::PresentationInfo& connection, |
const content::PresentationConnectionStateChangedCallback& |
state_changed_cb) { |
- const auto it = presentation_frames_.find(render_frame_host_id); |
- if (it != presentation_frames_.end()) |
- it->second->ListenForConnectionStateChange(connection, state_changed_cb); |
-} |
- |
-void PresentationFrameManager::SetDefaultPresentationUrls( |
- const RenderFrameHostId& render_frame_host_id, |
- const std::vector<GURL>& default_presentation_urls, |
- content::DefaultPresentationConnectionCallback callback) { |
- if (!IsMainFrame(render_frame_host_id)) |
+ auto it = presentation_id_to_route_.find(connection.presentation_id); |
+ if (it == presentation_id_to_route_.end()) { |
+ DLOG(ERROR) << __func__ << "route id not found for presentation: " |
+ << connection.presentation_id; |
return; |
- |
- if (default_presentation_urls.empty()) { |
- ClearDefaultPresentationRequest(); |
- } else { |
- DCHECK(!callback.is_null()); |
- const auto& frame_origin = |
- GetLastCommittedURLForFrame(render_frame_host_id); |
- PresentationRequest request(render_frame_host_id, default_presentation_urls, |
- frame_origin); |
- default_presentation_started_callback_ = callback; |
- SetDefaultPresentationRequest(request); |
- } |
-} |
- |
-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) { |
- const auto it = presentation_frames_.find(render_frame_host_id); |
- if (it != presentation_frames_.end()) { |
- it->second->Reset(); |
- presentation_frames_.erase(it); |
- } |
- |
- if (default_presentation_request_ && |
- render_frame_host_id == |
- default_presentation_request_->render_frame_host_id()) { |
- ClearDefaultPresentationRequest(); |
} |
-} |
-void PresentationFrameManager::RemoveConnection( |
- const RenderFrameHostId& render_frame_host_id, |
- const MediaRoute::Id& route_id, |
- const std::string& presentation_id) { |
- const auto it = presentation_frames_.find(render_frame_host_id); |
- if (it != presentation_frames_.end()) |
- it->second->RemoveConnection(route_id, presentation_id); |
-} |
- |
-PresentationFrame* PresentationFrameManager::GetOrAddPresentationFrame( |
- const RenderFrameHostId& render_frame_host_id) { |
- std::unique_ptr<PresentationFrame>& presentation_frame = |
- presentation_frames_[render_frame_host_id]; |
- if (!presentation_frame) { |
- presentation_frame.reset(new PresentationFrame( |
- render_frame_host_id, web_contents_, router_)); |
- } |
- return presentation_frame.get(); |
-} |
- |
-void PresentationFrameManager::ClearDefaultPresentationRequest() { |
- default_presentation_started_callback_.Reset(); |
- if (!default_presentation_request_) |
- return; |
- |
- default_presentation_request_.reset(); |
- for (auto& observer : default_presentation_request_observers_) |
- observer.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)) |
+ const MediaRoute::Id& route_id = it->second.media_route_id(); |
+ if (connection_state_subscriptions_.find(route_id) != |
+ connection_state_subscriptions_.end()) { |
+ DLOG(ERROR) << __func__ |
+ << "Already listening connection state change for route: " |
+ << route_id; |
return; |
+ } |
- default_presentation_request_.reset( |
- new PresentationRequest(default_presentation_request)); |
- for (auto& observer : default_presentation_request_observers_) |
- observer.OnDefaultPresentationChanged(*default_presentation_request_); |
-} |
- |
-void PresentationFrameManager::SetMediaRouterForTest(MediaRouter* router) { |
- router_ = router; |
+ connection_state_subscriptions_.insert(std::make_pair( |
+ route_id, router_->AddPresentationConnectionStateChangedCallback( |
+ route_id, state_changed_cb))); |
} |
PresentationServiceDelegateImpl* |
@@ -617,14 +311,12 @@ PresentationServiceDelegateImpl::PresentationServiceDelegateImpl( |
: web_contents_(web_contents), |
router_(MediaRouterFactory::GetApiForBrowserContext( |
web_contents_->GetBrowserContext())), |
- frame_manager_(new PresentationFrameManager(web_contents, router_)), |
weak_factory_(this) { |
DCHECK(web_contents_); |
DCHECK(router_); |
} |
-PresentationServiceDelegateImpl::~PresentationServiceDelegateImpl() { |
-} |
+PresentationServiceDelegateImpl::~PresentationServiceDelegateImpl() = default; |
void PresentationServiceDelegateImpl::AddObserver(int render_process_id, |
int render_frame_id, |
@@ -643,8 +335,9 @@ bool PresentationServiceDelegateImpl::AddScreenAvailabilityListener( |
int render_frame_id, |
content::PresentationScreenAvailabilityListener* listener) { |
DCHECK(listener); |
- return frame_manager_->SetScreenAvailabilityListener( |
- RenderFrameHostId(render_process_id, render_frame_id), listener); |
+ RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
+ auto* presentation_frame = GetOrAddPresentationFrame(render_frame_host_id); |
+ return presentation_frame->SetScreenAvailabilityListener(listener); |
} |
void PresentationServiceDelegateImpl::RemoveScreenAvailabilityListener( |
@@ -652,14 +345,36 @@ void PresentationServiceDelegateImpl::RemoveScreenAvailabilityListener( |
int render_frame_id, |
content::PresentationScreenAvailabilityListener* listener) { |
DCHECK(listener); |
- frame_manager_->RemoveScreenAvailabilityListener( |
- RenderFrameHostId(render_process_id, render_frame_id), listener); |
+ RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
+ const auto it = presentation_frames_.find(render_frame_host_id); |
+ if (it != presentation_frames_.end()) |
+ it->second->RemoveScreenAvailabilityListener(listener); |
} |
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); |
+ const auto it = presentation_frames_.find(render_frame_host_id); |
+ if (it != presentation_frames_.end()) { |
+ it->second->Reset(); |
+ presentation_frames_.erase(it); |
+ } |
+ |
+ if (default_presentation_request_ && |
+ render_frame_host_id == |
+ default_presentation_request_->render_frame_host_id()) { |
+ ClearDefaultPresentationRequest(); |
+ } |
+} |
+ |
+PresentationFrame* PresentationServiceDelegateImpl::GetOrAddPresentationFrame( |
+ const RenderFrameHostId& render_frame_host_id) { |
+ auto& presentation_frame = presentation_frames_[render_frame_host_id]; |
+ if (!presentation_frame) { |
+ presentation_frame.reset( |
+ new PresentationFrame(render_frame_host_id, web_contents_, router_)); |
+ } |
+ return presentation_frame.get(); |
} |
void PresentationServiceDelegateImpl::SetDefaultPresentationUrls( |
@@ -668,8 +383,20 @@ void PresentationServiceDelegateImpl::SetDefaultPresentationUrls( |
const std::vector<GURL>& default_presentation_urls, |
content::DefaultPresentationConnectionCallback callback) { |
RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
- frame_manager_->SetDefaultPresentationUrls( |
- render_frame_host_id, default_presentation_urls, std::move(callback)); |
+ if (!IsMainFrame(render_frame_host_id)) |
+ return; |
+ |
+ if (default_presentation_urls.empty()) { |
+ ClearDefaultPresentationRequest(); |
+ return; |
+ } |
+ |
+ DCHECK(!callback.is_null()); |
+ auto frame_origin = GetLastCommittedURLForFrame(render_frame_host_id); |
+ PresentationRequest request(render_frame_host_id, default_presentation_urls, |
+ frame_origin); |
+ default_presentation_started_callback_ = std::move(callback); |
+ SetDefaultPresentationRequest(request); |
} |
void PresentationServiceDelegateImpl::OnJoinRouteResponse( |
@@ -691,9 +418,8 @@ void PresentationServiceDelegateImpl::OnJoinRouteResponse( |
DCHECK_EQ(presentation_id, result.presentation_id()); |
content::PresentationInfo presentation_info(presentation_url, |
result.presentation_id()); |
- frame_manager_->OnPresentationConnection( |
- RenderFrameHostId(render_process_id, render_frame_id), |
- presentation_info, *result.route()); |
+ AddPresentation(RenderFrameHostId(render_process_id, render_frame_id), |
+ presentation_info, *result.route()); |
std::move(success_cb).Run(presentation_info); |
} |
} |
@@ -708,12 +434,27 @@ void PresentationServiceDelegateImpl::OnStartPresentationSucceeded( |
<< "route_id: " << route.media_route_id() |
<< ", presentation URL: " << new_presentation_info.presentation_url |
<< ", presentation ID: " << new_presentation_info.presentation_id; |
- frame_manager_->OnPresentationConnection( |
- RenderFrameHostId(render_process_id, render_frame_id), |
- new_presentation_info, route); |
+ AddPresentation(RenderFrameHostId(render_process_id, render_frame_id), |
+ new_presentation_info, route); |
std::move(success_cb).Run(new_presentation_info); |
} |
+void PresentationServiceDelegateImpl::AddPresentation( |
+ const RenderFrameHostId& render_frame_host_id, |
+ const content::PresentationInfo& presentation_info, |
+ const MediaRoute& route) { |
+ auto* presentation_frame = GetOrAddPresentationFrame(render_frame_host_id); |
+ presentation_frame->AddPresentation(presentation_info, route); |
+} |
+ |
+void PresentationServiceDelegateImpl::RemovePresentation( |
+ const RenderFrameHostId& render_frame_host_id, |
+ const std::string& presentation_id) { |
+ const auto it = presentation_frames_.find(render_frame_host_id); |
+ if (it != presentation_frames_.end()) |
+ it->second->RemovePresentation(presentation_id); |
+} |
+ |
void PresentationServiceDelegateImpl::StartPresentation( |
int render_process_id, |
int render_frame_id, |
@@ -745,7 +486,7 @@ void PresentationServiceDelegateImpl::StartPresentation( |
GetLastCommittedURLForFrame(render_frame_host_id), |
base::BindOnce( |
&PresentationServiceDelegateImpl::OnStartPresentationSucceeded, |
- weak_factory_.GetWeakPtr(), render_process_id, render_frame_id, |
+ GetWeakPtr(), render_process_id, render_frame_id, |
std::move(success_cb)), |
std::move(error_cb))); |
MediaRouterDialogController* controller = |
@@ -774,7 +515,7 @@ void PresentationServiceDelegateImpl::ReconnectPresentation( |
return; |
} |
- const url::Origin& origin = GetLastCommittedURLForFrame( |
+ auto origin = GetLastCommittedURLForFrame( |
RenderFrameHostId(render_process_id, render_frame_id)); |
#if !defined(OS_ANDROID) |
@@ -816,11 +557,10 @@ void PresentationServiceDelegateImpl::ReconnectPresentation( |
const GURL& presentation_url = presentation_urls[0]; |
bool incognito = web_contents_->GetBrowserContext()->IsOffTheRecord(); |
std::vector<MediaRouteResponseCallback> route_response_callbacks; |
- route_response_callbacks.push_back( |
- base::BindOnce(&PresentationServiceDelegateImpl::OnJoinRouteResponse, |
- weak_factory_.GetWeakPtr(), render_process_id, |
- render_frame_id, presentation_url, presentation_id, |
- std::move(success_cb), std::move(error_cb))); |
+ route_response_callbacks.push_back(base::BindOnce( |
+ &PresentationServiceDelegateImpl::OnJoinRouteResponse, GetWeakPtr(), |
+ render_process_id, render_frame_id, presentation_url, presentation_id, |
+ std::move(success_cb), std::move(error_cb))); |
router_->JoinRoute(MediaSourceForPresentationUrl(presentation_url).id(), |
presentation_id, origin, web_contents_, |
std::move(route_response_callbacks), base::TimeDelta(), |
@@ -833,8 +573,7 @@ void PresentationServiceDelegateImpl::CloseConnection( |
int render_frame_id, |
const std::string& presentation_id) { |
const RenderFrameHostId rfh_id(render_process_id, render_frame_id); |
- const MediaRoute::Id& route_id = |
- frame_manager_->GetRouteId(rfh_id, presentation_id); |
+ auto route_id = GetRouteId(rfh_id, presentation_id); |
if (route_id.empty()) { |
DVLOG(1) << "No active route for: " << presentation_id; |
return; |
@@ -851,7 +590,7 @@ void PresentationServiceDelegateImpl::CloseConnection( |
} else { |
router_->DetachRoute(route_id); |
} |
- frame_manager_->RemoveConnection(rfh_id, presentation_id, route_id); |
+ RemovePresentation(rfh_id, presentation_id); |
// TODO(mfoltz): close() should always succeed so there is no need to keep the |
// state_changed_cb around - remove it and fire the ChangeEvent on the |
// PresentationConnection in Blink. |
@@ -862,14 +601,13 @@ void PresentationServiceDelegateImpl::Terminate( |
int render_frame_id, |
const std::string& presentation_id) { |
const RenderFrameHostId rfh_id(render_process_id, render_frame_id); |
- const MediaRoute::Id& route_id = |
- frame_manager_->GetRouteId(rfh_id, presentation_id); |
+ auto route_id = GetRouteId(rfh_id, presentation_id); |
if (route_id.empty()) { |
DVLOG(1) << "No active route for: " << presentation_id; |
return; |
} |
router_->TerminateRoute(route_id); |
- frame_manager_->RemoveConnection(rfh_id, presentation_id, route_id); |
+ RemovePresentation(rfh_id, presentation_id); |
} |
void PresentationServiceDelegateImpl::SendMessage( |
@@ -878,9 +616,9 @@ void PresentationServiceDelegateImpl::SendMessage( |
const content::PresentationInfo& presentation_info, |
content::PresentationConnectionMessage message, |
SendMessageCallback send_message_cb) { |
- const MediaRoute::Id& route_id = frame_manager_->GetRouteId( |
- RenderFrameHostId(render_process_id, render_frame_id), |
- presentation_info.presentation_id); |
+ auto route_id = |
+ GetRouteId(RenderFrameHostId(render_process_id, render_frame_id), |
+ presentation_info.presentation_id); |
if (route_id.empty()) { |
DVLOG(1) << "No active route for " << presentation_info.presentation_id; |
std::move(send_message_cb).Run(false); |
@@ -904,9 +642,10 @@ void PresentationServiceDelegateImpl::ListenForConnectionStateChange( |
const content::PresentationInfo& connection, |
const content::PresentationConnectionStateChangedCallback& |
state_changed_cb) { |
- frame_manager_->ListenForConnectionStateChange( |
- RenderFrameHostId(render_process_id, render_frame_id), connection, |
- state_changed_cb); |
+ RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
+ const auto it = presentation_frames_.find(render_frame_host_id); |
+ if (it != presentation_frames_.end()) |
+ it->second->ListenForConnectionStateChange(connection, state_changed_cb); |
} |
void PresentationServiceDelegateImpl::ConnectToPresentation( |
@@ -916,9 +655,10 @@ void PresentationServiceDelegateImpl::ConnectToPresentation( |
content::PresentationConnectionPtr controller_connection_ptr, |
content::PresentationConnectionRequest receiver_connection_request) { |
RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
- frame_manager_->ConnectToPresentation(render_frame_host_id, presentation_info, |
- std::move(controller_connection_ptr), |
- std::move(receiver_connection_request)); |
+ auto* presentation_frame = GetOrAddPresentationFrame(render_frame_host_id); |
+ presentation_frame->ConnectToPresentation( |
+ presentation_info, std::move(controller_connection_ptr), |
+ std::move(receiver_connection_request)); |
} |
void PresentationServiceDelegateImpl::OnRouteResponse( |
@@ -932,28 +672,32 @@ void PresentationServiceDelegateImpl::OnRouteResponse( |
content::PresentationInfo presentation_info(result.presentation_url(), |
result.presentation_id()); |
- frame_manager_->OnDefaultPresentationStarted( |
- presentation_request, presentation_info, *result.route()); |
+ AddPresentation(presentation_request.render_frame_host_id(), |
+ presentation_info, *result.route()); |
+ if (default_presentation_request_ && |
+ default_presentation_request_->Equals(presentation_request)) { |
+ default_presentation_started_callback_.Run(presentation_info); |
+ } |
} |
void PresentationServiceDelegateImpl::AddDefaultPresentationRequestObserver( |
DefaultPresentationRequestObserver* observer) { |
- frame_manager_->AddDefaultPresentationRequestObserver(observer); |
+ default_presentation_request_observers_.AddObserver(observer); |
} |
void PresentationServiceDelegateImpl::RemoveDefaultPresentationRequestObserver( |
DefaultPresentationRequestObserver* observer) { |
- frame_manager_->RemoveDefaultPresentationRequestObserver(observer); |
+ default_presentation_request_observers_.RemoveObserver(observer); |
} |
PresentationRequest |
PresentationServiceDelegateImpl::GetDefaultPresentationRequest() const { |
DCHECK(HasDefaultPresentationRequest()); |
- return *frame_manager_->default_presentation_request(); |
+ return *default_presentation_request_; |
} |
bool PresentationServiceDelegateImpl::HasDefaultPresentationRequest() const { |
- return frame_manager_->default_presentation_request() != nullptr; |
+ return default_presentation_request_ != nullptr; |
} |
base::WeakPtr<PresentationServiceDelegateImpl> |
@@ -964,7 +708,6 @@ PresentationServiceDelegateImpl::GetWeakPtr() { |
void PresentationServiceDelegateImpl::SetMediaRouterForTest( |
MediaRouter* router) { |
router_ = router; |
- frame_manager_->SetMediaRouterForTest(router); |
} |
bool PresentationServiceDelegateImpl::HasScreenAvailabilityListenerForTest( |
@@ -972,8 +715,47 @@ bool PresentationServiceDelegateImpl::HasScreenAvailabilityListenerForTest( |
int render_frame_id, |
const MediaSource::Id& source_id) const { |
RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); |
- return frame_manager_->HasScreenAvailabilityListenerForTest( |
- render_frame_host_id, source_id); |
+ const auto it = presentation_frames_.find(render_frame_host_id); |
+ return it != presentation_frames_.end() && |
+ it->second->HasScreenAvailabilityListenerForTest(source_id); |
+} |
+ |
+void PresentationServiceDelegateImpl::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 (auto& observer : default_presentation_request_observers_) |
+ observer.OnDefaultPresentationChanged(*default_presentation_request_); |
+} |
+ |
+void PresentationServiceDelegateImpl::ClearDefaultPresentationRequest() { |
+ default_presentation_started_callback_.Reset(); |
+ if (!default_presentation_request_) |
+ return; |
+ |
+ default_presentation_request_.reset(); |
+ for (auto& observer : default_presentation_request_observers_) |
+ observer.OnDefaultPresentationRemoved(); |
+} |
+ |
+// TODO(imcheng): Move this check to PresentationServiceImpl. |
+bool PresentationServiceDelegateImpl::IsMainFrame( |
+ const RenderFrameHostId& render_frame_host_id) const { |
+ RenderFrameHost* main_frame = web_contents_->GetMainFrame(); |
+ return main_frame && GetRenderFrameHostId(main_frame) == render_frame_host_id; |
+} |
+ |
+MediaRoute::Id PresentationServiceDelegateImpl::GetRouteId( |
+ const RenderFrameHostId& render_frame_host_id, |
+ const std::string& presentation_id) const { |
+ const auto it = presentation_frames_.find(render_frame_host_id); |
+ return it != presentation_frames_.end() |
+ ? it->second->GetRouteId(presentation_id) |
+ : MediaRoute::Id(); |
} |
#if !defined(OS_ANDROID) |