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

Unified Diff: chrome/browser/media/router/offscreen_presentation_manager.h

Issue 1314413005: [Presentation API] 1-UA presentation support + presenter APIs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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/offscreen_presentation_manager.h
diff --git a/chrome/browser/media/router/offscreen_presentation_manager.h b/chrome/browser/media/router/offscreen_presentation_manager.h
new file mode 100644
index 0000000000000000000000000000000000000000..c44438a8f9d757fc07173db73595b055f44db697
--- /dev/null
+++ b/chrome/browser/media/router/offscreen_presentation_manager.h
@@ -0,0 +1,255 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_MEDIA_ROUTER_OFFSCREEN_PRESENTATION_MANAGER_H_
+#define CHROME_BROWSER_MEDIA_ROUTER_OFFSCREEN_PRESENTATION_MANAGER_H_
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include "base/containers/scoped_ptr_map.h"
+#include "base/macros.h"
+#include "chrome/browser/media/router/render_frame_host_helper.h"
+#include "components/keyed_service/core/keyed_service.h"
+#include "content/public/browser/presentation_service_delegate.h"
+#include "content/public/browser/presentation_session.h"
+
+namespace content {
+class BrowserContext;
+class WebContents;
+}
+
+namespace media_router {
+
+class OffscreenPresentationManager;
+
+// Exposes APIs to get presentation receiver sessions and operate on receiver
miu 2015/09/27 00:22:08 IMO, this class should be deleted. It adds too li
imcheng 2015/09/30 01:13:41 Done.
+// sessions for an offscreen presentation given by |presentation_id_| hosted in
+// an offscreen tab given by |presenter_web_contents_|.
+// Obtained by calling |OffscreenPresentationManager::RegisterPresenterTab|.
+// When this class is destroyed, all presentation receiver sessions will
+// be removed from its OffscreenPresentationManager.
+// This class must not outlive OffscreenPresentationManager or
+// |presenter_web_contents_|.
+class OffscreenPresenterContext {
+ public:
+ ~OffscreenPresenterContext();
+
+ void GetPresentationReceiverSession(
miu 2015/09/27 00:22:08 These two methods have almost the exact same name,
imcheng 2015/09/30 01:13:41 I have removed these functions from here. I will d
+ const RenderFrameHostId& frame_id,
+ const content::PresentationReceiverSessionAvailableCallback&
+ success_callback,
+ const base::Callback<void(const std::string&)>& error_callback);
+ std::vector<content::PresentationSessionInfo> GetPresentationReceiverSessions(
+ const RenderFrameHostId& frame_id) const;
+
+ bool IsPresenterFrame(const RenderFrameHostId& frame_id) const;
+
+ void SendMessage(const RenderFrameHostId& frame_id,
+ const content::PresentationSessionInfo& session,
+ scoped_ptr<content::PresentationSessionMessage> message,
+ const content::SendMessageCallback& callback);
+ void ListenForMessages(
+ const RenderFrameHostId& frame_id,
+ const content::PresentationSessionInfo& session,
+ const content::PresentationSessionMessageCallback& callback);
+ void ListenForStateChanges(
+ const RenderFrameHostId& frame_id,
+ content::PresentationSessionStateListener* listener);
+
+ private:
+ friend class OffscreenPresentationManager;
+
+ OffscreenPresenterContext(content::WebContents* presenter_web_contents,
+ const std::string& presentation_id,
+ OffscreenPresentationManager* manager);
+
+ content::WebContents* const presenter_web_contents_;
+ const std::string presentation_id_;
+
+ // Calls are delegated to manager.
+ OffscreenPresentationManager* const manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(OffscreenPresenterContext);
+};
+
+// Exposes APIs to operate on a single controller session for an offscreen
miu 2015/09/27 00:22:08 This class doesn't expose APIs. It declares publi
imcheng 2015/09/30 01:13:41 Updated comment.
+// presentation given by |session|_ in a frame given by |controller_frame_id_|.
+// Obtained by calling |OffscreenPresentationManager::RegisterController|.
+// When this class is destroyed, the controller session will be removed from
+// its OffscreenPresentationManager.
+// This class must not outlive OffscreenPresentationManager or the
+// RenderFrameHost of |controller_frame_id|.
+class OffscreenController {
miu 2015/09/27 00:22:08 This class doesn't include any control logic. It'
imcheng 2015/09/30 01:13:41 As discussed offline yesterday, I have reworked th
+ public:
+ ~OffscreenController();
+
+ void SendMessage(scoped_ptr<content::PresentationSessionMessage> message,
+ const content::SendMessageCallback& callback);
+ void ListenForMessages(
+ const content::PresentationSessionMessageCallback& callback);
+ void ListenForStateChanges(
+ content::PresentationSessionStateListener* listener);
+
+ private:
+ friend class OffscreenPresentationManager;
+
+ OffscreenController(const RenderFrameHostId& controller_frame_id,
+ const content::PresentationSessionInfo& session,
+ OffscreenPresentationManager* manager);
+
+ const RenderFrameHostId controller_frame_id_;
+ const content::PresentationSessionInfo session_;
+
+ // Calls are delegated to manager.
+ OffscreenPresentationManager* const manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(OffscreenController);
+};
+
+class OffscreenPresentationManager : public KeyedService {
miu 2015/09/27 00:22:08 Naming: "Manager" is so abstract. How about "Offs
imcheng 2015/09/30 01:13:42 Not sure if it's a better name, since message exch
+ public:
+ ~OffscreenPresentationManager() override;
+
+ // Registers the presenter of a offscreen presentation given by
+ // |presentation_id|
+ // as the main frame of tab given by |presenter_web_contents|.
+ // Only 1 presenter may be registered for a given presentation.
+ // A given WebContents can be a presenter for at most one presentation.
+ void RegisterPresenterTab(const std::string& presentation_id,
+ content::WebContents* presenter_web_contents);
+ void UnregisterPresenterTab(content::WebContents* presenter_web_contents);
+
+ // Returns an OffscreenPresenterContext that can be used to operate on
+ // presenter
+ // session objects on tab |presenter_web_contents| that have been connected
+ // to their corresponding controllers.
+ scoped_ptr<OffscreenPresenterContext> GetOffscreenPresenterContext(
+ content::WebContents* presenter_web_contents);
+
+ // Registers a controller of a offscreen presentation given by
+ // |presentation_id|
+ // as the frame given by |controller_frame_id|.
+ // Note that each presentation may have multiple controller frames, and that
+ // a frame may be a controller for multiple presentations.
+ // Returns a OffscreenController object that can be used to operate
+ // on the registered controller of the offscreen presentation.
+ scoped_ptr<OffscreenController> RegisterController(
+ const content::PresentationSessionInfo& session,
+ const RenderFrameHostId& controller_frame_id);
+
+ private:
+ friend class OffscreenPresenterContext;
+ friend class OffscreenController;
+
+ private:
+ friend class OffscreenPresentationManagerFactory;
+
+ // Represents a presentation session object. Contains information on the
+ // session object, including callbacks to be invoked for messages and state
+ // changes (which comes from the other side of the controller/presenter).
+ struct OffscreenPresentationSessionInfo {
miu 2015/09/27 00:22:08 Consider merging this into OffscreenController. T
imcheng 2015/09/30 01:13:41 I have moved the callback and listener fields what
+ OffscreenPresentationSessionInfo(
+ const RenderFrameHostId& controller_frame_id,
+ const content::PresentationSessionInfo& session);
+ ~OffscreenPresentationSessionInfo();
+
+ const RenderFrameHostId controller_frame_id;
+ const content::PresentationSessionInfo session;
+ content::PresentationSessionMessageCallback message_callback;
+ content::PresentationSessionStateListener* state_change_listener;
+ };
+
+ // Represents a connection between a controller and the presentation.
+ // Contains the controller session object in the controller frame, and its
+ // corresponding presenter session object proxy in the presenter frame.
+ struct OffscreenPresentationRoute {
miu 2015/09/27 00:22:08 Suggestion: Delete this class, and move |presenter
imcheng 2015/09/30 01:13:42 I have added support for multiple controllers for
+ OffscreenPresentationRoute();
+ ~OffscreenPresentationRoute();
+
+ scoped_ptr<OffscreenPresentationSessionInfo> presenter;
+ scoped_ptr<OffscreenPresentationSessionInfo> controller;
+ };
+
+ // Represents a offscreen presentation.
+ // Contains information on the presenter frame, as well as list of controllers
+ // currently connected to presentation.
+ struct OffscreenPresentationInfo {
miu 2015/09/27 00:22:08 naming: "Info" isn't accurate.
imcheng 2015/09/30 01:13:42 Renamed to OffscreenPresentation.
+ OffscreenPresentationInfo();
+ ~OffscreenPresentationInfo();
+ bool IsEmpty() const;
miu 2015/09/27 00:22:08 naming: How about HasRoutedPeers()? (This suggest
imcheng 2015/09/30 01:13:41 Removed function.
+
+ RenderFrameHostId presenter_frame_id;
+
+ // Callback for getSession(). Must be made from |presenter_frame|.
+ content::PresentationReceiverSessionAvailableCallback session_callback;
+
+ // TODO(imcheng): Support multiple controllers.
+ OffscreenPresentationRoute route;
+ };
+
+ // Used by OffscreenPresentationManagerFactory::GetOrCreateForBrowserContext.
+ OffscreenPresentationManager();
+
+ void UnregisterController(const RenderFrameHostId& controller_frame_id,
+ const std::string& presentation_id);
+
+ // Presenting API - must be a presenter frame to call.
+ // Obtains a presenter-side PresentationSessionInfo object that represents a
+ // proxy to its corresponding controller for the presentation session with
+ // presenter frame given by |presenter_frame_id|.
+ // |callback| will be invoked with the object once a controller has
+ // registered itself with the presentation.
+ void GetReceiverSession(
+ const RenderFrameHostId& presenter_frame_id,
+ const content::PresentationReceiverSessionAvailableCallback& callback);
+
+ // TODO(imcheng): Support getSessions() once we can support multiple
+ // controllers. Currently we have no mechanism to distinguish one controller
+ // from another.
+ // Gets a list of presenter-side PresentationSessionInfo objects that
+ // represent proxies to their corresponding controllers for the presentation
+ // session with presenter frame given by |presenter_frame_id|.
+ std::vector<content::PresentationSessionInfo> GetPresentationReceiverSessions(
+ const RenderFrameHostId& presenter_frame_id) const;
+
+ // Messaging - may be called by either presenter or controller frames.
+ void SendMessage(const content::PresentationSessionInfo& session,
+ scoped_ptr<content::PresentationSessionMessage> message,
+ const content::SendMessageCallback& callback);
+ void ListenForMessages(
+ const content::PresentationSessionInfo& session,
+ const content::PresentationSessionMessageCallback& callback);
+
+ // State changes - may be called by either presenter or controller frames.
+ void ListenForStateChanges(
+ content::PresentationSessionStateListener* listener);
+
+ // Remove the presenter/controller side from |presentation_info| and notify
+ // the other party of state change to "disconnected".
+ void RemovePresenterAndNotifyStateChange(
+ OffscreenPresentationInfo* presentation_info);
+ void RemoveControllerAndNotifyStateChange(
+ OffscreenPresentationInfo* presentation_info,
+ const RenderFrameHostId& controller_frame_id);
+
+ OffscreenPresentationInfo* GetOrCreateOffscreenPresentationInfo(
+ const std::string& presentation_id);
+ OffscreenPresentationInfo* GetOffscreenPresentationInfo(
+ const std::string& presentation_id) const;
+
+ // Maps from presentation ID to OffscreenPresentationInfo.
+ base::ScopedPtrMap<std::string, scoped_ptr<OffscreenPresentationInfo>>
+ offscreen_presentation_infos_;
+
+ // Maps from presenter frame ID to presentation ID.
+ std::map<RenderFrameHostId, std::string> presenter_frames_;
+
+ DISALLOW_COPY_AND_ASSIGN(OffscreenPresentationManager);
+};
+
+} // namespace media_router
+
+#endif // CHROME_BROWSER_MEDIA_ROUTER_OFFSCREEN_PRESENTATION_MANAGER_H_

Powered by Google App Engine
This is Rietveld 408576698