Chromium Code Reviews| Index: chrome/browser/media/router/presentation_service_delegate_impl.cc |
| diff --git a/chrome/browser/media/router/presentation_service_delegate_impl.cc b/chrome/browser/media/router/presentation_service_delegate_impl.cc |
| index 670fe4c1b58cf491815f989c9d383ea4e77fb5ab..b180a61d92b9a499375bf1b11d3a4b1d0f692aeb 100644 |
| --- a/chrome/browser/media/router/presentation_service_delegate_impl.cc |
| +++ b/chrome/browser/media/router/presentation_service_delegate_impl.cc |
| @@ -83,6 +83,8 @@ class PresentationFrame { |
| const content::PresentationSessionMessageCallback& message_cb); |
| void Reset(); |
| + void RemoveConnection(const std::string& presentation_id, |
| + const MediaRoute::Id& route_id); |
| const MediaRoute::Id GetRouteId(const std::string& presentation_id) const; |
| const std::vector<MediaRoute::Id> GetRouteIds() const; |
| @@ -184,7 +186,7 @@ bool PresentationFrame::HasScreenAvailabilityListenerForTest( |
| void PresentationFrame::Reset() { |
| for (const auto& pid_route_id : presentation_id_to_route_id_) |
| - router_->OnPresentationSessionDetached(pid_route_id.second); |
| + router_->DetachRoute(pid_route_id.second); |
| presentation_id_to_route_id_.clear(); |
| sinks_observer_.reset(); |
| @@ -192,6 +194,23 @@ void PresentationFrame::Reset() { |
| session_messages_observers_.clear(); |
| } |
| +void PresentationFrame::RemoveConnection(const std::string& presentation_id, |
| + const MediaRoute::Id& route_id) { |
| + // Remove the presentation id mapping so a later call to Reset is a no-op. |
| + presentation_id_to_route_id_.erase(presentation_id); |
| + // We no longer need to observe route messages. |
|
imcheng
2015/12/10 19:50:46
nit: new line above comment
mark a. foltz
2015/12/10 23:46:49
Done
|
| + auto observer_iter = std::find_if( |
| + session_messages_observers_.begin(), session_messages_observers_.end(), |
| + [&route_id](const PresentationSessionMessagesObserver* observer) { |
| + return route_id == observer->route_id(); |
| + }); |
| + if (observer_iter != session_messages_observers_.end()) |
| + session_messages_observers_.erase(observer_iter); |
| + // We keep the PresentationConnectionStateChangedCallback registered with MR |
|
imcheng
2015/12/10 19:50:46
nit: new line above comment
mark a. foltz
2015/12/10 23:46:49
Done
|
| + // so the MRP can tell us when terminate() completed. |
| + router_->DetachRoute(route_id); |
|
imcheng
2015/12/10 19:50:46
Looks like you are already calling DetachRoute in
mark a. foltz
2015/12/10 23:46:49
You're right, good catch.
|
| +} |
| + |
| void PresentationFrame::ListenForConnectionStateChange( |
| const content::PresentationSessionInfo& connection, |
| const content::PresentationConnectionStateChangedCallback& |
| @@ -280,6 +299,9 @@ class PresentationFrameManager { |
| PresentationServiceDelegateImpl::DefaultPresentationRequestObserver* |
| observer); |
| void Reset(const RenderFrameHostId& render_frame_host_id); |
| + void RemoveConnection(const RenderFrameHostId& render_frame_host_id, |
| + const MediaRoute::Id& route_id, |
| + const std::string& presentation_id); |
| bool HasScreenAvailabilityListenerForTest( |
| const RenderFrameHostId& render_frame_host_id, |
| const MediaSource::Id& source_id) const; |
| @@ -505,6 +527,15 @@ void PresentationFrameManager::Reset( |
| } |
| } |
| +void PresentationFrameManager::RemoveConnection( |
| + const RenderFrameHostId& render_frame_host_id, |
| + const MediaRoute::Id& route_id, |
| + const std::string& presentation_id) { |
| + auto presentation_frame = presentation_frames_.get(render_frame_host_id); |
| + if (presentation_frame) |
|
mlamouri (slow - plz ping)
2015/12/10 15:39:51
Is `presentation_frame == nullptr` even possible?
mark a. foltz
2015/12/10 23:46:49
My current understanding is a frame can call conne
|
| + presentation_frame->RemoveConnection(route_id, presentation_id); |
| +} |
| + |
| PresentationFrame* PresentationFrameManager::GetOrAddPresentationFrame( |
| const RenderFrameHostId& render_frame_host_id) { |
| if (!presentation_frames_.contains(render_frame_host_id)) { |
| @@ -715,35 +746,38 @@ void PresentationServiceDelegateImpl::JoinSession( |
| web_contents_, route_response_callbacks); |
| } |
| -void PresentationServiceDelegateImpl::CloseSession( |
| +void PresentationServiceDelegateImpl::CloseConnection( |
| int render_process_id, |
| int render_frame_id, |
| const std::string& presentation_id) { |
| - const MediaRoute::Id& route_id = frame_manager_->GetRouteId( |
| - RenderFrameHostId(render_process_id, render_frame_id), presentation_id); |
| + const RenderFrameHostId rfh_id(render_process_id, render_frame_id); |
| + const MediaRoute::Id& route_id = |
| + frame_manager_->GetRouteId(rfh_id, presentation_id); |
| if (route_id.empty()) { |
| DVLOG(1) << "No active route for: " << presentation_id; |
| return; |
| } |
| - // TODO(mfoltz, mlamouri): implement CloseSession(). |
| - // This could call router_->OnPresentationSessionDetached(route_id). |
| - // PresentationFrame::Reset() should probably call CloseSession() too. |
| - // Rename CloseRoute() to something else to avoid confusion? |
| - NOTIMPLEMENTED(); |
| + router_->DetachRoute(route_id); |
| + frame_manager_->RemoveConnection(rfh_id, presentation_id, route_id); |
| + // TODO(mfoltz): close() should always succeed so there is no need to keep the |
| + // state_changed_cb around - remove it and fire the ChangeEvent on the |
| + // PresentationConnection in Blink. |
| } |
| -void PresentationServiceDelegateImpl::TerminateSession( |
| +void PresentationServiceDelegateImpl::Terminate( |
| int render_process_id, |
| int render_frame_id, |
| const std::string& presentation_id) { |
| - const MediaRoute::Id& route_id = frame_manager_->GetRouteId( |
| - RenderFrameHostId(render_process_id, render_frame_id), presentation_id); |
| + const RenderFrameHostId rfh_id(render_process_id, render_frame_id); |
| + const MediaRoute::Id& route_id = |
| + frame_manager_->GetRouteId(rfh_id, presentation_id); |
| if (route_id.empty()) { |
| DVLOG(1) << "No active route for: " << presentation_id; |
| return; |
| } |
| - router_->CloseRoute(route_id); |
| + router_->TerminateRoute(route_id); |
| + frame_manager_->RemoveConnection(rfh_id, presentation_id, route_id); |
|
imcheng
2015/12/10 19:50:46
So we are calling TerminateRoute, and then DetachR
mark a. foltz
2015/12/10 23:46:49
Yeah removed call to router_->DetachRoute() from R
|
| } |
| void PresentationServiceDelegateImpl::ListenForSessionMessages( |