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

Side by Side Diff: content/browser/presentation/presentation_service_impl.cc

Issue 2653683006: [Presentation API] Fix race condition in which state change is lost. (Closed)
Patch Set: 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
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/browser/presentation/presentation_service_impl.h" 5 #include "content/browser/presentation/presentation_service_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <algorithm> 9 #include <algorithm>
10 #include <utility> 10 #include <utility>
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 const NewSessionCallback& callback) { 286 const NewSessionCallback& callback) {
287 if (pending_join_session_cbs_.size() >= kMaxNumQueuedSessionRequests) 287 if (pending_join_session_cbs_.size() >= kMaxNumQueuedSessionRequests)
288 return kInvalidRequestSessionId; 288 return kInvalidRequestSessionId;
289 289
290 int request_id = GetNextRequestSessionId(); 290 int request_id = GetNextRequestSessionId();
291 pending_join_session_cbs_[request_id].reset( 291 pending_join_session_cbs_[request_id].reset(
292 new NewSessionCallbackWrapper(callback)); 292 new NewSessionCallbackWrapper(callback));
293 return request_id; 293 return request_id;
294 } 294 }
295 295
296 void PresentationServiceImpl::ListenForConnectionStateChangeAndChangeState( 296 void PresentationServiceImpl::ListenForConnectionStateChange(
297 const PresentationSessionInfo& connection) { 297 const PresentationSessionInfo& connection) {
298 // NOTE: Blink will automatically transition the connection's state to
299 // 'connected'.
298 if (controller_delegate_) { 300 if (controller_delegate_) {
299 controller_delegate_->ListenForConnectionStateChange( 301 controller_delegate_->ListenForConnectionStateChange(
300 render_process_id_, render_frame_id_, connection, 302 render_process_id_, render_frame_id_, connection,
301 base::Bind(&PresentationServiceImpl::OnConnectionStateChanged, 303 base::Bind(&PresentationServiceImpl::OnConnectionStateChanged,
302 weak_factory_.GetWeakPtr(), connection)); 304 weak_factory_.GetWeakPtr(), connection));
303 OnConnectionStateChanged(connection,
304 PresentationConnectionStateChangeInfo(
305 PRESENTATION_CONNECTION_STATE_CONNECTED));
306 } 305 }
307 } 306 }
308 307
309 void PresentationServiceImpl::OnStartSessionSucceeded( 308 void PresentationServiceImpl::OnStartSessionSucceeded(
310 int request_session_id, 309 int request_session_id,
311 const PresentationSessionInfo& session_info) { 310 const PresentationSessionInfo& session_info) {
312 if (request_session_id != start_session_request_id_) 311 if (request_session_id != start_session_request_id_)
313 return; 312 return;
314 313
315 CHECK(pending_start_session_cb_.get()); 314 CHECK(pending_start_session_cb_.get());
316 pending_start_session_cb_->Run( 315 pending_start_session_cb_->Run(
317 blink::mojom::PresentationSessionInfo::From(session_info), 316 blink::mojom::PresentationSessionInfo::From(session_info),
318 blink::mojom::PresentationErrorPtr()); 317 blink::mojom::PresentationErrorPtr());
319 ListenForConnectionStateChangeAndChangeState(session_info); 318 ListenForConnectionStateChange(session_info);
320 pending_start_session_cb_.reset(); 319 pending_start_session_cb_.reset();
321 start_session_request_id_ = kInvalidRequestSessionId; 320 start_session_request_id_ = kInvalidRequestSessionId;
322 } 321 }
323 322
324 void PresentationServiceImpl::OnStartSessionError( 323 void PresentationServiceImpl::OnStartSessionError(
325 int request_session_id, 324 int request_session_id,
326 const PresentationError& error) { 325 const PresentationError& error) {
327 if (request_session_id != start_session_request_id_) 326 if (request_session_id != start_session_request_id_)
328 return; 327 return;
329 328
330 CHECK(pending_start_session_cb_.get()); 329 CHECK(pending_start_session_cb_.get());
331 pending_start_session_cb_->Run(blink::mojom::PresentationSessionInfoPtr(), 330 pending_start_session_cb_->Run(blink::mojom::PresentationSessionInfoPtr(),
332 blink::mojom::PresentationError::From(error)); 331 blink::mojom::PresentationError::From(error));
333 pending_start_session_cb_.reset(); 332 pending_start_session_cb_.reset();
334 start_session_request_id_ = kInvalidRequestSessionId; 333 start_session_request_id_ = kInvalidRequestSessionId;
335 } 334 }
336 335
337 void PresentationServiceImpl::OnJoinSessionSucceeded( 336 void PresentationServiceImpl::OnJoinSessionSucceeded(
338 int request_session_id, 337 int request_session_id,
339 const PresentationSessionInfo& session_info) { 338 const PresentationSessionInfo& session_info) {
340 if (RunAndEraseJoinSessionMojoCallback( 339 if (RunAndEraseJoinSessionMojoCallback(
341 request_session_id, 340 request_session_id,
342 blink::mojom::PresentationSessionInfo::From(session_info), 341 blink::mojom::PresentationSessionInfo::From(session_info),
343 blink::mojom::PresentationErrorPtr())) { 342 blink::mojom::PresentationErrorPtr())) {
344 ListenForConnectionStateChangeAndChangeState(session_info); 343 ListenForConnectionStateChange(session_info);
345 } 344 }
346 } 345 }
347 346
348 void PresentationServiceImpl::OnJoinSessionError( 347 void PresentationServiceImpl::OnJoinSessionError(
349 int request_session_id, 348 int request_session_id,
350 const PresentationError& error) { 349 const PresentationError& error) {
351 RunAndEraseJoinSessionMojoCallback( 350 RunAndEraseJoinSessionMojoCallback(
352 request_session_id, blink::mojom::PresentationSessionInfoPtr(), 351 request_session_id, blink::mojom::PresentationSessionInfoPtr(),
353 blink::mojom::PresentationError::From(error)); 352 blink::mojom::PresentationError::From(error));
354 } 353 }
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 controller_delegate_ = nullptr; 606 controller_delegate_ = nullptr;
608 receiver_delegate_ = nullptr; 607 receiver_delegate_ = nullptr;
609 Reset(); 608 Reset();
610 } 609 }
611 610
612 void PresentationServiceImpl::OnDefaultPresentationStarted( 611 void PresentationServiceImpl::OnDefaultPresentationStarted(
613 const PresentationSessionInfo& connection) { 612 const PresentationSessionInfo& connection) {
614 DCHECK(client_.get()); 613 DCHECK(client_.get());
615 client_->OnDefaultSessionStarted( 614 client_->OnDefaultSessionStarted(
616 blink::mojom::PresentationSessionInfo::From(connection)); 615 blink::mojom::PresentationSessionInfo::From(connection));
617 ListenForConnectionStateChangeAndChangeState(connection); 616 ListenForConnectionStateChange(connection);
618 } 617 }
619 618
620 PresentationServiceImpl::ScreenAvailabilityListenerImpl:: 619 PresentationServiceImpl::ScreenAvailabilityListenerImpl::
621 ScreenAvailabilityListenerImpl(const GURL& availability_url, 620 ScreenAvailabilityListenerImpl(const GURL& availability_url,
622 PresentationServiceImpl* service) 621 PresentationServiceImpl* service)
623 : availability_url_(availability_url), service_(service) { 622 : availability_url_(availability_url), service_(service) {
624 DCHECK(service_); 623 DCHECK(service_);
625 DCHECK(service_->client_.get()); 624 DCHECK(service_->client_.get());
626 } 625 }
627 626
(...skipping 29 matching lines...) Expand all
657 656
658 void PresentationServiceImpl::NewSessionCallbackWrapper::Run( 657 void PresentationServiceImpl::NewSessionCallbackWrapper::Run(
659 blink::mojom::PresentationSessionInfoPtr session, 658 blink::mojom::PresentationSessionInfoPtr session,
660 blink::mojom::PresentationErrorPtr error) { 659 blink::mojom::PresentationErrorPtr error) {
661 DCHECK(!callback_.is_null()); 660 DCHECK(!callback_.is_null());
662 callback_.Run(std::move(session), std::move(error)); 661 callback_.Run(std::move(session), std::move(error));
663 callback_.Reset(); 662 callback_.Reset();
664 } 663 }
665 664
666 } // namespace content 665 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698