| 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/memory/scoped_vector.h" | 15 #include "base/memory/scoped_vector.h" |
| 16 #include "base/observer_list.h" | 16 #include "base/observer_list.h" |
| 17 #include "base/stl_util.h" | 17 #include "base/stl_util.h" |
| 18 #include "base/strings/stringprintf.h" | 18 #include "base/strings/stringprintf.h" |
| 19 #include "chrome/browser/media/router/issues_observer.h" | 19 #include "chrome/browser/media/router/issues_observer.h" |
| 20 #include "chrome/browser/media/router/media_router_factory.h" | 20 #include "chrome/browser/media/router/media_router_factory.h" |
| 21 #include "chrome/browser/media/router/media_routes_observer.h" | 21 #include "chrome/browser/media/router/media_routes_observer.h" |
| 22 #include "chrome/browser/media/router/media_sinks_observer.h" | 22 #include "chrome/browser/media/router/media_sinks_observer.h" |
| 23 #include "chrome/browser/media/router/media_source_helper.h" | 23 #include "chrome/browser/media/router/media_source_helper.h" |
| 24 #include "chrome/browser/media/router/mojo/media_route_provider_util_win.h" | 24 #include "chrome/browser/media/router/mojo/media_route_provider_util_win.h" |
| 25 #include "chrome/browser/media/router/mojo/media_router_mojo_metrics.h" | 25 #include "chrome/browser/media/router/mojo/media_router_mojo_metrics.h" |
| 26 #include "chrome/browser/media/router/mojo/media_router_type_converters.h" | |
| 27 #include "chrome/browser/media/router/route_message.h" | 26 #include "chrome/browser/media/router/route_message.h" |
| 28 #include "chrome/browser/media/router/route_message_observer.h" | 27 #include "chrome/browser/media/router/route_message_observer.h" |
| 29 #include "chrome/browser/sessions/session_tab_helper.h" | 28 #include "chrome/browser/sessions/session_tab_helper.h" |
| 30 #include "content/public/browser/browser_thread.h" | 29 #include "content/public/browser/browser_thread.h" |
| 31 #include "extensions/browser/process_manager.h" | 30 #include "extensions/browser/process_manager.h" |
| 32 | 31 |
| 33 #define DVLOG_WITH_INSTANCE(level) \ | 32 #define DVLOG_WITH_INSTANCE(level) \ |
| 34 DVLOG(level) << "MR #" << instance_id_ << ": " | 33 DVLOG(level) << "MR #" << instance_id_ << ": " |
| 35 | 34 |
| 36 #define DLOG_WITH_INSTANCE(level) DLOG(level) << "MR #" << instance_id_ << ": " | 35 #define DLOG_WITH_INSTANCE(level) DLOG(level) << "MR #" << instance_id_ << ": " |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 } | 167 } |
| 169 | 168 |
| 170 void MediaRouterMojoImpl::OnIssue(const IssueInfo& issue) { | 169 void MediaRouterMojoImpl::OnIssue(const IssueInfo& issue) { |
| 171 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 170 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 172 DVLOG_WITH_INSTANCE(1) << "OnIssue " << issue.title; | 171 DVLOG_WITH_INSTANCE(1) << "OnIssue " << issue.title; |
| 173 issue_manager_.AddIssue(issue); | 172 issue_manager_.AddIssue(issue); |
| 174 } | 173 } |
| 175 | 174 |
| 176 void MediaRouterMojoImpl::OnSinksReceived( | 175 void MediaRouterMojoImpl::OnSinksReceived( |
| 177 const std::string& media_source, | 176 const std::string& media_source, |
| 178 std::vector<mojom::MediaSinkPtr> sinks, | 177 const std::vector<MediaSink>& sinks, |
| 179 const std::vector<url::Origin>& origins) { | 178 const std::vector<url::Origin>& origins) { |
| 180 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 179 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 181 DVLOG_WITH_INSTANCE(1) << "OnSinksReceived"; | 180 DVLOG_WITH_INSTANCE(1) << "OnSinksReceived"; |
| 182 auto it = sinks_queries_.find(media_source); | 181 auto it = sinks_queries_.find(media_source); |
| 183 if (it == sinks_queries_.end()) { | 182 if (it == sinks_queries_.end()) { |
| 184 DVLOG_WITH_INSTANCE(1) << "Received sink list without MediaSinksQuery."; | 183 DVLOG_WITH_INSTANCE(1) << "Received sink list without MediaSinksQuery."; |
| 185 return; | 184 return; |
| 186 } | 185 } |
| 187 | 186 |
| 188 std::vector<MediaSink> sink_list; | |
| 189 sink_list.reserve(sinks.size()); | |
| 190 for (size_t i = 0; i < sinks.size(); ++i) | |
| 191 sink_list.push_back(sinks[i].To<MediaSink>()); | |
| 192 | |
| 193 auto* sinks_query = it->second.get(); | 187 auto* sinks_query = it->second.get(); |
| 194 sinks_query->has_cached_result = true; | 188 sinks_query->has_cached_result = true; |
| 195 sinks_query->origins = origins; | 189 sinks_query->origins = origins; |
| 196 sinks_query->cached_sink_list.swap(sink_list); | 190 sinks_query->cached_sink_list = sinks; |
| 197 | 191 |
| 198 if (!sinks_query->observers.might_have_observers()) { | 192 if (!sinks_query->observers.might_have_observers()) { |
| 199 DVLOG_WITH_INSTANCE(1) | 193 DVLOG_WITH_INSTANCE(1) |
| 200 << "Received sink list without any active observers: " << media_source; | 194 << "Received sink list without any active observers: " << media_source; |
| 201 } else { | 195 } else { |
| 202 for (auto& observer : sinks_query->observers) { | 196 for (auto& observer : sinks_query->observers) { |
| 203 observer.OnSinksUpdated(sinks_query->cached_sink_list, | 197 observer.OnSinksUpdated(sinks_query->cached_sink_list, |
| 204 sinks_query->origins); | 198 sinks_query->origins); |
| 205 } | 199 } |
| 206 } | 200 } |
| 207 } | 201 } |
| 208 | 202 |
| 209 void MediaRouterMojoImpl::OnRoutesUpdated( | 203 void MediaRouterMojoImpl::OnRoutesUpdated( |
| 210 std::vector<mojom::MediaRoutePtr> routes, | 204 const std::vector<MediaRoute>& routes, |
| 211 const std::string& media_source, | 205 const std::string& media_source, |
| 212 const std::vector<std::string>& joinable_route_ids) { | 206 const std::vector<std::string>& joinable_route_ids) { |
| 213 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 207 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 214 | 208 |
| 215 DVLOG_WITH_INSTANCE(1) << "OnRoutesUpdated"; | 209 DVLOG_WITH_INSTANCE(1) << "OnRoutesUpdated"; |
| 216 auto it = routes_queries_.find(media_source); | 210 auto it = routes_queries_.find(media_source); |
| 217 if (it == routes_queries_.end() || | 211 if (it == routes_queries_.end() || |
| 218 !(it->second->observers.might_have_observers())) { | 212 !(it->second->observers.might_have_observers())) { |
| 219 DVLOG_WITH_INSTANCE(1) | 213 DVLOG_WITH_INSTANCE(1) |
| 220 << "Received route list without any active observers: " << media_source; | 214 << "Received route list without any active observers: " << media_source; |
| 221 return; | 215 return; |
| 222 } | 216 } |
| 223 | 217 |
| 224 std::vector<MediaRoute> routes_converted; | |
| 225 routes_converted.reserve(routes.size()); | |
| 226 for (size_t i = 0; i < routes.size(); ++i) | |
| 227 routes_converted.push_back(routes[i].To<MediaRoute>()); | |
| 228 | |
| 229 for (auto& observer : it->second->observers) | 218 for (auto& observer : it->second->observers) |
| 230 observer.OnRoutesUpdated(routes_converted, joinable_route_ids); | 219 observer.OnRoutesUpdated(routes, joinable_route_ids); |
| 231 } | 220 } |
| 232 | 221 |
| 233 void MediaRouterMojoImpl::RouteResponseReceived( | 222 void MediaRouterMojoImpl::RouteResponseReceived( |
| 234 const std::string& presentation_id, | 223 const std::string& presentation_id, |
| 235 bool is_incognito, | 224 bool is_incognito, |
| 236 const std::vector<MediaRouteResponseCallback>& callbacks, | 225 const std::vector<MediaRouteResponseCallback>& callbacks, |
| 237 bool is_join, | 226 bool is_join, |
| 238 mojom::MediaRoutePtr media_route, | 227 const base::Optional<MediaRoute>& media_route, |
| 239 const base::Optional<std::string>& error_text, | 228 const base::Optional<std::string>& error_text, |
| 240 mojom::RouteRequestResultCode result_code) { | 229 RouteRequestResult::ResultCode result_code) { |
| 241 std::unique_ptr<RouteRequestResult> result; | 230 std::unique_ptr<RouteRequestResult> result; |
| 242 if (media_route.is_null()) { | 231 if (!media_route) { |
| 243 // An error occurred. | 232 // An error occurred. |
| 244 const std::string& error = (error_text && !error_text->empty()) | 233 const std::string& error = (error_text && !error_text->empty()) |
| 245 ? *error_text : std::string("Unknown error."); | 234 ? *error_text : std::string("Unknown error."); |
| 246 result = RouteRequestResult::FromError( | 235 result = RouteRequestResult::FromError(error, result_code); |
| 247 error, mojo::RouteRequestResultCodeFromMojo(result_code)); | 236 } else if (media_route->is_incognito() != is_incognito) { |
| 248 } else if (media_route->is_incognito != is_incognito) { | |
| 249 std::string error = base::StringPrintf( | 237 std::string error = base::StringPrintf( |
| 250 "Mismatch in incognito status: request = %d, response = %d", | 238 "Mismatch in incognito status: request = %d, response = %d", |
| 251 is_incognito, media_route->is_incognito); | 239 is_incognito, media_route->is_incognito()); |
| 252 result = RouteRequestResult::FromError( | 240 result = RouteRequestResult::FromError( |
| 253 error, RouteRequestResult::INCOGNITO_MISMATCH); | 241 error, RouteRequestResult::INCOGNITO_MISMATCH); |
| 254 } else { | 242 } else { |
| 255 result = RouteRequestResult::FromSuccess( | 243 result = |
| 256 media_route.To<std::unique_ptr<MediaRoute>>(), presentation_id); | 244 RouteRequestResult::FromSuccess(media_route.value(), presentation_id); |
| 257 } | 245 } |
| 258 | 246 |
| 259 if (is_join) | 247 if (is_join) |
| 260 MediaRouterMojoMetrics::RecordJoinRouteResultCode(result->result_code()); | 248 MediaRouterMojoMetrics::RecordJoinRouteResultCode(result->result_code()); |
| 261 else | 249 else |
| 262 MediaRouterMojoMetrics::RecordCreateRouteResultCode(result->result_code()); | 250 MediaRouterMojoMetrics::RecordCreateRouteResultCode(result->result_code()); |
| 263 | 251 |
| 264 RunRouteRequestCallbacks(std::move(result), callbacks); | 252 RunRouteRequestCallbacks(std::move(result), callbacks); |
| 265 } | 253 } |
| 266 | 254 |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 // Sinks are now available. Tell MRPM to start all sink queries again. | 693 // Sinks are now available. Tell MRPM to start all sink queries again. |
| 706 for (const auto& source_and_query : sinks_queries_) { | 694 for (const auto& source_and_query : sinks_queries_) { |
| 707 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStartObservingMediaSinks, | 695 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStartObservingMediaSinks, |
| 708 base::Unretained(this), source_and_query.first)); | 696 base::Unretained(this), source_and_query.first)); |
| 709 } | 697 } |
| 710 } | 698 } |
| 711 } | 699 } |
| 712 | 700 |
| 713 void MediaRouterMojoImpl::OnPresentationConnectionStateChanged( | 701 void MediaRouterMojoImpl::OnPresentationConnectionStateChanged( |
| 714 const std::string& route_id, | 702 const std::string& route_id, |
| 715 mojom::MediaRouter::PresentationConnectionState state) { | 703 content::PresentationConnectionState state) { |
| 716 NotifyPresentationConnectionStateChange( | 704 NotifyPresentationConnectionStateChange(route_id, state); |
| 717 route_id, mojo::PresentationConnectionStateFromMojo(state)); | |
| 718 } | 705 } |
| 719 | 706 |
| 720 void MediaRouterMojoImpl::OnPresentationConnectionClosed( | 707 void MediaRouterMojoImpl::OnPresentationConnectionClosed( |
| 721 const std::string& route_id, | 708 const std::string& route_id, |
| 722 mojom::MediaRouter::PresentationConnectionCloseReason reason, | 709 content::PresentationConnectionCloseReason reason, |
| 723 const std::string& message) { | 710 const std::string& message) { |
| 724 NotifyPresentationConnectionClose( | 711 NotifyPresentationConnectionClose(route_id, reason, message); |
| 725 route_id, mojo::PresentationConnectionCloseReasonFromMojo(reason), | |
| 726 message); | |
| 727 } | 712 } |
| 728 | 713 |
| 729 void MediaRouterMojoImpl::OnTerminateRouteResult( | 714 void MediaRouterMojoImpl::OnTerminateRouteResult( |
| 730 const MediaRoute::Id& route_id, | 715 const MediaRoute::Id& route_id, |
| 731 const base::Optional<std::string>& error_text, | 716 const base::Optional<std::string>& error_text, |
| 732 mojom::RouteRequestResultCode result_code) { | 717 RouteRequestResult::ResultCode result_code) { |
| 733 if (result_code != mojom::RouteRequestResultCode::OK) { | 718 if (result_code != RouteRequestResult::OK) { |
| 734 LOG(WARNING) << "Failed to terminate route " << route_id | 719 LOG(WARNING) << "Failed to terminate route " << route_id |
| 735 << ": result_code = " << result_code << ", " | 720 << ": result_code = " << result_code << ", " |
| 736 << error_text.value_or(std::string()); | 721 << error_text.value_or(std::string()); |
| 737 } | 722 } |
| 738 MediaRouterMojoMetrics::RecordMediaRouteProviderTerminateRoute( | 723 MediaRouterMojoMetrics::RecordMediaRouteProviderTerminateRoute(result_code); |
| 739 mojo::RouteRequestResultCodeFromMojo(result_code)); | |
| 740 } | 724 } |
| 741 | 725 |
| 742 void MediaRouterMojoImpl::DoStartObservingMediaSinks( | 726 void MediaRouterMojoImpl::DoStartObservingMediaSinks( |
| 743 const MediaSource::Id& source_id) { | 727 const MediaSource::Id& source_id) { |
| 744 DVLOG_WITH_INSTANCE(1) << "DoStartObservingMediaSinks: " << source_id; | 728 DVLOG_WITH_INSTANCE(1) << "DoStartObservingMediaSinks: " << source_id; |
| 745 // No need to call MRPM if there are no sinks available. | 729 // No need to call MRPM if there are no sinks available. |
| 746 if (availability_ == mojom::MediaRouter::SinkAvailability::UNAVAILABLE) | 730 if (availability_ == mojom::MediaRouter::SinkAvailability::UNAVAILABLE) |
| 747 return; | 731 return; |
| 748 | 732 |
| 749 // No need to call MRPM if all observers have been removed in the meantime. | 733 // No need to call MRPM if all observers have been removed in the meantime. |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 base::Unretained(this), source_id)); | 929 base::Unretained(this), source_id)); |
| 946 } | 930 } |
| 947 | 931 |
| 948 void MediaRouterMojoImpl::DoUpdateMediaSinks( | 932 void MediaRouterMojoImpl::DoUpdateMediaSinks( |
| 949 const MediaSource::Id& source_id) { | 933 const MediaSource::Id& source_id) { |
| 950 DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks" << source_id; | 934 DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks" << source_id; |
| 951 media_route_provider_->UpdateMediaSinks(source_id); | 935 media_route_provider_->UpdateMediaSinks(source_id); |
| 952 } | 936 } |
| 953 | 937 |
| 954 } // namespace media_router | 938 } // namespace media_router |
| OLD | NEW |