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

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

Issue 1224953002: [PresentationAPI] Ensures only one pending message callback at a time if a frame created multiple s… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cl format Created 5 years, 5 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') | no next file » | 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 <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 76
77 } // namespace 77 } // namespace
78 78
79 namespace content { 79 namespace content {
80 80
81 PresentationDispatcher::PresentationDispatcher(RenderFrame* render_frame) 81 PresentationDispatcher::PresentationDispatcher(RenderFrame* render_frame)
82 : RenderFrameObserver(render_frame), 82 : RenderFrameObserver(render_frame),
83 controller_(nullptr), 83 controller_(nullptr),
84 binding_(this), 84 binding_(this),
85 listening_state_(ListeningState::Inactive), 85 listening_state_(ListeningState::Inactive),
86 last_known_availability_(false) { 86 last_known_availability_(false),
87 listening_for_messages_(false) {
87 } 88 }
88 89
89 PresentationDispatcher::~PresentationDispatcher() { 90 PresentationDispatcher::~PresentationDispatcher() {
90 // Controller should be destroyed before the dispatcher when frame is 91 // Controller should be destroyed before the dispatcher when frame is
91 // destroyed. 92 // destroyed.
92 DCHECK(!controller_); 93 DCHECK(!controller_);
93 } 94 }
94 95
95 void PresentationDispatcher::setController( 96 void PresentationDispatcher::setController(
96 blink::WebPresentationController* controller) { 97 blink::WebPresentationController* controller) {
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 bool is_new_navigation, 331 bool is_new_navigation,
331 bool is_same_page_navigation) { 332 bool is_same_page_navigation) {
332 blink::WebFrame* frame = render_frame()->GetWebFrame(); 333 blink::WebFrame* frame = render_frame()->GetWebFrame();
333 // If not top-level navigation. 334 // If not top-level navigation.
334 if (frame->parent() || is_same_page_navigation) 335 if (frame->parent() || is_same_page_navigation)
335 return; 336 return;
336 337
337 // Remove all pending send message requests. 338 // Remove all pending send message requests.
338 MessageRequestQueue empty; 339 MessageRequestQueue empty;
339 std::swap(message_request_queue_, empty); 340 std::swap(message_request_queue_, empty);
341
342 listening_for_messages_ = false;
340 } 343 }
341 344
342 void PresentationDispatcher::OnScreenAvailabilityUpdated(bool available) { 345 void PresentationDispatcher::OnScreenAvailabilityUpdated(bool available) {
343 last_known_availability_ = available; 346 last_known_availability_ = available;
344 347
345 if (listening_state_ == ListeningState::Waiting) 348 if (listening_state_ == ListeningState::Waiting)
346 listening_state_ = ListeningState::Active; 349 listening_state_ = ListeningState::Active;
347 350
348 for (auto observer : availability_observers_) 351 for (auto observer : availability_observers_)
349 observer->availabilityChanged(available); 352 observer->availabilityChanged(available);
(...skipping 13 matching lines...) Expand all
363 return; 366 return;
364 367
365 // Reset the callback to get the next event. 368 // Reset the callback to get the next event.
366 presentation_service_->ListenForDefaultSessionStart(base::Bind( 369 presentation_service_->ListenForDefaultSessionStart(base::Bind(
367 &PresentationDispatcher::OnDefaultSessionStarted, 370 &PresentationDispatcher::OnDefaultSessionStarted,
368 base::Unretained(this))); 371 base::Unretained(this)));
369 372
370 if (!session_info.is_null()) { 373 if (!session_info.is_null()) {
371 controller_->didStartDefaultSession( 374 controller_->didStartDefaultSession(
372 new PresentationSessionClient(session_info.Pass())); 375 new PresentationSessionClient(session_info.Pass()));
376 StartListenForMessages();
373 } 377 }
374 } 378 }
375 379
376 void PresentationDispatcher::OnSessionCreated( 380 void PresentationDispatcher::OnSessionCreated(
377 blink::WebPresentationSessionClientCallbacks* callback, 381 blink::WebPresentationSessionClientCallbacks* callback,
378 presentation::PresentationSessionInfoPtr session_info, 382 presentation::PresentationSessionInfoPtr session_info,
379 presentation::PresentationErrorPtr error) { 383 presentation::PresentationErrorPtr error) {
380 DCHECK(callback); 384 DCHECK(callback);
381 if (!error.is_null()) { 385 if (!error.is_null()) {
382 DCHECK(session_info.is_null()); 386 DCHECK(session_info.is_null());
383 callback->onError(new blink::WebPresentationError( 387 callback->onError(new blink::WebPresentationError(
384 GetWebPresentationErrorTypeFromMojo(error->error_type), 388 GetWebPresentationErrorTypeFromMojo(error->error_type),
385 blink::WebString::fromUTF8(error->message))); 389 blink::WebString::fromUTF8(error->message)));
386 return; 390 return;
387 } 391 }
388 392
389 DCHECK(!session_info.is_null()); 393 DCHECK(!session_info.is_null());
390 callback->onSuccess(new PresentationSessionClient(session_info.Pass())); 394 callback->onSuccess(new PresentationSessionClient(session_info.Pass()));
395 StartListenForMessages();
396 }
397
398 void PresentationDispatcher::StartListenForMessages() {
399 if (listening_for_messages_)
400 return;
401
402 listening_for_messages_ = true;
391 presentation_service_->ListenForSessionMessages( 403 presentation_service_->ListenForSessionMessages(
392 base::Bind(&PresentationDispatcher::OnSessionMessagesReceived, 404 base::Bind(&PresentationDispatcher::OnSessionMessagesReceived,
393 base::Unretained(this))); 405 base::Unretained(this)));
394 } 406 }
395 407
396 void PresentationDispatcher::OnSessionStateChange( 408 void PresentationDispatcher::OnSessionStateChange(
397 presentation::PresentationSessionInfoPtr session_info, 409 presentation::PresentationSessionInfoPtr session_info,
398 presentation::PresentationSessionState session_state) { 410 presentation::PresentationSessionState session_state) {
399 if (!controller_) 411 if (!controller_)
400 return; 412 return;
401 413
402 presentation_service_->ListenForSessionStateChange(base::Bind( 414 presentation_service_->ListenForSessionStateChange(base::Bind(
403 &PresentationDispatcher::OnSessionStateChange, 415 &PresentationDispatcher::OnSessionStateChange,
404 base::Unretained(this))); 416 base::Unretained(this)));
405 417
406 DCHECK(!session_info.is_null()); 418 DCHECK(!session_info.is_null());
407 controller_->didChangeSessionState( 419 controller_->didChangeSessionState(
408 new PresentationSessionClient(session_info.Pass()), 420 new PresentationSessionClient(session_info.Pass()),
409 GetWebPresentationSessionStateFromMojo(session_state)); 421 GetWebPresentationSessionStateFromMojo(session_state));
410 } 422 }
411 423
412 void PresentationDispatcher::OnSessionMessagesReceived( 424 void PresentationDispatcher::OnSessionMessagesReceived(
413 mojo::Array<presentation::SessionMessagePtr> messages) { 425 mojo::Array<presentation::SessionMessagePtr> messages) {
426 if (!listening_for_messages_)
Kevin M 2015/07/08 20:16:08 Add a LOG/DLOG here to call our attention to stran
haibinlu 2015/07/08 20:47:41 added comments. this may happen. frame navigated,
427 return;
428
414 // When messages is null, there is an error at presentation service side. 429 // When messages is null, there is an error at presentation service side.
415 if (!controller_ || messages.is_null()) 430 if (!controller_ || messages.is_null()) {
431 listening_for_messages_ = false;
Kevin M 2015/07/08 20:16:07 LOG?
haibinlu 2015/07/08 20:47:41 null message is expected to indicate messaging err
416 return; 432 return;
433 }
417 434
418 for (size_t i = 0; i < messages.size(); ++i) { 435 for (size_t i = 0; i < messages.size(); ++i) {
419 if (messages[i]->type == 436 if (messages[i]->type ==
420 presentation::PresentationMessageType::PRESENTATION_MESSAGE_TYPE_TEXT) { 437 presentation::PresentationMessageType::PRESENTATION_MESSAGE_TYPE_TEXT) {
421 controller_->didReceiveSessionTextMessage( 438 controller_->didReceiveSessionTextMessage(
422 new PresentationSessionClient(messages[i]->presentation_url, 439 new PresentationSessionClient(messages[i]->presentation_url,
423 messages[i]->presentation_id), 440 messages[i]->presentation_id),
424 blink::WebString::fromUTF8(messages[i]->message)); 441 blink::WebString::fromUTF8(messages[i]->message));
425 } else { 442 } else {
426 // TODO(haibinlu): handle binary message 443 // TODO(haibinlu): handle binary message
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 if (should_listen) { 482 if (should_listen) {
466 listening_state_ = ListeningState::Waiting; 483 listening_state_ = ListeningState::Waiting;
467 presentation_service_->ListenForScreenAvailability(); 484 presentation_service_->ListenForScreenAvailability();
468 } else { 485 } else {
469 listening_state_ = ListeningState::Inactive; 486 listening_state_ = ListeningState::Inactive;
470 presentation_service_->StopListeningForScreenAvailability(); 487 presentation_service_->StopListeningForScreenAvailability();
471 } 488 }
472 } 489 }
473 490
474 } // namespace content 491 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/presentation/presentation_dispatcher.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698