Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3088)

Unified Diff: chrome/browser/media/router/presentation_service_delegate_impl.cc

Issue 2343013002: [Presentation API] (MR side) 1-UA: notify receiver page when receiver connection becomes available (Closed)
Patch Set: resolve code review comments from Derek Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 581357dced0c7900c4062f72870482a748830424..4987b05fca4651b7db68884c34f562b856c8d071 100644
--- a/chrome/browser/media/router/presentation_service_delegate_impl.cc
+++ b/chrome/browser/media/router/presentation_service_delegate_impl.cc
@@ -21,6 +21,8 @@
#include "chrome/browser/media/router/media_router_factory.h"
#include "chrome/browser/media/router/media_sink.h"
#include "chrome/browser/media/router/media_source_helper.h"
+#include "chrome/browser/media/router/offscreen_presentation_manager.h"
+#include "chrome/browser/media/router/offscreen_presentation_manager_factory.h"
#include "chrome/browser/media/router/presentation_media_sinks_observer.h"
#include "chrome/browser/media/router/route_message.h"
#include "chrome/browser/media/router/route_message_observer.h"
@@ -148,6 +150,11 @@ class PresentationFrame {
delegate_observer_ = observer;
}
+ void SetOffscreenPresentationClient(
+ content::OffscreenPresentationClient* client) {
+ offscreen_presentation_client_ = client;
+ }
+
private:
MediaSource GetMediaSourceFromListener(
content::PresentationScreenAvailabilityListener* listener) const;
@@ -171,7 +178,9 @@ class PresentationFrame {
const content::WebContents* web_contents_;
MediaRouter* router_;
+ OffscreenPresentationManager* const offscreen_presentation_manager_;
DelegateObserver* delegate_observer_;
+ content::OffscreenPresentationClient* offscreen_presentation_client_;
};
PresentationFrame::PresentationFrame(
@@ -181,7 +190,11 @@ PresentationFrame::PresentationFrame(
: render_frame_host_id_(render_frame_host_id),
web_contents_(web_contents),
router_(router),
- delegate_observer_(nullptr) {
+ offscreen_presentation_manager_(
+ OffscreenPresentationManagerFactory::GetOrCreateForBrowserContext(
+ web_contents_->GetBrowserContext())),
+ delegate_observer_(nullptr),
+ offscreen_presentation_client_(nullptr) {
DCHECK(web_contents_);
DCHECK(router_);
}
@@ -198,6 +211,9 @@ void PresentationFrame::OnPresentationSessionStarted(
const content::PresentationSessionInfo& session,
const MediaRoute::Id& route_id) {
presentation_id_to_route_id_[session.presentation_id] = route_id;
+ offscreen_presentation_manager_->RegisterOffscreenPresentationController(
imcheng 2016/09/28 07:28:37 Don't we need to check the started presentation is
zhaobin 2016/09/29 17:20:44 Yes, we need to check if it is offscreen presentat
+ session.presentation_id, render_frame_host_id_.second,
+ offscreen_presentation_client_);
}
const MediaRoute::Id PresentationFrame::GetRouteId(
@@ -251,8 +267,11 @@ bool PresentationFrame::HasScreenAvailabilityListenerForTest(
}
void PresentationFrame::Reset() {
- for (const auto& pid_route_id : presentation_id_to_route_id_)
+ for (const auto& pid_route_id : presentation_id_to_route_id_) {
router_->DetachRoute(pid_route_id.second);
+ offscreen_presentation_manager_->UnregisterOffscreenPresentationController(
imcheng 2016/09/28 07:28:37 Something to think about: how do we tell the recei
zhaobin 2016/09/29 17:20:44 Original plan: In receiver's PSImpl::CloseConnecti
+ pid_route_id.first, render_frame_host_id_.second);
+ }
presentation_id_to_route_id_.clear();
url_to_sinks_observer_.clear();
@@ -270,6 +289,9 @@ void PresentationFrame::RemoveConnection(const std::string& presentation_id,
// We keep the PresentationConnectionStateChangedCallback registered with MR
// so the MRP can tell us when terminate() completed.
+
+ offscreen_presentation_manager_->UnregisterOffscreenPresentationController(
+ presentation_id, render_frame_host_id_.second);
}
void PresentationFrame::ListenForConnectionStateChange(
@@ -387,6 +409,9 @@ class PresentationFrameManager {
const PresentationRequest& request,
const content::PresentationSessionInfo& session,
const MediaRoute::Id& route_id);
+ void RegisterOffscreenPresentationClient(
+ const RenderFrameHostId& render_frame_host_id,
+ content::OffscreenPresentationClient* client);
const MediaRoute::Id GetRouteId(const RenderFrameHostId& render_frame_host_id,
const std::string& presentation_id) const;
@@ -651,6 +676,13 @@ void PresentationFrameManager::SetMediaRouterForTest(MediaRouter* router) {
router_ = router;
}
+void PresentationFrameManager::RegisterOffscreenPresentationClient(
+ const RenderFrameHostId& render_frame_host_id,
+ content::OffscreenPresentationClient* client) {
+ auto* presentation_frame = GetOrAddPresentationFrame(render_frame_host_id);
+ presentation_frame->SetOffscreenPresentationClient(client);
+}
+
PresentationServiceDelegateImpl*
PresentationServiceDelegateImpl::GetOrCreateForWebContents(
content::WebContents* web_contents) {
@@ -966,4 +998,13 @@ bool PresentationServiceDelegateImpl::HasScreenAvailabilityListenerForTest(
render_frame_host_id, source_id);
}
+void PresentationServiceDelegateImpl::RegisterOffscreenPresentationClient(
+ int render_process_id,
+ int render_frame_id,
+ content::OffscreenPresentationClient* client) {
+ RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id);
+ frame_manager_->RegisterOffscreenPresentationClient(render_frame_host_id,
+ client);
+}
+
} // namespace media_router

Powered by Google App Engine
This is Rietveld 408576698