OLD | NEW |
---|---|
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 #include "content/renderer/presentation/presentation_dispatcher.h" | 5 #include "content/renderer/presentation/presentation_dispatcher.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/memory/ptr_util.h" | 13 #include "base/memory/ptr_util.h" |
14 #include "content/public/common/presentation_constants.h" | 14 #include "content/public/common/presentation_constants.h" |
15 #include "content/public/renderer/render_frame.h" | 15 #include "content/public/renderer/render_frame.h" |
16 #include "content/renderer/presentation/presentation_connection_client.h" | 16 #include "content/renderer/presentation/presentation_connection_client.h" |
17 #include "services/shell/public/cpp/interface_provider.h" | 17 #include "services/shell/public/cpp/interface_provider.h" |
18 #include "third_party/WebKit/public/platform/WebString.h" | 18 #include "third_party/WebKit/public/platform/WebString.h" |
19 #include "third_party/WebKit/public/platform/WebURL.h" | 19 #include "third_party/WebKit/public/platform/WebVector.h" |
20 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nAvailabilityObserver.h" | 20 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nAvailabilityObserver.h" |
21 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nController.h" | 21 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nController.h" |
22 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nError.h" | 22 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nError.h" |
23 #include "third_party/WebKit/public/platform/modules/presentation/presentation.m ojom.h" | 23 #include "third_party/WebKit/public/platform/modules/presentation/presentation.m ojom.h" |
24 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 24 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
25 #include "url/gurl.h" | 25 #include "url/gurl.h" |
26 | 26 |
27 namespace { | 27 namespace { |
28 | 28 |
29 blink::WebPresentationError::ErrorType GetWebPresentationErrorTypeFromMojo( | 29 blink::WebPresentationError::ErrorType GetWebPresentationErrorTypeFromMojo( |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
93 blink::WebPresentationController* controller) { | 93 blink::WebPresentationController* controller) { |
94 // There shouldn't be any swapping from one non-null controller to another. | 94 // There shouldn't be any swapping from one non-null controller to another. |
95 DCHECK(controller != controller_ && (!controller || !controller_)); | 95 DCHECK(controller != controller_ && (!controller || !controller_)); |
96 controller_ = controller; | 96 controller_ = controller; |
97 // The controller is set to null when the frame is about to be detached. | 97 // The controller is set to null when the frame is about to be detached. |
98 // Nothing is listening for screen availability anymore but the Mojo service | 98 // Nothing is listening for screen availability anymore but the Mojo service |
99 // will know about the frame being detached anyway. | 99 // will know about the frame being detached anyway. |
100 } | 100 } |
101 | 101 |
102 void PresentationDispatcher::startSession( | 102 void PresentationDispatcher::startSession( |
103 const blink::WebString& presentationUrl, | 103 const blink::WebVector<blink::WebString>& presentationUrls, |
104 blink::WebPresentationConnectionClientCallbacks* callback) { | 104 blink::WebPresentationConnectionClientCallbacks* callback) { |
105 DCHECK(callback); | 105 DCHECK(callback); |
106 ConnectToPresentationServiceIfNeeded(); | 106 ConnectToPresentationServiceIfNeeded(); |
107 | 107 |
108 // TODO(mfoltz): Pass all URLs to PresentationService. | |
109 | |
imcheng
2016/07/20 17:20:46
should this code check the given vector is not emp
| |
108 // The dispatcher owns the service so |this| will be valid when | 110 // The dispatcher owns the service so |this| will be valid when |
109 // OnSessionCreated() is called. |callback| needs to be alive and also needs | 111 // OnSessionCreated() is called. |callback| needs to be alive and also needs |
110 // to be destroyed so we transfer its ownership to the mojo callback. | 112 // to be destroyed so we transfer its ownership to the mojo callback. |
111 presentation_service_->StartSession( | 113 presentation_service_->StartSession( |
112 presentationUrl.utf8(), | 114 presentationUrls[0].utf8(), |
113 base::Bind(&PresentationDispatcher::OnSessionCreated, | 115 base::Bind(&PresentationDispatcher::OnSessionCreated, |
114 base::Unretained(this), | 116 base::Unretained(this), |
115 base::Owned(callback))); | 117 base::Owned(callback))); |
116 } | 118 } |
117 | 119 |
118 void PresentationDispatcher::joinSession( | 120 void PresentationDispatcher::joinSession( |
119 const blink::WebString& presentationUrl, | 121 const blink::WebVector<blink::WebString>& presentationUrls, |
120 const blink::WebString& presentationId, | 122 const blink::WebString& presentationId, |
121 blink::WebPresentationConnectionClientCallbacks* callback) { | 123 blink::WebPresentationConnectionClientCallbacks* callback) { |
122 DCHECK(callback); | 124 DCHECK(callback); |
123 ConnectToPresentationServiceIfNeeded(); | 125 ConnectToPresentationServiceIfNeeded(); |
124 | 126 |
127 // TODO(mfoltz): Pass all URLs to PresentationService. | |
128 | |
125 // The dispatcher owns the service so |this| will be valid when | 129 // The dispatcher owns the service so |this| will be valid when |
126 // OnSessionCreated() is called. |callback| needs to be alive and also needs | 130 // OnSessionCreated() is called. |callback| needs to be alive and also needs |
127 // to be destroyed so we transfer its ownership to the mojo callback. | 131 // to be destroyed so we transfer its ownership to the mojo callback. |
128 presentation_service_->JoinSession( | 132 presentation_service_->JoinSession( |
129 presentationUrl.utf8(), | 133 presentationUrls[0].utf8(), |
130 presentationId.utf8(), | 134 presentationId.utf8(), |
131 base::Bind(&PresentationDispatcher::OnSessionCreated, | 135 base::Bind(&PresentationDispatcher::OnSessionCreated, |
132 base::Unretained(this), | 136 base::Unretained(this), |
133 base::Owned(callback))); | 137 base::Owned(callback))); |
134 } | 138 } |
135 | 139 |
136 void PresentationDispatcher::sendString( | 140 void PresentationDispatcher::sendString( |
137 const blink::WebString& presentationUrl, | 141 const blink::WebString& presentationUrl, |
138 const blink::WebString& presentationId, | 142 const blink::WebString& presentationId, |
139 const blink::WebString& message) { | 143 const blink::WebString& message) { |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
234 void PresentationDispatcher::terminateSession( | 238 void PresentationDispatcher::terminateSession( |
235 const blink::WebString& presentationUrl, | 239 const blink::WebString& presentationUrl, |
236 const blink::WebString& presentationId) { | 240 const blink::WebString& presentationId) { |
237 ConnectToPresentationServiceIfNeeded(); | 241 ConnectToPresentationServiceIfNeeded(); |
238 | 242 |
239 presentation_service_->Terminate(presentationUrl.utf8(), | 243 presentation_service_->Terminate(presentationUrl.utf8(), |
240 presentationId.utf8()); | 244 presentationId.utf8()); |
241 } | 245 } |
242 | 246 |
243 void PresentationDispatcher::getAvailability( | 247 void PresentationDispatcher::getAvailability( |
244 const blink::WebString& availabilityUrl, | 248 const blink::WebVector<blink::WebString>& availabilityUrls, |
245 blink::WebPresentationAvailabilityCallbacks* callbacks) { | 249 blink::WebPresentationAvailabilityCallbacks* callbacks) { |
246 const std::string& availability_url = availabilityUrl.utf8(); | 250 // TODO(mfoltz): Pass all URLs to PresentationService. |
251 const std::string& availability_url = availabilityUrls[0].utf8(); | |
247 AvailabilityStatus* status = nullptr; | 252 AvailabilityStatus* status = nullptr; |
248 auto status_it = availability_status_.find(availability_url); | 253 auto status_it = availability_status_.find(availability_url); |
249 if (status_it == availability_status_.end()) { | 254 if (status_it == availability_status_.end()) { |
250 status = new AvailabilityStatus(availability_url); | 255 status = new AvailabilityStatus(availability_url); |
251 availability_status_[availability_url] = base::WrapUnique(status); | 256 availability_status_[availability_url] = base::WrapUnique(status); |
252 } else { | 257 } else { |
253 status = status_it->second.get(); | 258 status = status_it->second.get(); |
254 } | 259 } |
255 DCHECK(status); | 260 DCHECK(status); |
256 | 261 |
257 if (status->listening_state == ListeningState::ACTIVE) { | 262 if (status->listening_state == ListeningState::ACTIVE) { |
258 callbacks->onSuccess(status->last_known_availability); | 263 callbacks->onSuccess(status->last_known_availability); |
259 delete callbacks; | 264 delete callbacks; |
260 return; | 265 return; |
261 } | 266 } |
262 | 267 |
263 status->availability_callbacks.Add(callbacks); | 268 status->availability_callbacks.Add(callbacks); |
264 UpdateListeningState(status); | 269 UpdateListeningState(status); |
265 } | 270 } |
266 | 271 |
267 void PresentationDispatcher::startListening( | 272 void PresentationDispatcher::startListening( |
268 blink::WebPresentationAvailabilityObserver* observer) { | 273 blink::WebPresentationAvailabilityObserver* observer) { |
269 const std::string& availability_url = observer->url().string().utf8(); | 274 // TODO(mfoltz): Pass all URLs to PresentationService. |
275 const std::string& availability_url = observer->urls()[0].string().utf8(); | |
270 auto status_it = availability_status_.find(availability_url); | 276 auto status_it = availability_status_.find(availability_url); |
271 if (status_it == availability_status_.end()) { | 277 if (status_it == availability_status_.end()) { |
272 DLOG(WARNING) << "Start listening for availability for unknown URL " | 278 DLOG(WARNING) << "Start listening for availability for unknown URL " |
273 << availability_url; | 279 << availability_url; |
274 return; | 280 return; |
275 } | 281 } |
276 status_it->second->availability_observers.insert(observer); | 282 status_it->second->availability_observers.insert(observer); |
277 UpdateListeningState(status_it->second.get()); | 283 UpdateListeningState(status_it->second.get()); |
278 } | 284 } |
279 | 285 |
280 void PresentationDispatcher::stopListening( | 286 void PresentationDispatcher::stopListening( |
281 blink::WebPresentationAvailabilityObserver* observer) { | 287 blink::WebPresentationAvailabilityObserver* observer) { |
282 const std::string& availability_url = observer->url().string().utf8(); | 288 // TODO(mfoltz): Pass all URLs to PresentationService. |
289 const std::string& availability_url = observer->urls()[0].string().utf8(); | |
283 auto status_it = availability_status_.find(availability_url); | 290 auto status_it = availability_status_.find(availability_url); |
284 if (status_it == availability_status_.end()) { | 291 if (status_it == availability_status_.end()) { |
285 DLOG(WARNING) << "Stop listening for availability for unknown URL " | 292 DLOG(WARNING) << "Stop listening for availability for unknown URL " |
286 << availability_url; | 293 << availability_url; |
287 return; | 294 return; |
288 } | 295 } |
289 status_it->second->availability_observers.erase(observer); | 296 status_it->second->availability_observers.erase(observer); |
290 UpdateListeningState(status_it->second.get()); | 297 UpdateListeningState(status_it->second.get()); |
291 } | 298 } |
292 | 299 |
293 void PresentationDispatcher::setDefaultPresentationUrl( | 300 void PresentationDispatcher::setDefaultPresentationUrls( |
294 const blink::WebString& url) { | 301 const blink::WebVector<blink::WebString>& urls) { |
295 ConnectToPresentationServiceIfNeeded(); | 302 ConnectToPresentationServiceIfNeeded(); |
296 presentation_service_->SetDefaultPresentationURL(url.utf8()); | 303 // TODO(mfoltz): Pass all URLs to PresentationService. |
304 presentation_service_->SetDefaultPresentationURL(urls[0].utf8()); | |
297 } | 305 } |
298 | 306 |
299 void PresentationDispatcher::DidCommitProvisionalLoad( | 307 void PresentationDispatcher::DidCommitProvisionalLoad( |
300 bool is_new_navigation, | 308 bool is_new_navigation, |
301 bool is_same_page_navigation) { | 309 bool is_same_page_navigation) { |
302 blink::WebFrame* frame = render_frame()->GetWebFrame(); | 310 blink::WebFrame* frame = render_frame()->GetWebFrame(); |
303 // If not top-level navigation. | 311 // If not top-level navigation. |
304 if (frame->parent() || is_same_page_navigation) | 312 if (frame->parent() || is_same_page_navigation) |
305 return; | 313 return; |
306 | 314 |
(...skipping 12 matching lines...) Expand all Loading... | |
319 auto status_it = availability_status_.find(availability_url); | 327 auto status_it = availability_status_.find(availability_url); |
320 if (status_it == availability_status_.end()) | 328 if (status_it == availability_status_.end()) |
321 return; | 329 return; |
322 AvailabilityStatus* status = status_it->second.get(); | 330 AvailabilityStatus* status = status_it->second.get(); |
323 DCHECK(status); | 331 DCHECK(status); |
324 | 332 |
325 if (status->listening_state == ListeningState::WAITING) | 333 if (status->listening_state == ListeningState::WAITING) |
326 status->listening_state = ListeningState::ACTIVE; | 334 status->listening_state = ListeningState::ACTIVE; |
327 | 335 |
328 for (auto observer : status->availability_observers) | 336 for (auto observer : status->availability_observers) |
329 observer->availabilityChanged(available); | 337 observer->availabilityChanged(available); |
imcheng
2016/07/20 17:20:45
Add a TODO here to pass the availability_url into
| |
330 | 338 |
331 for (AvailabilityCallbacksMap::iterator iter(&status->availability_callbacks); | 339 for (AvailabilityCallbacksMap::iterator iter(&status->availability_callbacks); |
332 !iter.IsAtEnd(); iter.Advance()) { | 340 !iter.IsAtEnd(); iter.Advance()) { |
333 iter.GetCurrentValue()->onSuccess(available); | 341 iter.GetCurrentValue()->onSuccess(available); |
334 } | 342 } |
335 status->last_known_availability = available; | 343 status->last_known_availability = available; |
336 status->availability_callbacks.Clear(); | 344 status->availability_callbacks.Clear(); |
337 UpdateListeningState(status); | 345 UpdateListeningState(status); |
338 } | 346 } |
339 | 347 |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
528 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus( | 536 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus( |
529 const std::string& availability_url) | 537 const std::string& availability_url) |
530 : url(availability_url), | 538 : url(availability_url), |
531 last_known_availability(false), | 539 last_known_availability(false), |
532 listening_state(ListeningState::INACTIVE) {} | 540 listening_state(ListeningState::INACTIVE) {} |
533 | 541 |
534 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() { | 542 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() { |
535 } | 543 } |
536 | 544 |
537 } // namespace content | 545 } // namespace content |
OLD | NEW |