Chromium Code Reviews| Index: chrome/browser/media/router/one_ua_presentation_router.h |
| diff --git a/chrome/browser/media/router/one_ua_presentation_router.h b/chrome/browser/media/router/one_ua_presentation_router.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..67fac66193c4bbb2c3285c38d1ca950bf10e1cd2 |
| --- /dev/null |
| +++ b/chrome/browser/media/router/one_ua_presentation_router.h |
| @@ -0,0 +1,159 @@ |
| +// 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_ONE_UA_PRESENTATION_ROUTER_H_ |
| +#define CHROME_BROWSER_MEDIA_ROUTER_ONE_UA_PRESENTATION_ROUTER_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; |
| +} |
| + |
| +namespace media_router { |
| + |
| +class OneUAPresentationRouter : public KeyedService { |
|
mark a. foltz
2015/09/11 23:24:20
Naming nitpicks:
The term "One-UA" comes from the
miu
2015/09/17 00:09:20
Random OTOH replacements for the term "One UA Pres
imcheng
2015/09/26 01:21:57
On 2015/09/11 23:24:20, mark a. foltz wrote:
> Nam
imcheng
2015/09/26 01:21:57
Went with OffscreenPresentationManager so it's con
miu
2015/09/27 00:22:08
Yes, because I am going to rename the OffscreenPre
imcheng
2015/09/30 01:13:41
Acknowledged.
|
| + public: |
| + ~OneUAPresentationRouter() override; |
| + |
| + // Registers the presenter of a 1-UA presentation given by |presentation_id| |
| + // as the frame given by |presenter_frame_id|. |
| + // Only 1 presenter frame may be registered for a given presentation. |
| + void RegisterPresenter(const std::string& presentation_id, |
| + const RenderFrameHostId& presenter_frame_id); |
| + void UnregisterPresenter(const RenderFrameHostId& presenter_frame_id); |
| + |
| + // Registers a controller of a 1-UA 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. |
| + void RegisterController(const content::PresentationSessionInfo& session, |
| + const RenderFrameHostId& controller_frame_id); |
| + void UnregisterController(const std::string& presentation_id, |
| + const RenderFrameHostId& controller_frame_id); |
| + |
| + // Returns true if the frame given by |frame_id| is a presenter frame. |
|
mark a. foltz
2015/09/11 23:24:20
ISTM that registering a controller or presenter sh
imcheng
2015/09/26 01:21:57
I think we can do that for controllers. but we mig
|
| + bool IsPresenter(const RenderFrameHostId& frame_id) const; |
| + |
| + // Returns true if the frame given by |frame_id| is a controller frame for |
| + // presentation given by |presentation_id|. |
| + bool IsController(const std::string& presentation_id, |
| + const RenderFrameHostId& frame_id) const; |
| + |
| + // 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 GetSinglePresenterSession( |
|
mark a. foltz
2015/09/11 23:24:20
Can the Presenter object (I mentioned above) get a
imcheng
2015/09/26 01:21:57
What I have is the that the Presenter object will
|
| + const RenderFrameHostId& presenter_frame_id, |
| + const content::PresenterSessionAvailableCallback& 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> GetPresenterSessions( |
|
mark a. foltz
2015/09/11 23:24:20
The Presenter would know which sessions are connec
imcheng
2015/09/26 01:21:57
Created Presenter object and exposed this API. But
|
| + 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( |
| + const content::PresentationSessionInfo& session, |
| + const content::SessionStateChangedCallback& callback); |
| + |
| + // Unregisters mapping/callbacks, etc., associated with |frame_id|. |
| + void Reset(const RenderFrameHostId& frame_id); |
| + |
| + private: |
| + friend class OneUAPresentationRouterFactory; |
| + |
| + // 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 OneUAPresentationSession { |
| + OneUAPresentationSession(const RenderFrameHostId& controller_frame_id, |
| + const content::PresentationSessionInfo& session); |
| + ~OneUAPresentationSession(); |
| + |
| + const RenderFrameHostId controller_frame_id; |
| + const content::PresentationSessionInfo session; |
| + content::PresentationSessionMessageCallback message_callback; |
| + content::SessionStateChangedCallback state_change_callback; |
| + }; |
| + |
| + // 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 OneUAPresentationRoute { |
|
mark a. foltz
2015/09/11 23:24:20
Perhaps the OffscreenPresenter owns a list of Offs
imcheng
2015/09/26 01:21:57
So my model here is (name changed after this patch
|
| + OneUAPresentationRoute(); |
| + ~OneUAPresentationRoute(); |
| + |
| + scoped_ptr<OneUAPresentationSession> presenter; |
| + scoped_ptr<OneUAPresentationSession> controller; |
| + }; |
| + |
| + // Represents a 1-UA presentation. |
| + // Contains information on the presenter frame, as well as list of controllers |
| + // currently connected to presentation. |
| + struct OneUAPresentationInfo { |
| + OneUAPresentationInfo(); |
| + ~OneUAPresentationInfo(); |
| + bool IsEmpty() const; |
| + |
| + RenderFrameHostId presenter_frame_id; |
| + |
| + // Callback for getSession(). Must be made from |presenter_frame|. |
| + content::PresenterSessionAvailableCallback session_callback; |
| + |
| + // TODO(imcheng): Support multiple controllers. |
| + OneUAPresentationRoute route; |
| + }; |
| + |
| + // Used by OneUAPresentationRouterFactory::GetOrCreateForBrowserContext. |
| + OneUAPresentationRouter(); |
| + |
| + // Remove the presenter/controller side from |presentation_info| and notify |
| + // the other party of state change to "disconnected". |
| + void RemovePresenterAndNotifyStateChange( |
| + OneUAPresentationInfo* presentation_info); |
| + void RemoveControllerAndNotifyStateChange( |
| + OneUAPresentationInfo* presentation_info); |
| + |
| + OneUAPresentationInfo* GetOrCreateOneUAPresentationInfo( |
| + const std::string& presentation_id); |
| + OneUAPresentationInfo* GetOneUAPresentationInfo( |
| + const std::string& presentation_id) const; |
| + |
| + base::ScopedPtrMap<std::string, scoped_ptr<OneUAPresentationInfo>> |
| + one_ua_presentations_; |
| + |
| + // Maps from presenter frame ID to presentation ID. |
| + std::map<RenderFrameHostId, std::string> presenter_frames_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(OneUAPresentationRouter); |
| +}; |
| + |
| +} // namespace media_router |
| + |
| +#endif // CHROME_BROWSER_MEDIA_ROUTER_ONE_UA_PRESENTATION_ROUTER_H_ |