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

Unified Diff: content/browser/presentation/presentation_service_impl.cc

Issue 1073893003: [Presentation API] Implement ondefaultsessionstart in PSImpl. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: use RunLoopFor Created 5 years, 8 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698