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

Side by Side Diff: chrome/browser/media/router/offscreen_presentation_manager.h

Issue 2477573002: [Presentation API] (3rd) (1-UA) Split PresentationServiceDelegateImpl(PSDImpl) (Closed)
Patch Set: fix windows compile error Created 3 years, 11 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_MEDIA_ROUTER_OFFSCREEN_PRESENTATION_MANAGER_H_ 5 #ifndef CHROME_BROWSER_MEDIA_ROUTER_OFFSCREEN_PRESENTATION_MANAGER_H_
6 #define CHROME_BROWSER_MEDIA_ROUTER_OFFSCREEN_PRESENTATION_MANAGER_H_ 6 #define CHROME_BROWSER_MEDIA_ROUTER_OFFSCREEN_PRESENTATION_MANAGER_H_
7 7
8 #include <map> 8 #include <map>
9 #include <memory> 9 #include <memory>
10 #include <string> 10 #include <string>
11 #include <unordered_map> 11 #include <unordered_map>
12 12
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/threading/thread_checker.h" 14 #include "base/threading/thread_checker.h"
15 #include "chrome/browser/media/router/render_frame_host_id.h" 15 #include "chrome/browser/media/router/render_frame_host_id.h"
16 #include "components/keyed_service/core/keyed_service.h" 16 #include "components/keyed_service/core/keyed_service.h"
17 #include "content/public/browser/presentation_service_delegate.h" 17 #include "content/public/browser/presentation_service_delegate.h"
18 18
19 class GURL; 19 class GURL;
20 20
21 // TODO(zhaobin): move these back to
22 // content/public/browser/presentation_service_delegate.h when they are actually
23 // used in content.
24 namespace content {
25 // TODO(zhaobin): A class stub for blink::mojom::PresentationConnectionPtr.
26 // presentation.mojom is under security review. Change this to
27 // blink::mojom::PresentationConnectionPtr once that is done.
28 class PresentationConnectionPtr {};
29
30 using ReceiverConnectionAvailableCallback =
31 base::Callback<void(const content::PresentationSessionInfo&,
32 PresentationConnectionPtr)>;
33 } // namespace content
34
35 namespace media_router { 21 namespace media_router {
36 // Manages all offscreen presentations started in the associated Profile and 22 // Manages all offscreen presentations started in the associated Profile and
37 // facilitates communication between the controllers and the receiver of an 23 // facilitates communication between the controllers and the receiver of an
38 // offscreen presentation. 24 // offscreen presentation.
39 // 25 //
40 // Design doc: 26 // Design doc:
41 // https://docs.google.com/document/d/1XM3jhMJTQyhEC5PDAAJFNIaKh6UUEihqZDz_ztEe4 Co/edit#heading=h.hadpx5oi0gml 27 // https://docs.google.com/document/d/1XM3jhMJTQyhEC5PDAAJFNIaKh6UUEihqZDz_ztEe4 Co/edit#heading=h.hadpx5oi0gml
42 // 28 //
43 // Example usage: 29 // Example usage:
44 // 30 //
45 // Receiver is created to host the offscreen presentation and registers itself 31 // Receiver is created to host the offscreen presentation and registers itself
46 // so that controller frames can connect to it: 32 // so that controller frames can connect to it:
47 // 33 //
48 // OffscreenPresentationManager* manager = 34 // OffscreenPresentationManager* manager =
49 // OffscreenPresentationManagerFactory::GetOrCreateForBrowserContext( 35 // OffscreenPresentationManagerFactory::GetOrCreateForBrowserContext(
50 // web_contents_->GetBrowserContext()); 36 // web_contents_->GetBrowserContext());
51 // manager->OnOffscreenPresentationReceiverCreated(presentation_id, 37 // manager->OnOffscreenPresentationReceiverCreated(presentation_id,
52 // base::Bind(&PresentationServiceImpl::OnReceiverConnectionAvailable)); 38 // base::Bind(&PresentationServiceImpl::OnReceiverConnectionAvailable));
53 // 39 //
54 // Controller frame establishes connection with the receiver side, resulting 40 // Controlling frame establishes connection with the receiver side, resulting
55 // in a connection with the two endpoints being the controller 41 // in a connection with the two endpoints being the controller
56 // PresentationConnectionPtr and receiver PresentationConnectionPtr. 42 // PresentationConnectionPtr and receiver PresentationConnectionPtr.
57 // Note calling this will trigger receiver frame's 43 // Note calling this will trigger receiver frame's
58 // PresentationServiceImpl::OnReceiverConnectionAvailable. 44 // PresentationServiceImpl::OnReceiverConnectionAvailable.
59 // 45 //
60 // manager->RegisterOffscreenPresentationController( 46 // manager->RegisterOffscreenPresentationController(
61 // presentation_id, controller_frame_id, controller_ptr); 47 // presentation_id, controller_frame_id, controller_connection_ptr,
48 // receiver_connection_request);
62 // 49 //
63 // Invoked on receiver's PresentationServiceImpl when controller connection is 50 // Invoked on receiver's PresentationServiceImpl when controller connection is
64 // established. 51 // established.
65 // 52 //
66 // |presentation_receiver_client_|: blink::mojom::PresentationServiceClienPtr 53 // |presentation_receiver_client_|: blink::mojom::PresentationServiceClienPtr
67 // for the presentation receiver. 54 // for the presentation receiver.
68 // |PresentationConnectionPtr|: blink::mojom::PresentationConnectionPtr for 55 // |controller_connection_ptr|: blink::mojom::PresentationConnectionPtr for
69 // blink::PresentationConnection object in render process. 56 // blink::PresentationConnection object in controlling frame's render process.
57 // |receiver_connection_request|: Mojo InterfaceRequest to be bind to
58 // blink::PresentationConnection object in receiver frame's render process.
70 // void PresentationServiceImpl::OnReceiverConnectionAvailable( 59 // void PresentationServiceImpl::OnReceiverConnectionAvailable(
71 // const content::PresentationSessionInfo& session, 60 // const content::PresentationSessionInfo& session,
72 // PresentationConnectionPtr&& controller) { 61 // PresentationConnectionPtr controller_connection_ptr,
62 // PresentationConnectionRequest receiver_connection_request) {
73 // presentation_receiver_client_->OnReceiverConnectionAvailable( 63 // presentation_receiver_client_->OnReceiverConnectionAvailable(
74 // blink::mojom::PresentationSessionInfo::From(session_info), 64 // blink::mojom::PresentationSessionInfo::From(session_info),
75 // std::move(controller)); 65 // std::move(controller_connection_ptr),
66 // std::move(receiver_connection_request));
76 // } 67 // }
77 // 68 //
78 // Send message from controller/receiver to receiver/controller: 69 // Send message from controlling/receiver frame to receiver/controlling frame:
79 // 70 //
80 // |target_connection_|: member variable of 71 // |target_connection_|: member variable of
81 // blink::mojom::PresentationConnectionPtr type, 72 // blink::mojom::PresentationConnectionPtr type,
82 // refering to remote PresentationConnectionProxy 73 // refering to remote PresentationConnectionProxy
83 // object on receiver/controlling frame. 74 // object on receiver/controlling frame.
84 // |message|: Text message to be sent. 75 // |message|: Text message to be sent.
85 // PresentationConnctionPtr::SendString( 76 // PresentationConnctionPtr::SendString(
86 // const blink::WebString& message) { 77 // const blink::WebString& message) {
87 // target_connection_->OnSessionMessageReceived(std::move(session_message)); 78 // target_connection_->OnSessionMessageReceived(std::move(session_message));
88 // } 79 // }
89 // 80 //
90 // A controller or receiver leaves the offscreen presentation (e.g., 81 // A controller or receiver leaves the offscreen presentation (e.g., due to
91 // due to navigation) by unregistering themselves from 82 // navigation) by unregistering themselves from OffscreenPresentation object.
92 // OffscreenPresentation object.
93 // 83 //
94 // When the receiver is no longer associated with an offscreen presentation, it 84 // When the receiver is no longer associated with an offscreen presentation, it
95 // shall unregister itself with OffscreenPresentationManager. Unregistration 85 // shall unregister itself with OffscreenPresentationManager. Unregistration
96 // will prevent additional controllers from establishing a connection with the 86 // will prevent additional controllers from establishing a connection with the
97 // receiver: 87 // receiver:
98 // 88 //
99 // In receiver's PSImpl::Reset() { 89 // In receiver's PSImpl::Reset() {
100 // offscreen_presentation_manager-> 90 // offscreen_presentation_manager->
101 // OnOffscreenPresentationReceiverTerminated(presentation_id); 91 // OnOffscreenPresentationReceiverTerminated(presentation_id);
102 // } 92 // }
103 // 93 //
104 // This class is not thread safe. All functions must be invoked on the UI 94 // This class is not thread safe. All functions must be invoked on the UI
105 // thread. All callbacks passed into this class will also be invoked on UI 95 // thread. All callbacks passed into this class will also be invoked on UI
106 // thread. 96 // thread.
107 class OffscreenPresentationManager : public KeyedService { 97 class OffscreenPresentationManager : public KeyedService {
108 public: 98 public:
109 ~OffscreenPresentationManager() override; 99 ~OffscreenPresentationManager() override;
110 100
111 // Registers controller PresentationConnectionPtr to presentation 101 // Registers controller PresentationConnectionPtr to presentation with
112 // with |presentation_id|, |render_frame_id|. 102 // |presentation_id| and |render_frame_id|.
113 // Creates a new presentation if no presentation with |presentation_id| 103 // Creates a new presentation if no presentation with |presentation_id|
114 // exists. 104 // exists.
115 // |controller|: Not owned by this class. Ownership is transferred to the 105 // |controller_connection_ptr|, |receiver_connection_request|: Not owned by
116 // presentation receiver via |receiver_callback| passed below. 106 // this class. Ownership is transferred to presentation receiver via
117 void RegisterOffscreenPresentationController( 107 // |receiver_callback| passed below.
108 virtual void RegisterOffscreenPresentationController(
118 const std::string& presentation_id, 109 const std::string& presentation_id,
119 const GURL& presentation_url, 110 const GURL& presentation_url,
120 const RenderFrameHostId& render_frame_id, 111 const RenderFrameHostId& render_frame_id,
121 content::PresentationConnectionPtr controller); 112 content::PresentationConnectionPtr controller_connection_ptr,
113 content::PresentationConnectionRequest receiver_connection_request);
122 114
123 // Unregisters controller PresentationConnectionPtr to presentation with 115 // Unregisters controller PresentationConnectionPtr to presentation with
124 // |presentation_id|, |render_frame_id|. It does nothing if there is no 116 // |presentation_id|, |render_frame_id|. It does nothing if there is no
125 // controller that matches the provided arguments. It removes presentation 117 // controller that matches the provided arguments. It removes presentation
126 // that matches the arguments if the presentation has no receiver_callback and 118 // that matches the arguments if the presentation has no |receiver_callback|
127 // any other pending controller. 119 // and any other pending controller.
128 void UnregisterOffscreenPresentationController( 120 virtual void UnregisterOffscreenPresentationController(
129 const std::string& presentation_id, 121 const std::string& presentation_id,
130 const RenderFrameHostId& render_frame_id); 122 const RenderFrameHostId& render_frame_id);
131 123
132 // Registers ReceiverConnectionAvailableCallback to presentation 124 // Registers |receiver_callback| to presentation with |presentation_id| and
133 // with |presentation_id|. 125 // |presentation_url|.
134 void OnOffscreenPresentationReceiverCreated( 126 virtual void OnOffscreenPresentationReceiverCreated(
135 const std::string& presentation_id, 127 const std::string& presentation_id,
136 const GURL& presentation_url, 128 const GURL& presentation_url,
137 const content::ReceiverConnectionAvailableCallback& receiver_callback); 129 const content::ReceiverConnectionAvailableCallback& receiver_callback);
138 130
139 // Unregisters the ReceiverConnectionAvailableCallback associated with 131 // Unregisters ReceiverConnectionAvailableCallback associated with
140 // |presentation_id|. 132 // |presentation_id|.
141 void OnOffscreenPresentationReceiverTerminated( 133 virtual void OnOffscreenPresentationReceiverTerminated(
142 const std::string& presentation_id); 134 const std::string& presentation_id);
143 135
144 private: 136 private:
145 // Represents an offscreen presentation registered with 137 // Represents an offscreen presentation registered with
146 // OffscreenPresentationManager. 138 // OffscreenPresentationManager. Contains callback to the receiver to inform
147 // Contains callback to the receiver to inform it of new connections 139 // it of new connections established from a controller. Contains set of
148 // established from a controller. 140 // controllers registered to OffscreenPresentationManager before corresponding
149 // Contains set of controllers registered to OffscreenPresentationManager 141 // receiver.
150 // before corresponding receiver.
151 class OffscreenPresentation { 142 class OffscreenPresentation {
152 public: 143 public:
153 OffscreenPresentation(const std::string& presentation_id, 144 OffscreenPresentation(const std::string& presentation_id,
154 const GURL& presentation_url); 145 const GURL& presentation_url);
155 ~OffscreenPresentation(); 146 ~OffscreenPresentation();
156 147
157 // Register |controller| with |render_frame_id|. If |receiver_callback_| has 148 // Register controller with |render_frame_id|. If |receiver_callback_| has
158 // been set, invoke |receiver_callback_| with |controller| as parameter, 149 // been set, invoke |receiver_callback_| with |controller_connection_ptr|
159 // else store |controller| in |pending_controllers_| map. 150 // and |receiver_connection_request| as parameter, else creates a
160 void RegisterController(const RenderFrameHostId& render_frame_id, 151 // ControllerConnection object with |controller_connection_ptr| and
161 content::PresentationConnectionPtr controller); 152 // |receiver_connection_request|, and store it in |pending_controllers_|
153 // map.
154 void RegisterController(
155 const RenderFrameHostId& render_frame_id,
156 content::PresentationConnectionPtr controller_connection_ptr,
157 content::PresentationConnectionRequest receiver_connection_request);
162 158
163 // Unregister controller with |render_frame_id|. Do nothing if there is no 159 // Unregister controller with |render_frame_id|. Do nothing if there is no
164 // pending controller with |render_frame_id|. 160 // pending controller with |render_frame_id|.
165 void UnregisterController(const RenderFrameHostId& render_frame_id); 161 void UnregisterController(const RenderFrameHostId& render_frame_id);
166 162
167 // Register |receiver_callback| to current offscreen_presentation object. 163 // Register |receiver_callback| to current offscreen_presentation object.
168 // For each controller in |pending_controllers_| map, invoke 164 // For each controller in |pending_controllers_| map, invoke
169 // |receiver_callback| with controller as parameter. Clear 165 // |receiver_callback| with controller as parameter. Clear
170 // |pending_controllers_| map afterwards. 166 // |pending_controllers_| map afterwards.
171 void RegisterReceiver( 167 void RegisterReceiver(
172 const content::ReceiverConnectionAvailableCallback& receiver_callback); 168 const content::ReceiverConnectionAvailableCallback& receiver_callback);
173 169
174 private: 170 private:
175 friend class OffscreenPresentationManagerTest; 171 friend class OffscreenPresentationManagerTest;
176 friend class OffscreenPresentationManager; 172 friend class OffscreenPresentationManager;
177 173
178 // Returns false if receiver_callback_ is null and there are no pending 174 // Returns false if receiver_callback_ is null and there are no pending
179 // controllers. 175 // controllers.
180 bool IsValid() const; 176 bool IsValid() const;
181 177
182 const std::string presentation_id_; 178 const std::string presentation_id_;
183 const GURL presentation_url_; 179 const GURL presentation_url_;
184 180
185 // Callback to invoke whenever a receiver connection is available. 181 // Callback to invoke whenever a receiver connection is available.
186 content::ReceiverConnectionAvailableCallback receiver_callback_; 182 content::ReceiverConnectionAvailableCallback receiver_callback_;
187 183
188 // Contains Mojo pointers to controller PresentationConnections registered 184 // Stores controller information.
189 // via |RegisterController()| before |receiver_callback_| is set. 185 // |controller_connection_ptr|: Mojo::InterfacePtr to
186 // blink::PresentationConnection object in controlling frame;
187 // |receiver_connection_request|: Mojo::InterfaceRequest to be bind to
188 // blink::PresentationConnection object in receiver frame.
189 struct ControllerConnection {
190 public:
191 ControllerConnection(
192 content::PresentationConnectionPtr controller_connection_ptr,
193 content::PresentationConnectionRequest receiver_connection_request);
194 ~ControllerConnection();
195
196 content::PresentationConnectionPtr controller_connection_ptr;
197 content::PresentationConnectionRequest receiver_connection_request;
198 };
199
200 // Contains ControllerConnection objects registered via
201 // |RegisterController()| before |receiver_callback_| is set.
190 std::unordered_map<RenderFrameHostId, 202 std::unordered_map<RenderFrameHostId,
191 content::PresentationConnectionPtr, 203 std::unique_ptr<ControllerConnection>,
192 RenderFrameHostIdHasher> 204 RenderFrameHostIdHasher>
193 pending_controllers_; 205 pending_controllers_;
194 206
195 DISALLOW_COPY_AND_ASSIGN(OffscreenPresentation); 207 DISALLOW_COPY_AND_ASSIGN(OffscreenPresentation);
196 }; 208 };
197 209
198 private: 210 private:
199 friend class OffscreenPresentationManagerFactory; 211 friend class OffscreenPresentationManagerFactory;
200 friend class OffscreenPresentationManagerTest; 212 friend class OffscreenPresentationManagerTest;
213 friend class MockOffscreenPresentationManager;
214 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplTest,
215 ConnectToOffscreenPresentation);
201 216
202 // Used by OffscreenPresentationManagerFactory::GetOrCreateForBrowserContext. 217 // Used by OffscreenPresentationManagerFactory::GetOrCreateForBrowserContext.
203 OffscreenPresentationManager(); 218 OffscreenPresentationManager();
204 219
205 using OffscreenPresentationMap = 220 using OffscreenPresentationMap =
206 std::map<std::string, std::unique_ptr<OffscreenPresentation>>; 221 std::map<std::string, std::unique_ptr<OffscreenPresentation>>;
207 222
208 // Creates an offscreen presentation with |presentation_id| and 223 // Creates an offscreen presentation with |presentation_id| and
209 // |presentation_url|. 224 // |presentation_url|.
210 OffscreenPresentation* GetOrCreateOffscreenPresentation( 225 OffscreenPresentation* GetOrCreateOffscreenPresentation(
211 const std::string& presentation_id, 226 const std::string& presentation_id,
212 const GURL& presentation_url); 227 const GURL& presentation_url);
213 228
214 // Maps from presentation ID to OffscreenPresentation. 229 // Maps from presentation ID to OffscreenPresentation.
215 OffscreenPresentationMap offscreen_presentations_; 230 OffscreenPresentationMap offscreen_presentations_;
216 231
217 base::ThreadChecker thread_checker_; 232 base::ThreadChecker thread_checker_;
218 233
219 DISALLOW_COPY_AND_ASSIGN(OffscreenPresentationManager); 234 DISALLOW_COPY_AND_ASSIGN(OffscreenPresentationManager);
220 }; 235 };
221 236
222 } // namespace media_router 237 } // namespace media_router
223 238
224 #endif // CHROME_BROWSER_MEDIA_ROUTER_OFFSCREEN_PRESENTATION_MANAGER_H_ 239 #endif // CHROME_BROWSER_MEDIA_ROUTER_OFFSCREEN_PRESENTATION_MANAGER_H_
OLDNEW
« no previous file with comments | « chrome/browser/media/router/BUILD.gn ('k') | chrome/browser/media/router/offscreen_presentation_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698