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 1a23a37ed6103e17bbd7ad61ee4eac6cc63b252c..f575a0e42f8d7af30ebb65f3724960de6e059c8e 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 |
@@ -157,13 +163,21 @@ void PresentationServiceImpl::CreateMojoService( |
WebContents::FromRenderFrameHost(render_frame_host); |
DCHECK(web_contents); |
+ auto* browser = GetContentClient()->browser(); |
+ auto* receiver_delegate = |
+ browser->GetReceiverPresentationServiceDelegate(web_contents); |
+ |
+ // In current implementation, web contents can be controller or receiver |
+ // but not both. |
+ auto* controller_delegate = |
+ receiver_delegate |
+ ? nullptr |
+ : browser->GetControllerPresentationServiceDelegate(web_contents); |
+ |
// 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( |
- web_contents)); |
+ render_frame_host, web_contents, controller_delegate, receiver_delegate); |
impl->Bind(std::move(request)); |
} |
@@ -178,11 +192,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 +212,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 +223,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 +239,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 +256,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 +269,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 +282,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 +304,8 @@ int PresentationServiceImpl::RegisterJoinSessionCallback( |
void PresentationServiceImpl::ListenForConnectionStateChangeAndChangeState( |
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)); |
@@ -361,14 +379,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())); |
@@ -378,17 +396,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)), |
@@ -409,16 +428,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( |
@@ -449,26 +469,48 @@ bool PresentationServiceImpl::FrameMatches( |
render_frame_host->GetRoutingID() == render_frame_id_; |
} |
+PresentationServiceDelegateBase* |
+PresentationServiceImpl::GetPresentationServiceDelegate() { |
+ return receiver_delegate_ |
+ ? static_cast<PresentationServiceDelegateBase*>(receiver_delegate_) |
mark a. foltz
2016/11/15 23:41:46
You shouldn't need to cast these pointers as both
zhaobin
2016/11/16 18:02:42
Need cast for trinary operator..(No need to cast w
|
+ : static_cast<PresentationServiceDelegateBase*>( |
+ 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) { |
@@ -480,6 +522,12 @@ void PresentationServiceImpl::OnSessionMessages( |
std::move(mojo_messages)); |
} |
+void PresentationServiceImpl::OnReceiverConnectionAvailable( |
+ const content::PresentationSessionInfo& session_info, |
+ PresentationConnectionPtr&& controller) { |
+ DVLOG(2) << "PresentationServiceImpl::OnReceiverConnectionAvailable"; |
+} |
+ |
void PresentationServiceImpl::DidNavigateAnyFrame( |
content::RenderFrameHost* render_frame_host, |
const content::LoadCommittedDetails& details, |
@@ -525,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(); |
@@ -553,7 +602,8 @@ void PresentationServiceImpl::Reset() { |
void PresentationServiceImpl::OnDelegateDestroyed() { |
DVLOG(2) << "PresentationServiceImpl::OnDelegateDestroyed"; |
- delegate_ = nullptr; |
+ controller_delegate_ = nullptr; |
+ receiver_delegate_ = nullptr; |
Reset(); |
} |