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

Side by Side Diff: content/renderer/presentation/presentation_dispatcher.h

Issue 2598063002: [Presentation API] Handle multiple Presentation URLs in PresentationRequest::getAvailability() (Closed)
Patch Set: resolve code review comments from Derek 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
« no previous file with comments | « no previous file | content/renderer/presentation/presentation_dispatcher.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 CONTENT_RENDERER_PRESENTATION_PRESENTATION_DISPATCHER_H_ 5 #ifndef CONTENT_RENDERER_PRESENTATION_PRESENTATION_DISPATCHER_H_
6 #define CONTENT_RENDERER_PRESENTATION_PRESENTATION_DISPATCHER_H_ 6 #define CONTENT_RENDERER_PRESENTATION_PRESENTATION_DISPATCHER_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 class CONTENT_EXPORT PresentationDispatcher 43 class CONTENT_EXPORT PresentationDispatcher
44 : public RenderFrameObserver, 44 : public RenderFrameObserver,
45 public NON_EXPORTED_BASE(blink::WebPresentationClient), 45 public NON_EXPORTED_BASE(blink::WebPresentationClient),
46 public NON_EXPORTED_BASE(blink::mojom::PresentationServiceClient) { 46 public NON_EXPORTED_BASE(blink::mojom::PresentationServiceClient) {
47 public: 47 public:
48 explicit PresentationDispatcher(RenderFrame* render_frame); 48 explicit PresentationDispatcher(RenderFrame* render_frame);
49 ~PresentationDispatcher() override; 49 ~PresentationDispatcher() override;
50 50
51 private: 51 private:
52 friend class TestPresentationDispatcher; 52 friend class TestPresentationDispatcher;
53 friend class PresentationDispatcherTest;
53 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestStartSession); 54 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestStartSession);
54 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestStartSessionError); 55 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestStartSessionError);
55 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestJoinSession); 56 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestJoinSession);
56 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestJoinSessionError); 57 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestJoinSessionError);
57 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestSendString); 58 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestSendString);
58 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestSendArrayBuffer); 59 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestSendArrayBuffer);
59 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestSendBlobData); 60 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestSendBlobData);
60 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestCloseSession); 61 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestCloseSession);
61 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestTerminateSession); 62 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestTerminateSession);
62 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, 63 FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 size_t length) override; 105 size_t length) override;
105 void sendBlobData(const blink::WebURL& presentationUrl, 106 void sendBlobData(const blink::WebURL& presentationUrl,
106 const blink::WebString& presentationId, 107 const blink::WebString& presentationId,
107 const uint8_t* data, 108 const uint8_t* data,
108 size_t length) override; 109 size_t length) override;
109 void closeSession(const blink::WebURL& presentationUrl, 110 void closeSession(const blink::WebURL& presentationUrl,
110 const blink::WebString& presentationId) override; 111 const blink::WebString& presentationId) override;
111 void terminateSession(const blink::WebURL& presentationUrl, 112 void terminateSession(const blink::WebURL& presentationUrl,
112 const blink::WebString& presentationId) override; 113 const blink::WebString& presentationId) override;
113 void getAvailability( 114 void getAvailability(
114 const blink::WebVector<blink::WebURL>& availabilityUrl, 115 const blink::WebVector<blink::WebURL>& availabilityUrls,
115 std::unique_ptr<blink::WebPresentationAvailabilityCallbacks> callbacks) 116 std::unique_ptr<blink::WebPresentationAvailabilityCallbacks> callbacks)
116 override; 117 override;
117 void startListening(blink::WebPresentationAvailabilityObserver*) override; 118 void startListening(blink::WebPresentationAvailabilityObserver*) override;
118 void stopListening(blink::WebPresentationAvailabilityObserver*) override; 119 void stopListening(blink::WebPresentationAvailabilityObserver*) override;
119 void setDefaultPresentationUrls( 120 void setDefaultPresentationUrls(
120 const blink::WebVector<blink::WebURL>& presentationUrls) override; 121 const blink::WebVector<blink::WebURL>& presentationUrls) override;
121 122
122 // RenderFrameObserver implementation. 123 // RenderFrameObserver implementation.
123 void DidCommitProvisionalLoad( 124 void DidCommitProvisionalLoad(
124 bool is_new_navigation, 125 bool is_new_navigation,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 // over mojo channel. 171 // over mojo channel.
171 using MessageRequestQueue = std::queue<std::unique_ptr<SendMessageRequest>>; 172 using MessageRequestQueue = std::queue<std::unique_ptr<SendMessageRequest>>;
172 MessageRequestQueue message_request_queue_; 173 MessageRequestQueue message_request_queue_;
173 174
174 enum class ListeningState { 175 enum class ListeningState {
175 INACTIVE, 176 INACTIVE,
176 WAITING, 177 WAITING,
177 ACTIVE, 178 ACTIVE,
178 }; 179 };
179 180
181 // Do not change order or add new enum values. |GetScreenAvailability| impl
182 // depends on the order of the enum values.
183 enum class ScreenAvailability {
184 UNKNOWN = 0,
185 UNAVAILABLE,
186 UNSUPPORTED,
187 AVAILABLE
188 };
189
180 using AvailabilityCallbacksMap = 190 using AvailabilityCallbacksMap =
181 IDMap<std::unique_ptr<blink::WebPresentationAvailabilityCallbacks>>; 191 IDMap<std::unique_ptr<blink::WebPresentationAvailabilityCallbacks>>;
182 using AvailabilityObserversSet = 192 using AvailabilityObserversSet =
183 std::set<blink::WebPresentationAvailabilityObserver*>; 193 std::set<blink::WebPresentationAvailabilityObserver*>;
184 194
185 // Tracks status of presentation displays availability for |availability_url|. 195 // Tracks listeners of presentation displays availability for
186 struct AvailabilityStatus { 196 // |availability_urls|.
187 explicit AvailabilityStatus(const GURL& availability_url); 197 struct AvailabilityListener {
188 ~AvailabilityStatus(); 198 explicit AvailabilityListener(const std::vector<GURL>& availability_urls);
199 ~AvailabilityListener();
189 200
190 const GURL url; 201 const std::vector<GURL> urls;
191 bool last_known_availability;
192 ListeningState listening_state;
193 AvailabilityCallbacksMap availability_callbacks; 202 AvailabilityCallbacksMap availability_callbacks;
194 AvailabilityObserversSet availability_observers; 203 AvailabilityObserversSet availability_observers;
195 }; 204 };
196 205
197 // Map of AvailabilityStatus for known URLs. 206 // Tracks listening status of |availability_url|.
198 std::map<GURL, std::unique_ptr<AvailabilityStatus>> 207 struct ListeningStatus {
199 availability_status_; 208 explicit ListeningStatus(const GURL& availability_url);
209 ~ListeningStatus();
200 210
201 // Updates the listening state of availability for |status| and notifies the 211 const GURL url;
202 // client. 212 ScreenAvailability last_known_availability;
203 void UpdateListeningState(AvailabilityStatus* status); 213 ListeningState listening_state;
214 };
215
216 // Map of ListeningStatus for known URLs.
217 std::map<GURL, std::unique_ptr<ListeningStatus>> listening_status_;
218
219 // Set of AvailabilityListener for known PresentationRequest.
220 std::set<std::unique_ptr<AvailabilityListener>> availability_set_;
221
222 // Starts listening to |url|.
223 void StartListeningToURL(const GURL& url);
224
225 // Stops listening to |url| if no PresentationAvailability is observing |url|.
226 // StartListening() must have been called first.
227 void MaybeStopListeningToURL(const GURL& url);
228
229 // Returns nullptr if there is no status for |url|.
230 ListeningStatus* GetListeningStatus(const GURL& url) const;
231
232 // Returns nullptr if there is no availability listener for |urls|.
233 AvailabilityListener* GetAvailabilityListener(
234 const std::vector<GURL>& urls) const;
235
236 // Removes |listener| from |availability_set_| if |listener| has no callbacks
237 // and no observers.
238 void TryRemoveAvailabilityListener(AvailabilityListener* listener);
239
240 // Returns AVAILABLE if any url in |urls| has screen availability AVAILABLE;
241 // Returns UNSUPPORTED if any url in |urls| have screen availability
242 // UNSUPPORTED, and no url has screen availability AVAILABLE;
243 // Returns UNAVAILABLE if at least one url in |urls| has screen availability
244 // UNAVAILABLE, and no url has screen availability AVAILABLE or UNSUPPORTED;
245 // Returns UNKNOWN if all urls in |urls| have screen availability
246 // UNKNOWN.
247 ScreenAvailability GetScreenAvailability(const std::vector<GURL>& urls) const;
204 248
205 DISALLOW_COPY_AND_ASSIGN(PresentationDispatcher); 249 DISALLOW_COPY_AND_ASSIGN(PresentationDispatcher);
206 }; 250 };
207 251
208 } // namespace content 252 } // namespace content
209 253
210 #endif // CONTENT_RENDERER_PRESENTATION_PRESENTATION_DISPATCHER_H_ 254 #endif // CONTENT_RENDERER_PRESENTATION_PRESENTATION_DISPATCHER_H_
OLDNEW
« no previous file with comments | « no previous file | content/renderer/presentation/presentation_dispatcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698