Chromium Code Reviews| 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::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 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()); |
|
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 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() | |
|
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 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); | 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |