| OLD | NEW |
| 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::BindOnce(&MediaRouterMojoImpl::OnFirewallCheckComplete, | 78 base::BindOnce(&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 Loading... |
| 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()); |
| 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 Loading... |
| 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() |
| 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 Loading... |
| 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); | |
| 290 int tab_id = SessionTabHelper::IdForTab(web_contents); | 272 int tab_id = SessionTabHelper::IdForTab(web_contents); |
| 291 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoCreateRoute, | 273 event_page_request_manager_->RunOrDefer( |
| 292 base::Unretained(this), source_id, sink_id, origin, | 274 base::BindOnce(&MediaRouterMojoImpl::DoCreateRoute, |
| 293 tab_id, std::move(callbacks), timeout, incognito)); | 275 weak_factory_.GetWeakPtr(), source_id, sink_id, origin, |
| 276 tab_id, std::move(callbacks), timeout, incognito), |
| 277 MediaRouteProviderWakeReason::CREATE_ROUTE); |
| 294 } | 278 } |
| 295 | 279 |
| 296 void MediaRouterMojoImpl::JoinRoute( | 280 void MediaRouterMojoImpl::JoinRoute( |
| 297 const MediaSource::Id& source_id, | 281 const MediaSource::Id& source_id, |
| 298 const std::string& presentation_id, | 282 const std::string& presentation_id, |
| 299 const url::Origin& origin, | 283 const url::Origin& origin, |
| 300 content::WebContents* web_contents, | 284 content::WebContents* web_contents, |
| 301 std::vector<MediaRouteResponseCallback> callbacks, | 285 std::vector<MediaRouteResponseCallback> callbacks, |
| 302 base::TimeDelta timeout, | 286 base::TimeDelta timeout, |
| 303 bool incognito) { | 287 bool incognito) { |
| 304 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 288 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 305 | 289 |
| 306 if (!HasJoinableRoute()) { | 290 if (!HasJoinableRoute()) { |
| 307 DVLOG_WITH_INSTANCE(1) << "No joinable routes"; | 291 DVLOG_WITH_INSTANCE(1) << "No joinable routes"; |
| 308 std::unique_ptr<RouteRequestResult> result = RouteRequestResult::FromError( | 292 std::unique_ptr<RouteRequestResult> result = RouteRequestResult::FromError( |
| 309 "Route not found", RouteRequestResult::ROUTE_NOT_FOUND); | 293 "Route not found", RouteRequestResult::ROUTE_NOT_FOUND); |
| 310 MediaRouterMojoMetrics::RecordJoinRouteResultCode(result->result_code()); | 294 MediaRouterMojoMetrics::RecordJoinRouteResultCode(result->result_code()); |
| 311 RunRouteRequestCallbacks(std::move(result), std::move(callbacks)); | 295 RunRouteRequestCallbacks(std::move(result), std::move(callbacks)); |
| 312 return; | 296 return; |
| 313 } | 297 } |
| 314 | 298 |
| 315 SetWakeReason(MediaRouteProviderWakeReason::JOIN_ROUTE); | |
| 316 int tab_id = SessionTabHelper::IdForTab(web_contents); | 299 int tab_id = SessionTabHelper::IdForTab(web_contents); |
| 317 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoJoinRoute, | 300 event_page_request_manager_->RunOrDefer( |
| 318 base::Unretained(this), source_id, presentation_id, | 301 base::BindOnce(&MediaRouterMojoImpl::DoJoinRoute, |
| 319 origin, tab_id, std::move(callbacks), timeout, | 302 weak_factory_.GetWeakPtr(), source_id, presentation_id, |
| 320 incognito)); | 303 origin, tab_id, std::move(callbacks), timeout, incognito), |
| 304 MediaRouteProviderWakeReason::JOIN_ROUTE); |
| 321 } | 305 } |
| 322 | 306 |
| 323 void MediaRouterMojoImpl::ConnectRouteByRouteId( | 307 void MediaRouterMojoImpl::ConnectRouteByRouteId( |
| 324 const MediaSource::Id& source_id, | 308 const MediaSource::Id& source_id, |
| 325 const MediaRoute::Id& route_id, | 309 const MediaRoute::Id& route_id, |
| 326 const url::Origin& origin, | 310 const url::Origin& origin, |
| 327 content::WebContents* web_contents, | 311 content::WebContents* web_contents, |
| 328 std::vector<MediaRouteResponseCallback> callbacks, | 312 std::vector<MediaRouteResponseCallback> callbacks, |
| 329 base::TimeDelta timeout, | 313 base::TimeDelta timeout, |
| 330 bool incognito) { | 314 bool incognito) { |
| 331 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 315 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 332 | 316 |
| 333 SetWakeReason(MediaRouteProviderWakeReason::CONNECT_ROUTE_BY_ROUTE_ID); | |
| 334 int tab_id = SessionTabHelper::IdForTab(web_contents); | 317 int tab_id = SessionTabHelper::IdForTab(web_contents); |
| 335 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoConnectRouteByRouteId, | 318 event_page_request_manager_->RunOrDefer( |
| 336 base::Unretained(this), source_id, route_id, origin, | 319 base::BindOnce(&MediaRouterMojoImpl::DoConnectRouteByRouteId, |
| 337 tab_id, std::move(callbacks), timeout, incognito)); | 320 weak_factory_.GetWeakPtr(), source_id, route_id, origin, |
| 321 tab_id, std::move(callbacks), timeout, incognito), |
| 322 MediaRouteProviderWakeReason::CONNECT_ROUTE_BY_ROUTE_ID); |
| 338 } | 323 } |
| 339 | 324 |
| 340 void MediaRouterMojoImpl::TerminateRoute(const MediaRoute::Id& route_id) { | 325 void MediaRouterMojoImpl::TerminateRoute(const MediaRoute::Id& route_id) { |
| 341 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 326 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 342 DVLOG(2) << "TerminateRoute " << route_id; | 327 DVLOG(2) << "TerminateRoute " << route_id; |
| 343 SetWakeReason(MediaRouteProviderWakeReason::TERMINATE_ROUTE); | 328 event_page_request_manager_->RunOrDefer( |
| 344 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoTerminateRoute, | 329 base::BindOnce(&MediaRouterMojoImpl::DoTerminateRoute, |
| 345 base::Unretained(this), route_id)); | 330 weak_factory_.GetWeakPtr(), route_id), |
| 331 MediaRouteProviderWakeReason::TERMINATE_ROUTE); |
| 346 } | 332 } |
| 347 | 333 |
| 348 void MediaRouterMojoImpl::DetachRoute(const MediaRoute::Id& route_id) { | 334 void MediaRouterMojoImpl::DetachRoute(const MediaRoute::Id& route_id) { |
| 349 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 335 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 350 | 336 |
| 351 SetWakeReason(MediaRouteProviderWakeReason::DETACH_ROUTE); | 337 event_page_request_manager_->RunOrDefer( |
| 352 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoDetachRoute, | 338 base::BindOnce(&MediaRouterMojoImpl::DoDetachRoute, |
| 353 base::Unretained(this), route_id)); | 339 weak_factory_.GetWeakPtr(), route_id), |
| 340 MediaRouteProviderWakeReason::DETACH_ROUTE); |
| 354 } | 341 } |
| 355 | 342 |
| 356 void MediaRouterMojoImpl::SendRouteMessage(const MediaRoute::Id& route_id, | 343 void MediaRouterMojoImpl::SendRouteMessage(const MediaRoute::Id& route_id, |
| 357 const std::string& message, | 344 const std::string& message, |
| 358 SendRouteMessageCallback callback) { | 345 SendRouteMessageCallback callback) { |
| 359 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 346 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 360 | 347 |
| 361 SetWakeReason(MediaRouteProviderWakeReason::SEND_SESSION_MESSAGE); | 348 event_page_request_manager_->RunOrDefer( |
| 362 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoSendSessionMessage, | 349 base::BindOnce(&MediaRouterMojoImpl::DoSendSessionMessage, |
| 363 base::Unretained(this), route_id, message, | 350 weak_factory_.GetWeakPtr(), route_id, message, |
| 364 std::move(callback))); | 351 std::move(callback)), |
| 352 MediaRouteProviderWakeReason::SEND_SESSION_MESSAGE); |
| 365 } | 353 } |
| 366 | 354 |
| 367 void MediaRouterMojoImpl::SendRouteBinaryMessage( | 355 void MediaRouterMojoImpl::SendRouteBinaryMessage( |
| 368 const MediaRoute::Id& route_id, | 356 const MediaRoute::Id& route_id, |
| 369 std::unique_ptr<std::vector<uint8_t>> data, | 357 std::unique_ptr<std::vector<uint8_t>> data, |
| 370 SendRouteMessageCallback callback) { | 358 SendRouteMessageCallback callback) { |
| 371 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 359 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 372 | 360 |
| 373 SetWakeReason(MediaRouteProviderWakeReason::SEND_SESSION_BINARY_MESSAGE); | 361 event_page_request_manager_->RunOrDefer( |
| 374 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoSendSessionBinaryMessage, | 362 base::BindOnce(&MediaRouterMojoImpl::DoSendSessionBinaryMessage, |
| 375 base::Unretained(this), route_id, std::move(data), | 363 weak_factory_.GetWeakPtr(), route_id, |
| 376 std::move(callback))); | 364 base::Passed(std::move(data)), std::move(callback)), |
| 365 MediaRouteProviderWakeReason::SEND_SESSION_BINARY_MESSAGE); |
| 377 } | 366 } |
| 378 | 367 |
| 379 void MediaRouterMojoImpl::AddIssue(const IssueInfo& issue_info) { | 368 void MediaRouterMojoImpl::AddIssue(const IssueInfo& issue_info) { |
| 380 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 369 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 381 issue_manager_.AddIssue(issue_info); | 370 issue_manager_.AddIssue(issue_info); |
| 382 } | 371 } |
| 383 | 372 |
| 384 void MediaRouterMojoImpl::ClearIssue(const Issue::Id& issue_id) { | 373 void MediaRouterMojoImpl::ClearIssue(const Issue::Id& issue_id) { |
| 385 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 374 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 386 issue_manager_.ClearIssue(issue_id); | 375 issue_manager_.ClearIssue(issue_id); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 397 } | 386 } |
| 398 | 387 |
| 399 void MediaRouterMojoImpl::SearchSinks( | 388 void MediaRouterMojoImpl::SearchSinks( |
| 400 const MediaSink::Id& sink_id, | 389 const MediaSink::Id& sink_id, |
| 401 const MediaSource::Id& source_id, | 390 const MediaSource::Id& source_id, |
| 402 const std::string& search_input, | 391 const std::string& search_input, |
| 403 const std::string& domain, | 392 const std::string& domain, |
| 404 MediaSinkSearchResponseCallback sink_callback) { | 393 MediaSinkSearchResponseCallback sink_callback) { |
| 405 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 394 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 406 | 395 |
| 407 SetWakeReason(MediaRouteProviderWakeReason::SEARCH_SINKS); | 396 event_page_request_manager_->RunOrDefer( |
| 408 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoSearchSinks, | 397 base::BindOnce(&MediaRouterMojoImpl::DoSearchSinks, |
| 409 base::Unretained(this), sink_id, source_id, | 398 weak_factory_.GetWeakPtr(), sink_id, source_id, |
| 410 search_input, domain, std::move(sink_callback))); | 399 search_input, domain, std::move(sink_callback)), |
| 400 MediaRouteProviderWakeReason::SEARCH_SINKS); |
| 411 } | 401 } |
| 412 | 402 |
| 413 scoped_refptr<MediaRouteController> MediaRouterMojoImpl::GetRouteController( | 403 scoped_refptr<MediaRouteController> MediaRouterMojoImpl::GetRouteController( |
| 414 const MediaRoute::Id& route_id) { | 404 const MediaRoute::Id& route_id) { |
| 415 if (!IsRouteKnown(route_id)) | 405 if (!IsRouteKnown(route_id)) |
| 416 return nullptr; | 406 return nullptr; |
| 417 | 407 |
| 418 auto it = route_controllers_.find(route_id); | 408 auto it = route_controllers_.find(route_id); |
| 419 if (it != route_controllers_.end()) | 409 if (it != route_controllers_.end()) |
| 420 return scoped_refptr<MediaRouteController>(it->second); | 410 return scoped_refptr<MediaRouteController>(it->second); |
| 421 | 411 |
| 422 mojom::MediaControllerPtr mojo_media_controller; | 412 mojom::MediaControllerPtr mojo_media_controller; |
| 423 mojom::MediaControllerRequest mojo_media_controller_request = | 413 mojom::MediaControllerRequest mojo_media_controller_request = |
| 424 mojo::MakeRequest(&mojo_media_controller); | 414 mojo::MakeRequest(&mojo_media_controller); |
| 425 scoped_refptr<MediaRouteController> route_controller = | 415 scoped_refptr<MediaRouteController> route_controller = |
| 426 new MediaRouteController(route_id, std::move(mojo_media_controller), | 416 new MediaRouteController(route_id, std::move(mojo_media_controller), |
| 427 this); | 417 this); |
| 428 | 418 |
| 429 SetWakeReason(MediaRouteProviderWakeReason::CREATE_MEDIA_ROUTE_CONTROLLER); | 419 event_page_request_manager_->RunOrDefer( |
| 430 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoCreateMediaRouteController, | 420 base::BindOnce(&MediaRouterMojoImpl::DoCreateMediaRouteController, |
| 431 base::Unretained(this), route_id, | 421 weak_factory_.GetWeakPtr(), route_id, |
| 432 std::move(mojo_media_controller_request), | 422 std::move(mojo_media_controller_request), |
| 433 route_controller->BindObserverPtr())); | 423 route_controller->BindObserverPtr()), |
| 424 MediaRouteProviderWakeReason::CREATE_MEDIA_ROUTE_CONTROLLER); |
| 434 route_controllers_.emplace(route_id, route_controller.get()); | 425 route_controllers_.emplace(route_id, route_controller.get()); |
| 435 return route_controller; | 426 return route_controller; |
| 436 } | 427 } |
| 437 | 428 |
| 438 void MediaRouterMojoImpl::ProvideSinks(const std::string& provider_name, | 429 void MediaRouterMojoImpl::ProvideSinks(const std::string& provider_name, |
| 439 std::vector<MediaSinkInternal> sinks) { | 430 std::vector<MediaSinkInternal> sinks) { |
| 440 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 431 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 441 DVLOG_WITH_INSTANCE(1) << "OnDialMediaSinkDiscovered found " << sinks.size() | 432 DVLOG_WITH_INSTANCE(1) << "OnDialMediaSinkDiscovered found " << sinks.size() |
| 442 << " devices..."; | 433 << " devices..."; |
| 443 | 434 |
| 444 SetWakeReason(MediaRouteProviderWakeReason::PROVIDE_SINKS); | 435 event_page_request_manager_->RunOrDefer( |
| 445 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoProvideSinks, | 436 base::Bind(&MediaRouterMojoImpl::DoProvideSinks, |
| 446 base::Unretained(this), provider_name, | 437 weak_factory_.GetWeakPtr(), provider_name, std::move(sinks)), |
| 447 std::move(sinks))); | 438 MediaRouteProviderWakeReason::PROVIDE_SINKS); |
| 448 } | 439 } |
| 449 | 440 |
| 450 bool MediaRouterMojoImpl::RegisterMediaSinksObserver( | 441 bool MediaRouterMojoImpl::RegisterMediaSinksObserver( |
| 451 MediaSinksObserver* observer) { | 442 MediaSinksObserver* observer) { |
| 452 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 443 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 453 | 444 |
| 454 // Create an observer list for the media source and add |observer| | 445 // Create an observer list for the media source and add |observer| |
| 455 // to it. Fail if |observer| is already registered. | 446 // to it. Fail if |observer| is already registered. |
| 456 const std::string& source_id = observer->source().id(); | 447 const std::string& source_id = observer->source().id(); |
| 457 std::unique_ptr<MediaSinksQuery>& sinks_query = sinks_queries_[source_id]; | 448 std::unique_ptr<MediaSinksQuery>& sinks_query = sinks_queries_[source_id]; |
| 458 bool is_new_query = false; | 449 bool is_new_query = false; |
| 459 if (!sinks_query) { | 450 if (!sinks_query) { |
| 460 is_new_query = true; | 451 is_new_query = true; |
| 461 sinks_query = base::MakeUnique<MediaSinksQuery>(); | 452 sinks_query = base::MakeUnique<MediaSinksQuery>(); |
| 462 } else { | 453 } else { |
| 463 DCHECK(!sinks_query->observers.HasObserver(observer)); | 454 DCHECK(!sinks_query->observers.HasObserver(observer)); |
| 464 } | 455 } |
| 465 | 456 |
| 466 // If sink availability is UNAVAILABLE, then there is no need to call MRPM. | 457 // If sink availability is UNAVAILABLE, then there is no need to call MRPM. |
| 467 // |observer| can be immediately notified with an empty list. | 458 // |observer| can be immediately notified with an empty list. |
| 468 sinks_query->observers.AddObserver(observer); | 459 sinks_query->observers.AddObserver(observer); |
| 469 if (availability_ == mojom::MediaRouter::SinkAvailability::UNAVAILABLE) { | 460 if (availability_ == mojom::MediaRouter::SinkAvailability::UNAVAILABLE) { |
| 470 observer->OnSinksUpdated(std::vector<MediaSink>(), | 461 observer->OnSinksUpdated(std::vector<MediaSink>(), |
| 471 std::vector<url::Origin>()); | 462 std::vector<url::Origin>()); |
| 472 } else { | 463 } else { |
| 473 // Need to call MRPM to start observing sinks if the query is new. | 464 // Need to call MRPM to start observing sinks if the query is new. |
| 474 if (is_new_query) { | 465 if (is_new_query) { |
| 475 SetWakeReason(MediaRouteProviderWakeReason::START_OBSERVING_MEDIA_SINKS); | 466 event_page_request_manager_->RunOrDefer( |
| 476 RunOrDefer( | |
| 477 base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaSinks, | 467 base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaSinks, |
| 478 base::Unretained(this), source_id)); | 468 weak_factory_.GetWeakPtr(), source_id), |
| 469 MediaRouteProviderWakeReason::START_OBSERVING_MEDIA_SINKS); |
| 479 } else if (sinks_query->cached_sink_list) { | 470 } else if (sinks_query->cached_sink_list) { |
| 480 observer->OnSinksUpdated(*sinks_query->cached_sink_list, | 471 observer->OnSinksUpdated(*sinks_query->cached_sink_list, |
| 481 sinks_query->origins); | 472 sinks_query->origins); |
| 482 } | 473 } |
| 483 } | 474 } |
| 484 return true; | 475 return true; |
| 485 } | 476 } |
| 486 | 477 |
| 487 void MediaRouterMojoImpl::UnregisterMediaSinksObserver( | 478 void MediaRouterMojoImpl::UnregisterMediaSinksObserver( |
| 488 MediaSinksObserver* observer) { | 479 MediaSinksObserver* observer) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 499 // observing sinks for it. | 490 // observing sinks for it. |
| 500 // might_have_observers() is reliable here on the assumption that this call | 491 // might_have_observers() is reliable here on the assumption that this call |
| 501 // is not inside the ObserverList iteration. | 492 // is not inside the ObserverList iteration. |
| 502 it->second->observers.RemoveObserver(observer); | 493 it->second->observers.RemoveObserver(observer); |
| 503 if (!it->second->observers.might_have_observers()) { | 494 if (!it->second->observers.might_have_observers()) { |
| 504 // Only ask MRPM to stop observing media sinks if the availability is not | 495 // Only ask MRPM to stop observing media sinks if the availability is not |
| 505 // UNAVAILABLE. | 496 // UNAVAILABLE. |
| 506 // Otherwise, the MRPM would have discarded the queries already. | 497 // Otherwise, the MRPM would have discarded the queries already. |
| 507 if (availability_ != | 498 if (availability_ != |
| 508 mojom::MediaRouter::SinkAvailability::UNAVAILABLE) { | 499 mojom::MediaRouter::SinkAvailability::UNAVAILABLE) { |
| 509 SetWakeReason(MediaRouteProviderWakeReason::STOP_OBSERVING_MEDIA_SINKS); | |
| 510 // The |sinks_queries_| entry will be removed in the immediate or deferred | 500 // The |sinks_queries_| entry will be removed in the immediate or deferred |
| 511 // |DoStopObservingMediaSinks| call. | 501 // |DoStopObservingMediaSinks| call. |
| 512 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoStopObservingMediaSinks, | 502 event_page_request_manager_->RunOrDefer( |
| 513 base::Unretained(this), source_id)); | 503 base::BindOnce(&MediaRouterMojoImpl::DoStopObservingMediaSinks, |
| 504 weak_factory_.GetWeakPtr(), source_id), |
| 505 MediaRouteProviderWakeReason::STOP_OBSERVING_MEDIA_SINKS); |
| 514 } else { | 506 } else { |
| 515 sinks_queries_.erase(source_id); | 507 sinks_queries_.erase(source_id); |
| 516 } | 508 } |
| 517 } | 509 } |
| 518 } | 510 } |
| 519 | 511 |
| 520 void MediaRouterMojoImpl::RegisterMediaRoutesObserver( | 512 void MediaRouterMojoImpl::RegisterMediaRoutesObserver( |
| 521 MediaRoutesObserver* observer) { | 513 MediaRoutesObserver* observer) { |
| 522 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 514 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 523 const MediaSource::Id source_id = observer->source_id(); | 515 const MediaSource::Id source_id = observer->source_id(); |
| 524 auto& routes_query = routes_queries_[source_id]; | 516 auto& routes_query = routes_queries_[source_id]; |
| 525 bool is_new_query = false; | 517 bool is_new_query = false; |
| 526 if (!routes_query) { | 518 if (!routes_query) { |
| 527 is_new_query = true; | 519 is_new_query = true; |
| 528 routes_query = base::MakeUnique<MediaRoutesQuery>(); | 520 routes_query = base::MakeUnique<MediaRoutesQuery>(); |
| 529 } else { | 521 } else { |
| 530 DCHECK(!routes_query->observers.HasObserver(observer)); | 522 DCHECK(!routes_query->observers.HasObserver(observer)); |
| 531 } | 523 } |
| 532 | 524 |
| 533 routes_query->observers.AddObserver(observer); | 525 routes_query->observers.AddObserver(observer); |
| 534 if (is_new_query) { | 526 if (is_new_query) { |
| 535 SetWakeReason(MediaRouteProviderWakeReason::START_OBSERVING_MEDIA_ROUTES); | 527 event_page_request_manager_->RunOrDefer( |
| 536 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaRoutes, | 528 base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaRoutes, |
| 537 base::Unretained(this), source_id)); | 529 weak_factory_.GetWeakPtr(), source_id), |
| 530 MediaRouteProviderWakeReason::START_OBSERVING_MEDIA_ROUTES); |
| 538 // The MRPM will call MediaRouterMojoImpl::OnRoutesUpdated() soon, if there | 531 // The MRPM will call MediaRouterMojoImpl::OnRoutesUpdated() soon, if there |
| 539 // are any existing routes the new observer should be aware of. | 532 // are any existing routes the new observer should be aware of. |
| 540 } else if (routes_query->cached_route_list) { | 533 } else if (routes_query->cached_route_list) { |
| 541 // Return to the event loop before notifying of a cached route list because | 534 // Return to the event loop before notifying of a cached route list because |
| 542 // MediaRoutesObserver is calling this method from its constructor, and that | 535 // MediaRoutesObserver is calling this method from its constructor, and that |
| 543 // must complete before invoking its virtual OnRoutesUpdated() method. | 536 // must complete before invoking its virtual OnRoutesUpdated() method. |
| 544 content::BrowserThread::PostTask( | 537 content::BrowserThread::PostTask( |
| 545 content::BrowserThread::UI, FROM_HERE, | 538 content::BrowserThread::UI, FROM_HERE, |
| 546 base::BindOnce(&MediaRouterMojoImpl::NotifyOfExistingRoutesIfRegistered, | 539 base::BindOnce(&MediaRouterMojoImpl::NotifyOfExistingRoutesIfRegistered, |
| 547 weak_factory_.GetWeakPtr(), source_id, observer)); | 540 weak_factory_.GetWeakPtr(), source_id, observer)); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 574 !it->second->observers.HasObserver(observer)) { | 567 !it->second->observers.HasObserver(observer)) { |
| 575 return; | 568 return; |
| 576 } | 569 } |
| 577 | 570 |
| 578 // If we are removing the final observer for the source, then stop | 571 // If we are removing the final observer for the source, then stop |
| 579 // observing routes for it. | 572 // observing routes for it. |
| 580 // might_have_observers() is reliable here on the assumption that this call | 573 // might_have_observers() is reliable here on the assumption that this call |
| 581 // is not inside the ObserverList iteration. | 574 // is not inside the ObserverList iteration. |
| 582 it->second->observers.RemoveObserver(observer); | 575 it->second->observers.RemoveObserver(observer); |
| 583 if (!it->second->observers.might_have_observers()) { | 576 if (!it->second->observers.might_have_observers()) { |
| 584 SetWakeReason(MediaRouteProviderWakeReason::STOP_OBSERVING_MEDIA_ROUTES); | 577 event_page_request_manager_->RunOrDefer( |
| 585 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoStopObservingMediaRoutes, | 578 base::BindOnce(&MediaRouterMojoImpl::DoStopObservingMediaRoutes, |
| 586 base::Unretained(this), source_id)); | 579 weak_factory_.GetWeakPtr(), source_id), |
| 580 MediaRouteProviderWakeReason::STOP_OBSERVING_MEDIA_ROUTES); |
| 587 } | 581 } |
| 588 } | 582 } |
| 589 | 583 |
| 590 void MediaRouterMojoImpl::RegisterIssuesObserver(IssuesObserver* observer) { | 584 void MediaRouterMojoImpl::RegisterIssuesObserver(IssuesObserver* observer) { |
| 591 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 585 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 592 issue_manager_.RegisterObserver(observer); | 586 issue_manager_.RegisterObserver(observer); |
| 593 } | 587 } |
| 594 | 588 |
| 595 void MediaRouterMojoImpl::UnregisterIssuesObserver(IssuesObserver* observer) { | 589 void MediaRouterMojoImpl::UnregisterIssuesObserver(IssuesObserver* observer) { |
| 596 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 590 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 597 issue_manager_.UnregisterObserver(observer); | 591 issue_manager_.UnregisterObserver(observer); |
| 598 } | 592 } |
| 599 | 593 |
| 600 void MediaRouterMojoImpl::RegisterRouteMessageObserver( | 594 void MediaRouterMojoImpl::RegisterRouteMessageObserver( |
| 601 RouteMessageObserver* observer) { | 595 RouteMessageObserver* observer) { |
| 602 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 596 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 603 DCHECK(observer); | 597 DCHECK(observer); |
| 604 const MediaRoute::Id& route_id = observer->route_id(); | 598 const MediaRoute::Id& route_id = observer->route_id(); |
| 605 auto& observer_list = message_observers_[route_id]; | 599 auto& observer_list = message_observers_[route_id]; |
| 606 if (!observer_list) { | 600 if (!observer_list) { |
| 607 observer_list = | 601 observer_list = |
| 608 base::MakeUnique<base::ObserverList<RouteMessageObserver>>(); | 602 base::MakeUnique<base::ObserverList<RouteMessageObserver>>(); |
| 609 } else { | 603 } else { |
| 610 DCHECK(!observer_list->HasObserver(observer)); | 604 DCHECK(!observer_list->HasObserver(observer)); |
| 611 } | 605 } |
| 612 | 606 |
| 613 bool should_listen = !observer_list->might_have_observers(); | 607 bool should_listen = !observer_list->might_have_observers(); |
| 614 observer_list->AddObserver(observer); | 608 observer_list->AddObserver(observer); |
| 615 if (should_listen) { | 609 if (should_listen) { |
| 616 SetWakeReason( | 610 event_page_request_manager_->RunOrDefer( |
| 611 base::Bind(&MediaRouterMojoImpl::DoStartListeningForRouteMessages, |
| 612 weak_factory_.GetWeakPtr(), route_id), |
| 617 MediaRouteProviderWakeReason::START_LISTENING_FOR_ROUTE_MESSAGES); | 613 MediaRouteProviderWakeReason::START_LISTENING_FOR_ROUTE_MESSAGES); |
| 618 RunOrDefer( | |
| 619 base::Bind(&MediaRouterMojoImpl::DoStartListeningForRouteMessages, | |
| 620 base::Unretained(this), route_id)); | |
| 621 } | 614 } |
| 622 } | 615 } |
| 623 | 616 |
| 624 void MediaRouterMojoImpl::UnregisterRouteMessageObserver( | 617 void MediaRouterMojoImpl::UnregisterRouteMessageObserver( |
| 625 RouteMessageObserver* observer) { | 618 RouteMessageObserver* observer) { |
| 626 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 619 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 627 DCHECK(observer); | 620 DCHECK(observer); |
| 628 | 621 |
| 629 const MediaRoute::Id& route_id = observer->route_id(); | 622 const MediaRoute::Id& route_id = observer->route_id(); |
| 630 auto it = message_observers_.find(route_id); | 623 auto it = message_observers_.find(route_id); |
| 631 if (it == message_observers_.end() || !it->second->HasObserver(observer)) | 624 if (it == message_observers_.end() || !it->second->HasObserver(observer)) |
| 632 return; | 625 return; |
| 633 | 626 |
| 634 it->second->RemoveObserver(observer); | 627 it->second->RemoveObserver(observer); |
| 635 if (!it->second->might_have_observers()) { | 628 if (!it->second->might_have_observers()) { |
| 636 message_observers_.erase(route_id); | 629 message_observers_.erase(route_id); |
| 637 SetWakeReason( | 630 event_page_request_manager_->RunOrDefer( |
| 631 base::BindOnce(&MediaRouterMojoImpl::DoStopListeningForRouteMessages, |
| 632 weak_factory_.GetWeakPtr(), route_id), |
| 638 MediaRouteProviderWakeReason::STOP_LISTENING_FOR_ROUTE_MESSAGES); | 633 MediaRouteProviderWakeReason::STOP_LISTENING_FOR_ROUTE_MESSAGES); |
| 639 RunOrDefer( | |
| 640 base::BindOnce(&MediaRouterMojoImpl::DoStopListeningForRouteMessages, | |
| 641 base::Unretained(this), route_id)); | |
| 642 } | 634 } |
| 643 } | 635 } |
| 644 | 636 |
| 645 void MediaRouterMojoImpl::DetachRouteController( | 637 void MediaRouterMojoImpl::DetachRouteController( |
| 646 const MediaRoute::Id& route_id, | 638 const MediaRoute::Id& route_id, |
| 647 MediaRouteController* controller) { | 639 MediaRouteController* controller) { |
| 648 auto it = route_controllers_.find(route_id); | 640 auto it = route_controllers_.find(route_id); |
| 649 if (it != route_controllers_.end() && it->second == controller) | 641 if (it != route_controllers_.end() && it->second == controller) |
| 650 route_controllers_.erase(it); | 642 route_controllers_.erase(it); |
| 651 } | 643 } |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 812 // Sinks are no longer available. MRPM has already removed all sink queries. | 804 // Sinks are no longer available. MRPM has already removed all sink queries. |
| 813 for (auto& source_and_query : sinks_queries_) { | 805 for (auto& source_and_query : sinks_queries_) { |
| 814 const auto& query = source_and_query.second; | 806 const auto& query = source_and_query.second; |
| 815 query->is_active = false; | 807 query->is_active = false; |
| 816 query->cached_sink_list = base::nullopt; | 808 query->cached_sink_list = base::nullopt; |
| 817 query->origins.clear(); | 809 query->origins.clear(); |
| 818 } | 810 } |
| 819 } else { | 811 } else { |
| 820 // Sinks are now available. Tell MRPM to start all sink queries again. | 812 // Sinks are now available. Tell MRPM to start all sink queries again. |
| 821 for (const auto& source_and_query : sinks_queries_) { | 813 for (const auto& source_and_query : sinks_queries_) { |
| 822 RunOrDefer( | 814 event_page_request_manager_->RunOrDefer( |
| 823 base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaSinks, | 815 base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaSinks, |
| 824 base::Unretained(this), source_and_query.first)); | 816 base::Unretained(this), source_and_query.first), |
| 817 MediaRouteProviderWakeReason::START_OBSERVING_MEDIA_SINKS); |
| 825 } | 818 } |
| 826 } | 819 } |
| 827 } | 820 } |
| 828 | 821 |
| 829 void MediaRouterMojoImpl::OnPresentationConnectionStateChanged( | 822 void MediaRouterMojoImpl::OnPresentationConnectionStateChanged( |
| 830 const std::string& route_id, | 823 const std::string& route_id, |
| 831 content::PresentationConnectionState state) { | 824 content::PresentationConnectionState state) { |
| 832 NotifyPresentationConnectionStateChange(route_id, state); | 825 NotifyPresentationConnectionStateChange(route_id, state); |
| 833 } | 826 } |
| 834 | 827 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 910 if (it == routes_queries_.end() || | 903 if (it == routes_queries_.end() || |
| 911 it->second->observers.might_have_observers()) { | 904 it->second->observers.might_have_observers()) { |
| 912 return; | 905 return; |
| 913 } | 906 } |
| 914 | 907 |
| 915 DVLOG_WITH_INSTANCE(1) << "MRPM.StopObservingMediaRoutes: " << source_id; | 908 DVLOG_WITH_INSTANCE(1) << "MRPM.StopObservingMediaRoutes: " << source_id; |
| 916 media_route_provider_->StopObservingMediaRoutes(source_id); | 909 media_route_provider_->StopObservingMediaRoutes(source_id); |
| 917 routes_queries_.erase(source_id); | 910 routes_queries_.erase(source_id); |
| 918 } | 911 } |
| 919 | 912 |
| 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() { | 913 void MediaRouterMojoImpl::SyncStateToMediaRouteProvider() { |
| 991 DCHECK(media_route_provider_); | 914 DCHECK(media_route_provider_); |
| 992 | 915 |
| 993 // Sink queries. | 916 // Sink queries. |
| 994 if (availability_ != mojom::MediaRouter::SinkAvailability::UNAVAILABLE) { | 917 if (availability_ != mojom::MediaRouter::SinkAvailability::UNAVAILABLE) { |
| 995 for (const auto& it : sinks_queries_) { | 918 for (const auto& it : sinks_queries_) { |
| 996 DoStartObservingMediaSinks(it.first); | 919 DoStartObservingMediaSinks(it.first); |
| 997 } | 920 } |
| 998 } | 921 } |
| 999 | 922 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1015 // discovery when it wakes up, has been upgraded, etc. | 938 // discovery when it wakes up, has been upgraded, etc. |
| 1016 if (should_enable_mdns_discovery_) { | 939 if (should_enable_mdns_discovery_) { |
| 1017 DoEnsureMdnsDiscoveryEnabled(); | 940 DoEnsureMdnsDiscoveryEnabled(); |
| 1018 } | 941 } |
| 1019 #endif | 942 #endif |
| 1020 | 943 |
| 1021 if (media_router::DialLocalDiscoveryEnabled()) | 944 if (media_router::DialLocalDiscoveryEnabled()) |
| 1022 StartDiscovery(); | 945 StartDiscovery(); |
| 1023 } | 946 } |
| 1024 | 947 |
| 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) | 948 #if defined(OS_WIN) |
| 1063 void MediaRouterMojoImpl::EnsureMdnsDiscoveryEnabled() { | 949 void MediaRouterMojoImpl::EnsureMdnsDiscoveryEnabled() { |
| 1064 if (is_mdns_enabled_) | 950 if (is_mdns_enabled_) |
| 1065 return; | 951 return; |
| 1066 | 952 |
| 1067 SetWakeReason(MediaRouteProviderWakeReason::ENABLE_MDNS_DISCOVERY); | 953 event_page_request_manager_->RunOrDefer( |
| 1068 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoEnsureMdnsDiscoveryEnabled, | 954 base::BindOnce(&MediaRouterMojoImpl::DoEnsureMdnsDiscoveryEnabled, |
| 1069 base::Unretained(this))); | 955 weak_factory_.GetWeakPtr()), |
| 956 MediaRouteProviderWakeReason::ENABLE_MDNS_DISCOVERY); |
| 1070 should_enable_mdns_discovery_ = true; | 957 should_enable_mdns_discovery_ = true; |
| 1071 } | 958 } |
| 1072 | 959 |
| 1073 void MediaRouterMojoImpl::DoEnsureMdnsDiscoveryEnabled() { | 960 void MediaRouterMojoImpl::DoEnsureMdnsDiscoveryEnabled() { |
| 1074 DVLOG_WITH_INSTANCE(1) << "DoEnsureMdnsDiscoveryEnabled"; | 961 DVLOG_WITH_INSTANCE(1) << "DoEnsureMdnsDiscoveryEnabled"; |
| 1075 if (!is_mdns_enabled_) { | 962 if (!is_mdns_enabled_) { |
| 1076 media_route_provider_->EnableMdnsDiscovery(); | 963 media_route_provider_->EnableMdnsDiscovery(); |
| 1077 is_mdns_enabled_ = true; | 964 is_mdns_enabled_ = true; |
| 1078 } | 965 } |
| 1079 } | 966 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1094 base::Bind(&MediaRouterMojoImpl::ProvideSinks, | 981 base::Bind(&MediaRouterMojoImpl::ProvideSinks, |
| 1095 weak_factory_.GetWeakPtr(), "dial"), | 982 weak_factory_.GetWeakPtr(), "dial"), |
| 1096 context_); | 983 context_); |
| 1097 } | 984 } |
| 1098 | 985 |
| 1099 dial_media_sink_service_proxy_->Start(); | 986 dial_media_sink_service_proxy_->Start(); |
| 1100 } | 987 } |
| 1101 | 988 |
| 1102 void MediaRouterMojoImpl::UpdateMediaSinks( | 989 void MediaRouterMojoImpl::UpdateMediaSinks( |
| 1103 const MediaSource::Id& source_id) { | 990 const MediaSource::Id& source_id) { |
| 1104 SetWakeReason(MediaRouteProviderWakeReason::UPDATE_MEDIA_SINKS); | 991 event_page_request_manager_->RunOrDefer( |
| 1105 RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoUpdateMediaSinks, | 992 base::BindOnce(&MediaRouterMojoImpl::DoUpdateMediaSinks, |
| 1106 base::Unretained(this), source_id)); | 993 weak_factory_.GetWeakPtr(), source_id), |
| 994 MediaRouteProviderWakeReason::UPDATE_MEDIA_SINKS); |
| 1107 } | 995 } |
| 1108 | 996 |
| 1109 void MediaRouterMojoImpl::DoUpdateMediaSinks( | 997 void MediaRouterMojoImpl::DoUpdateMediaSinks( |
| 1110 const MediaSource::Id& source_id) { | 998 const MediaSource::Id& source_id) { |
| 1111 DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks: " << source_id; | 999 DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks: " << source_id; |
| 1112 media_route_provider_->UpdateMediaSinks(source_id); | 1000 media_route_provider_->UpdateMediaSinks(source_id); |
| 1113 } | 1001 } |
| 1114 | 1002 |
| 1115 void MediaRouterMojoImpl::RemoveInvalidRouteControllers( | 1003 void MediaRouterMojoImpl::RemoveInvalidRouteControllers( |
| 1116 const std::vector<MediaRoute>& routes) { | 1004 const std::vector<MediaRoute>& routes) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1127 | 1015 |
| 1128 void MediaRouterMojoImpl::OnMediaControllerCreated( | 1016 void MediaRouterMojoImpl::OnMediaControllerCreated( |
| 1129 const MediaRoute::Id& route_id, | 1017 const MediaRoute::Id& route_id, |
| 1130 bool success) { | 1018 bool success) { |
| 1131 DVLOG_WITH_INSTANCE(1) << "OnMediaControllerCreated: " << route_id | 1019 DVLOG_WITH_INSTANCE(1) << "OnMediaControllerCreated: " << route_id |
| 1132 << (success ? " was successful." : " failed."); | 1020 << (success ? " was successful." : " failed."); |
| 1133 MediaRouterMojoMetrics::RecordMediaRouteControllerCreationResult(success); | 1021 MediaRouterMojoMetrics::RecordMediaRouteControllerCreationResult(success); |
| 1134 } | 1022 } |
| 1135 | 1023 |
| 1136 } // namespace media_router | 1024 } // namespace media_router |
| OLD | NEW |