OLD | NEW |
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/optional.h" | 14 #include "base/optional.h" |
15 #include "base/threading/thread_checker.h" | 15 #include "base/threading/thread_checker.h" |
16 #include "chrome/browser/media/router/render_frame_host_id.h" | 16 #include "chrome/browser/media/router/render_frame_host_id.h" |
17 #include "chrome/common/media_router/media_route.h" | 17 #include "chrome/common/media_router/media_route.h" |
18 #include "components/keyed_service/core/keyed_service.h" | 18 #include "components/keyed_service/core/keyed_service.h" |
19 #include "content/public/browser/presentation_service_delegate.h" | 19 #include "content/public/browser/presentation_service_delegate.h" |
20 | 20 |
21 class GURL; | 21 namespace content { |
| 22 struct PresentationInfo; |
| 23 } |
22 | 24 |
23 namespace media_router { | 25 namespace media_router { |
24 // Manages all offscreen presentations started in the associated Profile and | 26 // Manages all offscreen presentations started in the associated Profile and |
25 // facilitates communication between the controllers and the receiver of an | 27 // facilitates communication between the controllers and the receiver of an |
26 // offscreen presentation. | 28 // offscreen presentation. |
27 // | 29 // |
28 // Design doc: | 30 // Design doc: |
29 // https://docs.google.com/document/d/1XM3jhMJTQyhEC5PDAAJFNIaKh6UUEihqZDz_ztEe4
Co/edit#heading=h.hadpx5oi0gml | 31 // https://docs.google.com/document/d/1XM3jhMJTQyhEC5PDAAJFNIaKh6UUEihqZDz_ztEe4
Co/edit#heading=h.hadpx5oi0gml |
30 // | 32 // |
31 // Example usage: | 33 // Example usage: |
32 // | 34 // |
33 // Receiver is created to host the offscreen presentation and registers itself | 35 // Receiver is created to host the offscreen presentation and registers itself |
34 // so that controller frames can connect to it: | 36 // so that controller frames can connect to it: |
35 // | 37 // |
36 // OffscreenPresentationManager* manager = | 38 // OffscreenPresentationManager* manager = |
37 // OffscreenPresentationManagerFactory::GetOrCreateForBrowserContext( | 39 // OffscreenPresentationManagerFactory::GetOrCreateForBrowserContext( |
38 // web_contents_->GetBrowserContext()); | 40 // web_contents_->GetBrowserContext()); |
39 // manager->OnOffscreenPresentationReceiverCreated(presentation_id, | 41 // manager->OnOffscreenPresentationReceiverCreated(presentation_info, |
40 // base::Bind(&PresentationServiceImpl::OnReceiverConnectionAvailable)); | 42 // base::Bind(&PresentationServiceImpl::OnReceiverConnectionAvailable)); |
41 // | 43 // |
42 // Controlling frame establishes connection with the receiver side, resulting | 44 // Controlling frame establishes connection with the receiver side, resulting |
43 // in a connection with the two endpoints being the controller | 45 // in a connection with the two endpoints being the controller |
44 // PresentationConnectionPtr and receiver PresentationConnectionPtr. | 46 // PresentationConnectionPtr and receiver PresentationConnectionPtr. |
45 // Note calling this will trigger receiver frame's | 47 // Note calling this will trigger receiver frame's |
46 // PresentationServiceImpl::OnReceiverConnectionAvailable. | 48 // PresentationServiceImpl::OnReceiverConnectionAvailable. |
47 // | 49 // |
48 // manager->RegisterOffscreenPresentationController( | 50 // manager->RegisterOffscreenPresentationController( |
49 // presentation_id, controller_frame_id, controller_connection_ptr, | 51 // presentation_info, |
50 // receiver_connection_request); | 52 // std::move(controller_connection_ptr, |
| 53 // std::move(receiver_connection_request)); |
51 // | 54 // |
52 // Invoked on receiver's PresentationServiceImpl when controller connection is | 55 // Invoked on receiver's PresentationServiceImpl when controller connection is |
53 // established. | 56 // established. |
54 // | 57 // |
55 // |presentation_receiver_client_|: blink::mojom::PresentationServiceClienPtr | 58 // |presentation_receiver_client_|: blink::mojom::PresentationServiceClienPtr |
56 // for the presentation receiver. | 59 // for the presentation receiver. |
57 // |controller_connection_ptr|: blink::mojom::PresentationConnectionPtr for | 60 // |controller_connection_ptr|: blink::mojom::PresentationConnectionPtr for |
58 // blink::PresentationConnection object in controlling frame's render process. | 61 // blink::PresentationConnection object in controlling frame's render process. |
59 // |receiver_connection_request|: Mojo InterfaceRequest to be bind to | 62 // |receiver_connection_request|: Mojo InterfaceRequest to be bind to |
60 // blink::PresentationConnection object in receiver frame's render process. | 63 // blink::PresentationConnection object in receiver frame's render process. |
61 // void PresentationServiceImpl::OnReceiverConnectionAvailable( | 64 // void PresentationServiceImpl::OnReceiverConnectionAvailable( |
62 // const content::PresentationInfo& presentation_info, | 65 // const content::PresentationInfo& presentation_info, |
63 // PresentationConnectionPtr controller_connection_ptr, | 66 // PresentationConnectionPtr controller_connection_ptr, |
64 // PresentationConnectionRequest receiver_connection_request) { | 67 // PresentationConnectionRequest receiver_connection_request) { |
65 // presentation_receiver_client_->OnReceiverConnectionAvailable( | 68 // presentation_receiver_client_->OnReceiverConnectionAvailable( |
66 // blink::mojom::PresentationInfo::From(presentation_info), | 69 // blink::mojom::PresentationInfo::From(presentation_info), |
67 // std::move(controller_connection_ptr), | 70 // std::move(controller_connection_ptr), |
68 // std::move(receiver_connection_request)); | 71 // std::move(receiver_connection_request)); |
69 // } | 72 // } |
70 // | 73 // |
71 // Send message from controlling/receiver frame to receiver/controlling frame: | 74 // Send message from controlling/receiver frame to receiver/controlling frame: |
72 // | 75 // |
73 // |target_connection_|: member variable of | 76 // |target_connection_|: member variable of |
74 // blink::mojom::PresentationConnectionPtr type, | 77 // blink::mojom::PresentationConnectionPtr type, |
75 // refering to remote PresentationConnectionProxy | 78 // refering to remote PresentationConnectionProxy |
76 // object on receiver/controlling frame. | 79 // object on receiver/controlling frame. |
77 // |message|: Text message to be sent. | 80 // |message|: Text message to be sent. |
78 // PresentationConnctionPtr::SendString( | 81 // PresentationConnctionPtr::SendString( |
79 // const blink::WebString& message) { | 82 // const blink::WebString& message) { |
80 // target_connection_->OnConnectionMessageReceived( | 83 // target_connection_->OnMessage( |
81 // std::move(connection_message)); | 84 // content::PresentationConnectionMessage(message.Utf8()), |
| 85 // base::Bind(&OnMessageReceived)); |
82 // } | 86 // } |
83 // | 87 // |
84 // A controller or receiver leaves the offscreen presentation (e.g., due to | 88 // A controller or receiver leaves the offscreen presentation (e.g., due to |
85 // navigation) by unregistering themselves from OffscreenPresentation object. | 89 // navigation) by unregistering themselves from OffscreenPresentation object. |
86 // | 90 // |
87 // When the receiver is no longer associated with an offscreen presentation, it | 91 // When the receiver is no longer associated with an offscreen presentation, it |
88 // shall unregister itself with OffscreenPresentationManager. Unregistration | 92 // shall unregister itself with OffscreenPresentationManager. Unregistration |
89 // will prevent additional controllers from establishing a connection with the | 93 // will prevent additional controllers from establishing a connection with the |
90 // receiver: | 94 // receiver: |
91 // | 95 // |
(...skipping 10 matching lines...) Expand all Loading... |
102 ~OffscreenPresentationManager() override; | 106 ~OffscreenPresentationManager() override; |
103 | 107 |
104 // Registers controller PresentationConnectionPtr to presentation with | 108 // Registers controller PresentationConnectionPtr to presentation with |
105 // |presentation_id| and |render_frame_id|. | 109 // |presentation_id| and |render_frame_id|. |
106 // Creates a new presentation if no presentation with |presentation_id| | 110 // Creates a new presentation if no presentation with |presentation_id| |
107 // exists. | 111 // exists. |
108 // |controller_connection_ptr|, |receiver_connection_request|: Not owned by | 112 // |controller_connection_ptr|, |receiver_connection_request|: Not owned by |
109 // this class. Ownership is transferred to presentation receiver via | 113 // this class. Ownership is transferred to presentation receiver via |
110 // |receiver_callback| passed below. | 114 // |receiver_callback| passed below. |
111 virtual void RegisterOffscreenPresentationController( | 115 virtual void RegisterOffscreenPresentationController( |
112 const std::string& presentation_id, | 116 const content::PresentationInfo& presentation_info, |
113 const GURL& presentation_url, | |
114 const RenderFrameHostId& render_frame_id, | 117 const RenderFrameHostId& render_frame_id, |
115 content::PresentationConnectionPtr controller_connection_ptr, | 118 content::PresentationConnectionPtr controller_connection_ptr, |
116 content::PresentationConnectionRequest receiver_connection_request, | 119 content::PresentationConnectionRequest receiver_connection_request, |
117 const MediaRoute& route); | 120 const MediaRoute& route); |
118 | 121 |
119 // Unregisters controller PresentationConnectionPtr to presentation with | 122 // Unregisters controller PresentationConnectionPtr to presentation with |
120 // |presentation_id|, |render_frame_id|. It does nothing if there is no | 123 // |presentation_id|, |render_frame_id|. It does nothing if there is no |
121 // controller that matches the provided arguments. It removes presentation | 124 // controller that matches the provided arguments. It removes presentation |
122 // that matches the arguments if the presentation has no |receiver_callback| | 125 // that matches the arguments if the presentation has no |receiver_callback| |
123 // and any other pending controller. | 126 // and any other pending controller. |
124 virtual void UnregisterOffscreenPresentationController( | 127 virtual void UnregisterOffscreenPresentationController( |
125 const std::string& presentation_id, | 128 const std::string& presentation_id, |
126 const RenderFrameHostId& render_frame_id); | 129 const RenderFrameHostId& render_frame_id); |
127 | 130 |
128 // Registers |receiver_callback| to presentation with |presentation_id| and | 131 // Registers |receiver_callback| to presentation with |presentation_info|. |
129 // |presentation_url|. | |
130 virtual void OnOffscreenPresentationReceiverCreated( | 132 virtual void OnOffscreenPresentationReceiverCreated( |
131 const std::string& presentation_id, | 133 const content::PresentationInfo& presentation_info, |
132 const GURL& presentation_url, | |
133 const content::ReceiverConnectionAvailableCallback& receiver_callback); | 134 const content::ReceiverConnectionAvailableCallback& receiver_callback); |
134 | 135 |
135 // Unregisters ReceiverConnectionAvailableCallback associated with | 136 // Unregisters ReceiverConnectionAvailableCallback associated with |
136 // |presentation_id|. | 137 // |presentation_id|. |
137 virtual void OnOffscreenPresentationReceiverTerminated( | 138 virtual void OnOffscreenPresentationReceiverTerminated( |
138 const std::string& presentation_id); | 139 const std::string& presentation_id); |
139 | 140 |
140 // Returns true if this class has an offscreen presentation with | 141 // Returns true if this class has an offscreen presentation with |
141 // |presentation_id|. | 142 // |presentation_id|. |
142 virtual bool IsOffscreenPresentation(const std::string& presentation_id); | 143 virtual bool IsOffscreenPresentation(const std::string& presentation_id); |
143 | 144 |
144 // Returns nullptr if |presentation_id| is not associated with an offscreen | 145 // Returns nullptr if |presentation_id| is not associated with an offscreen |
145 // presentation. | 146 // presentation. |
146 virtual const MediaRoute* GetRoute(const std::string& presentation_id); | 147 virtual const MediaRoute* GetRoute(const std::string& presentation_id); |
147 | 148 |
148 private: | 149 private: |
149 // Represents an offscreen presentation registered with | 150 // Represents an offscreen presentation registered with |
150 // OffscreenPresentationManager. Contains callback to the receiver to inform | 151 // OffscreenPresentationManager. Contains callback to the receiver to inform |
151 // it of new connections established from a controller. Contains set of | 152 // it of new connections established from a controller. Contains set of |
152 // controllers registered to OffscreenPresentationManager before corresponding | 153 // controllers registered to OffscreenPresentationManager before corresponding |
153 // receiver. | 154 // receiver. |
154 class OffscreenPresentation { | 155 class OffscreenPresentation { |
155 public: | 156 public: |
156 OffscreenPresentation(const std::string& presentation_id, | 157 explicit OffscreenPresentation( |
157 const GURL& presentation_url); | 158 const content::PresentationInfo& presentation_info); |
158 ~OffscreenPresentation(); | 159 ~OffscreenPresentation(); |
159 | 160 |
160 // Register controller with |render_frame_id|. If |receiver_callback_| has | 161 // Register controller with |render_frame_id|. If |receiver_callback_| has |
161 // been set, invoke |receiver_callback_| with |controller_connection_ptr| | 162 // been set, invoke |receiver_callback_| with |controller_connection_ptr| |
162 // and |receiver_connection_request| as parameter, else creates a | 163 // and |receiver_connection_request| as parameter, else creates a |
163 // ControllerConnection object with |controller_connection_ptr| and | 164 // ControllerConnection object with |controller_connection_ptr| and |
164 // |receiver_connection_request|, and store it in |pending_controllers_| | 165 // |receiver_connection_request|, and store it in |pending_controllers_| |
165 // map. | 166 // map. |
166 void RegisterController( | 167 void RegisterController( |
167 const RenderFrameHostId& render_frame_id, | 168 const RenderFrameHostId& render_frame_id, |
(...skipping 13 matching lines...) Expand all Loading... |
181 const content::ReceiverConnectionAvailableCallback& receiver_callback); | 182 const content::ReceiverConnectionAvailableCallback& receiver_callback); |
182 | 183 |
183 private: | 184 private: |
184 friend class OffscreenPresentationManagerTest; | 185 friend class OffscreenPresentationManagerTest; |
185 friend class OffscreenPresentationManager; | 186 friend class OffscreenPresentationManager; |
186 | 187 |
187 // Returns false if receiver_callback_ is null and there are no pending | 188 // Returns false if receiver_callback_ is null and there are no pending |
188 // controllers. | 189 // controllers. |
189 bool IsValid() const; | 190 bool IsValid() const; |
190 | 191 |
191 const std::string presentation_id_; | 192 const content::PresentationInfo presentation_info_; |
192 const GURL presentation_url_; | |
193 base::Optional<MediaRoute> route_; | 193 base::Optional<MediaRoute> route_; |
194 | 194 |
195 // Callback to invoke whenever a receiver connection is available. | 195 // Callback to invoke whenever a receiver connection is available. |
196 content::ReceiverConnectionAvailableCallback receiver_callback_; | 196 content::ReceiverConnectionAvailableCallback receiver_callback_; |
197 | 197 |
198 // Stores controller information. | 198 // Stores controller information. |
199 // |controller_connection_ptr|: Mojo::InterfacePtr to | 199 // |controller_connection_ptr|: Mojo::InterfacePtr to |
200 // blink::PresentationConnection object in controlling frame; | 200 // blink::PresentationConnection object in controlling frame; |
201 // |receiver_connection_request|: Mojo::InterfaceRequest to be bind to | 201 // |receiver_connection_request|: Mojo::InterfaceRequest to be bind to |
202 // blink::PresentationConnection object in receiver frame. | 202 // blink::PresentationConnection object in receiver frame. |
(...skipping 24 matching lines...) Expand all Loading... |
227 friend class MockOffscreenPresentationManager; | 227 friend class MockOffscreenPresentationManager; |
228 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplTest, | 228 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplTest, |
229 ConnectToOffscreenPresentation); | 229 ConnectToOffscreenPresentation); |
230 | 230 |
231 // Used by OffscreenPresentationManagerFactory::GetOrCreateForBrowserContext. | 231 // Used by OffscreenPresentationManagerFactory::GetOrCreateForBrowserContext. |
232 OffscreenPresentationManager(); | 232 OffscreenPresentationManager(); |
233 | 233 |
234 using OffscreenPresentationMap = | 234 using OffscreenPresentationMap = |
235 std::map<std::string, std::unique_ptr<OffscreenPresentation>>; | 235 std::map<std::string, std::unique_ptr<OffscreenPresentation>>; |
236 | 236 |
237 // Creates an offscreen presentation with |presentation_id| and | 237 // Creates an offscreen presentation with |presentation_info|. |
238 // |presentation_url|. | |
239 OffscreenPresentation* GetOrCreateOffscreenPresentation( | 238 OffscreenPresentation* GetOrCreateOffscreenPresentation( |
240 const std::string& presentation_id, | 239 const content::PresentationInfo& presentation_info); |
241 const GURL& presentation_url); | |
242 | 240 |
243 // Maps from presentation ID to OffscreenPresentation. | 241 // Maps from presentation ID to OffscreenPresentation. |
244 OffscreenPresentationMap offscreen_presentations_; | 242 OffscreenPresentationMap offscreen_presentations_; |
245 | 243 |
246 base::ThreadChecker thread_checker_; | 244 base::ThreadChecker thread_checker_; |
247 | 245 |
248 DISALLOW_COPY_AND_ASSIGN(OffscreenPresentationManager); | 246 DISALLOW_COPY_AND_ASSIGN(OffscreenPresentationManager); |
249 }; | 247 }; |
250 | 248 |
251 } // namespace media_router | 249 } // namespace media_router |
252 | 250 |
253 #endif // CHROME_BROWSER_MEDIA_ROUTER_OFFSCREEN_PRESENTATION_MANAGER_H_ | 251 #endif // CHROME_BROWSER_MEDIA_ROUTER_OFFSCREEN_PRESENTATION_MANAGER_H_ |
OLD | NEW |