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

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

Issue 2174693004: [Presentation API] Add support to content/ for multiple URLs per PresentationRequest. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 3 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 | « content/renderer/presentation/presentation_dispatcher.h ('k') | content/test/BUILD.gn » ('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 #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
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 std::vector<GURL> urls(presentationUrls.size());
109 std::transform(presentationUrls.begin(), presentationUrls.end(), urls.begin(),
110 [](const blink::WebString& url) { return GURL(url.utf8()); });
111
108 // The dispatcher owns the service so |this| will be valid when 112 // The dispatcher owns the service so |this| will be valid when
109 // OnSessionCreated() is called. |callback| needs to be alive and also needs 113 // OnSessionCreated() is called. |callback| needs to be alive and also needs
110 // to be destroyed so we transfer its ownership to the mojo callback. 114 // to be destroyed so we transfer its ownership to the mojo callback.
111 presentation_service_->StartSession( 115 presentation_service_->StartSession(
112 presentationUrl.utf8(), 116 urls, base::Bind(&PresentationDispatcher::OnSessionCreated,
113 base::Bind(&PresentationDispatcher::OnSessionCreated, 117 base::Unretained(this), base::Owned(callback)));
114 base::Unretained(this),
115 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 std::vector<GURL> urls(presentationUrls.size());
128 std::transform(presentationUrls.begin(), presentationUrls.end(), urls.begin(),
129 [](const blink::WebString& url) { return GURL(url.utf8()); });
130
125 // The dispatcher owns the service so |this| will be valid when 131 // The dispatcher owns the service so |this| will be valid when
126 // OnSessionCreated() is called. |callback| needs to be alive and also needs 132 // OnSessionCreated() is called. |callback| needs to be alive and also needs
127 // to be destroyed so we transfer its ownership to the mojo callback. 133 // to be destroyed so we transfer its ownership to the mojo callback.
128 presentation_service_->JoinSession( 134 presentation_service_->JoinSession(
129 presentationUrl.utf8(), 135 urls, presentationId.utf8(),
130 presentationId.utf8(),
131 base::Bind(&PresentationDispatcher::OnSessionCreated, 136 base::Bind(&PresentationDispatcher::OnSessionCreated,
132 base::Unretained(this), 137 base::Unretained(this), base::Owned(callback)));
133 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) {
140 if (message.utf8().size() > kMaxPresentationSessionMessageSize) { 144 if (message.utf8().size() > kMaxPresentationSessionMessageSize) {
141 // TODO(crbug.com/459008): Limit the size of individual messages to 64k 145 // TODO(crbug.com/459008): Limit the size of individual messages to 64k
142 // for now. Consider throwing DOMException or splitting bigger messages 146 // for now. Consider throwing DOMException or splitting bigger messages
143 // into smaller chunks later. 147 // into smaller chunks later.
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 message_request_queue_.pop(); 223 message_request_queue_.pop();
220 if (!message_request_queue_.empty()) { 224 if (!message_request_queue_.empty()) {
221 DoSendMessage(message_request_queue_.front().get()); 225 DoSendMessage(message_request_queue_.front().get());
222 } 226 }
223 } 227 }
224 228
225 void PresentationDispatcher::closeSession( 229 void PresentationDispatcher::closeSession(
226 const blink::WebString& presentationUrl, 230 const blink::WebString& presentationUrl,
227 const blink::WebString& presentationId) { 231 const blink::WebString& presentationId) {
228 ConnectToPresentationServiceIfNeeded(); 232 ConnectToPresentationServiceIfNeeded();
229 233 presentation_service_->CloseConnection(GURL(presentationUrl.utf8()),
230 presentation_service_->CloseConnection(presentationUrl.utf8(),
231 presentationId.utf8()); 234 presentationId.utf8());
232 } 235 }
233 236
234 void PresentationDispatcher::terminateSession( 237 void PresentationDispatcher::terminateSession(
235 const blink::WebString& presentationUrl, 238 const blink::WebString& presentationUrl,
236 const blink::WebString& presentationId) { 239 const blink::WebString& presentationId) {
237 ConnectToPresentationServiceIfNeeded(); 240 ConnectToPresentationServiceIfNeeded();
238 241 presentation_service_->Terminate(GURL(presentationUrl.utf8()),
239 presentation_service_->Terminate(presentationUrl.utf8(),
240 presentationId.utf8()); 242 presentationId.utf8());
241 } 243 }
242 244
243 void PresentationDispatcher::getAvailability( 245 void PresentationDispatcher::getAvailability(
244 const blink::WebString& availabilityUrl, 246 const blink::WebString& availabilityUrl,
245 blink::WebPresentationAvailabilityCallbacks* callbacks) { 247 blink::WebPresentationAvailabilityCallbacks* callbacks) {
246 const std::string& availability_url = availabilityUrl.utf8(); 248 const std::string& availability_url = availabilityUrl.utf8();
247 AvailabilityStatus* status = nullptr; 249 AvailabilityStatus* status = nullptr;
248 auto status_it = availability_status_.find(availability_url); 250 auto status_it = availability_status_.find(availability_url);
249 if (status_it == availability_status_.end()) { 251 if (status_it == availability_status_.end()) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 auto status_it = availability_status_.find(availability_url); 285 auto status_it = availability_status_.find(availability_url);
284 if (status_it == availability_status_.end()) { 286 if (status_it == availability_status_.end()) {
285 DLOG(WARNING) << "Stop listening for availability for unknown URL " 287 DLOG(WARNING) << "Stop listening for availability for unknown URL "
286 << availability_url; 288 << availability_url;
287 return; 289 return;
288 } 290 }
289 status_it->second->availability_observers.erase(observer); 291 status_it->second->availability_observers.erase(observer);
290 UpdateListeningState(status_it->second.get()); 292 UpdateListeningState(status_it->second.get());
291 } 293 }
292 294
293 void PresentationDispatcher::setDefaultPresentationUrl( 295 void PresentationDispatcher::setDefaultPresentationUrls(
294 const blink::WebString& url) { 296 const blink::WebVector<blink::WebString>& presentationUrls) {
295 ConnectToPresentationServiceIfNeeded(); 297 ConnectToPresentationServiceIfNeeded();
296 presentation_service_->SetDefaultPresentationURL(url.utf8()); 298
299 std::vector<GURL> urls(presentationUrls.size());
300 std::transform(presentationUrls.begin(), presentationUrls.end(), urls.begin(),
301 [](const blink::WebString& url) { return GURL(url.utf8()); });
302 presentation_service_->SetDefaultPresentationUrls(urls);
297 } 303 }
298 304
299 void PresentationDispatcher::DidCommitProvisionalLoad( 305 void PresentationDispatcher::DidCommitProvisionalLoad(
300 bool is_new_navigation, 306 bool is_new_navigation,
301 bool is_same_page_navigation) { 307 bool is_same_page_navigation) {
302 blink::WebFrame* frame = render_frame()->GetWebFrame(); 308 blink::WebFrame* frame = render_frame()->GetWebFrame();
303 // If not top-level navigation. 309 // If not top-level navigation.
304 if (frame->parent() || is_same_page_navigation) 310 if (frame->parent() || is_same_page_navigation)
305 return; 311 return;
306 312
307 // Remove all pending send message requests. 313 // Remove all pending send message requests.
308 MessageRequestQueue empty; 314 MessageRequestQueue empty;
309 std::swap(message_request_queue_, empty); 315 std::swap(message_request_queue_, empty);
310 } 316 }
311 317
312 void PresentationDispatcher::OnDestruct() { 318 void PresentationDispatcher::OnDestruct() {
313 delete this; 319 delete this;
314 } 320 }
315 321
316 void PresentationDispatcher::OnScreenAvailabilityUpdated(const std::string& url, 322 void PresentationDispatcher::OnScreenAvailabilityUpdated(const GURL& url,
317 bool available) { 323 bool available) {
318 auto status_it = availability_status_.find(url); 324 auto status_it = availability_status_.find(url.spec());
319 if (status_it == availability_status_.end()) 325 if (status_it == availability_status_.end())
320 return; 326 return;
321 AvailabilityStatus* status = status_it->second.get(); 327 AvailabilityStatus* status = status_it->second.get();
322 DCHECK(status); 328 DCHECK(status);
323 329
324 if (status->listening_state == ListeningState::WAITING) 330 if (status->listening_state == ListeningState::WAITING)
325 status->listening_state = ListeningState::ACTIVE; 331 status->listening_state = ListeningState::ACTIVE;
326 332
327 for (auto* observer : status->availability_observers) 333 for (auto* observer : status->availability_observers)
328 observer->availabilityChanged(available); 334 observer->availabilityChanged(available);
329 335
330 for (AvailabilityCallbacksMap::iterator iter(&status->availability_callbacks); 336 for (AvailabilityCallbacksMap::iterator iter(&status->availability_callbacks);
331 !iter.IsAtEnd(); iter.Advance()) { 337 !iter.IsAtEnd(); iter.Advance()) {
332 iter.GetCurrentValue()->onSuccess(available); 338 iter.GetCurrentValue()->onSuccess(available);
333 } 339 }
334 status->last_known_availability = available; 340 status->last_known_availability = available;
335 status->availability_callbacks.Clear(); 341 status->availability_callbacks.Clear();
336 UpdateListeningState(status); 342 UpdateListeningState(status);
337 } 343 }
338 344
339 void PresentationDispatcher::OnScreenAvailabilityNotSupported( 345 void PresentationDispatcher::OnScreenAvailabilityNotSupported(const GURL& url) {
340 const std::string& url) { 346 auto status_it = availability_status_.find(url.spec());
341 auto status_it = availability_status_.find(url);
342 if (status_it == availability_status_.end()) 347 if (status_it == availability_status_.end())
343 return; 348 return;
344 AvailabilityStatus* status = status_it->second.get(); 349 AvailabilityStatus* status = status_it->second.get();
345 DCHECK(status); 350 DCHECK(status);
346 DCHECK(status->listening_state == ListeningState::WAITING); 351 DCHECK(status->listening_state == ListeningState::WAITING);
347 352
348 const blink::WebString& not_supported_error = blink::WebString::fromUTF8( 353 const blink::WebString& not_supported_error = blink::WebString::fromUTF8(
349 "getAvailability() isn't supported at the moment. It can be due to " 354 "getAvailability() isn't supported at the moment. It can be due to "
350 "a permanent or temporary system limitation. It is recommended to " 355 "a permanent or temporary system limitation. It is recommended to "
351 "try to blindly start a session in that case."); 356 "try to blindly start a session in that case.");
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 bool should_listen = !status->availability_callbacks.IsEmpty() || 468 bool should_listen = !status->availability_callbacks.IsEmpty() ||
464 !status->availability_observers.empty(); 469 !status->availability_observers.empty();
465 bool is_listening = status->listening_state != ListeningState::INACTIVE; 470 bool is_listening = status->listening_state != ListeningState::INACTIVE;
466 471
467 if (should_listen == is_listening) 472 if (should_listen == is_listening)
468 return; 473 return;
469 474
470 ConnectToPresentationServiceIfNeeded(); 475 ConnectToPresentationServiceIfNeeded();
471 if (should_listen) { 476 if (should_listen) {
472 status->listening_state = ListeningState::WAITING; 477 status->listening_state = ListeningState::WAITING;
473 presentation_service_->ListenForScreenAvailability(status->url); 478 presentation_service_->ListenForScreenAvailability(GURL(status->url));
474 } else { 479 } else {
475 status->listening_state = ListeningState::INACTIVE; 480 status->listening_state = ListeningState::INACTIVE;
476 presentation_service_->StopListeningForScreenAvailability(status->url); 481 presentation_service_->StopListeningForScreenAvailability(
482 GURL(status->url));
477 } 483 }
478 } 484 }
479 485
480 PresentationDispatcher::SendMessageRequest::SendMessageRequest( 486 PresentationDispatcher::SendMessageRequest::SendMessageRequest(
481 blink::mojom::PresentationSessionInfoPtr session_info, 487 blink::mojom::PresentationSessionInfoPtr session_info,
482 blink::mojom::SessionMessagePtr message) 488 blink::mojom::SessionMessagePtr message)
483 : session_info(std::move(session_info)), message(std::move(message)) {} 489 : session_info(std::move(session_info)), message(std::move(message)) {}
484 490
485 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {} 491 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {}
486 492
487 // static 493 // static
488 PresentationDispatcher::SendMessageRequest* 494 PresentationDispatcher::SendMessageRequest*
489 PresentationDispatcher::CreateSendTextMessageRequest( 495 PresentationDispatcher::CreateSendTextMessageRequest(
490 const blink::WebString& presentationUrl, 496 const blink::WebString& presentationUrl,
491 const blink::WebString& presentationId, 497 const blink::WebString& presentationId,
492 const blink::WebString& message) { 498 const blink::WebString& message) {
493 blink::mojom::PresentationSessionInfoPtr session_info = 499 blink::mojom::PresentationSessionInfoPtr session_info =
494 blink::mojom::PresentationSessionInfo::New(); 500 blink::mojom::PresentationSessionInfo::New();
495 session_info->url = presentationUrl.utf8(); 501 session_info->url = GURL(presentationUrl.utf8());
496 session_info->id = presentationId.utf8(); 502 session_info->id = presentationId.utf8();
497 503
498 blink::mojom::SessionMessagePtr session_message = 504 blink::mojom::SessionMessagePtr session_message =
499 blink::mojom::SessionMessage::New(); 505 blink::mojom::SessionMessage::New();
500 session_message->type = blink::mojom::PresentationMessageType::TEXT; 506 session_message->type = blink::mojom::PresentationMessageType::TEXT;
501 session_message->message = message.utf8(); 507 session_message->message = message.utf8();
502 return new SendMessageRequest(std::move(session_info), 508 return new SendMessageRequest(std::move(session_info),
503 std::move(session_message)); 509 std::move(session_message));
504 } 510 }
505 511
506 // static 512 // static
507 PresentationDispatcher::SendMessageRequest* 513 PresentationDispatcher::SendMessageRequest*
508 PresentationDispatcher::CreateSendBinaryMessageRequest( 514 PresentationDispatcher::CreateSendBinaryMessageRequest(
509 const blink::WebString& presentationUrl, 515 const blink::WebString& presentationUrl,
510 const blink::WebString& presentationId, 516 const blink::WebString& presentationId,
511 blink::mojom::PresentationMessageType type, 517 blink::mojom::PresentationMessageType type,
512 const uint8_t* data, 518 const uint8_t* data,
513 size_t length) { 519 size_t length) {
514 blink::mojom::PresentationSessionInfoPtr session_info = 520 blink::mojom::PresentationSessionInfoPtr session_info =
515 blink::mojom::PresentationSessionInfo::New(); 521 blink::mojom::PresentationSessionInfo::New();
516 session_info->url = presentationUrl.utf8(); 522 session_info->url = GURL(presentationUrl.utf8());
517 session_info->id = presentationId.utf8(); 523 session_info->id = presentationId.utf8();
518 524
519 blink::mojom::SessionMessagePtr session_message = 525 blink::mojom::SessionMessagePtr session_message =
520 blink::mojom::SessionMessage::New(); 526 blink::mojom::SessionMessage::New();
521 session_message->type = type; 527 session_message->type = type;
522 session_message->data = std::vector<uint8_t>(data, data + length); 528 session_message->data = std::vector<uint8_t>(data, data + length);
523 return new SendMessageRequest(std::move(session_info), 529 return new SendMessageRequest(std::move(session_info),
524 std::move(session_message)); 530 std::move(session_message));
525 } 531 }
526 532
527 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus( 533 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus(
528 const std::string& availability_url) 534 const std::string& availability_url)
529 : url(availability_url), 535 : url(availability_url),
530 last_known_availability(false), 536 last_known_availability(false),
531 listening_state(ListeningState::INACTIVE) {} 537 listening_state(ListeningState::INACTIVE) {}
532 538
533 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() { 539 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() {
534 } 540 }
535 541
536 } // namespace content 542 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/presentation/presentation_dispatcher.h ('k') | content/test/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698