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

Side by Side Diff: chrome/browser/media/router/mojo/media_router_mojo_impl.cc

Issue 2949933002: [Media Router] Factor extension-related logic out of MediaRouterMojoImpl (Closed)
Patch Set: . Created 3 years, 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/media/router/mojo/media_router_mojo_impl.h" 5 #include "chrome/browser/media/router/mojo/media_router_mojo_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/guid.h" 12 #include "base/guid.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/memory/ptr_util.h" 14 #include "base/memory/ptr_util.h"
15 #include "base/observer_list.h" 15 #include "base/observer_list.h"
16 #include "base/stl_util.h" 16 #include "base/stl_util.h"
17 #include "base/strings/stringprintf.h" 17 #include "base/strings/stringprintf.h"
18 #include "chrome/browser/media/router/discovery/dial/dial_media_sink_service_pro xy.h" 18 #include "chrome/browser/media/router/discovery/dial/dial_media_sink_service_pro xy.h"
19 #include "chrome/browser/media/router/event_page_request_manager.h"
20 #include "chrome/browser/media/router/event_page_request_manager_factory.h"
19 #include "chrome/browser/media/router/issues_observer.h" 21 #include "chrome/browser/media/router/issues_observer.h"
20 #include "chrome/browser/media/router/media_router_factory.h" 22 #include "chrome/browser/media/router/media_router_factory.h"
21 #include "chrome/browser/media/router/media_router_feature.h" 23 #include "chrome/browser/media/router/media_router_feature.h"
22 #include "chrome/browser/media/router/media_routes_observer.h" 24 #include "chrome/browser/media/router/media_routes_observer.h"
23 #include "chrome/browser/media/router/media_sinks_observer.h" 25 #include "chrome/browser/media/router/media_sinks_observer.h"
24 #include "chrome/browser/media/router/mojo/media_route_controller.h" 26 #include "chrome/browser/media/router/mojo/media_route_controller.h"
25 #include "chrome/browser/media/router/mojo/media_route_provider_util_win.h" 27 #include "chrome/browser/media/router/mojo/media_route_provider_util_win.h"
26 #include "chrome/browser/media/router/mojo/media_router_mojo_metrics.h" 28 #include "chrome/browser/media/router/mojo/media_router_mojo_metrics.h"
27 #include "chrome/browser/media/router/route_message_observer.h" 29 #include "chrome/browser/media/router/route_message_observer.h"
28 #include "chrome/browser/profiles/profile.h" 30 #include "chrome/browser/profiles/profile.h"
29 #include "chrome/browser/sessions/session_tab_helper.h" 31 #include "chrome/browser/sessions/session_tab_helper.h"
30 #include "chrome/common/media_router/media_source_helper.h" 32 #include "chrome/common/media_router/media_source_helper.h"
31 #include "chrome/common/media_router/route_message.h" 33 #include "chrome/common/media_router/route_message.h"
32 #include "content/public/browser/browser_thread.h" 34 #include "content/public/browser/browser_thread.h"
33 #include "extensions/browser/process_manager.h" 35 #include "extensions/common/extension.h"
34 36
35 #define DVLOG_WITH_INSTANCE(level) \ 37 #define DVLOG_WITH_INSTANCE(level) \
36 DVLOG(level) << "MR #" << instance_id_ << ": " 38 DVLOG(level) << "MR #" << instance_id_ << ": "
37 39
38 #define DLOG_WITH_INSTANCE(level) DLOG(level) << "MR #" << instance_id_ << ": " 40 #define DLOG_WITH_INSTANCE(level) DLOG(level) << "MR #" << instance_id_ << ": "
39 41
40 namespace media_router { 42 namespace media_router {
41 43
42 namespace { 44 namespace {
43 45
44 void RunRouteRequestCallbacks( 46 void RunRouteRequestCallbacks(
45 std::unique_ptr<RouteRequestResult> result, 47 std::unique_ptr<RouteRequestResult> result,
46 std::vector<MediaRouteResponseCallback> callbacks) { 48 std::vector<MediaRouteResponseCallback> callbacks) {
47 for (MediaRouteResponseCallback& callback : callbacks) 49 for (MediaRouteResponseCallback& callback : callbacks)
48 std::move(callback).Run(*result); 50 std::move(callback).Run(*result);
49 } 51 }
50 52
51 } // namespace 53 } // namespace
52 54
53 using SinkAvailability = mojom::MediaRouter::SinkAvailability; 55 using SinkAvailability = mojom::MediaRouter::SinkAvailability;
54 56
55 MediaRouterMojoImpl::MediaRoutesQuery::MediaRoutesQuery() = default; 57 MediaRouterMojoImpl::MediaRoutesQuery::MediaRoutesQuery() = default;
56 58
57 MediaRouterMojoImpl::MediaRoutesQuery::~MediaRoutesQuery() = default; 59 MediaRouterMojoImpl::MediaRoutesQuery::~MediaRoutesQuery() = default;
58 60
59 MediaRouterMojoImpl::MediaSinksQuery::MediaSinksQuery() = default; 61 MediaRouterMojoImpl::MediaSinksQuery::MediaSinksQuery() = default;
60 62
61 MediaRouterMojoImpl::MediaSinksQuery::~MediaSinksQuery() = default; 63 MediaRouterMojoImpl::MediaSinksQuery::~MediaSinksQuery() = default;
62 64
63 MediaRouterMojoImpl::MediaRouterMojoImpl( 65 MediaRouterMojoImpl::MediaRouterMojoImpl(content::BrowserContext* context,
64 extensions::EventPageTracker* event_page_tracker, 66 FirewallCheck check_firewall)
65 content::BrowserContext* context, 67 : instance_id_(base::GenerateGUID()),
66 FirewallCheck check_firewall)
67 : event_page_tracker_(event_page_tracker),
68 instance_id_(base::GenerateGUID()),
69 availability_(mojom::MediaRouter::SinkAvailability::UNAVAILABLE), 68 availability_(mojom::MediaRouter::SinkAvailability::UNAVAILABLE),
70 current_wake_reason_(MediaRouteProviderWakeReason::TOTAL_COUNT),
71 context_(context), 69 context_(context),
70 event_page_request_manager_(
71 EventPageRequestManagerFactory::GetApiForBrowserContext(context)),
72 weak_factory_(this) { 72 weak_factory_(this) {
73 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 73 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
74 DCHECK(event_page_tracker_); 74 DCHECK(event_page_request_manager_);
75 #if defined(OS_WIN) 75 #if defined(OS_WIN)
76 if (check_firewall == FirewallCheck::RUN) { 76 if (check_firewall == FirewallCheck::RUN) {
77 CanFirewallUseLocalPorts( 77 CanFirewallUseLocalPorts(
78 base::Bind(&MediaRouterMojoImpl::OnFirewallCheckComplete, 78 base::Bind(&MediaRouterMojoImpl::OnFirewallCheckComplete,
79 weak_factory_.GetWeakPtr())); 79 weak_factory_.GetWeakPtr()));
80 } 80 }
81 #endif 81 #endif
82 } 82 }
83 83
84 MediaRouterMojoImpl::~MediaRouterMojoImpl() { 84 MediaRouterMojoImpl::~MediaRouterMojoImpl() {
(...skipping 13 matching lines...) Expand all
98 DCHECK(impl); 98 DCHECK(impl);
99 99
100 impl->BindToMojoRequest(std::move(request), *extension); 100 impl->BindToMojoRequest(std::move(request), *extension);
101 } 101 }
102 102
103 void MediaRouterMojoImpl::BindToMojoRequest( 103 void MediaRouterMojoImpl::BindToMojoRequest(
104 mojo::InterfaceRequest<mojom::MediaRouter> request, 104 mojo::InterfaceRequest<mojom::MediaRouter> request,
105 const extensions::Extension& extension) { 105 const extensions::Extension& extension) {
106 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 106 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
107 107
108 binding_.reset( 108 binding_ = base::MakeUnique<mojo::Binding<mojom::MediaRouter>>(
109 new mojo::Binding<mojom::MediaRouter>(this, std::move(request))); 109 this, std::move(request));
110 binding_->set_connection_error_handler(base::Bind( 110 binding_->set_connection_error_handler(base::Bind(
111 &MediaRouterMojoImpl::OnConnectionError, base::Unretained(this))); 111 &MediaRouterMojoImpl::OnConnectionError, base::Unretained(this)));
112 112
113 media_route_provider_extension_id_ = extension.id(); 113 event_page_request_manager_->SetExtensionId(extension.id());
imcheng 2017/06/30 00:17:39 I think this method will need to move to the proxy
takumif 2017/07/01 01:16:44 I agree.
114 if (!provider_version_was_recorded_) { 114 if (!provider_version_was_recorded_) {
115 MediaRouterMojoMetrics::RecordMediaRouteProviderVersion(extension); 115 MediaRouterMojoMetrics::RecordMediaRouteProviderVersion(extension);
116 provider_version_was_recorded_ = true; 116 provider_version_was_recorded_ = true;
117 } 117 }
118 } 118 }
119 119
120 void MediaRouterMojoImpl::OnConnectionError() { 120 void MediaRouterMojoImpl::OnConnectionError() {
121 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 121 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
122 122
123 event_page_request_manager_->OnMojoConnectionError();
123 media_route_provider_.reset(); 124 media_route_provider_.reset();
124 binding_.reset(); 125 binding_.reset();
125
126 // If |OnConnectionError| is invoked while there are pending requests, then
127 // it means we tried to wake the extension, but weren't able to complete the
128 // connection to media route provider. Since we do not know whether the error
129 // is transient, reattempt the wakeup.
130 if (!pending_requests_.empty()) {
131 DLOG_WITH_INSTANCE(ERROR) << "A connection error while there are pending "
132 "requests.";
133 SetWakeReason(MediaRouteProviderWakeReason::CONNECTION_ERROR);
134 AttemptWakeEventPage();
135 }
136 } 126 }
137 127
138 void MediaRouterMojoImpl::RegisterMediaRouteProvider( 128 void MediaRouterMojoImpl::RegisterMediaRouteProvider(
139 mojom::MediaRouteProviderPtr media_route_provider_ptr, 129 mojom::MediaRouteProviderPtr media_route_provider_ptr,
140 mojom::MediaRouter::RegisterMediaRouteProviderCallback callback) { 130 mojom::MediaRouter::RegisterMediaRouteProviderCallback callback) {
141 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 131 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
142 #if defined(OS_WIN) 132 #if defined(OS_WIN)
143 // The MRPM may have been upgraded or otherwise reload such that we could be 133 // The MRPM may have been upgraded or otherwise reload such that we could be
144 // seeing an MRPM that doesn't know mDNS is enabled, even if we've told a 134 // seeing an MRPM that doesn't know mDNS is enabled, even if we've told a
145 // previously registered MRPM it should be enabled. Furthermore, there may be 135 // previously registered MRPM it should be enabled. Furthermore, there may be
146 // a pending request to enable mDNS, so don't clear this flag after 136 // a pending request to enable mDNS, so don't clear this flag after
147 // ExecutePendingRequests(). 137 // ExecutePendingRequests().
148 is_mdns_enabled_ = false; 138 is_mdns_enabled_ = false;
149 #endif 139 #endif
150 if (event_page_tracker_->IsEventPageSuspended(
151 media_route_provider_extension_id_)) {
152 DVLOG_WITH_INSTANCE(1)
153 << "RegisterMediaRouteProvider was called while extension is "
154 "suspended.";
155 media_route_provider_.reset();
156 SetWakeReason(MediaRouteProviderWakeReason::REGISTER_MEDIA_ROUTE_PROVIDER);
157 AttemptWakeEventPage();
158 return;
159 }
160 140
161 media_route_provider_ = std::move(media_route_provider_ptr); 141 media_route_provider_ = std::move(media_route_provider_ptr);
162 media_route_provider_.set_connection_error_handler(base::Bind( 142 media_route_provider_.set_connection_error_handler(base::Bind(
163 &MediaRouterMojoImpl::OnConnectionError, base::Unretained(this))); 143 &MediaRouterMojoImpl::OnConnectionError, base::Unretained(this)));
164 144
165 auto config = mojom::MediaRouteProviderConfig::New(); 145 auto config = mojom::MediaRouteProviderConfig::New();
166 // Enabling browser side discovery means disabling extension side discovery. 146 // Enabling browser side discovery means disabling extension side discovery.
167 // We are migrating discovery from the external Media Route Provider to the 147 // We are migrating discovery from the external Media Route Provider to the
168 // Media Router (crbug.com/687383), so we need to disable it in the provider. 148 // Media Router (crbug.com/687383), so we need to disable it in the provider.
169 config->enable_dial_discovery = !media_router::DialLocalDiscoveryEnabled(); 149 config->enable_dial_discovery = !media_router::DialLocalDiscoveryEnabled();
170 config->enable_cast_discovery = !media_router::CastDiscoveryEnabled(); 150 config->enable_cast_discovery = !media_router::CastDiscoveryEnabled();
171 std::move(callback).Run(instance_id_, std::move(config)); 151 std::move(callback).Run(instance_id_, std::move(config));
172 ExecutePendingRequests(); 152 event_page_request_manager_->OnMojoConnectionsReady();
173 SyncStateToMediaRouteProvider(); 153 SyncStateToMediaRouteProvider();
174
175 wakeup_attempt_count_ = 0;
176 } 154 }
177 155
178 void MediaRouterMojoImpl::OnIssue(const IssueInfo& issue) { 156 void MediaRouterMojoImpl::OnIssue(const IssueInfo& issue) {
179 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 157 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
180 DVLOG_WITH_INSTANCE(1) << "OnIssue " << issue.title; 158 DVLOG_WITH_INSTANCE(1) << "OnIssue " << issue.title;
181 issue_manager_.AddIssue(issue); 159 issue_manager_.AddIssue(issue);
182 } 160 }
183 161
184 void MediaRouterMojoImpl::OnSinksReceived( 162 void MediaRouterMojoImpl::OnSinksReceived(
185 const std::string& media_source, 163 const std::string& media_source,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 for (auto& observer : routes_query->observers) 214 for (auto& observer : routes_query->observers)
237 observer.OnRoutesUpdated(routes, joinable_route_ids); 215 observer.OnRoutesUpdated(routes, joinable_route_ids);
238 } else { 216 } else {
239 DVLOG_WITH_INSTANCE(1) 217 DVLOG_WITH_INSTANCE(1)
240 << "Received routes update without any active observers: " 218 << "Received routes update without any active observers: "
241 << media_source; 219 << media_source;
242 } 220 }
243 RemoveInvalidRouteControllers(routes); 221 RemoveInvalidRouteControllers(routes);
244 } 222 }
245 223
224 const std::string& MediaRouterMojoImpl::media_route_provider_extension_id()
imcheng 2017/06/30 00:17:39 As a TODO we should remove this method and have th
takumif 2017/07/01 01:16:45 Right, I added a TODO in the .h to remove this met
225 const {
226 return event_page_request_manager_->media_route_provider_extension_id();
227 }
228
246 void MediaRouterMojoImpl::RouteResponseReceived( 229 void MediaRouterMojoImpl::RouteResponseReceived(
247 const std::string& presentation_id, 230 const std::string& presentation_id,
248 bool is_incognito, 231 bool is_incognito,
249 std::vector<MediaRouteResponseCallback> callbacks, 232 std::vector<MediaRouteResponseCallback> callbacks,
250 bool is_join, 233 bool is_join,
251 const base::Optional<MediaRoute>& media_route, 234 const base::Optional<MediaRoute>& media_route,
252 const base::Optional<std::string>& error_text, 235 const base::Optional<std::string>& error_text,
253 RouteRequestResult::ResultCode result_code) { 236 RouteRequestResult::ResultCode result_code) {
254 std::unique_ptr<RouteRequestResult> result; 237 std::unique_ptr<RouteRequestResult> result;
255 if (!media_route) { 238 if (!media_route) {
(...skipping 23 matching lines...) Expand all
279 void MediaRouterMojoImpl::CreateRoute( 262 void MediaRouterMojoImpl::CreateRoute(
280 const MediaSource::Id& source_id, 263 const MediaSource::Id& source_id,
281 const MediaSink::Id& sink_id, 264 const MediaSink::Id& sink_id,
282 const url::Origin& origin, 265 const url::Origin& origin,
283 content::WebContents* web_contents, 266 content::WebContents* web_contents,
284 std::vector<MediaRouteResponseCallback> callbacks, 267 std::vector<MediaRouteResponseCallback> callbacks,
285 base::TimeDelta timeout, 268 base::TimeDelta timeout,
286 bool incognito) { 269 bool incognito) {
287 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 270 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
288 271
289 SetWakeReason(MediaRouteProviderWakeReason::CREATE_ROUTE); 272 event_page_request_manager_->SetWakeReason(
imcheng 2017/06/30 00:17:39 Will the pattern of SetWakeReason+RunOrDefer be re
takumif 2017/07/01 01:16:44 Yes, all the references to event_page_request_mana
273 MediaRouteProviderWakeReason::CREATE_ROUTE);
290 int tab_id = SessionTabHelper::IdForTab(web_contents); 274 int tab_id = SessionTabHelper::IdForTab(web_contents);
291 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoCreateRoute, 275 event_page_request_manager_->RunOrDefer(
292 base::Unretained(this), source_id, sink_id, origin, 276 base::BindOnce(&MediaRouterMojoImpl::DoCreateRoute,
293 tab_id, std::move(callbacks), timeout, incognito)); 277 weak_factory_.GetWeakPtr(), source_id, sink_id, origin,
278 tab_id, std::move(callbacks), timeout, incognito));
294 } 279 }
295 280
296 void MediaRouterMojoImpl::JoinRoute( 281 void MediaRouterMojoImpl::JoinRoute(
297 const MediaSource::Id& source_id, 282 const MediaSource::Id& source_id,
298 const std::string& presentation_id, 283 const std::string& presentation_id,
299 const url::Origin& origin, 284 const url::Origin& origin,
300 content::WebContents* web_contents, 285 content::WebContents* web_contents,
301 std::vector<MediaRouteResponseCallback> callbacks, 286 std::vector<MediaRouteResponseCallback> callbacks,
302 base::TimeDelta timeout, 287 base::TimeDelta timeout,
303 bool incognito) { 288 bool incognito) {
304 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 289 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
305 290
306 if (!HasJoinableRoute()) { 291 if (!HasJoinableRoute()) {
307 DVLOG_WITH_INSTANCE(1) << "No joinable routes"; 292 DVLOG_WITH_INSTANCE(1) << "No joinable routes";
308 std::unique_ptr<RouteRequestResult> result = RouteRequestResult::FromError( 293 std::unique_ptr<RouteRequestResult> result = RouteRequestResult::FromError(
309 "Route not found", RouteRequestResult::ROUTE_NOT_FOUND); 294 "Route not found", RouteRequestResult::ROUTE_NOT_FOUND);
310 MediaRouterMojoMetrics::RecordJoinRouteResultCode(result->result_code()); 295 MediaRouterMojoMetrics::RecordJoinRouteResultCode(result->result_code());
311 RunRouteRequestCallbacks(std::move(result), std::move(callbacks)); 296 RunRouteRequestCallbacks(std::move(result), std::move(callbacks));
312 return; 297 return;
313 } 298 }
314 299
315 SetWakeReason(MediaRouteProviderWakeReason::JOIN_ROUTE); 300 event_page_request_manager_->SetWakeReason(
301 MediaRouteProviderWakeReason::JOIN_ROUTE);
316 int tab_id = SessionTabHelper::IdForTab(web_contents); 302 int tab_id = SessionTabHelper::IdForTab(web_contents);
317 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoJoinRoute, 303 event_page_request_manager_->RunOrDefer(
318 base::Unretained(this), source_id, presentation_id, 304 base::BindOnce(&MediaRouterMojoImpl::DoJoinRoute,
319 origin, tab_id, std::move(callbacks), timeout, 305 weak_factory_.GetWeakPtr(), source_id, presentation_id,
320 incognito)); 306 origin, tab_id, std::move(callbacks), timeout, incognito));
321 } 307 }
322 308
323 void MediaRouterMojoImpl::ConnectRouteByRouteId( 309 void MediaRouterMojoImpl::ConnectRouteByRouteId(
324 const MediaSource::Id& source_id, 310 const MediaSource::Id& source_id,
325 const MediaRoute::Id& route_id, 311 const MediaRoute::Id& route_id,
326 const url::Origin& origin, 312 const url::Origin& origin,
327 content::WebContents* web_contents, 313 content::WebContents* web_contents,
328 std::vector<MediaRouteResponseCallback> callbacks, 314 std::vector<MediaRouteResponseCallback> callbacks,
329 base::TimeDelta timeout, 315 base::TimeDelta timeout,
330 bool incognito) { 316 bool incognito) {
331 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 317 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
332 318
333 SetWakeReason(MediaRouteProviderWakeReason::CONNECT_ROUTE_BY_ROUTE_ID); 319 event_page_request_manager_->SetWakeReason(
320 MediaRouteProviderWakeReason::CONNECT_ROUTE_BY_ROUTE_ID);
334 int tab_id = SessionTabHelper::IdForTab(web_contents); 321 int tab_id = SessionTabHelper::IdForTab(web_contents);
335 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoConnectRouteByRouteId, 322 event_page_request_manager_->RunOrDefer(
336 base::Unretained(this), source_id, route_id, origin, 323 base::BindOnce(&MediaRouterMojoImpl::DoConnectRouteByRouteId,
337 tab_id, std::move(callbacks), timeout, incognito)); 324 weak_factory_.GetWeakPtr(), source_id, route_id, origin,
325 tab_id, std::move(callbacks), timeout, incognito));
338 } 326 }
339 327
340 void MediaRouterMojoImpl::TerminateRoute(const MediaRoute::Id& route_id) { 328 void MediaRouterMojoImpl::TerminateRoute(const MediaRoute::Id& route_id) {
341 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 329 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
342 DVLOG(2) << "TerminateRoute " << route_id; 330 DVLOG(2) << "TerminateRoute " << route_id;
343 SetWakeReason(MediaRouteProviderWakeReason::TERMINATE_ROUTE); 331 event_page_request_manager_->SetWakeReason(
344 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoTerminateRoute, 332 MediaRouteProviderWakeReason::TERMINATE_ROUTE);
345 base::Unretained(this), route_id)); 333 event_page_request_manager_->RunOrDefer(
334 base::BindOnce(&MediaRouterMojoImpl::DoTerminateRoute,
335 weak_factory_.GetWeakPtr(), route_id));
346 } 336 }
347 337
348 void MediaRouterMojoImpl::DetachRoute(const MediaRoute::Id& route_id) { 338 void MediaRouterMojoImpl::DetachRoute(const MediaRoute::Id& route_id) {
349 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 339 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
350 340
351 SetWakeReason(MediaRouteProviderWakeReason::DETACH_ROUTE); 341 event_page_request_manager_->SetWakeReason(
352 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoDetachRoute, 342 MediaRouteProviderWakeReason::DETACH_ROUTE);
353 base::Unretained(this), route_id)); 343 event_page_request_manager_->RunOrDefer(
344 base::BindOnce(&MediaRouterMojoImpl::DoDetachRoute,
345 weak_factory_.GetWeakPtr(), route_id));
354 } 346 }
355 347
356 void MediaRouterMojoImpl::SendRouteMessage(const MediaRoute::Id& route_id, 348 void MediaRouterMojoImpl::SendRouteMessage(const MediaRoute::Id& route_id,
357 const std::string& message, 349 const std::string& message,
358 SendRouteMessageCallback callback) { 350 SendRouteMessageCallback callback) {
359 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 351 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
360 352
361 SetWakeReason(MediaRouteProviderWakeReason::SEND_SESSION_MESSAGE); 353 event_page_request_manager_->SetWakeReason(
362 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoSendSessionMessage, 354 MediaRouteProviderWakeReason::SEND_SESSION_MESSAGE);
363 base::Unretained(this), route_id, message, 355 event_page_request_manager_->RunOrDefer(base::BindOnce(
364 std::move(callback))); 356 &MediaRouterMojoImpl::DoSendSessionMessage, weak_factory_.GetWeakPtr(),
357 route_id, message, std::move(callback)));
365 } 358 }
366 359
367 void MediaRouterMojoImpl::SendRouteBinaryMessage( 360 void MediaRouterMojoImpl::SendRouteBinaryMessage(
368 const MediaRoute::Id& route_id, 361 const MediaRoute::Id& route_id,
369 std::unique_ptr<std::vector<uint8_t>> data, 362 std::unique_ptr<std::vector<uint8_t>> data,
370 SendRouteMessageCallback callback) { 363 SendRouteMessageCallback callback) {
371 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 364 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
372 365
373 SetWakeReason(MediaRouteProviderWakeReason::SEND_SESSION_BINARY_MESSAGE); 366 event_page_request_manager_->SetWakeReason(
374 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoSendSessionBinaryMessage, 367 MediaRouteProviderWakeReason::SEND_SESSION_BINARY_MESSAGE);
375 base::Unretained(this), route_id, std::move(data), 368 event_page_request_manager_->RunOrDefer(
376 std::move(callback))); 369 base::BindOnce(&MediaRouterMojoImpl::DoSendSessionBinaryMessage,
370 weak_factory_.GetWeakPtr(), route_id,
371 base::Passed(std::move(data)), std::move(callback)));
377 } 372 }
378 373
379 void MediaRouterMojoImpl::AddIssue(const IssueInfo& issue_info) { 374 void MediaRouterMojoImpl::AddIssue(const IssueInfo& issue_info) {
380 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 375 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
381 issue_manager_.AddIssue(issue_info); 376 issue_manager_.AddIssue(issue_info);
382 } 377 }
383 378
384 void MediaRouterMojoImpl::ClearIssue(const Issue::Id& issue_id) { 379 void MediaRouterMojoImpl::ClearIssue(const Issue::Id& issue_id) {
385 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 380 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
386 issue_manager_.ClearIssue(issue_id); 381 issue_manager_.ClearIssue(issue_id);
(...skipping 10 matching lines...) Expand all
397 } 392 }
398 393
399 void MediaRouterMojoImpl::SearchSinks( 394 void MediaRouterMojoImpl::SearchSinks(
400 const MediaSink::Id& sink_id, 395 const MediaSink::Id& sink_id,
401 const MediaSource::Id& source_id, 396 const MediaSource::Id& source_id,
402 const std::string& search_input, 397 const std::string& search_input,
403 const std::string& domain, 398 const std::string& domain,
404 MediaSinkSearchResponseCallback sink_callback) { 399 MediaSinkSearchResponseCallback sink_callback) {
405 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 400 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
406 401
407 SetWakeReason(MediaRouteProviderWakeReason::SEARCH_SINKS); 402 event_page_request_manager_->SetWakeReason(
408 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoSearchSinks, 403 MediaRouteProviderWakeReason::SEARCH_SINKS);
409 base::Unretained(this), sink_id, source_id, 404 event_page_request_manager_->RunOrDefer(base::BindOnce(
410 search_input, domain, std::move(sink_callback))); 405 &MediaRouterMojoImpl::DoSearchSinks, weak_factory_.GetWeakPtr(), sink_id,
406 source_id, search_input, domain, std::move(sink_callback)));
411 } 407 }
412 408
413 scoped_refptr<MediaRouteController> MediaRouterMojoImpl::GetRouteController( 409 scoped_refptr<MediaRouteController> MediaRouterMojoImpl::GetRouteController(
414 const MediaRoute::Id& route_id) { 410 const MediaRoute::Id& route_id) {
415 if (!IsRouteKnown(route_id)) 411 if (!IsRouteKnown(route_id))
416 return nullptr; 412 return nullptr;
417 413
418 auto it = route_controllers_.find(route_id); 414 auto it = route_controllers_.find(route_id);
419 if (it != route_controllers_.end()) 415 if (it != route_controllers_.end())
420 return scoped_refptr<MediaRouteController>(it->second); 416 return scoped_refptr<MediaRouteController>(it->second);
421 417
422 mojom::MediaControllerPtr mojo_media_controller; 418 mojom::MediaControllerPtr mojo_media_controller;
423 mojom::MediaControllerRequest mojo_media_controller_request = 419 mojom::MediaControllerRequest mojo_media_controller_request =
424 mojo::MakeRequest(&mojo_media_controller); 420 mojo::MakeRequest(&mojo_media_controller);
425 scoped_refptr<MediaRouteController> route_controller = 421 scoped_refptr<MediaRouteController> route_controller =
426 new MediaRouteController(route_id, std::move(mojo_media_controller), 422 new MediaRouteController(route_id, std::move(mojo_media_controller),
427 this); 423 this);
428 424
429 SetWakeReason(MediaRouteProviderWakeReason::CREATE_MEDIA_ROUTE_CONTROLLER); 425 event_page_request_manager_->SetWakeReason(
430 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoCreateMediaRouteController, 426 MediaRouteProviderWakeReason::CREATE_MEDIA_ROUTE_CONTROLLER);
431 base::Unretained(this), route_id, 427 event_page_request_manager_->RunOrDefer(
432 std::move(mojo_media_controller_request), 428 base::BindOnce(&MediaRouterMojoImpl::DoCreateMediaRouteController,
433 route_controller->BindObserverPtr())); 429 weak_factory_.GetWeakPtr(), route_id,
430 std::move(mojo_media_controller_request),
431 route_controller->BindObserverPtr()));
434 route_controllers_.emplace(route_id, route_controller.get()); 432 route_controllers_.emplace(route_id, route_controller.get());
435 return route_controller; 433 return route_controller;
436 } 434 }
437 435
438 void MediaRouterMojoImpl::ProvideSinks(const std::string& provider_name, 436 void MediaRouterMojoImpl::ProvideSinks(const std::string& provider_name,
439 std::vector<MediaSinkInternal> sinks) { 437 std::vector<MediaSinkInternal> sinks) {
440 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 438 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
441 DVLOG_WITH_INSTANCE(1) << "OnDialMediaSinkDiscovered found " << sinks.size() 439 DVLOG_WITH_INSTANCE(1) << "OnDialMediaSinkDiscovered found " << sinks.size()
442 << " devices..."; 440 << " devices...";
443 441
444 SetWakeReason(MediaRouteProviderWakeReason::PROVIDE_SINKS); 442 event_page_request_manager_->SetWakeReason(
445 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoProvideSinks, 443 MediaRouteProviderWakeReason::PROVIDE_SINKS);
446 base::Unretained(this), provider_name, 444 event_page_request_manager_->RunOrDefer(
imcheng 2017/06/30 00:17:39 Seems like WakeReason could be part of the RunOrDe
takumif 2017/07/01 01:16:45 Added wake reason as a param to this method. This
447 std::move(sinks))); 445 base::Bind(&MediaRouterMojoImpl::DoProvideSinks,
446 weak_factory_.GetWeakPtr(), provider_name, std::move(sinks)));
448 } 447 }
449 448
450 bool MediaRouterMojoImpl::RegisterMediaSinksObserver( 449 bool MediaRouterMojoImpl::RegisterMediaSinksObserver(
451 MediaSinksObserver* observer) { 450 MediaSinksObserver* observer) {
452 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 451 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
453 452
454 // Create an observer list for the media source and add |observer| 453 // Create an observer list for the media source and add |observer|
455 // to it. Fail if |observer| is already registered. 454 // to it. Fail if |observer| is already registered.
456 const std::string& source_id = observer->source().id(); 455 const std::string& source_id = observer->source().id();
457 std::unique_ptr<MediaSinksQuery>& sinks_query = sinks_queries_[source_id]; 456 std::unique_ptr<MediaSinksQuery>& sinks_query = sinks_queries_[source_id];
458 bool is_new_query = false; 457 bool is_new_query = false;
459 if (!sinks_query) { 458 if (!sinks_query) {
460 is_new_query = true; 459 is_new_query = true;
461 sinks_query = base::MakeUnique<MediaSinksQuery>(); 460 sinks_query = base::MakeUnique<MediaSinksQuery>();
462 } else { 461 } else {
463 DCHECK(!sinks_query->observers.HasObserver(observer)); 462 DCHECK(!sinks_query->observers.HasObserver(observer));
464 } 463 }
465 464
466 // If sink availability is UNAVAILABLE, then there is no need to call MRPM. 465 // If sink availability is UNAVAILABLE, then there is no need to call MRPM.
467 // |observer| can be immediately notified with an empty list. 466 // |observer| can be immediately notified with an empty list.
468 sinks_query->observers.AddObserver(observer); 467 sinks_query->observers.AddObserver(observer);
469 if (availability_ == mojom::MediaRouter::SinkAvailability::UNAVAILABLE) { 468 if (availability_ == mojom::MediaRouter::SinkAvailability::UNAVAILABLE) {
470 observer->OnSinksUpdated(std::vector<MediaSink>(), 469 observer->OnSinksUpdated(std::vector<MediaSink>(),
471 std::vector<url::Origin>()); 470 std::vector<url::Origin>());
472 } else { 471 } else {
473 // Need to call MRPM to start observing sinks if the query is new. 472 // Need to call MRPM to start observing sinks if the query is new.
474 if (is_new_query) { 473 if (is_new_query) {
475 SetWakeReason(MediaRouteProviderWakeReason::START_OBSERVING_MEDIA_SINKS); 474 event_page_request_manager_->SetWakeReason(
476 RunOrDefer( 475 MediaRouteProviderWakeReason::START_OBSERVING_MEDIA_SINKS);
476 event_page_request_manager_->RunOrDefer(
477 base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaSinks, 477 base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaSinks,
478 base::Unretained(this), source_id)); 478 weak_factory_.GetWeakPtr(), source_id));
479 } else if (sinks_query->cached_sink_list) { 479 } else if (sinks_query->cached_sink_list) {
480 observer->OnSinksUpdated(*sinks_query->cached_sink_list, 480 observer->OnSinksUpdated(*sinks_query->cached_sink_list,
481 sinks_query->origins); 481 sinks_query->origins);
482 } 482 }
483 } 483 }
484 return true; 484 return true;
485 } 485 }
486 486
487 void MediaRouterMojoImpl::UnregisterMediaSinksObserver( 487 void MediaRouterMojoImpl::UnregisterMediaSinksObserver(
488 MediaSinksObserver* observer) { 488 MediaSinksObserver* observer) {
(...skipping 10 matching lines...) Expand all
499 // observing sinks for it. 499 // observing sinks for it.
500 // might_have_observers() is reliable here on the assumption that this call 500 // might_have_observers() is reliable here on the assumption that this call
501 // is not inside the ObserverList iteration. 501 // is not inside the ObserverList iteration.
502 it->second->observers.RemoveObserver(observer); 502 it->second->observers.RemoveObserver(observer);
503 if (!it->second->observers.might_have_observers()) { 503 if (!it->second->observers.might_have_observers()) {
504 // Only ask MRPM to stop observing media sinks if the availability is not 504 // Only ask MRPM to stop observing media sinks if the availability is not
505 // UNAVAILABLE. 505 // UNAVAILABLE.
506 // Otherwise, the MRPM would have discarded the queries already. 506 // Otherwise, the MRPM would have discarded the queries already.
507 if (availability_ != 507 if (availability_ !=
508 mojom::MediaRouter::SinkAvailability::UNAVAILABLE) { 508 mojom::MediaRouter::SinkAvailability::UNAVAILABLE) {
509 SetWakeReason(MediaRouteProviderWakeReason::STOP_OBSERVING_MEDIA_SINKS); 509 event_page_request_manager_->SetWakeReason(
510 MediaRouteProviderWakeReason::STOP_OBSERVING_MEDIA_SINKS);
510 // The |sinks_queries_| entry will be removed in the immediate or deferred 511 // The |sinks_queries_| entry will be removed in the immediate or deferred
511 // |DoStopObservingMediaSinks| call. 512 // |DoStopObservingMediaSinks| call.
512 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoStopObservingMediaSinks, 513 event_page_request_manager_->RunOrDefer(
513 base::Unretained(this), source_id)); 514 base::BindOnce(&MediaRouterMojoImpl::DoStopObservingMediaSinks,
515 weak_factory_.GetWeakPtr(), source_id));
514 } else { 516 } else {
515 sinks_queries_.erase(source_id); 517 sinks_queries_.erase(source_id);
516 } 518 }
517 } 519 }
518 } 520 }
519 521
520 void MediaRouterMojoImpl::RegisterMediaRoutesObserver( 522 void MediaRouterMojoImpl::RegisterMediaRoutesObserver(
521 MediaRoutesObserver* observer) { 523 MediaRoutesObserver* observer) {
522 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 524 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
523 const MediaSource::Id source_id = observer->source_id(); 525 const MediaSource::Id source_id = observer->source_id();
524 auto& routes_query = routes_queries_[source_id]; 526 auto& routes_query = routes_queries_[source_id];
525 bool is_new_query = false; 527 bool is_new_query = false;
526 if (!routes_query) { 528 if (!routes_query) {
527 is_new_query = true; 529 is_new_query = true;
528 routes_query = base::MakeUnique<MediaRoutesQuery>(); 530 routes_query = base::MakeUnique<MediaRoutesQuery>();
529 } else { 531 } else {
530 DCHECK(!routes_query->observers.HasObserver(observer)); 532 DCHECK(!routes_query->observers.HasObserver(observer));
531 } 533 }
532 534
533 routes_query->observers.AddObserver(observer); 535 routes_query->observers.AddObserver(observer);
534 if (is_new_query) { 536 if (is_new_query) {
535 SetWakeReason(MediaRouteProviderWakeReason::START_OBSERVING_MEDIA_ROUTES); 537 event_page_request_manager_->SetWakeReason(
536 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaRoutes, 538 MediaRouteProviderWakeReason::START_OBSERVING_MEDIA_ROUTES);
537 base::Unretained(this), source_id)); 539 event_page_request_manager_->RunOrDefer(
540 base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaRoutes,
541 weak_factory_.GetWeakPtr(), source_id));
538 // The MRPM will call MediaRouterMojoImpl::OnRoutesUpdated() soon, if there 542 // The MRPM will call MediaRouterMojoImpl::OnRoutesUpdated() soon, if there
539 // are any existing routes the new observer should be aware of. 543 // are any existing routes the new observer should be aware of.
540 } else if (routes_query->cached_route_list) { 544 } else if (routes_query->cached_route_list) {
541 // Return to the event loop before notifying of a cached route list because 545 // Return to the event loop before notifying of a cached route list because
542 // MediaRoutesObserver is calling this method from its constructor, and that 546 // MediaRoutesObserver is calling this method from its constructor, and that
543 // must complete before invoking its virtual OnRoutesUpdated() method. 547 // must complete before invoking its virtual OnRoutesUpdated() method.
544 content::BrowserThread::PostTask( 548 content::BrowserThread::PostTask(
545 content::BrowserThread::UI, FROM_HERE, 549 content::BrowserThread::UI, FROM_HERE,
546 base::BindOnce(&MediaRouterMojoImpl::NotifyOfExistingRoutesIfRegistered, 550 base::BindOnce(&MediaRouterMojoImpl::NotifyOfExistingRoutesIfRegistered,
547 weak_factory_.GetWeakPtr(), source_id, observer)); 551 weak_factory_.GetWeakPtr(), source_id, observer));
(...skipping 26 matching lines...) Expand all
574 !it->second->observers.HasObserver(observer)) { 578 !it->second->observers.HasObserver(observer)) {
575 return; 579 return;
576 } 580 }
577 581
578 // If we are removing the final observer for the source, then stop 582 // If we are removing the final observer for the source, then stop
579 // observing routes for it. 583 // observing routes for it.
580 // might_have_observers() is reliable here on the assumption that this call 584 // might_have_observers() is reliable here on the assumption that this call
581 // is not inside the ObserverList iteration. 585 // is not inside the ObserverList iteration.
582 it->second->observers.RemoveObserver(observer); 586 it->second->observers.RemoveObserver(observer);
583 if (!it->second->observers.might_have_observers()) { 587 if (!it->second->observers.might_have_observers()) {
584 SetWakeReason(MediaRouteProviderWakeReason::STOP_OBSERVING_MEDIA_ROUTES); 588 event_page_request_manager_->SetWakeReason(
585 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoStopObservingMediaRoutes, 589 MediaRouteProviderWakeReason::STOP_OBSERVING_MEDIA_ROUTES);
586 base::Unretained(this), source_id)); 590 event_page_request_manager_->RunOrDefer(
591 base::BindOnce(&MediaRouterMojoImpl::DoStopObservingMediaRoutes,
592 weak_factory_.GetWeakPtr(), source_id));
587 } 593 }
588 } 594 }
589 595
590 void MediaRouterMojoImpl::RegisterIssuesObserver(IssuesObserver* observer) { 596 void MediaRouterMojoImpl::RegisterIssuesObserver(IssuesObserver* observer) {
591 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 597 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
592 issue_manager_.RegisterObserver(observer); 598 issue_manager_.RegisterObserver(observer);
593 } 599 }
594 600
595 void MediaRouterMojoImpl::UnregisterIssuesObserver(IssuesObserver* observer) { 601 void MediaRouterMojoImpl::UnregisterIssuesObserver(IssuesObserver* observer) {
596 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 602 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
597 issue_manager_.UnregisterObserver(observer); 603 issue_manager_.UnregisterObserver(observer);
598 } 604 }
599 605
600 void MediaRouterMojoImpl::RegisterRouteMessageObserver( 606 void MediaRouterMojoImpl::RegisterRouteMessageObserver(
601 RouteMessageObserver* observer) { 607 RouteMessageObserver* observer) {
602 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 608 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
603 DCHECK(observer); 609 DCHECK(observer);
604 const MediaRoute::Id& route_id = observer->route_id(); 610 const MediaRoute::Id& route_id = observer->route_id();
605 auto& observer_list = message_observers_[route_id]; 611 auto& observer_list = message_observers_[route_id];
606 if (!observer_list) { 612 if (!observer_list) {
607 observer_list = 613 observer_list =
608 base::MakeUnique<base::ObserverList<RouteMessageObserver>>(); 614 base::MakeUnique<base::ObserverList<RouteMessageObserver>>();
609 } else { 615 } else {
610 DCHECK(!observer_list->HasObserver(observer)); 616 DCHECK(!observer_list->HasObserver(observer));
611 } 617 }
612 618
613 bool should_listen = !observer_list->might_have_observers(); 619 bool should_listen = !observer_list->might_have_observers();
614 observer_list->AddObserver(observer); 620 observer_list->AddObserver(observer);
615 if (should_listen) { 621 if (should_listen) {
616 SetWakeReason( 622 event_page_request_manager_->SetWakeReason(
617 MediaRouteProviderWakeReason::START_LISTENING_FOR_ROUTE_MESSAGES); 623 MediaRouteProviderWakeReason::START_LISTENING_FOR_ROUTE_MESSAGES);
618 RunOrDefer( 624 event_page_request_manager_->RunOrDefer(
619 base::Bind(&MediaRouterMojoImpl::DoStartListeningForRouteMessages, 625 base::Bind(&MediaRouterMojoImpl::DoStartListeningForRouteMessages,
620 base::Unretained(this), route_id)); 626 weak_factory_.GetWeakPtr(), route_id));
621 } 627 }
622 } 628 }
623 629
624 void MediaRouterMojoImpl::UnregisterRouteMessageObserver( 630 void MediaRouterMojoImpl::UnregisterRouteMessageObserver(
625 RouteMessageObserver* observer) { 631 RouteMessageObserver* observer) {
626 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 632 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
627 DCHECK(observer); 633 DCHECK(observer);
628 634
629 const MediaRoute::Id& route_id = observer->route_id(); 635 const MediaRoute::Id& route_id = observer->route_id();
630 auto it = message_observers_.find(route_id); 636 auto it = message_observers_.find(route_id);
631 if (it == message_observers_.end() || !it->second->HasObserver(observer)) 637 if (it == message_observers_.end() || !it->second->HasObserver(observer))
632 return; 638 return;
633 639
634 it->second->RemoveObserver(observer); 640 it->second->RemoveObserver(observer);
635 if (!it->second->might_have_observers()) { 641 if (!it->second->might_have_observers()) {
636 message_observers_.erase(route_id); 642 message_observers_.erase(route_id);
637 SetWakeReason( 643 event_page_request_manager_->SetWakeReason(
638 MediaRouteProviderWakeReason::STOP_LISTENING_FOR_ROUTE_MESSAGES); 644 MediaRouteProviderWakeReason::STOP_LISTENING_FOR_ROUTE_MESSAGES);
639 RunOrDefer( 645 event_page_request_manager_->RunOrDefer(
640 base::BindOnce(&MediaRouterMojoImpl::DoStopListeningForRouteMessages, 646 base::BindOnce(&MediaRouterMojoImpl::DoStopListeningForRouteMessages,
641 base::Unretained(this), route_id)); 647 weak_factory_.GetWeakPtr(), route_id));
642 } 648 }
643 } 649 }
644 650
645 void MediaRouterMojoImpl::DetachRouteController( 651 void MediaRouterMojoImpl::DetachRouteController(
646 const MediaRoute::Id& route_id, 652 const MediaRoute::Id& route_id,
647 MediaRouteController* controller) { 653 MediaRouteController* controller) {
648 auto it = route_controllers_.find(route_id); 654 auto it = route_controllers_.find(route_id);
649 if (it != route_controllers_.end() && it->second == controller) 655 if (it != route_controllers_.end() && it->second == controller)
650 route_controllers_.erase(it); 656 route_controllers_.erase(it);
651 } 657 }
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
812 // Sinks are no longer available. MRPM has already removed all sink queries. 818 // Sinks are no longer available. MRPM has already removed all sink queries.
813 for (auto& source_and_query : sinks_queries_) { 819 for (auto& source_and_query : sinks_queries_) {
814 const auto& query = source_and_query.second; 820 const auto& query = source_and_query.second;
815 query->is_active = false; 821 query->is_active = false;
816 query->cached_sink_list = base::nullopt; 822 query->cached_sink_list = base::nullopt;
817 query->origins.clear(); 823 query->origins.clear();
818 } 824 }
819 } else { 825 } else {
820 // Sinks are now available. Tell MRPM to start all sink queries again. 826 // Sinks are now available. Tell MRPM to start all sink queries again.
821 for (const auto& source_and_query : sinks_queries_) { 827 for (const auto& source_and_query : sinks_queries_) {
822 RunOrDefer( 828 event_page_request_manager_->RunOrDefer(
823 base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaSinks, 829 base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaSinks,
824 base::Unretained(this), source_and_query.first)); 830 base::Unretained(this), source_and_query.first));
825 } 831 }
826 } 832 }
827 } 833 }
828 834
829 void MediaRouterMojoImpl::OnPresentationConnectionStateChanged( 835 void MediaRouterMojoImpl::OnPresentationConnectionStateChanged(
830 const std::string& route_id, 836 const std::string& route_id,
831 content::PresentationConnectionState state) { 837 content::PresentationConnectionState state) {
832 NotifyPresentationConnectionStateChange(route_id, state); 838 NotifyPresentationConnectionStateChange(route_id, state);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 if (it == routes_queries_.end() || 916 if (it == routes_queries_.end() ||
911 it->second->observers.might_have_observers()) { 917 it->second->observers.might_have_observers()) {
912 return; 918 return;
913 } 919 }
914 920
915 DVLOG_WITH_INSTANCE(1) << "MRPM.StopObservingMediaRoutes: " << source_id; 921 DVLOG_WITH_INSTANCE(1) << "MRPM.StopObservingMediaRoutes: " << source_id;
916 media_route_provider_->StopObservingMediaRoutes(source_id); 922 media_route_provider_->StopObservingMediaRoutes(source_id);
917 routes_queries_.erase(source_id); 923 routes_queries_.erase(source_id);
918 } 924 }
919 925
920 void MediaRouterMojoImpl::EnqueueTask(base::OnceClosure closure) {
921 pending_requests_.push_back(std::move(closure));
922 if (pending_requests_.size() > kMaxPendingRequests) {
923 DLOG_WITH_INSTANCE(ERROR) << "Reached max queue size. Dropping oldest "
924 << "request.";
925 pending_requests_.pop_front();
926 }
927 DVLOG_WITH_INSTANCE(2) << "EnqueueTask (queue-length="
928 << pending_requests_.size() << ")";
929 }
930
931 void MediaRouterMojoImpl::RunOrDefer(base::OnceClosure request) {
932 DCHECK(event_page_tracker_);
933
934 if (media_route_provider_extension_id_.empty()) {
935 DVLOG_WITH_INSTANCE(1) << "Extension ID not known yet.";
936 EnqueueTask(std::move(request));
937 } else if (event_page_tracker_->IsEventPageSuspended(
938 media_route_provider_extension_id_)) {
939 DVLOG_WITH_INSTANCE(1) << "Waking event page.";
940 EnqueueTask(std::move(request));
941 AttemptWakeEventPage();
942 media_route_provider_.reset();
943 } else if (!media_route_provider_) {
944 DVLOG_WITH_INSTANCE(1) << "Extension is awake, awaiting ProvideMediaRouter "
945 " to be called.";
946 EnqueueTask(std::move(request));
947 } else {
948 std::move(request).Run();
949 }
950 }
951
952 void MediaRouterMojoImpl::AttemptWakeEventPage() {
953 ++wakeup_attempt_count_;
954 if (wakeup_attempt_count_ > kMaxWakeupAttemptCount) {
955 DLOG_WITH_INSTANCE(ERROR) << "Attempted too many times to wake up event "
956 << "page.";
957 DrainPendingRequests();
958 wakeup_attempt_count_ = 0;
959 MediaRouterMojoMetrics::RecordMediaRouteProviderWakeup(
960 MediaRouteProviderWakeup::ERROR_TOO_MANY_RETRIES);
961 return;
962 }
963
964 DVLOG_WITH_INSTANCE(1) << "Attempting to wake up event page: attempt "
965 << wakeup_attempt_count_;
966
967 // This return false if the extension is already awake.
968 // Callback is bound using WeakPtr because |event_page_tracker_| outlives
969 // |this|.
970 if (!event_page_tracker_->WakeEventPage(
971 media_route_provider_extension_id_,
972 base::Bind(&MediaRouterMojoImpl::EventPageWakeComplete,
973 weak_factory_.GetWeakPtr()))) {
974 DLOG_WITH_INSTANCE(ERROR) << "Failed to schedule a wakeup for event page.";
975 }
976 }
977
978 void MediaRouterMojoImpl::ExecutePendingRequests() {
979 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
980 DCHECK(media_route_provider_);
981 DCHECK(event_page_tracker_);
982 DCHECK(!media_route_provider_extension_id_.empty());
983
984 for (auto& next_request : pending_requests_)
985 std::move(next_request).Run();
986
987 pending_requests_.clear();
988 }
989
990 void MediaRouterMojoImpl::SyncStateToMediaRouteProvider() { 926 void MediaRouterMojoImpl::SyncStateToMediaRouteProvider() {
991 DCHECK(media_route_provider_); 927 DCHECK(media_route_provider_);
992 928
993 // Sink queries. 929 // Sink queries.
994 if (availability_ != mojom::MediaRouter::SinkAvailability::UNAVAILABLE) { 930 if (availability_ != mojom::MediaRouter::SinkAvailability::UNAVAILABLE) {
995 for (const auto& it : sinks_queries_) { 931 for (const auto& it : sinks_queries_) {
996 DoStartObservingMediaSinks(it.first); 932 DoStartObservingMediaSinks(it.first);
997 } 933 }
998 } 934 }
999 935
(...skipping 15 matching lines...) Expand all
1015 // discovery when it wakes up, has been upgraded, etc. 951 // discovery when it wakes up, has been upgraded, etc.
1016 if (should_enable_mdns_discovery_) { 952 if (should_enable_mdns_discovery_) {
1017 DoEnsureMdnsDiscoveryEnabled(); 953 DoEnsureMdnsDiscoveryEnabled();
1018 } 954 }
1019 #endif 955 #endif
1020 956
1021 if (media_router::DialLocalDiscoveryEnabled()) 957 if (media_router::DialLocalDiscoveryEnabled())
1022 StartDiscovery(); 958 StartDiscovery();
1023 } 959 }
1024 960
1025 void MediaRouterMojoImpl::EventPageWakeComplete(bool success) {
1026 if (success) {
1027 MediaRouterMojoMetrics::RecordMediaRouteProviderWakeReason(
1028 current_wake_reason_);
1029 ClearWakeReason();
1030 MediaRouterMojoMetrics::RecordMediaRouteProviderWakeup(
1031 MediaRouteProviderWakeup::SUCCESS);
1032 return;
1033 }
1034
1035 // This is likely an non-retriable error. Drop the pending requests.
1036 DLOG_WITH_INSTANCE(ERROR)
1037 << "An error encountered while waking the event page.";
1038 ClearWakeReason();
1039 DrainPendingRequests();
1040 MediaRouterMojoMetrics::RecordMediaRouteProviderWakeup(
1041 MediaRouteProviderWakeup::ERROR_UNKNOWN);
1042 }
1043
1044 void MediaRouterMojoImpl::DrainPendingRequests() {
1045 DLOG_WITH_INSTANCE(ERROR)
1046 << "Draining request queue. (queue-length=" << pending_requests_.size()
1047 << ")";
1048 pending_requests_.clear();
1049 }
1050
1051 void MediaRouterMojoImpl::SetWakeReason(MediaRouteProviderWakeReason reason) {
1052 DCHECK(reason != MediaRouteProviderWakeReason::TOTAL_COUNT);
1053 if (current_wake_reason_ == MediaRouteProviderWakeReason::TOTAL_COUNT)
1054 current_wake_reason_ = reason;
1055 }
1056
1057 void MediaRouterMojoImpl::ClearWakeReason() {
1058 DCHECK(current_wake_reason_ != MediaRouteProviderWakeReason::TOTAL_COUNT);
1059 current_wake_reason_ = MediaRouteProviderWakeReason::TOTAL_COUNT;
1060 }
1061
1062 #if defined(OS_WIN) 961 #if defined(OS_WIN)
1063 void MediaRouterMojoImpl::EnsureMdnsDiscoveryEnabled() { 962 void MediaRouterMojoImpl::EnsureMdnsDiscoveryEnabled() {
1064 if (is_mdns_enabled_) 963 if (is_mdns_enabled_)
1065 return; 964 return;
1066 965
1067 SetWakeReason(MediaRouteProviderWakeReason::ENABLE_MDNS_DISCOVERY); 966 event_page_request_manager_->SetWakeReason(
1068 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoEnsureMdnsDiscoveryEnabled, 967 MediaRouteProviderWakeReason::ENABLE_MDNS_DISCOVERY);
1069 base::Unretained(this))); 968 event_page_request_manager_->RunOrDefer(
969 base::BindOnce(&MediaRouterMojoImpl::DoEnsureMdnsDiscoveryEnabled,
970 weak_factory_.GetWeakPtr()));
1070 should_enable_mdns_discovery_ = true; 971 should_enable_mdns_discovery_ = true;
1071 } 972 }
1072 973
1073 void MediaRouterMojoImpl::DoEnsureMdnsDiscoveryEnabled() { 974 void MediaRouterMojoImpl::DoEnsureMdnsDiscoveryEnabled() {
1074 DVLOG_WITH_INSTANCE(1) << "DoEnsureMdnsDiscoveryEnabled"; 975 DVLOG_WITH_INSTANCE(1) << "DoEnsureMdnsDiscoveryEnabled";
1075 if (!is_mdns_enabled_) { 976 if (!is_mdns_enabled_) {
1076 media_route_provider_->EnableMdnsDiscovery(); 977 media_route_provider_->EnableMdnsDiscovery();
1077 is_mdns_enabled_ = true; 978 is_mdns_enabled_ = true;
1078 } 979 }
1079 } 980 }
(...skipping 14 matching lines...) Expand all
1094 base::Bind(&MediaRouterMojoImpl::ProvideSinks, 995 base::Bind(&MediaRouterMojoImpl::ProvideSinks,
1095 weak_factory_.GetWeakPtr(), "dial"), 996 weak_factory_.GetWeakPtr(), "dial"),
1096 context_); 997 context_);
1097 } 998 }
1098 999
1099 dial_media_sink_service_proxy_->Start(); 1000 dial_media_sink_service_proxy_->Start();
1100 } 1001 }
1101 1002
1102 void MediaRouterMojoImpl::UpdateMediaSinks( 1003 void MediaRouterMojoImpl::UpdateMediaSinks(
1103 const MediaSource::Id& source_id) { 1004 const MediaSource::Id& source_id) {
1104 SetWakeReason(MediaRouteProviderWakeReason::UPDATE_MEDIA_SINKS); 1005 event_page_request_manager_->SetWakeReason(
1105 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoUpdateMediaSinks, 1006 MediaRouteProviderWakeReason::UPDATE_MEDIA_SINKS);
1106 base::Unretained(this), source_id)); 1007 event_page_request_manager_->RunOrDefer(
1008 base::BindOnce(&MediaRouterMojoImpl::DoUpdateMediaSinks,
1009 weak_factory_.GetWeakPtr(), source_id));
1107 } 1010 }
1108 1011
1109 void MediaRouterMojoImpl::DoUpdateMediaSinks( 1012 void MediaRouterMojoImpl::DoUpdateMediaSinks(
1110 const MediaSource::Id& source_id) { 1013 const MediaSource::Id& source_id) {
1111 DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks: " << source_id; 1014 DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks: " << source_id;
1112 media_route_provider_->UpdateMediaSinks(source_id); 1015 media_route_provider_->UpdateMediaSinks(source_id);
1113 } 1016 }
1114 1017
1115 void MediaRouterMojoImpl::RemoveInvalidRouteControllers( 1018 void MediaRouterMojoImpl::RemoveInvalidRouteControllers(
1116 const std::vector<MediaRoute>& routes) { 1019 const std::vector<MediaRoute>& routes) {
(...skipping 10 matching lines...) Expand all
1127 1030
1128 void MediaRouterMojoImpl::OnMediaControllerCreated( 1031 void MediaRouterMojoImpl::OnMediaControllerCreated(
1129 const MediaRoute::Id& route_id, 1032 const MediaRoute::Id& route_id,
1130 bool success) { 1033 bool success) {
1131 DVLOG_WITH_INSTANCE(1) << "OnMediaControllerCreated: " << route_id 1034 DVLOG_WITH_INSTANCE(1) << "OnMediaControllerCreated: " << route_id
1132 << (success ? " was successful." : " failed."); 1035 << (success ? " was successful." : " failed.");
1133 MediaRouterMojoMetrics::RecordMediaRouteControllerCreationResult(success); 1036 MediaRouterMojoMetrics::RecordMediaRouteControllerCreationResult(success);
1134 } 1037 }
1135 1038
1136 } // namespace media_router 1039 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698