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

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: Address Derek's comments 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 fa14895861f721762f1fcdfc6c2283e0294c037b..829ec1fce88ae97992ca88c7232a1d54a6d26502 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,38 @@ 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 (!IsRouteValid(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);
+
+ RunOrDefer(
imcheng 2017/04/06 21:14:05 Please add a SetWakeReason() call here for UMA pur
takumif 2017/04/07 21:07:56 Done.
+ base::BindOnce(&MediaRouterMojoImpl::DoCreateMediaRouteController,
imcheng 2017/04/06 21:14:05 Is there a reason why we still need separate metho
takumif 2017/04/07 21:07:55 None of the other Do.. methods call multiple MRP m
+ base::Unretained(this), route_id,
+ std::move(mojo_media_controller_request),
+ base::Bind(&MediaRouterMojoImpl::OnMediaControllerCreated,
imcheng 2017/04/06 21:14:05 You don't have to Bind OnMediaControllerCreated be
takumif 2017/04/07 21:07:55 Done.
+ base::Unretained(this), route_id)));
+ RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoSetMediaRouteStatusObserver,
+ base::Unretained(this), route_id,
+ route_controller->BindObserverPtr()));
+ route_controllers_.insert({route_id, route_controller.get()});
+ return route_controller;
}
bool MediaRouterMojoImpl::RegisterMediaSinksObserver(
@@ -424,8 +456,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);
@@ -459,8 +492,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);
}
@@ -483,8 +516,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) {
@@ -532,8 +565,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));
}
}
@@ -586,11 +619,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,
@@ -702,6 +744,23 @@ void MediaRouterMojoImpl::DoSearchSinks(
sink_id, source_id, std::move(sink_search_criteria), sink_callback);
}
+void MediaRouterMojoImpl::DoCreateMediaRouteController(
+ const MediaRoute::Id& route_id,
+ mojom::MediaControllerRequest mojo_media_controller_request,
+ base::Callback<void(bool)> callback) {
+ DVLOG_WITH_INSTANCE(1) << "DoCreateMediaRouteController";
+ media_route_provider_->CreateMediaRouteController(
+ route_id, std::move(mojo_media_controller_request), callback);
+}
+
+void MediaRouterMojoImpl::DoSetMediaRouteStatusObserver(
+ const MediaRoute::Id& route_id,
+ mojom::MediaStatusObserverPtr mojo_observer) {
+ DVLOG_WITH_INSTANCE(1) << "DoSetMediaRouteStatusObserver";
+ media_route_provider_->SetMediaRouteStatusObserver(route_id,
+ std::move(mojo_observer));
+}
+
void MediaRouterMojoImpl::OnRouteMessagesReceived(
const std::string& route_id,
const std::vector<RouteMessage>& messages) {
@@ -736,8 +795,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));
}
}
}
@@ -833,8 +893,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.";
@@ -844,24 +904,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();
}
}
@@ -897,8 +957,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();
}
@@ -946,8 +1006,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;
}
@@ -969,8 +1029,8 @@ 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(
@@ -979,4 +1039,30 @@ void MediaRouterMojoImpl::DoUpdateMediaSinks(
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 (IsRouteValid(it->first)) {
+ ++it;
+ } else {
+ it->second->Invalidate();
+ it = route_controllers_.erase(it);
+ }
+ }
+}
+
+void MediaRouterMojoImpl::OnMediaControllerCreated(
+ const MediaRoute::Id& route_id,
+ bool success) {
+ if (success)
+ return;
+
imcheng 2017/04/06 21:14:05 Could you add a DVLOG_WITH_INSTANCE here for dev p
takumif 2017/04/07 21:07:55 Done.
+ auto it = route_controllers_.find(route_id);
+ if (it != route_controllers_.end()) {
+ it->second->Invalidate();
+ it = route_controllers_.erase(it);
imcheng 2017/04/06 21:14:05 No need to assign |it| with returned value.
takumif 2017/04/07 21:07:55 Oops, done.
+ }
+}
+
} // namespace media_router

Powered by Google App Engine
This is Rietveld 408576698