| Index: content/renderer/presentation/presentation_dispatcher.cc
|
| diff --git a/content/renderer/presentation/presentation_dispatcher.cc b/content/renderer/presentation/presentation_dispatcher.cc
|
| index 24d4dcb7b2a85484eaeaff1910e9873672306a49..3e318961cf73a00faf8444f8202f96b707b5287d 100644
|
| --- a/content/renderer/presentation/presentation_dispatcher.cc
|
| +++ b/content/renderer/presentation/presentation_dispatcher.cc
|
| @@ -83,7 +83,8 @@ PresentationDispatcher::PresentationDispatcher(RenderFrame* render_frame)
|
| controller_(nullptr),
|
| binding_(this),
|
| listening_state_(ListeningState::Inactive),
|
| - last_known_availability_(false) {
|
| + last_known_availability_(false),
|
| + listening_for_messages_(false) {
|
| }
|
|
|
| PresentationDispatcher::~PresentationDispatcher() {
|
| @@ -342,6 +343,8 @@ void PresentationDispatcher::DidCommitProvisionalLoad(
|
| // Remove all pending send message requests.
|
| MessageRequestQueue empty;
|
| std::swap(message_request_queue_, empty);
|
| +
|
| + listening_for_messages_ = false;
|
| }
|
|
|
| void PresentationDispatcher::OnScreenAvailabilityUpdated(bool available) {
|
| @@ -395,6 +398,7 @@ void PresentationDispatcher::OnDefaultSessionStarted(
|
| if (!session_info.is_null()) {
|
| controller_->didStartDefaultSession(
|
| new PresentationSessionClient(session_info.Pass()));
|
| + StartListenForMessages();
|
| }
|
| }
|
|
|
| @@ -413,6 +417,14 @@ void PresentationDispatcher::OnSessionCreated(
|
|
|
| DCHECK(!session_info.is_null());
|
| callback->onSuccess(new PresentationSessionClient(session_info.Pass()));
|
| + StartListenForMessages();
|
| +}
|
| +
|
| +void PresentationDispatcher::StartListenForMessages() {
|
| + if (listening_for_messages_)
|
| + return;
|
| +
|
| + listening_for_messages_ = true;
|
| presentation_service_->ListenForSessionMessages(
|
| base::Bind(&PresentationDispatcher::OnSessionMessagesReceived,
|
| base::Unretained(this)));
|
| @@ -432,9 +444,14 @@ void PresentationDispatcher::OnSessionStateChanged(
|
|
|
| void PresentationDispatcher::OnSessionMessagesReceived(
|
| mojo::Array<presentation::SessionMessagePtr> messages) {
|
| + if (!listening_for_messages_)
|
| + return; // messages may come after the frame navigated.
|
| +
|
| // When messages is null, there is an error at presentation service side.
|
| - if (!controller_ || messages.is_null())
|
| + if (!controller_ || messages.is_null()) {
|
| + listening_for_messages_ = false;
|
| return;
|
| + }
|
|
|
| for (size_t i = 0; i < messages.size(); ++i) {
|
| if (messages[i]->type ==
|
|
|