| 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 2d6769e0f102397ace4313ab131c28f4e247d1b9..e22e9149eb2e86ce40775bb7405deac5c7bfea83 100644
|
| --- a/content/browser/presentation/presentation_service_impl.cc
|
| +++ b/content/browser/presentation/presentation_service_impl.cc
|
| @@ -23,23 +23,24 @@ PresentationServiceImpl::PresentationServiceImpl(
|
| WebContents* web_contents,
|
| PresentationServiceDelegate* delegate)
|
| : WebContentsObserver(web_contents),
|
| - render_frame_host_(render_frame_host),
|
| delegate_(delegate),
|
| is_start_session_pending_(false),
|
| next_request_session_id_(0),
|
| weak_factory_(this) {
|
| - DCHECK(render_frame_host_);
|
| + DCHECK(render_frame_host);
|
| DCHECK(web_contents);
|
| +
|
| + render_process_id_ = render_frame_host->GetProcess()->GetID();
|
| + render_frame_id_ = render_frame_host->GetRoutingID();
|
| DVLOG(2) << "PresentationServiceImpl: "
|
| - << render_frame_host_->GetProcess()->GetID() << ", "
|
| - << render_frame_host_->GetRoutingID();
|
| + << render_process_id_ << ", " << render_frame_id_;
|
| if (delegate_)
|
| - delegate_->AddObserver(this);
|
| + delegate_->AddObserver(render_process_id_, render_frame_id_, this);
|
| }
|
|
|
| PresentationServiceImpl::~PresentationServiceImpl() {
|
| if (delegate_)
|
| - delegate_->RemoveObserver(this);
|
| + delegate_->RemoveObserver(render_process_id_, render_frame_id_);
|
| FlushNewSessionCallbacks();
|
| }
|
|
|
| @@ -83,9 +84,7 @@ PresentationServiceImpl::GetOrCreateAvailabilityContext(
|
| linked_ptr<ScreenAvailabilityContext> context(
|
| new ScreenAvailabilityContext(presentation_url));
|
| if (!delegate_->AddScreenAvailabilityListener(
|
| - render_frame_host_->GetProcess()->GetID(),
|
| - render_frame_host_->GetRoutingID(),
|
| - context.get())) {
|
| + render_process_id_, render_frame_id_, context.get())) {
|
| DVLOG(1) << "AddScreenAvailabilityListener failed. Ignoring request.";
|
| return nullptr;
|
| }
|
| @@ -125,9 +124,7 @@ void PresentationServiceImpl::RemoveScreenAvailabilityListener(
|
| return;
|
|
|
| delegate_->RemoveScreenAvailabilityListener(
|
| - render_frame_host_->GetProcess()->GetID(),
|
| - render_frame_host_->GetRoutingID(),
|
| - it->second.get());
|
| + render_process_id_, render_frame_id_, it->second.get());
|
| // Resolve the context's pending callbacks before removing it.
|
| it->second->OnScreenAvailabilityChanged(false);
|
| availability_contexts_.erase(it);
|
| @@ -135,7 +132,9 @@ void PresentationServiceImpl::RemoveScreenAvailabilityListener(
|
|
|
| void PresentationServiceImpl::ListenForDefaultSessionStart(
|
| const DefaultSessionMojoCallback& callback) {
|
| - NOTIMPLEMENTED();
|
| + if (!default_session_start_context_.get())
|
| + default_session_start_context_.reset(new DefaultSessionStartContext);
|
| + default_session_start_context_->AddCallback(callback);
|
| }
|
|
|
| void PresentationServiceImpl::StartSession(
|
| @@ -169,8 +168,8 @@ void PresentationServiceImpl::JoinSession(
|
|
|
| int request_session_id = RegisterNewSessionCallback(callback);
|
| delegate_->JoinSession(
|
| - render_frame_host_->GetProcess()->GetID(),
|
| - render_frame_host_->GetRoutingID(),
|
| + render_process_id_,
|
| + render_frame_id_,
|
| presentation_url,
|
| presentation_id,
|
| base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionSucceeded,
|
| @@ -214,8 +213,8 @@ void PresentationServiceImpl::DoStartSession(
|
| int request_session_id = RegisterNewSessionCallback(callback);
|
| is_start_session_pending_ = true;
|
| delegate_->StartSession(
|
| - render_frame_host_->GetProcess()->GetID(),
|
| - render_frame_host_->GetRoutingID(),
|
| + render_process_id_,
|
| + render_frame_id_,
|
| presentation_url,
|
| presentation_id,
|
| base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionSucceeded,
|
| @@ -266,8 +265,8 @@ void PresentationServiceImpl::DoSetDefaultPresentationUrl(
|
| const std::string& default_presentation_id) {
|
| DCHECK(delegate_);
|
| delegate_->SetDefaultPresentationUrl(
|
| - render_frame_host_->GetProcess()->GetID(),
|
| - render_frame_host_->GetRoutingID(),
|
| + render_process_id_,
|
| + render_frame_id_,
|
| default_presentation_url,
|
| default_presentation_id);
|
| default_presentation_url_ = default_presentation_url;
|
| @@ -307,8 +306,8 @@ void PresentationServiceImpl::SetDefaultPresentationURL(
|
|
|
| // Remove listener for old default presentation URL.
|
| delegate_->RemoveScreenAvailabilityListener(
|
| - render_frame_host_->GetProcess()->GetID(),
|
| - render_frame_host_->GetRoutingID(),
|
| + render_process_id_,
|
| + render_frame_id_,
|
| old_it->second.get());
|
| availability_contexts_.erase(old_it);
|
| DoSetDefaultPresentationUrl(new_default_url, default_presentation_id);
|
| @@ -325,12 +324,21 @@ void PresentationServiceImpl::ListenForSessionStateChange(
|
| NOTIMPLEMENTED();
|
| }
|
|
|
| +bool PresentationServiceImpl::FrameMatches(
|
| + content::RenderFrameHost* render_frame_host) const {
|
| + if (!render_frame_host)
|
| + return false;
|
| +
|
| + return render_frame_host->GetProcess()->GetID() == render_process_id_ &&
|
| + render_frame_host->GetRoutingID() == render_frame_id_;
|
| +}
|
| +
|
| void PresentationServiceImpl::DidNavigateAnyFrame(
|
| content::RenderFrameHost* render_frame_host,
|
| const content::LoadCommittedDetails& details,
|
| const content::FrameNavigateParams& params) {
|
| DVLOG(2) << "PresentationServiceImpl::DidNavigateAnyFrame";
|
| - if (render_frame_host_ != render_frame_host)
|
| + if (!FrameMatches(render_frame_host))
|
| return;
|
|
|
| std::string prev_url_host = details.previous_url.host();
|
| @@ -355,29 +363,26 @@ void PresentationServiceImpl::DidNavigateAnyFrame(
|
| void PresentationServiceImpl::RenderFrameDeleted(
|
| content::RenderFrameHost* render_frame_host) {
|
| DVLOG(2) << "PresentationServiceImpl::RenderFrameDeleted";
|
| - if (render_frame_host_ != render_frame_host)
|
| + if (!FrameMatches(render_frame_host))
|
| return;
|
|
|
| - // RenderFrameDeleted means |render_frame_host_| is going to be deleted soon.
|
| + // RenderFrameDeleted means the associated RFH is going to be deleted soon.
|
| // This object should also be deleted.
|
| Reset();
|
| - render_frame_host_ = nullptr;
|
| delete this;
|
| }
|
|
|
| void PresentationServiceImpl::Reset() {
|
| DVLOG(2) << "PresentationServiceImpl::Reset";
|
| - if (delegate_) {
|
| - delegate_->Reset(
|
| - render_frame_host_->GetProcess()->GetID(),
|
| - render_frame_host_->GetRoutingID());
|
| - }
|
| + if (delegate_)
|
| + delegate_->Reset(render_process_id_, render_frame_id_);
|
|
|
| default_presentation_url_.clear();
|
| default_presentation_id_.clear();
|
| availability_contexts_.clear();
|
| queued_start_session_requests_.clear();
|
| FlushNewSessionCallbacks();
|
| + default_session_start_context_.reset();
|
| }
|
|
|
| // static
|
| @@ -395,6 +400,12 @@ void PresentationServiceImpl::OnDelegateDestroyed() {
|
| Reset();
|
| }
|
|
|
| +void PresentationServiceImpl::OnDefaultPresentationStarted(
|
| + const PresentationSessionInfo& session) {
|
| + if (default_session_start_context_.get())
|
| + default_session_start_context_->set_session(session);
|
| +}
|
| +
|
| PresentationServiceImpl::ScreenAvailabilityContext::ScreenAvailabilityContext(
|
| const std::string& presentation_url)
|
| : presentation_url_(presentation_url) {
|
| @@ -478,5 +489,46 @@ PresentationServiceImpl::StartSessionRequest::PassCallback() {
|
| return callback;
|
| }
|
|
|
| +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
|
|
|
|
|