Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2015 The Chromium Authors |
avayvod | bca35fad | 2015-01-29 20:20:57 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #ifndef CONTENT_BROWSER_PRESENTATION_PRESENTATION_SERVICE_IMPL_H_ |
| 6 | #define CONTENT_BROWSER_PRESENTATION_PRESENTATION_SERVICE_IMPL_H_ |
| 7 | |
kmarshall | f5367c64 | 2015-08-20 19:23:13 | [diff] [blame] | 8 | #include <map> |
dcheng | 5971627 | 2016-04-09 05:19:08 | [diff] [blame] | 9 | #include <memory> |
kmarshall | f5367c64 | 2015-08-20 19:23:13 | [diff] [blame] | 10 | #include <string> |
Takuto Ikuta | adf31eb | 2019-01-05 00:32:48 | [diff] [blame] | 11 | #include <unordered_map> |
mfoltz | fcad5262 | 2016-09-03 03:08:33 | [diff] [blame] | 12 | #include <vector> |
imcheng | 271b9ef | 2015-03-18 19:43:19 | [diff] [blame] | 13 | |
Avi Drissman | adac2199 | 2023-01-11 23:46:39 | [diff] [blame] | 14 | #include "base/functional/callback.h" |
imcheng | 9f515d0 | 2015-02-10 20:09:24 | [diff] [blame] | 15 | #include "base/gtest_prod_util.h" |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 16 | #include "base/memory/raw_ptr.h" |
imcheng | 271b9ef | 2015-03-18 19:43:19 | [diff] [blame] | 17 | #include "base/memory/weak_ptr.h" |
imcheng | 9f515d0 | 2015-02-10 20:09:24 | [diff] [blame] | 18 | #include "content/common/content_export.h" |
imcheng | 9f515d0 | 2015-02-10 20:09:24 | [diff] [blame] | 19 | #include "content/public/browser/navigation_details.h" |
| 20 | #include "content/public/browser/presentation_screen_availability_listener.h" |
| 21 | #include "content/public/browser/presentation_service_delegate.h" |
| 22 | #include "content/public/browser/web_contents_observer.h" |
Mario Sanchez Prada | 2311a9e | 2019-08-26 14:29:49 | [diff] [blame] | 23 | #include "mojo/public/cpp/bindings/pending_receiver.h" |
| 24 | #include "mojo/public/cpp/bindings/pending_remote.h" |
Clovis PJ | 535cff6a | 2020-08-06 14:40:04 | [diff] [blame] | 25 | #include "mojo/public/cpp/bindings/receiver_set.h" |
Mario Sanchez Prada | 2ae29e5a | 2019-08-26 14:42:23 | [diff] [blame] | 26 | #include "mojo/public/cpp/bindings/remote.h" |
mark a. foltz | 6bbe59f | 2018-07-24 20:06:24 | [diff] [blame] | 27 | #include "third_party/blink/public/mojom/presentation/presentation.mojom.h" |
mfoltz | fcad5262 | 2016-09-03 03:08:33 | [diff] [blame] | 28 | #include "url/gurl.h" |
avayvod | bca35fad | 2015-01-29 20:20:57 | [diff] [blame] | 29 | |
avayvod | bca35fad | 2015-01-29 20:20:57 | [diff] [blame] | 30 | namespace content { |
| 31 | |
imcheng | 9f515d0 | 2015-02-10 20:09:24 | [diff] [blame] | 32 | class RenderFrameHost; |
| 33 | |
| 34 | // Implementation of Mojo PresentationService. |
| 35 | // It handles Presentation API requests coming from Blink / renderer process |
| 36 | // and delegates the requests to the embedder's media router via |
| 37 | // PresentationServiceDelegate. |
| 38 | // An instance of this class tied to a RenderFrameHost and listens to events |
| 39 | // related to the RFH via implementing WebContentsObserver. |
| 40 | // This class is instantiated on-demand via Mojo's ConnectToRemoteService |
| 41 | // from the renderer when the first presentation API request is handled. |
Derek Cheng | 4de47c5 | 2017-10-10 01:05:54 | [diff] [blame] | 42 | // This class currently handles requests from both controller and receiver |
| 43 | // frames. The sequence of calls from a controller looks like the following: |
| 44 | // Create() |
| 45 | // SetClient() |
| 46 | // StartPresentation() |
Derek Cheng | 4de47c5 | 2017-10-10 01:05:54 | [diff] [blame] | 47 | // ... |
Alison Gale | 923a33e | 2024-04-22 23:34:28 | [diff] [blame] | 48 | // TODO(crbug.com/41336031): Split the controller and receiver logic into |
| 49 | // separate classes so that each is easier to reason about. |
imcheng | 9f515d0 | 2015-02-10 20:09:24 | [diff] [blame] | 50 | class CONTENT_EXPORT PresentationServiceImpl |
Nico Weber | 43ddd7a3 | 2017-08-15 19:19:27 | [diff] [blame] | 51 | : public blink::mojom::PresentationService, |
imcheng | 9f515d0 | 2015-02-10 20:09:24 | [diff] [blame] | 52 | public WebContentsObserver, |
| 53 | public PresentationServiceDelegate::Observer { |
avayvod | bca35fad | 2015-01-29 20:20:57 | [diff] [blame] | 54 | public: |
mfoltz | 11fc4df8 | 2017-03-20 23:49:18 | [diff] [blame] | 55 | using NewPresentationCallback = |
btolsch | 8ca10fb2 | 2018-08-29 01:35:09 | [diff] [blame] | 56 | base::OnceCallback<void(blink::mojom::PresentationConnectionResultPtr, |
mark a. foltz | d9d2a451 | 2018-04-16 20:42:45 | [diff] [blame] | 57 | blink::mojom::PresentationErrorPtr)>; |
mfoltz | dfbd7c3 | 2017-02-03 20:04:19 | [diff] [blame] | 58 | |
Derek Cheng | 4de47c5 | 2017-10-10 01:05:54 | [diff] [blame] | 59 | // Creates a PresentationServiceImpl using the given RenderFrameHost. |
| 60 | static std::unique_ptr<PresentationServiceImpl> Create( |
| 61 | RenderFrameHost* render_frame_host); |
| 62 | |
Peter Boström | 828b902 | 2021-09-21 02:28:43 | [diff] [blame] | 63 | PresentationServiceImpl(const PresentationServiceImpl&) = delete; |
| 64 | PresentationServiceImpl& operator=(const PresentationServiceImpl&) = delete; |
| 65 | |
Derek Cheng | 4de47c5 | 2017-10-10 01:05:54 | [diff] [blame] | 66 | ~PresentationServiceImpl() override; |
| 67 | |
Mario Sanchez Prada | d960266d | 2019-08-26 15:11:53 | [diff] [blame] | 68 | // Creates a binding between this object and |receiver|. Note that a |
| 69 | // PresentationServiceImpl instance can be bound to multiple receivers. |
| 70 | void Bind(mojo::PendingReceiver<blink::mojom::PresentationService> receiver); |
avayvod | bca35fad | 2015-01-29 20:20:57 | [diff] [blame] | 71 | |
imcheng | fafb67d0 | 2017-06-15 17:30:14 | [diff] [blame] | 72 | // PresentationService implementation. |
| 73 | void SetDefaultPresentationUrls( |
| 74 | const std::vector<GURL>& presentation_urls) override; |
Mario Sanchez Prada | 2ae29e5a | 2019-08-26 14:42:23 | [diff] [blame] | 75 | void SetController(mojo::PendingRemote<blink::mojom::PresentationController> |
| 76 | presentation_controller_remote) override; |
Mario Sanchez Prada | 23a91b2 | 2019-08-26 14:45:33 | [diff] [blame] | 77 | void SetReceiver(mojo::PendingRemote<blink::mojom::PresentationReceiver> |
| 78 | presentation_receiver_remote) override; |
imcheng | fafb67d0 | 2017-06-15 17:30:14 | [diff] [blame] | 79 | void ListenForScreenAvailability(const GURL& url) override; |
| 80 | void StopListeningForScreenAvailability(const GURL& url) override; |
| 81 | void StartPresentation(const std::vector<GURL>& presentation_urls, |
| 82 | NewPresentationCallback callback) override; |
| 83 | void ReconnectPresentation(const std::vector<GURL>& presentation_urls, |
Derek Cheng | 71ede79 | 2017-07-27 07:58:16 | [diff] [blame] | 84 | const std::string& presentation_id, |
imcheng | fafb67d0 | 2017-06-15 17:30:14 | [diff] [blame] | 85 | NewPresentationCallback callback) override; |
| 86 | void CloseConnection(const GURL& presentation_url, |
| 87 | const std::string& presentation_id) override; |
| 88 | void Terminate(const GURL& presentation_url, |
| 89 | const std::string& presentation_id) override; |
imcheng | fafb67d0 | 2017-06-15 17:30:14 | [diff] [blame] | 90 | |
Rakina Zata Amni | c7bc8263 | 2019-12-09 05:21:22 | [diff] [blame] | 91 | void SetControllerDelegateForTesting( |
| 92 | ControllerPresentationServiceDelegate* controller_delegate); |
| 93 | |
avayvod | bca35fad | 2015-01-29 20:20:57 | [diff] [blame] | 94 | private: |
imcheng | 9ce5394b | 2015-05-12 19:27:01 | [diff] [blame] | 95 | friend class PresentationServiceImplTest; |
Derek Cheng | 4de47c5 | 2017-10-10 01:05:54 | [diff] [blame] | 96 | FRIEND_TEST_ALL_PREFIXES(PresentationServiceImplTest, OnDelegateDestroyed); |
imcheng | 9ce5394b | 2015-05-12 19:27:01 | [diff] [blame] | 97 | FRIEND_TEST_ALL_PREFIXES(PresentationServiceImplTest, DelegateFails); |
| 98 | FRIEND_TEST_ALL_PREFIXES(PresentationServiceImplTest, |
imcheng | 22578da | 2017-07-11 23:09:11 | [diff] [blame] | 99 | SetDefaultPresentationUrlsNoopsOnNonMainFrame); |
| 100 | FRIEND_TEST_ALL_PREFIXES(PresentationServiceImplTest, |
imcheng | 1ebdd16 | 2017-01-26 22:01:52 | [diff] [blame] | 101 | ListenForConnectionStateChange); |
imcheng | ed10e96 | 2016-02-23 06:34:44 | [diff] [blame] | 102 | FRIEND_TEST_ALL_PREFIXES(PresentationServiceImplTest, |
| 103 | ListenForConnectionClose); |
zhaobin | f3704f8 | 2017-01-12 07:19:36 | [diff] [blame] | 104 | FRIEND_TEST_ALL_PREFIXES(PresentationServiceImplTest, |
imcheng | fafb67d0 | 2017-06-15 17:30:14 | [diff] [blame] | 105 | MaxPendingStartPresentationRequests); |
| 106 | FRIEND_TEST_ALL_PREFIXES(PresentationServiceImplTest, |
| 107 | MaxPendingReconnectPresentationRequests); |
zhaobin | f3704f8 | 2017-01-12 07:19:36 | [diff] [blame] | 108 | FRIEND_TEST_ALL_PREFIXES(PresentationServiceImplTest, |
| 109 | ReceiverPresentationServiceDelegate); |
zhaobin | dca98f63 | 2017-06-29 18:42:28 | [diff] [blame] | 110 | FRIEND_TEST_ALL_PREFIXES(PresentationServiceImplTest, |
| 111 | ReceiverDelegateOnSubFrame); |
Rakina Zata Amni | c7bc8263 | 2019-12-09 05:21:22 | [diff] [blame] | 112 | FRIEND_TEST_ALL_PREFIXES(BackForwardCacheBrowserTest, |
| 113 | PresentationConnectionClosed); |
imcheng | f3e5a01 | 2015-11-20 04:08:37 | [diff] [blame] | 114 | |
mfoltz | 11fc4df8 | 2017-03-20 23:49:18 | [diff] [blame] | 115 | // Maximum number of pending ReconnectPresentation requests at any given time. |
| 116 | static const int kMaxQueuedRequests = 10; |
imcheng | 27e2b56b | 2015-05-15 21:39:30 | [diff] [blame] | 117 | |
imcheng | 9ce5394b | 2015-05-12 19:27:01 | [diff] [blame] | 118 | // Listener implementation owned by PresentationServiceImpl. An instance of |
mfoltz | 3f30502f | 2015-08-11 16:13:38 | [diff] [blame] | 119 | // this is created when PresentationRequest.getAvailability() is resolved. |
imcheng | 9ce5394b | 2015-05-12 19:27:01 | [diff] [blame] | 120 | // The instance receives screen availability results from the embedder and |
| 121 | // propagates results back to PresentationServiceImpl. |
| 122 | class CONTENT_EXPORT ScreenAvailabilityListenerImpl |
imcheng | 271b9ef | 2015-03-18 19:43:19 | [diff] [blame] | 123 | : public PresentationScreenAvailabilityListener { |
| 124 | public: |
mfoltz | 7a2c823b | 2016-10-08 01:35:24 | [diff] [blame] | 125 | ScreenAvailabilityListenerImpl(const GURL& availability_url, |
| 126 | PresentationServiceImpl* service); |
imcheng | 9ce5394b | 2015-05-12 19:27:01 | [diff] [blame] | 127 | ~ScreenAvailabilityListenerImpl() override; |
imcheng | 271b9ef | 2015-03-18 19:43:19 | [diff] [blame] | 128 | |
imcheng | 271b9ef | 2015-03-18 19:43:19 | [diff] [blame] | 129 | // PresentationScreenAvailabilityListener implementation. |
Lucas Furukawa Gadani | 4b4eed0 | 2019-06-04 23:12:04 | [diff] [blame] | 130 | GURL GetAvailabilityUrl() override; |
Anton Vayvod | e3c3986 | 2017-06-20 20:53:32 | [diff] [blame] | 131 | void OnScreenAvailabilityChanged( |
| 132 | blink::mojom::ScreenAvailability availability) override; |
imcheng | 271b9ef | 2015-03-18 19:43:19 | [diff] [blame] | 133 | |
imcheng | 271b9ef | 2015-03-18 19:43:19 | [diff] [blame] | 134 | private: |
mfoltz | 7a2c823b | 2016-10-08 01:35:24 | [diff] [blame] | 135 | const GURL availability_url_; |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 136 | const raw_ptr<PresentationServiceImpl> service_; |
imcheng | 271b9ef | 2015-03-18 19:43:19 | [diff] [blame] | 137 | }; |
| 138 | |
mfoltz | 11fc4df8 | 2017-03-20 23:49:18 | [diff] [blame] | 139 | // Ensures the provided NewPresentationCallback is invoked exactly once |
imcheng | 27e2b56b | 2015-05-15 21:39:30 | [diff] [blame] | 140 | // before it goes out of scope. |
mfoltz | 11fc4df8 | 2017-03-20 23:49:18 | [diff] [blame] | 141 | class NewPresentationCallbackWrapper { |
imcheng | 27e2b56b | 2015-05-15 21:39:30 | [diff] [blame] | 142 | public: |
tzik | cf7bcd65 | 2017-06-15 04:19:30 | [diff] [blame] | 143 | explicit NewPresentationCallbackWrapper(NewPresentationCallback callback); |
Peter Boström | 828b902 | 2021-09-21 02:28:43 | [diff] [blame] | 144 | |
| 145 | NewPresentationCallbackWrapper(const NewPresentationCallbackWrapper&) = |
| 146 | delete; |
| 147 | NewPresentationCallbackWrapper& operator=( |
| 148 | const NewPresentationCallbackWrapper&) = delete; |
| 149 | |
mfoltz | 11fc4df8 | 2017-03-20 23:49:18 | [diff] [blame] | 150 | ~NewPresentationCallbackWrapper(); |
imcheng | 27e2b56b | 2015-05-15 21:39:30 | [diff] [blame] | 151 | |
btolsch | 8ca10fb2 | 2018-08-29 01:35:09 | [diff] [blame] | 152 | void Run(blink::mojom::PresentationConnectionResultPtr result, |
mark a. foltz | d9d2a451 | 2018-04-16 20:42:45 | [diff] [blame] | 153 | blink::mojom::PresentationErrorPtr error); |
imcheng | 27e2b56b | 2015-05-15 21:39:30 | [diff] [blame] | 154 | |
| 155 | private: |
mfoltz | 11fc4df8 | 2017-03-20 23:49:18 | [diff] [blame] | 156 | NewPresentationCallback callback_; |
imcheng | 27e2b56b | 2015-05-15 21:39:30 | [diff] [blame] | 157 | }; |
| 158 | |
Derek Cheng | 4de47c5 | 2017-10-10 01:05:54 | [diff] [blame] | 159 | // Note: Use |PresentationServiceImpl::Create| instead. This constructor |
| 160 | // should only be directly invoked in tests. |
imcheng | 9f515d0 | 2015-02-10 20:09:24 | [diff] [blame] | 161 | // |render_frame_host|: The RFH this instance is associated with. |
| 162 | // |web_contents|: The WebContents to observe. |
zhaobin | f3704f8 | 2017-01-12 07:19:36 | [diff] [blame] | 163 | // |controller_delegate|: Where Presentation API requests are delegated to in |
| 164 | // controller frame. Set to nullptr if current frame is receiver frame. Not |
| 165 | // owned by this class. |
| 166 | // |receiver_delegate|: Where Presentation API requests are delegated to in |
| 167 | // receiver frame. Set to nullptr if current frame is controller frame. Not |
| 168 | // owned by this class. |
imcheng | 9f515d0 | 2015-02-10 20:09:24 | [diff] [blame] | 169 | PresentationServiceImpl( |
| 170 | RenderFrameHost* render_frame_host, |
| 171 | WebContents* web_contents, |
zhaobin | f3704f8 | 2017-01-12 07:19:36 | [diff] [blame] | 172 | ControllerPresentationServiceDelegate* controller_delegate, |
| 173 | ReceiverPresentationServiceDelegate* receiver_delegate); |
avayvod | bca35fad | 2015-01-29 20:20:57 | [diff] [blame] | 174 | |
imcheng | 9f515d0 | 2015-02-10 20:09:24 | [diff] [blame] | 175 | // WebContentsObserver override. |
jam | 5fdbb58d | 2017-02-06 22:09:59 | [diff] [blame] | 176 | void DidFinishNavigation(NavigationHandle* navigation_handle) override; |
imcheng | 9f515d0 | 2015-02-10 20:09:24 | [diff] [blame] | 177 | |
| 178 | // PresentationServiceDelegate::Observer |
| 179 | void OnDelegateDestroyed() override; |
imcheng | fa43aae0 | 2015-11-11 17:28:44 | [diff] [blame] | 180 | |
| 181 | // Passed to embedder's implementation of PresentationServiceDelegate for |
| 182 | // later invocation when default presentation has started. |
mark a. foltz | e2084383c | 2018-05-11 19:21:50 | [diff] [blame] | 183 | void OnDefaultPresentationStarted( |
btolsch | 8ca10fb2 | 2018-08-29 01:35:09 | [diff] [blame] | 184 | blink::mojom::PresentationConnectionResultPtr result); |
imcheng | 9f515d0 | 2015-02-10 20:09:24 | [diff] [blame] | 185 | |
mfoltz | 11fc4df8 | 2017-03-20 23:49:18 | [diff] [blame] | 186 | // Finds the callback from |pending_reconnect_presentation_cbs_| using |
| 187 | // |request_id|. |
btolsch | 8ca10fb2 | 2018-08-29 01:35:09 | [diff] [blame] | 188 | // If it exists, invoke it with |result| and |error|, then erase it |
mfoltz | 11fc4df8 | 2017-03-20 23:49:18 | [diff] [blame] | 189 | // from |pending_reconnect_presentation_cbs_|. Returns true if the callback |
| 190 | // was found. |
| 191 | bool RunAndEraseReconnectPresentationMojoCallback( |
| 192 | int request_id, |
btolsch | 8ca10fb2 | 2018-08-29 01:35:09 | [diff] [blame] | 193 | blink::mojom::PresentationConnectionResultPtr result, |
mark a. foltz | d9d2a451 | 2018-04-16 20:42:45 | [diff] [blame] | 194 | blink::mojom::PresentationErrorPtr error); |
imcheng | 31fe0da9 | 2015-03-26 02:08:50 | [diff] [blame] | 195 | |
imcheng | 271b9ef | 2015-03-18 19:43:19 | [diff] [blame] | 196 | // Removes all listeners and resets default presentation URL on this instance |
| 197 | // and informs the PresentationServiceDelegate of such. |
| 198 | void Reset(); |
| 199 | |
s.singapati | 834d10a1 | 2015-05-11 16:29:47 | [diff] [blame] | 200 | // These functions are bound as base::Callbacks and passed to |
imcheng | 271b9ef | 2015-03-18 19:43:19 | [diff] [blame] | 201 | // embedder's implementation of PresentationServiceDelegate for later |
| 202 | // invocation. |
mark a. foltz | e2084383c | 2018-05-11 19:21:50 | [diff] [blame] | 203 | void OnStartPresentationSucceeded( |
| 204 | int request_id, |
btolsch | 8ca10fb2 | 2018-08-29 01:35:09 | [diff] [blame] | 205 | blink::mojom::PresentationConnectionResultPtr result); |
mark a. foltz | d9d2a451 | 2018-04-16 20:42:45 | [diff] [blame] | 206 | void OnStartPresentationError(int request_id, |
| 207 | const blink::mojom::PresentationError& error); |
mfoltz | 11fc4df8 | 2017-03-20 23:49:18 | [diff] [blame] | 208 | void OnReconnectPresentationSucceeded( |
| 209 | int request_id, |
btolsch | 8ca10fb2 | 2018-08-29 01:35:09 | [diff] [blame] | 210 | blink::mojom::PresentationConnectionResultPtr result); |
mark a. foltz | d9d2a451 | 2018-04-16 20:42:45 | [diff] [blame] | 211 | void OnReconnectPresentationError( |
| 212 | int request_id, |
| 213 | const blink::mojom::PresentationError& error); |
imcheng | 271b9ef | 2015-03-18 19:43:19 | [diff] [blame] | 214 | |
imcheng | f3e5a01 | 2015-11-20 04:08:37 | [diff] [blame] | 215 | // Calls to |delegate_| to start listening for state changes for |connection|. |
imcheng | 1ebdd16 | 2017-01-26 22:01:52 | [diff] [blame] | 216 | // State changes will be returned via |OnConnectionStateChanged|. |
mark a. foltz | e2084383c | 2018-05-11 19:21:50 | [diff] [blame] | 217 | void ListenForConnectionStateChange( |
| 218 | const blink::mojom::PresentationInfo& connection); |
imcheng | f3e5a01 | 2015-11-20 04:08:37 | [diff] [blame] | 219 | |
Takumi Fujimoto | 6d2b0f2 | 2017-10-30 23:01:33 | [diff] [blame] | 220 | // A callback registered to LocalPresentationManager when |
zhaobin | f3704f8 | 2017-01-12 07:19:36 | [diff] [blame] | 221 | // the PresentationServiceImpl for the presentation receiver is initialized. |
Derek Cheng | f8ffbec5 | 2017-12-06 19:43:04 | [diff] [blame] | 222 | // Calls |receiver_| to create a new PresentationConnection on receiver page. |
zhaobin | f3704f8 | 2017-01-12 07:19:36 | [diff] [blame] | 223 | void OnReceiverConnectionAvailable( |
Wei4 Wang | e1c8c00 | 2023-04-24 23:30:25 | [diff] [blame] | 224 | blink::mojom::PresentationConnectionResultPtr result); |
zhaobin | f3704f8 | 2017-01-12 07:19:36 | [diff] [blame] | 225 | |
mfoltz | 11fc4df8 | 2017-03-20 23:49:18 | [diff] [blame] | 226 | // Associates a ReconnectPresentation |callback| with a unique request ID and |
tzik | cf7bcd65 | 2017-06-15 04:19:30 | [diff] [blame] | 227 | // stores it in a map. Moves out |callback| object if |callback| is registered |
| 228 | // successfully. If the queue is full, returns a negative value and leaves |
| 229 | // |callback| as is. |
| 230 | int RegisterReconnectPresentationCallback(NewPresentationCallback* callback); |
imcheng | 31fe0da9 | 2015-03-26 02:08:50 | [diff] [blame] | 231 | |
imcheng | 1709d15 | 2015-07-10 21:14:11 | [diff] [blame] | 232 | // Invoked by the embedder's PresentationServiceDelegate when a |
imcheng | f3e5a01 | 2015-11-20 04:08:37 | [diff] [blame] | 233 | // PresentationConnection's state has changed. |
imcheng | ed10e96 | 2016-02-23 06:34:44 | [diff] [blame] | 234 | void OnConnectionStateChanged( |
mark a. foltz | e2084383c | 2018-05-11 19:21:50 | [diff] [blame] | 235 | const blink::mojom::PresentationInfo& connection, |
imcheng | ed10e96 | 2016-02-23 06:34:44 | [diff] [blame] | 236 | const PresentationConnectionStateChangeInfo& info); |
imcheng | 1709d15 | 2015-07-10 21:14:11 | [diff] [blame] | 237 | |
imcheng | 2ed5f820 | 2015-04-24 19:41:17 | [diff] [blame] | 238 | // Returns true if this object is associated with |render_frame_host|. |
| 239 | bool FrameMatches(content::RenderFrameHost* render_frame_host) const; |
| 240 | |
Derek Cheng | 1ad7724 | 2018-04-16 18:55:11 | [diff] [blame] | 241 | // Invoked on Mojo connection error. Closes all Mojo message pipes held by |
| 242 | // |this|. |
| 243 | void OnConnectionError(); |
| 244 | |
zhaobin | f3704f8 | 2017-01-12 07:19:36 | [diff] [blame] | 245 | // Returns |controller_delegate| if current frame is controller frame; Returns |
| 246 | // |receiver_delegate| if current frame is receiver frame. |
| 247 | PresentationServiceDelegate* GetPresentationServiceDelegate(); |
| 248 | |
Derek Cheng | 1071a23 | 2017-07-25 22:23:56 | [diff] [blame] | 249 | // The RenderFrameHost associated with this object. |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 250 | const raw_ptr<RenderFrameHost> render_frame_host_; |
Derek Cheng | 1071a23 | 2017-07-25 22:23:56 | [diff] [blame] | 251 | |
zhaobin | f3704f8 | 2017-01-12 07:19:36 | [diff] [blame] | 252 | // Embedder-specific delegate for controller to forward Presentation requests |
| 253 | // to. Must be nullptr if current page is receiver page or |
| 254 | // embedder does not support Presentation API . |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 255 | raw_ptr<ControllerPresentationServiceDelegate> controller_delegate_; |
zhaobin | f3704f8 | 2017-01-12 07:19:36 | [diff] [blame] | 256 | |
| 257 | // Embedder-specific delegate for receiver to forward Presentation requests |
| 258 | // to. Must be nullptr if current page is receiver page or |
| 259 | // embedder does not support Presentation API. |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 260 | raw_ptr<ReceiverPresentationServiceDelegate> receiver_delegate_; |
imcheng | 9f515d0 | 2015-02-10 20:09:24 | [diff] [blame] | 261 | |
Derek Cheng | f8ffbec5 | 2017-12-06 19:43:04 | [diff] [blame] | 262 | // Pointer to the PresentationController implementation in the renderer. |
Mario Sanchez Prada | 2ae29e5a | 2019-08-26 14:42:23 | [diff] [blame] | 263 | mojo::Remote<blink::mojom::PresentationController> |
| 264 | presentation_controller_remote_; |
imcheng | 9f515d0 | 2015-02-10 20:09:24 | [diff] [blame] | 265 | |
Derek Cheng | f8ffbec5 | 2017-12-06 19:43:04 | [diff] [blame] | 266 | // Pointer to the PresentationReceiver implementation in the renderer. |
Mario Sanchez Prada | 23a91b2 | 2019-08-26 14:45:33 | [diff] [blame] | 267 | mojo::Remote<blink::mojom::PresentationReceiver> |
| 268 | presentation_receiver_remote_; |
Derek Cheng | 4de47c5 | 2017-10-10 01:05:54 | [diff] [blame] | 269 | |
mfoltz | 7a2c823b | 2016-10-08 01:35:24 | [diff] [blame] | 270 | std::vector<GURL> default_presentation_urls_; |
imcheng | 271b9ef | 2015-03-18 19:43:19 | [diff] [blame] | 271 | |
mfoltz | 3f30502f | 2015-08-11 16:13:38 | [diff] [blame] | 272 | using ScreenAvailabilityListenerMap = |
mfoltz | 7a2c823b | 2016-10-08 01:35:24 | [diff] [blame] | 273 | std::map<GURL, std::unique_ptr<ScreenAvailabilityListenerImpl>>; |
mfoltz | 3f30502f | 2015-08-11 16:13:38 | [diff] [blame] | 274 | ScreenAvailabilityListenerMap screen_availability_listeners_; |
imcheng | 9ce5394b | 2015-05-12 19:27:01 | [diff] [blame] | 275 | |
mfoltz | 11fc4df8 | 2017-03-20 23:49:18 | [diff] [blame] | 276 | // For StartPresentation requests. |
| 277 | // Set to a positive value when a StartPresentation request is being |
| 278 | // processed. |
| 279 | int start_presentation_request_id_; |
| 280 | std::unique_ptr<NewPresentationCallbackWrapper> |
| 281 | pending_start_presentation_cb_; |
rockot | 5d5dbf0d | 2015-04-14 18:31:15 | [diff] [blame] | 282 | |
mfoltz | 11fc4df8 | 2017-03-20 23:49:18 | [diff] [blame] | 283 | // For ReconnectPresentation requests. |
Takuto Ikuta | adf31eb | 2019-01-05 00:32:48 | [diff] [blame] | 284 | std::unordered_map<int, std::unique_ptr<NewPresentationCallbackWrapper>> |
mfoltz | 11fc4df8 | 2017-03-20 23:49:18 | [diff] [blame] | 285 | pending_reconnect_presentation_cbs_; |
imcheng | 31fe0da9 | 2015-03-26 02:08:50 | [diff] [blame] | 286 | |
Clovis PJ | 535cff6a | 2020-08-06 14:40:04 | [diff] [blame] | 287 | mojo::ReceiverSet<blink::mojom::PresentationService> |
| 288 | presentation_service_receivers_; |
imcheng | 16819b9 | 2015-04-03 08:52:45 | [diff] [blame] | 289 | |
imcheng | 2ed5f820 | 2015-04-24 19:41:17 | [diff] [blame] | 290 | // ID of the RenderFrameHost this object is associated with. |
| 291 | int render_process_id_; |
| 292 | int render_frame_id_; |
| 293 | |
Claudio DeSouza | ee45cae | 2021-11-24 20:30:27 | [diff] [blame] | 294 | // If current frame is the outermost frame (not an iframe nor a fenced frame). |
| 295 | bool is_outermost_document_; |
zhaobin | dca98f63 | 2017-06-29 18:42:28 | [diff] [blame] | 296 | |
imcheng | 271b9ef | 2015-03-18 19:43:19 | [diff] [blame] | 297 | // NOTE: Weak pointers must be invalidated before all other member variables. |
Jeremy Roman | 3bca4bf | 2019-07-11 03:41:25 | [diff] [blame] | 298 | base::WeakPtrFactory<PresentationServiceImpl> weak_factory_{this}; |
avayvod | bca35fad | 2015-01-29 20:20:57 | [diff] [blame] | 299 | }; |
| 300 | |
| 301 | } // namespace content |
| 302 | |
| 303 | #endif // CONTENT_BROWSER_PRESENTATION_PRESENTATION_SERVICE_IMPL_H_ |