Index: content/browser/presentation/presentation_service_impl.cc |
diff --git a/content/browser/presentation/presentation_service_impl.cc b/content/browser/presentation/presentation_service_impl.cc |
index 2d2a52c5dd309772f8dedb6951f286b3336c35aa..f0f2e0a2238db679a84e9fcd0a6f9584c24c7945 100644 |
--- a/content/browser/presentation/presentation_service_impl.cc |
+++ b/content/browser/presentation/presentation_service_impl.cc |
@@ -25,6 +25,7 @@ PresentationServiceImpl::PresentationServiceImpl( |
: WebContentsObserver(web_contents), |
render_frame_host_(render_frame_host), |
delegate_(delegate), |
+ next_request_session_id_(0), |
weak_factory_(this) { |
DCHECK(render_frame_host_); |
DCHECK(web_contents); |
@@ -133,10 +134,7 @@ void PresentationServiceImpl::StartSession( |
const NewSessionMojoCallback& callback) { |
DVLOG(2) << "StartSession"; |
if (!delegate_) { |
- callback.Run( |
- presentation::PresentationSessionInfoPtr(), |
- presentation::PresentationError::From( |
- PresentationError(PRESENTATION_ERROR_UNKNOWN, ""))); |
+ InvokeNewSessionMojoCallbackWithError(callback); |
return; |
} |
@@ -152,23 +150,22 @@ void PresentationServiceImpl::JoinSession( |
const NewSessionMojoCallback& callback) { |
DVLOG(2) << "JoinSession"; |
if (!delegate_) { |
- callback.Run( |
- presentation::PresentationSessionInfoPtr(), |
- presentation::PresentationError::From( |
- PresentationError(PRESENTATION_ERROR_UNKNOWN, ""))); |
+ InvokeNewSessionMojoCallbackWithError(callback); |
return; |
} |
+ ++next_request_session_id_; |
+ pending_session_cbs_[next_request_session_id_].reset( |
+ new NewSessionMojoCallback(callback)); |
delegate_->JoinSession( |
render_frame_host_->GetProcess()->GetID(), |
render_frame_host_->GetRoutingID(), |
presentation_url, |
presentation_id, |
- // TODO(imcheng): These callbacks may be dropped. http://crbug.com/468575 |
base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionSucceeded, |
- weak_factory_.GetWeakPtr(), false, callback), |
+ weak_factory_.GetWeakPtr(), false, next_request_session_id_), |
base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionError, |
- weak_factory_.GetWeakPtr(), false, callback)); |
+ weak_factory_.GetWeakPtr(), false, next_request_session_id_)); |
} |
void PresentationServiceImpl::HandleQueuedStartSessionRequests() { |
@@ -187,23 +184,26 @@ void PresentationServiceImpl::DoStartSession( |
const std::string& presentation_url, |
const std::string& presentation_id, |
const NewSessionMojoCallback& callback) { |
+ ++next_request_session_id_; |
whywhat
2015/03/25 17:05:54
I'd encapsulate this logic into something like:
i
imcheng
2015/03/25 23:03:42
Done.
|
+ pending_session_cbs_[next_request_session_id_].reset( |
+ new NewSessionMojoCallback(callback)); |
delegate_->StartSession( |
render_frame_host_->GetProcess()->GetID(), |
render_frame_host_->GetRoutingID(), |
presentation_url, |
presentation_id, |
- // TODO(imcheng): These callbacks may be dropped. http://crbug.com/468575 |
base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionSucceeded, |
- weak_factory_.GetWeakPtr(), true, callback), |
+ weak_factory_.GetWeakPtr(), true, next_request_session_id_), |
base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionError, |
- weak_factory_.GetWeakPtr(), true, callback)); |
+ weak_factory_.GetWeakPtr(), true, next_request_session_id_)); |
} |
void PresentationServiceImpl::OnStartOrJoinSessionSucceeded( |
bool is_start_session, |
- const NewSessionMojoCallback& callback, |
+ int request_session_id, |
const PresentationSessionInfo& session_info) { |
- callback.Run( |
+ RunAndEraseNewMojoCallback( |
+ request_session_id, |
presentation::PresentationSessionInfo::From(session_info), |
presentation::PresentationErrorPtr()); |
if (is_start_session) |
@@ -212,15 +212,29 @@ void PresentationServiceImpl::OnStartOrJoinSessionSucceeded( |
void PresentationServiceImpl::OnStartOrJoinSessionError( |
bool is_start_session, |
- const NewSessionMojoCallback& callback, |
+ int request_session_id, |
const PresentationError& error) { |
- callback.Run( |
+ RunAndEraseNewMojoCallback( |
+ request_session_id, |
presentation::PresentationSessionInfoPtr(), |
presentation::PresentationError::From(error)); |
if (is_start_session) |
HandleQueuedStartSessionRequests(); |
} |
+void PresentationServiceImpl::RunAndEraseNewMojoCallback( |
+ int request_session_id, |
+ presentation::PresentationSessionInfoPtr session, |
+ presentation::PresentationErrorPtr error) { |
+ auto it = pending_session_cbs_.find(request_session_id); |
+ if (it == pending_session_cbs_.end()) |
+ return; |
+ |
+ DCHECK(it->second.get()); |
+ it->second->Run(session.Pass(), error.Pass()); |
+ pending_session_cbs_.erase(it); |
+} |
+ |
void PresentationServiceImpl::DoSetDefaultPresentationUrl( |
const std::string& default_presentation_url, |
const std::string& default_presentation_id) { |
@@ -327,12 +341,26 @@ void PresentationServiceImpl::Reset() { |
default_presentation_url_.clear(); |
default_presentation_id_.clear(); |
- for (const auto& context : availability_contexts_) { |
- context.second->OnScreenAvailabilityChanged(false); |
+ for (const auto& context_entry : availability_contexts_) { |
+ context_entry.second->OnScreenAvailabilityChanged(false); |
} |
availability_contexts_.clear(); |
- // TODO(imcheng): This may drop callbacks. See http://crbug.com/468575. |
+ for (auto& request_ptr : queued_start_session_requests_) { |
+ InvokeNewSessionMojoCallbackWithError(request_ptr->callback); |
+ } |
queued_start_session_requests_.clear(); |
+ for (auto& pending_entry : pending_session_cbs_) { |
+ InvokeNewSessionMojoCallbackWithError(*pending_entry.second); |
+ } |
+ pending_session_cbs_.clear(); |
+} |
+ |
+void PresentationServiceImpl::InvokeNewSessionMojoCallbackWithError( |
+ const NewSessionMojoCallback& callback) { |
+ callback.Run( |
+ presentation::PresentationSessionInfoPtr(), |
+ presentation::PresentationError::From( |
+ PresentationError(PRESENTATION_ERROR_UNKNOWN, "Internal error"))); |
} |
void PresentationServiceImpl::OnDelegateDestroyed() { |