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 5d20a311e0927bab74e7b86d85622fb8f613ee2b..dd5203dce31567a3007fc996485817fb88235e61 100644 |
--- a/content/browser/presentation/presentation_service_impl.cc |
+++ b/content/browser/presentation/presentation_service_impl.cc |
@@ -224,6 +224,13 @@ |
screen_availability_listeners_.erase(listener_it); |
} |
+void PresentationServiceImpl::ListenForDefaultSessionStart( |
+ const DefaultSessionMojoCallback& callback) { |
+ if (!default_session_start_context_.get()) |
+ default_session_start_context_.reset(new DefaultSessionStartContext); |
+ default_session_start_context_->AddCallback(callback); |
+} |
+ |
void PresentationServiceImpl::StartSession( |
const mojo::String& presentation_url, |
const NewSessionMojoCallback& callback) { |
@@ -361,12 +368,11 @@ |
const std::string& new_default_url = url.get(); |
if (default_presentation_url_ == new_default_url) |
return; |
- |
+ delegate_->SetDefaultPresentationUrl( |
+ render_process_id_, |
+ render_frame_id_, |
+ new_default_url); |
default_presentation_url_ = new_default_url; |
- delegate_->SetDefaultPresentationUrl( |
- render_process_id_, render_frame_id_, new_default_url, |
- base::Bind(&PresentationServiceImpl::OnDefaultPresentationStarted, |
- weak_factory_.GetWeakPtr())); |
} |
void PresentationServiceImpl::SendSessionMessage( |
@@ -515,6 +521,8 @@ |
pending_join_session_cbs_.clear(); |
+ default_session_start_context_.reset(); |
+ |
if (on_session_messages_callback_.get()) { |
on_session_messages_callback_->Run( |
mojo::Array<presentation::SessionMessagePtr>()); |
@@ -536,10 +544,9 @@ |
} |
void PresentationServiceImpl::OnDefaultPresentationStarted( |
- const PresentationSessionInfo& session_info) { |
- DCHECK(client_.get()); |
- client_->OnDefaultSessionStarted( |
- presentation::PresentationSessionInfo::From(session_info)); |
+ const PresentationSessionInfo& session) { |
+ if (default_session_start_context_.get()) |
+ default_session_start_context_->set_session(session); |
} |
PresentationServiceImpl::ScreenAvailabilityListenerImpl |
@@ -590,4 +597,45 @@ |
callback_.reset(); |
} |
+PresentationServiceImpl::DefaultSessionStartContext |
+::DefaultSessionStartContext() { |
+} |
+ |
+PresentationServiceImpl::DefaultSessionStartContext |
+::~DefaultSessionStartContext() { |
+ Reset(); |
+} |
+ |
+void PresentationServiceImpl::DefaultSessionStartContext::AddCallback( |
+ const DefaultSessionMojoCallback& callback) { |
+ if (session_.get()) { |
+ DCHECK(callbacks_.empty()); |
+ callback.Run(presentation::PresentationSessionInfo::From(*session_)); |
+ session_.reset(); |
+ } else { |
+ callbacks_.push_back(new DefaultSessionMojoCallback(callback)); |
+ } |
+} |
+ |
+void PresentationServiceImpl::DefaultSessionStartContext::set_session( |
+ const PresentationSessionInfo& session) { |
+ if (callbacks_.empty()) { |
+ session_.reset(new PresentationSessionInfo(session)); |
+ } else { |
+ DCHECK(!session_.get()); |
+ ScopedVector<DefaultSessionMojoCallback> callbacks; |
+ callbacks.swap(callbacks_); |
+ for (const auto& callback : callbacks) |
+ callback->Run(presentation::PresentationSessionInfo::From(session)); |
+ } |
+} |
+ |
+void PresentationServiceImpl::DefaultSessionStartContext::Reset() { |
+ ScopedVector<DefaultSessionMojoCallback> callbacks; |
+ callbacks.swap(callbacks_); |
+ for (const auto& callback : callbacks) |
+ callback->Run(presentation::PresentationSessionInfoPtr()); |
+ session_.reset(); |
+} |
+ |
} // namespace content |