Chromium Code Reviews| Index: chrome/browser/media/router/mojo/media_router_mojo_impl.cc |
| diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc |
| index 9ba4318b0f292932144f542509f5e351429c539d..9dcfb5f2c2e5e48b7ede48fbc64c64188020d4bc 100644 |
| --- a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc |
| +++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc |
| @@ -596,8 +596,11 @@ void MediaRouterMojoImpl::RegisterPresentationSessionMessagesObserver( |
| bool should_listen = !observer_list->might_have_observers(); |
| observer_list->AddObserver(observer); |
| if (should_listen) { |
| - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoListenForRouteMessages, |
| - base::Unretained(this), route_id)); |
| + SetWakeReason( |
| + MediaRouteProviderWakeReason::START_LISTENING_FOR_ROUTE_MESSAGES); |
| + RunOrDefer( |
| + base::Bind(&MediaRouterMojoImpl::DoStartListeningForRouteMessages, |
| + base::Unretained(this), route_id)); |
| } |
| } |
| @@ -710,24 +713,15 @@ void MediaRouterMojoImpl::DoSendSessionBinaryMessage( |
| callback); |
| } |
| -void MediaRouterMojoImpl::DoListenForRouteMessages( |
| +void MediaRouterMojoImpl::DoStartListeningForRouteMessages( |
| const MediaRoute::Id& route_id) { |
| - DVLOG_WITH_INSTANCE(1) << "ListenForRouteMessages"; |
| - if (!ContainsValue(route_ids_listening_for_messages_, route_id)) { |
| - route_ids_listening_for_messages_.insert(route_id); |
| - media_route_provider_->ListenForRouteMessages( |
| - route_id, base::Bind(&MediaRouterMojoImpl::OnRouteMessagesReceived, |
| - base::Unretained(this), route_id)); |
| - } |
| + DVLOG_WITH_INSTANCE(1) << "DoStartListeningForRouteMessages"; |
| + media_route_provider_->StartListeningForRouteMessages(route_id); |
| } |
| void MediaRouterMojoImpl::DoStopListeningForRouteMessages( |
| const MediaRoute::Id& route_id) { |
| DVLOG_WITH_INSTANCE(1) << "StopListeningForRouteMessages"; |
| - |
| - // No need to erase |route_ids_listening_for_messages_| entry here. |
| - // It will be removed when there are no more observers by the time |
| - // |OnRouteMessagesReceived| is invoked. |
| media_route_provider_->StopListeningForRouteMessages(route_id); |
| } |
| @@ -747,49 +741,29 @@ void MediaRouterMojoImpl::DoSearchSinks( |
| } |
| void MediaRouterMojoImpl::OnRouteMessagesReceived( |
| - const MediaRoute::Id& route_id, |
| - mojo::Array<interfaces::RouteMessagePtr> messages, |
| - bool error) { |
| - DVLOG(1) << "OnRouteMessagesReceived"; |
| - |
| - // If |messages| is null, then no more messages will come from this route. |
| - // We can stop listening. |
| - if (error) { |
| - DVLOG(2) << "Encountered error in OnRouteMessagesReceived for " << route_id; |
| - route_ids_listening_for_messages_.erase(route_id); |
| - return; |
| - } |
| + const mojo::String& route_id, |
| + mojo::Array<interfaces::RouteMessagePtr> messages) { |
| + DVLOG_WITH_INSTANCE(1) << "OnRouteMessagesReceived"; |
| + |
| + DCHECK(!messages.storage().empty()); |
| - // Check if there are any observers remaining. If not, the messages |
| - // can be discarded and we can stop listening for the next batch of messages. |
| auto* observer_list = messages_observers_.get(route_id); |
| if (!observer_list) { |
| - route_ids_listening_for_messages_.erase(route_id); |
| return; |
| } |
| - // If |messages| is empty, then |StopListeningForRouteMessages| was invoked |
| - // but we have added back an observer since. Keep listening for more messages, |
| - // but do not notify observers with empty list. |
| - if (!messages.storage().empty()) { |
| - ScopedVector<content::PresentationSessionMessage> session_messages; |
| - session_messages.reserve(messages.size()); |
| - for (size_t i = 0; i < messages.size(); ++i) { |
| - session_messages.push_back( |
| - ConvertToPresentationSessionMessage(std::move(messages[i]))); |
| - } |
| - base::ObserverList<PresentationSessionMessagesObserver>::Iterator |
| - observer_it(observer_list); |
| - bool single_observer = |
| - observer_it.GetNext() != nullptr && observer_it.GetNext() == nullptr; |
| - FOR_EACH_OBSERVER(PresentationSessionMessagesObserver, *observer_list, |
| - OnMessagesReceived(session_messages, single_observer)); |
| + ScopedVector<content::PresentationSessionMessage> session_messages; |
| + session_messages.reserve(messages.size()); |
| + for (size_t i = 0; i < messages.size(); ++i) { |
| + session_messages.push_back( |
| + ConvertToPresentationSessionMessage(std::move(messages[i]))); |
| } |
| - |
| - // Listen for more messages. |
| - media_route_provider_->ListenForRouteMessages( |
| - route_id, base::Bind(&MediaRouterMojoImpl::OnRouteMessagesReceived, |
| - base::Unretained(this), route_id)); |
| + base::ObserverList<PresentationSessionMessagesObserver>::Iterator observer_it( |
| + observer_list); |
| + bool single_observer = |
| + observer_it.GetNext() != nullptr && observer_it.GetNext() == nullptr; |
|
dcheng
2016/07/18 16:14:34
This is... not nice.
1) //content/browser/present
imcheng
2016/07/18 18:56:41
The message type enum on the two definitions are s
|
| + FOR_EACH_OBSERVER(PresentationSessionMessagesObserver, *observer_list, |
| + OnMessagesReceived(session_messages, single_observer)); |
| } |
| void MediaRouterMojoImpl::OnSinkAvailabilityUpdated( |