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

Unified Diff: chrome/browser/media/router/mojo/media_router_mojo_impl.cc

Issue 2728543009: [Media Router] Custom Controls 2 - add MediaRouter::GetRouteController() (Closed)
Patch Set: Combine CreateMRController and SetMRStatusObserver Created 3 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: 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 bdea1370ca6fa9f1ee2068820ba6fce6df9dec1d..9d640c64a645f85638f46c76b13fec7736ba37c7 100644
--- a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
+++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
@@ -20,6 +20,7 @@
#include "chrome/browser/media/router/media_routes_observer.h"
#include "chrome/browser/media/router/media_sinks_observer.h"
#include "chrome/browser/media/router/media_source_helper.h"
+#include "chrome/browser/media/router/mojo/media_route_controller.h"
#include "chrome/browser/media/router/mojo/media_route_provider_util_win.h"
#include "chrome/browser/media/router/mojo/media_router_mojo_metrics.h"
#include "chrome/browser/media/router/route_message.h"
@@ -230,6 +231,7 @@ void MediaRouterMojoImpl::OnRoutesUpdated(
<< "Received routes update without any active observers: "
<< media_source;
}
+ RemoveInvalidRouteControllers(routes);
}
void MediaRouterMojoImpl::RouteResponseReceived(
@@ -277,9 +279,9 @@ void MediaRouterMojoImpl::CreateRoute(
SetWakeReason(MediaRouteProviderWakeReason::CREATE_ROUTE);
int tab_id = SessionTabHelper::IdForTab(web_contents);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoCreateRoute,
- base::Unretained(this), source_id, sink_id, origin,
- tab_id, callbacks, timeout, incognito));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoCreateRoute,
+ base::Unretained(this), source_id, sink_id, origin,
+ tab_id, callbacks, timeout, incognito));
}
void MediaRouterMojoImpl::JoinRoute(
@@ -303,9 +305,9 @@ void MediaRouterMojoImpl::JoinRoute(
SetWakeReason(MediaRouteProviderWakeReason::JOIN_ROUTE);
int tab_id = SessionTabHelper::IdForTab(web_contents);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoJoinRoute,
- base::Unretained(this), source_id, presentation_id,
- origin, tab_id, callbacks, timeout, incognito));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoJoinRoute,
+ base::Unretained(this), source_id, presentation_id,
+ origin, tab_id, callbacks, timeout, incognito));
}
void MediaRouterMojoImpl::ConnectRouteByRouteId(
@@ -320,25 +322,25 @@ void MediaRouterMojoImpl::ConnectRouteByRouteId(
SetWakeReason(MediaRouteProviderWakeReason::CONNECT_ROUTE_BY_ROUTE_ID);
int tab_id = SessionTabHelper::IdForTab(web_contents);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoConnectRouteByRouteId,
- base::Unretained(this), source_id, route_id, origin,
- tab_id, callbacks, timeout, incognito));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoConnectRouteByRouteId,
+ base::Unretained(this), source_id, route_id, origin,
+ tab_id, callbacks, timeout, incognito));
}
void MediaRouterMojoImpl::TerminateRoute(const MediaRoute::Id& route_id) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DVLOG(2) << "TerminateRoute " << route_id;
SetWakeReason(MediaRouteProviderWakeReason::TERMINATE_ROUTE);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoTerminateRoute,
- base::Unretained(this), route_id));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoTerminateRoute,
+ base::Unretained(this), route_id));
}
void MediaRouterMojoImpl::DetachRoute(const MediaRoute::Id& route_id) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
SetWakeReason(MediaRouteProviderWakeReason::DETACH_ROUTE);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoDetachRoute,
- base::Unretained(this), route_id));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoDetachRoute,
+ base::Unretained(this), route_id));
}
void MediaRouterMojoImpl::SendRouteMessage(
@@ -348,8 +350,9 @@ void MediaRouterMojoImpl::SendRouteMessage(
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
SetWakeReason(MediaRouteProviderWakeReason::SEND_SESSION_MESSAGE);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoSendSessionMessage,
- base::Unretained(this), route_id, message, callback));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoSendSessionMessage,
+ base::Unretained(this), route_id, message,
+ callback));
}
void MediaRouterMojoImpl::SendRouteBinaryMessage(
@@ -359,9 +362,9 @@ void MediaRouterMojoImpl::SendRouteBinaryMessage(
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
SetWakeReason(MediaRouteProviderWakeReason::SEND_SESSION_BINARY_MESSAGE);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoSendSessionBinaryMessage,
- base::Unretained(this), route_id,
- base::Passed(std::move(data)), callback));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoSendSessionBinaryMessage,
+ base::Unretained(this), route_id,
+ base::Passed(std::move(data)), callback));
}
void MediaRouterMojoImpl::AddIssue(const IssueInfo& issue_info) {
@@ -393,9 +396,34 @@ void MediaRouterMojoImpl::SearchSinks(
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
SetWakeReason(MediaRouteProviderWakeReason::SEARCH_SINKS);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoSearchSinks,
- base::Unretained(this), sink_id, source_id,
- search_input, domain, sink_callback));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoSearchSinks,
+ base::Unretained(this), sink_id, source_id,
+ search_input, domain, sink_callback));
+}
+
+scoped_refptr<MediaRouteController> MediaRouterMojoImpl::GetRouteController(
+ const MediaRoute::Id& route_id) {
+ if (!IsRouteKnown(route_id))
+ return nullptr;
+
+ auto it = route_controllers_.find(route_id);
+ if (it != route_controllers_.end())
+ return scoped_refptr<MediaRouteController>(it->second);
+
+ mojom::MediaControllerPtr mojo_media_controller;
+ mojom::MediaControllerRequest mojo_media_controller_request =
+ mojo::MakeRequest(&mojo_media_controller);
+ scoped_refptr<MediaRouteController> route_controller =
+ new MediaRouteController(route_id, std::move(mojo_media_controller),
+ this);
+
+ SetWakeReason(MediaRouteProviderWakeReason::CREATE_MEDIA_ROUTE_CONTROLLER);
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoCreateMediaRouteController,
+ base::Unretained(this), route_id,
+ std::move(mojo_media_controller_request),
+ route_controller->BindObserverPtr()));
+ route_controllers_.emplace(route_id, route_controller.get());
+ return route_controller;
}
void MediaRouterMojoImpl::ProvideSinks(
@@ -434,8 +462,9 @@ bool MediaRouterMojoImpl::RegisterMediaSinksObserver(
// Need to call MRPM to start observing sinks if the query is new.
if (is_new_query) {
SetWakeReason(MediaRouteProviderWakeReason::START_OBSERVING_MEDIA_SINKS);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStartObservingMediaSinks,
- base::Unretained(this), source_id));
+ RunOrDefer(
+ base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaSinks,
+ base::Unretained(this), source_id));
} else if (sinks_query->cached_sink_list) {
observer->OnSinksUpdated(*sinks_query->cached_sink_list,
sinks_query->origins);
@@ -469,8 +498,8 @@ void MediaRouterMojoImpl::UnregisterMediaSinksObserver(
SetWakeReason(MediaRouteProviderWakeReason::STOP_OBSERVING_MEDIA_SINKS);
// The |sinks_queries_| entry will be removed in the immediate or deferred
// |DoStopObservingMediaSinks| call.
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStopObservingMediaSinks,
- base::Unretained(this), source_id));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoStopObservingMediaSinks,
+ base::Unretained(this), source_id));
} else {
sinks_queries_.erase(source_id);
}
@@ -493,8 +522,8 @@ void MediaRouterMojoImpl::RegisterMediaRoutesObserver(
routes_query->observers.AddObserver(observer);
if (is_new_query) {
SetWakeReason(MediaRouteProviderWakeReason::START_OBSERVING_MEDIA_ROUTES);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStartObservingMediaRoutes,
- base::Unretained(this), source_id));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaRoutes,
+ base::Unretained(this), source_id));
// The MRPM will call MediaRouterMojoImpl::OnRoutesUpdated() soon, if there
// are any existing routes the new observer should be aware of.
} else if (routes_query->cached_route_list) {
@@ -542,8 +571,8 @@ void MediaRouterMojoImpl::UnregisterMediaRoutesObserver(
it->second->observers.RemoveObserver(observer);
if (!it->second->observers.might_have_observers()) {
SetWakeReason(MediaRouteProviderWakeReason::STOP_OBSERVING_MEDIA_ROUTES);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStopObservingMediaRoutes,
- base::Unretained(this), source_id));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoStopObservingMediaRoutes,
+ base::Unretained(this), source_id));
}
}
@@ -596,11 +625,20 @@ void MediaRouterMojoImpl::UnregisterRouteMessageObserver(
message_observers_.erase(route_id);
SetWakeReason(
MediaRouteProviderWakeReason::STOP_LISTENING_FOR_ROUTE_MESSAGES);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStopListeningForRouteMessages,
- base::Unretained(this), route_id));
+ RunOrDefer(
+ base::BindOnce(&MediaRouterMojoImpl::DoStopListeningForRouteMessages,
+ base::Unretained(this), route_id));
}
}
+void MediaRouterMojoImpl::DetachRouteController(
+ const MediaRoute::Id& route_id,
+ MediaRouteController* controller) {
+ auto it = route_controllers_.find(route_id);
+ if (it != route_controllers_.end() && it->second == controller)
+ route_controllers_.erase(it);
+}
+
void MediaRouterMojoImpl::DoCreateRoute(
const MediaSource::Id& source_id,
const MediaSink::Id& sink_id,
@@ -719,6 +757,21 @@ void MediaRouterMojoImpl::DoProvideSinks(
media_route_provider_->ProvideSinks(provider_name, sinks);
}
+void MediaRouterMojoImpl::DoCreateMediaRouteController(
+ const MediaRoute::Id& route_id,
+ mojom::MediaControllerRequest mojo_media_controller_request,
+ mojom::MediaStatusObserverPtr mojo_observer) {
+ DVLOG_WITH_INSTANCE(1) << "DoCreateMediaRouteController";
+ if (!mojo_media_controller_request.is_pending() || !mojo_observer.is_bound())
+ return;
+
+ media_route_provider_->CreateMediaRouteController(
+ route_id, std::move(mojo_media_controller_request),
+ std::move(mojo_observer),
+ base::Bind(&MediaRouterMojoImpl::OnMediaControllerCreated,
+ base::Unretained(this), route_id));
+}
+
void MediaRouterMojoImpl::OnRouteMessagesReceived(
const std::string& route_id,
const std::vector<RouteMessage>& messages) {
@@ -753,8 +806,9 @@ void MediaRouterMojoImpl::OnSinkAvailabilityUpdated(
} else {
// Sinks are now available. Tell MRPM to start all sink queries again.
for (const auto& source_and_query : sinks_queries_) {
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStartObservingMediaSinks,
- base::Unretained(this), source_and_query.first));
+ RunOrDefer(
+ base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaSinks,
+ base::Unretained(this), source_and_query.first));
}
}
}
@@ -850,8 +904,8 @@ void MediaRouterMojoImpl::DoStopObservingMediaRoutes(
routes_queries_.erase(source_id);
}
-void MediaRouterMojoImpl::EnqueueTask(const base::Closure& closure) {
- pending_requests_.push_back(closure);
+void MediaRouterMojoImpl::EnqueueTask(base::OnceClosure closure) {
+ pending_requests_.push_back(std::move(closure));
if (pending_requests_.size() > kMaxPendingRequests) {
DLOG_WITH_INSTANCE(ERROR) << "Reached max queue size. Dropping oldest "
<< "request.";
@@ -861,24 +915,24 @@ void MediaRouterMojoImpl::EnqueueTask(const base::Closure& closure) {
<< pending_requests_.size() << ")";
}
-void MediaRouterMojoImpl::RunOrDefer(const base::Closure& request) {
+void MediaRouterMojoImpl::RunOrDefer(base::OnceClosure request) {
DCHECK(event_page_tracker_);
if (media_route_provider_extension_id_.empty()) {
DVLOG_WITH_INSTANCE(1) << "Extension ID not known yet.";
- EnqueueTask(request);
+ EnqueueTask(std::move(request));
} else if (event_page_tracker_->IsEventPageSuspended(
media_route_provider_extension_id_)) {
DVLOG_WITH_INSTANCE(1) << "Waking event page.";
- EnqueueTask(request);
+ EnqueueTask(std::move(request));
AttemptWakeEventPage();
media_route_provider_.reset();
} else if (!media_route_provider_) {
DVLOG_WITH_INSTANCE(1) << "Extension is awake, awaiting ProvideMediaRouter "
" to be called.";
- EnqueueTask(request);
+ EnqueueTask(std::move(request));
} else {
- request.Run();
+ std::move(request).Run();
}
}
@@ -914,8 +968,8 @@ void MediaRouterMojoImpl::ExecutePendingRequests() {
DCHECK(event_page_tracker_);
DCHECK(!media_route_provider_extension_id_.empty());
- for (const auto& next_request : pending_requests_)
- next_request.Run();
+ for (auto& next_request : pending_requests_)
+ std::move(next_request).Run();
pending_requests_.clear();
}
@@ -963,8 +1017,8 @@ void MediaRouterMojoImpl::EnsureMdnsDiscoveryEnabled() {
return;
SetWakeReason(MediaRouteProviderWakeReason::ENABLE_MDNS_DISCOVERY);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoEnsureMdnsDiscoveryEnabled,
- base::Unretained(this)));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoEnsureMdnsDiscoveryEnabled,
+ base::Unretained(this)));
should_enable_mdns_discovery_ = true;
}
@@ -986,14 +1040,35 @@ void MediaRouterMojoImpl::OnFirewallCheckComplete(
void MediaRouterMojoImpl::UpdateMediaSinks(
const MediaSource::Id& source_id) {
SetWakeReason(MediaRouteProviderWakeReason::UPDATE_MEDIA_SINKS);
- RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoUpdateMediaSinks,
- base::Unretained(this), source_id));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoUpdateMediaSinks,
+ base::Unretained(this), source_id));
}
void MediaRouterMojoImpl::DoUpdateMediaSinks(
const MediaSource::Id& source_id) {
- DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks" << source_id;
+ DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks: " << source_id;
media_route_provider_->UpdateMediaSinks(source_id);
}
+void MediaRouterMojoImpl::RemoveInvalidRouteControllers(
+ const std::vector<MediaRoute>& routes) {
+ auto it = route_controllers_.begin();
+ while (it != route_controllers_.end()) {
+ if (IsRouteKnown(it->first)) {
+ ++it;
+ } else {
+ it->second->Invalidate();
+ it = route_controllers_.erase(it);
+ }
+ }
+}
+
+void MediaRouterMojoImpl::OnMediaControllerCreated(
+ const MediaRoute::Id& route_id,
+ bool success) {
+ // TODO(takumif): Record success/failure with UMA.
+ DVLOG_WITH_INSTANCE(1) << "OnMediaControllerCreated: " << route_id
+ << (success ? " was successful." : " failed.");
+}
+
} // namespace media_router

Powered by Google App Engine
This is Rietveld 408576698