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 46ec67cf0158791d666a023c92abfb3e71e47546..8c3bdab4e699585fcb73132dc6746bfb77ef09c2 100644 |
--- a/content/browser/presentation/presentation_service_impl.cc |
+++ b/content/browser/presentation/presentation_service_impl.cc |
@@ -126,9 +126,11 @@ void InvokeNewSessionCallbackWithError( |
PresentationServiceImpl::PresentationServiceImpl( |
RenderFrameHost* render_frame_host, |
WebContents* web_contents, |
- PresentationServiceDelegate* delegate) |
+ ControllerPresentationServiceDelegate* controller_delegate, |
+ ReceiverPresentationServiceDelegate* receiver_delegate) |
: WebContentsObserver(web_contents), |
- delegate_(delegate), |
+ controller_delegate_(controller_delegate), |
+ receiver_delegate_(receiver_delegate), |
start_session_request_id_(kInvalidRequestSessionId), |
weak_factory_(this) { |
DCHECK(render_frame_host); |
@@ -139,13 +141,17 @@ PresentationServiceImpl::PresentationServiceImpl( |
render_frame_id_ = render_frame_host->GetRoutingID(); |
DVLOG(2) << "PresentationServiceImpl: " |
<< render_process_id_ << ", " << render_frame_id_; |
- if (delegate_) |
- delegate_->AddObserver(render_process_id_, render_frame_id_, this); |
+ |
+ if (auto delegate = GetPresentationServiceDelegate()) |
+ delegate->AddObserver(render_process_id_, render_frame_id_, this); |
} |
PresentationServiceImpl::~PresentationServiceImpl() { |
- if (delegate_) |
- delegate_->RemoveObserver(render_process_id_, render_frame_id_); |
+ DVLOG(2) << __FUNCTION__ << ": " << render_process_id_ << ", " |
+ << render_frame_id_; |
+ |
+ if (auto delegate = GetPresentationServiceDelegate()) |
+ delegate->RemoveObserver(render_process_id_, render_frame_id_); |
} |
// static |
@@ -160,10 +166,16 @@ void PresentationServiceImpl::CreateMojoService( |
// This object will be deleted when the RenderFrameHost is about to be |
// deleted (RenderFrameDeleted). |
PresentationServiceImpl* impl = new PresentationServiceImpl( |
- render_frame_host, |
- web_contents, |
- GetContentClient()->browser()->GetPresentationServiceDelegate( |
+ render_frame_host, web_contents, |
+ GetContentClient()->browser()->GetControllerPresentationServiceDelegate( |
+ web_contents), |
+ GetContentClient()->browser()->GetReceiverPresentationServiceDelegate( |
web_contents)); |
+ if (impl->receiver_delegate_) { |
+ // In current implementation, web contents can be controller or receiver |
+ // but not both. |
+ impl->controller_delegate_ = nullptr; |
+ } |
impl->Bind(std::move(request)); |
} |
@@ -178,11 +190,17 @@ void PresentationServiceImpl::SetClient( |
DCHECK(!client_.get()); |
// TODO(imcheng): Set ErrorHandler to listen for errors. |
client_ = std::move(client); |
+ |
+ if (receiver_delegate_) { |
+ receiver_delegate_->RegisterReceiverConnectionAvailableCallback( |
+ base::Bind(&PresentationServiceImpl::OnReceiverConnectionAvailable, |
+ weak_factory_.GetWeakPtr())); |
+ } |
} |
void PresentationServiceImpl::ListenForScreenAvailability(const GURL& url) { |
DVLOG(2) << "ListenForScreenAvailability " << url.spec(); |
- if (!delegate_) { |
+ if (!controller_delegate_) { |
client_->OnScreenAvailabilityUpdated(url, false); |
return; |
} |
@@ -192,10 +210,8 @@ void PresentationServiceImpl::ListenForScreenAvailability(const GURL& url) { |
std::unique_ptr<ScreenAvailabilityListenerImpl> listener( |
new ScreenAvailabilityListenerImpl(url, this)); |
- if (delegate_->AddScreenAvailabilityListener( |
- render_process_id_, |
- render_frame_id_, |
- listener.get())) { |
+ if (controller_delegate_->AddScreenAvailabilityListener( |
+ render_process_id_, render_frame_id_, listener.get())) { |
screen_availability_listeners_[url] = std::move(listener); |
} else { |
DVLOG(1) << "AddScreenAvailabilityListener failed. Ignoring request."; |
@@ -205,14 +221,14 @@ void PresentationServiceImpl::ListenForScreenAvailability(const GURL& url) { |
void PresentationServiceImpl::StopListeningForScreenAvailability( |
const GURL& url) { |
DVLOG(2) << "StopListeningForScreenAvailability " << url.spec(); |
- if (!delegate_) |
+ if (!controller_delegate_) |
return; |
auto listener_it = screen_availability_listeners_.find(url); |
if (listener_it == screen_availability_listeners_.end()) |
return; |
- delegate_->RemoveScreenAvailabilityListener( |
+ controller_delegate_->RemoveScreenAvailabilityListener( |
render_process_id_, render_frame_id_, listener_it->second.get()); |
screen_availability_listeners_.erase(listener_it); |
} |
@@ -221,7 +237,7 @@ void PresentationServiceImpl::StartSession( |
const std::vector<GURL>& presentation_urls, |
const NewSessionCallback& callback) { |
DVLOG(2) << "StartSession"; |
- if (!delegate_) { |
+ if (!controller_delegate_) { |
callback.Run( |
blink::mojom::PresentationSessionInfoPtr(), |
blink::mojom::PresentationError::From(PresentationError( |
@@ -238,7 +254,7 @@ void PresentationServiceImpl::StartSession( |
start_session_request_id_ = GetNextRequestSessionId(); |
pending_start_session_cb_.reset(new NewSessionCallbackWrapper(callback)); |
- delegate_->StartSession( |
+ controller_delegate_->StartSession( |
render_process_id_, render_frame_id_, presentation_urls, |
base::Bind(&PresentationServiceImpl::OnStartSessionSucceeded, |
weak_factory_.GetWeakPtr(), start_session_request_id_), |
@@ -251,7 +267,7 @@ void PresentationServiceImpl::JoinSession( |
const base::Optional<std::string>& presentation_id, |
const NewSessionCallback& callback) { |
DVLOG(2) << "JoinSession"; |
- if (!delegate_) { |
+ if (!controller_delegate_) { |
callback.Run(blink::mojom::PresentationSessionInfoPtr(), |
blink::mojom::PresentationError::From(PresentationError( |
PRESENTATION_ERROR_NO_PRESENTATION_FOUND, |
@@ -264,7 +280,7 @@ void PresentationServiceImpl::JoinSession( |
InvokeNewSessionCallbackWithError(callback); |
return; |
} |
- delegate_->JoinSession( |
+ controller_delegate_->JoinSession( |
render_process_id_, render_frame_id_, presentation_urls, |
presentation_id.value_or(std::string()), |
base::Bind(&PresentationServiceImpl::OnJoinSessionSucceeded, |
@@ -286,8 +302,8 @@ int PresentationServiceImpl::RegisterJoinSessionCallback( |
void PresentationServiceImpl::ListenForConnectionStateChange( |
const PresentationSessionInfo& connection) { |
- if (delegate_) { |
- delegate_->ListenForConnectionStateChange( |
+ if (controller_delegate_) { |
+ controller_delegate_->ListenForConnectionStateChange( |
render_process_id_, render_frame_id_, connection, |
base::Bind(&PresentationServiceImpl::OnConnectionStateChanged, |
weak_factory_.GetWeakPtr(), connection)); |
@@ -297,6 +313,8 @@ void PresentationServiceImpl::ListenForConnectionStateChange( |
void PresentationServiceImpl::OnStartSessionSucceeded( |
int request_session_id, |
const PresentationSessionInfo& session_info) { |
+ DVLOG(2) << "PresentationServiceImpl::OnStartSessionSucceeded" |
+ << " [is_offscreen]: " << session_info.is_offscreen; |
if (request_session_id != start_session_request_id_) |
return; |
@@ -325,6 +343,8 @@ void PresentationServiceImpl::OnStartSessionError( |
void PresentationServiceImpl::OnJoinSessionSucceeded( |
int request_session_id, |
const PresentationSessionInfo& session_info) { |
+ DVLOG(2) << "PresentationServiceImpl::OnJoinSessionSucceeded" |
+ << " [is_offscreen]: " << session_info.is_offscreen; |
if (RunAndEraseJoinSessionMojoCallback( |
request_session_id, |
blink::mojom::PresentationSessionInfo::From(session_info), |
@@ -358,14 +378,14 @@ bool PresentationServiceImpl::RunAndEraseJoinSessionMojoCallback( |
void PresentationServiceImpl::SetDefaultPresentationUrls( |
const std::vector<GURL>& presentation_urls) { |
DVLOG(2) << "SetDefaultPresentationUrls"; |
- if (!delegate_) |
+ if (!controller_delegate_) |
return; |
if (default_presentation_urls_ == presentation_urls) |
return; |
default_presentation_urls_ = presentation_urls; |
- delegate_->SetDefaultPresentationUrls( |
+ controller_delegate_->SetDefaultPresentationUrls( |
render_process_id_, render_frame_id_, presentation_urls, |
base::Bind(&PresentationServiceImpl::OnDefaultPresentationStarted, |
weak_factory_.GetWeakPtr())); |
@@ -375,17 +395,18 @@ void PresentationServiceImpl::SendSessionMessage( |
blink::mojom::PresentationSessionInfoPtr session, |
blink::mojom::SessionMessagePtr session_message, |
const SendSessionMessageCallback& callback) { |
- DVLOG(2) << "SendSessionMessage"; |
+ DVLOG(2) << "SendSessionMessage" |
+ << " [id]: " << session->id; |
DCHECK(!session_message.is_null()); |
// send_message_callback_ should be null by now, otherwise resetting of |
// send_message_callback_ with new callback will drop the old callback. |
- if (!delegate_ || send_message_callback_) { |
+ if (!controller_delegate_ || send_message_callback_) { |
callback.Run(false); |
return; |
} |
send_message_callback_.reset(new SendSessionMessageCallback(callback)); |
- delegate_->SendMessage( |
+ controller_delegate_->SendMessage( |
render_process_id_, render_frame_id_, |
session.To<PresentationSessionInfo>(), |
GetPresentationSessionMessage(std::move(session_message)), |
@@ -406,16 +427,17 @@ void PresentationServiceImpl::CloseConnection( |
const GURL& presentation_url, |
const std::string& presentation_id) { |
DVLOG(2) << "CloseConnection " << presentation_id; |
- if (delegate_) |
- delegate_->CloseConnection(render_process_id_, render_frame_id_, |
- presentation_id); |
+ if (controller_delegate_) |
+ controller_delegate_->CloseConnection(render_process_id_, render_frame_id_, |
+ presentation_id); |
} |
void PresentationServiceImpl::Terminate(const GURL& presentation_url, |
const std::string& presentation_id) { |
DVLOG(2) << "Terminate " << presentation_id; |
- if (delegate_) |
- delegate_->Terminate(render_process_id_, render_frame_id_, presentation_id); |
+ if (controller_delegate_) |
+ controller_delegate_->Terminate(render_process_id_, render_frame_id_, |
+ presentation_id); |
} |
void PresentationServiceImpl::OnConnectionStateChanged( |
@@ -443,26 +465,48 @@ bool PresentationServiceImpl::FrameMatches( |
render_frame_host->GetRoutingID() == render_frame_id_; |
} |
+PresentationServiceDelegateBase* |
+PresentationServiceImpl::GetPresentationServiceDelegate() { |
+ if (receiver_delegate_) |
+ return receiver_delegate_; |
+ |
+ return controller_delegate_; |
+} |
+ |
void PresentationServiceImpl::ListenForSessionMessages( |
blink::mojom::PresentationSessionInfoPtr session) { |
DVLOG(2) << "ListenForSessionMessages"; |
- if (!delegate_) |
+ if (!controller_delegate_) |
return; |
PresentationSessionInfo session_info(session.To<PresentationSessionInfo>()); |
- delegate_->ListenForSessionMessages( |
+ controller_delegate_->ListenForSessionMessages( |
render_process_id_, render_frame_id_, session_info, |
base::Bind(&PresentationServiceImpl::OnSessionMessages, |
weak_factory_.GetWeakPtr(), session_info)); |
} |
+void PresentationServiceImpl::SetPresentationConnection( |
+ blink::mojom::PresentationSessionInfoPtr session, |
+ blink::mojom::PresentationConnectionPtr connection) { |
+ DVLOG(2) << "SetPresentationConnection"; |
+ |
+ if (!controller_delegate_) |
+ return; |
+ |
+ PresentationSessionInfo session_info(session.To<PresentationSessionInfo>()); |
+ controller_delegate_->ConnectToOffscreenPresentation( |
+ render_process_id_, render_frame_id_, session_info, |
+ std::move(connection)); |
+} |
+ |
void PresentationServiceImpl::OnSessionMessages( |
const PresentationSessionInfo& session, |
const ScopedVector<PresentationSessionMessage>& messages, |
bool pass_ownership) { |
DCHECK(client_); |
- |
- DVLOG(2) << "OnSessionMessages"; |
+ DVLOG(2) << "OnSessionMessages" |
+ << " [id]: " << session.presentation_id; |
std::vector<blink::mojom::SessionMessagePtr> mojo_messages(messages.size()); |
std::transform(messages.begin(), messages.end(), mojo_messages.begin(), |
[pass_ownership](PresentationSessionMessage* message) { |
@@ -474,6 +518,16 @@ void PresentationServiceImpl::OnSessionMessages( |
std::move(mojo_messages)); |
} |
+void PresentationServiceImpl::OnReceiverConnectionAvailable( |
+ const content::PresentationSessionInfo& session_info, |
+ PresentationConnectionPtr&& controller) { |
+ DVLOG(2) << "PresentationServiceImpl::OnReceiverConnectionAvailable"; |
+ |
+ client_->OnReceiverConnectionAvailable( |
+ blink::mojom::PresentationSessionInfo::From(session_info), |
+ std::move(controller)); |
+} |
+ |
void PresentationServiceImpl::DidNavigateAnyFrame( |
content::RenderFrameHost* render_frame_host, |
const content::LoadCommittedDetails& details, |
@@ -519,8 +573,9 @@ void PresentationServiceImpl::WebContentsDestroyed() { |
void PresentationServiceImpl::Reset() { |
DVLOG(2) << "PresentationServiceImpl::Reset"; |
- if (delegate_) |
- delegate_->Reset(render_process_id_, render_frame_id_); |
+ |
+ if (auto delegate = GetPresentationServiceDelegate()) |
+ delegate->Reset(render_process_id_, render_frame_id_); |
default_presentation_urls_.clear(); |
@@ -547,12 +602,15 @@ void PresentationServiceImpl::Reset() { |
void PresentationServiceImpl::OnDelegateDestroyed() { |
DVLOG(2) << "PresentationServiceImpl::OnDelegateDestroyed"; |
- delegate_ = nullptr; |
+ controller_delegate_ = nullptr; |
+ receiver_delegate_ = nullptr; |
Reset(); |
} |
void PresentationServiceImpl::OnDefaultPresentationStarted( |
const PresentationSessionInfo& connection) { |
+ DVLOG(2) << "PresentationServiceImpl::OnDefaultPresentationStarted" |
+ << " [is_offscreen]: " << connection.is_offscreen; |
DCHECK(client_.get()); |
client_->OnDefaultSessionStarted( |
blink::mojom::PresentationSessionInfo::From(connection)); |