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<std::string>& origins) { | 178 const std::vector<std::string>& 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<GURL> origin_list; | 187 std::vector<GURL> origin_list; |
189 origin_list.reserve(origins.size()); | 188 origin_list.reserve(origins.size()); |
190 for (size_t i = 0; i < origins.size(); ++i) { | 189 for (size_t i = 0; i < origins.size(); ++i) { |
191 GURL origin(origins[i]); | 190 GURL origin(origins[i]); |
192 if (!origin.is_valid()) { | 191 if (!origin.is_valid()) { |
193 LOG(WARNING) << "Received invalid origin: " << origin | 192 LOG(WARNING) << "Received invalid origin: " << origin |
194 << ". Dropping result."; | 193 << ". Dropping result."; |
195 return; | 194 return; |
196 } | 195 } |
197 origin_list.push_back(origin); | 196 origin_list.push_back(origin); |
198 } | 197 } |
199 | 198 |
200 std::vector<MediaSink> sink_list; | |
201 sink_list.reserve(sinks.size()); | |
202 for (size_t i = 0; i < sinks.size(); ++i) | |
203 sink_list.push_back(sinks[i].To<MediaSink>()); | |
204 | |
205 auto* sinks_query = it->second.get(); | 199 auto* sinks_query = it->second.get(); |
206 sinks_query->has_cached_result = true; | 200 sinks_query->has_cached_result = true; |
207 sinks_query->origins.swap(origin_list); | 201 sinks_query->origins.swap(origin_list); |
208 sinks_query->cached_sink_list.swap(sink_list); | 202 sinks_query->cached_sink_list = sinks; |
209 | 203 |
210 if (!sinks_query->observers.might_have_observers()) { | 204 if (!sinks_query->observers.might_have_observers()) { |
211 DVLOG_WITH_INSTANCE(1) | 205 DVLOG_WITH_INSTANCE(1) |
212 << "Received sink list without any active observers: " << media_source; | 206 << "Received sink list without any active observers: " << media_source; |
213 } else { | 207 } else { |
214 for (auto& observer : sinks_query->observers) { | 208 for (auto& observer : sinks_query->observers) { |
215 observer.OnSinksUpdated(sinks_query->cached_sink_list, | 209 observer.OnSinksUpdated(sinks_query->cached_sink_list, |
216 sinks_query->origins); | 210 sinks_query->origins); |
217 } | 211 } |
218 } | 212 } |
219 } | 213 } |
220 | 214 |
221 void MediaRouterMojoImpl::OnRoutesUpdated( | 215 void MediaRouterMojoImpl::OnRoutesUpdated( |
222 std::vector<mojom::MediaRoutePtr> routes, | 216 const std::vector<MediaRoute>& routes, |
223 const std::string& media_source, | 217 const std::string& media_source, |
224 const std::vector<std::string>& joinable_route_ids) { | 218 const std::vector<std::string>& joinable_route_ids) { |
225 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 219 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
226 | 220 |
227 DVLOG_WITH_INSTANCE(1) << "OnRoutesUpdated"; | 221 DVLOG_WITH_INSTANCE(1) << "OnRoutesUpdated"; |
228 auto it = routes_queries_.find(media_source); | 222 auto it = routes_queries_.find(media_source); |
229 if (it == routes_queries_.end() || | 223 if (it == routes_queries_.end() || |
230 !(it->second->observers.might_have_observers())) { | 224 !(it->second->observers.might_have_observers())) { |
231 DVLOG_WITH_INSTANCE(1) | 225 DVLOG_WITH_INSTANCE(1) |
232 << "Received route list without any active observers: " << media_source; | 226 << "Received route list without any active observers: " << media_source; |
233 return; | 227 return; |
234 } | 228 } |
235 | 229 |
236 std::vector<MediaRoute> routes_converted; | |
237 routes_converted.reserve(routes.size()); | |
238 for (size_t i = 0; i < routes.size(); ++i) | |
239 routes_converted.push_back(routes[i].To<MediaRoute>()); | |
240 | |
241 for (auto& observer : it->second->observers) | 230 for (auto& observer : it->second->observers) |
242 observer.OnRoutesUpdated(routes_converted, joinable_route_ids); | 231 observer.OnRoutesUpdated(routes, joinable_route_ids); |
243 } | 232 } |
244 | 233 |
245 void MediaRouterMojoImpl::RouteResponseReceived( | 234 void MediaRouterMojoImpl::RouteResponseReceived( |
246 const std::string& presentation_id, | 235 const std::string& presentation_id, |
247 bool is_incognito, | 236 bool is_incognito, |
248 const std::vector<MediaRouteResponseCallback>& callbacks, | 237 const std::vector<MediaRouteResponseCallback>& callbacks, |
249 bool is_join, | 238 bool is_join, |
250 mojom::MediaRoutePtr media_route, | 239 const base::Optional<MediaRoute>& media_route, |
251 const base::Optional<std::string>& error_text, | 240 const base::Optional<std::string>& error_text, |
252 mojom::RouteRequestResultCode result_code) { | 241 RouteRequestResult::ResultCode result_code) { |
253 std::unique_ptr<RouteRequestResult> result; | 242 std::unique_ptr<RouteRequestResult> result; |
254 if (media_route.is_null()) { | 243 if (!media_route) { |
255 // An error occurred. | 244 // An error occurred. |
256 const std::string& error = (error_text && !error_text->empty()) | 245 const std::string& error = (error_text && !error_text->empty()) |
257 ? *error_text : std::string("Unknown error."); | 246 ? *error_text : std::string("Unknown error."); |
258 result = RouteRequestResult::FromError( | 247 result = RouteRequestResult::FromError(error, result_code); |
259 error, mojo::RouteRequestResultCodeFromMojo(result_code)); | 248 } else if (media_route->is_incognito() != is_incognito) { |
260 } else if (media_route->is_incognito != is_incognito) { | |
261 std::string error = base::StringPrintf( | 249 std::string error = base::StringPrintf( |
262 "Mismatch in incognito status: request = %d, response = %d", | 250 "Mismatch in incognito status: request = %d, response = %d", |
263 is_incognito, media_route->is_incognito); | 251 is_incognito, media_route->is_incognito()); |
264 result = RouteRequestResult::FromError( | 252 result = RouteRequestResult::FromError( |
265 error, RouteRequestResult::INCOGNITO_MISMATCH); | 253 error, RouteRequestResult::INCOGNITO_MISMATCH); |
266 } else { | 254 } else { |
267 result = RouteRequestResult::FromSuccess( | 255 result = |
268 media_route.To<std::unique_ptr<MediaRoute>>(), presentation_id); | 256 RouteRequestResult::FromSuccess(media_route.value(), presentation_id); |
269 } | 257 } |
270 | 258 |
271 if (is_join) | 259 if (is_join) |
272 MediaRouterMojoMetrics::RecordJoinRouteResultCode(result->result_code()); | 260 MediaRouterMojoMetrics::RecordJoinRouteResultCode(result->result_code()); |
273 else | 261 else |
274 MediaRouterMojoMetrics::RecordCreateRouteResultCode(result->result_code()); | 262 MediaRouterMojoMetrics::RecordCreateRouteResultCode(result->result_code()); |
275 | 263 |
276 RunRouteRequestCallbacks(std::move(result), callbacks); | 264 RunRouteRequestCallbacks(std::move(result), callbacks); |
277 } | 265 } |
278 | 266 |
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 // Sinks are now available. Tell MRPM to start all sink queries again. | 735 // Sinks are now available. Tell MRPM to start all sink queries again. |
748 for (const auto& source_and_query : sinks_queries_) { | 736 for (const auto& source_and_query : sinks_queries_) { |
749 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStartObservingMediaSinks, | 737 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStartObservingMediaSinks, |
750 base::Unretained(this), source_and_query.first)); | 738 base::Unretained(this), source_and_query.first)); |
751 } | 739 } |
752 } | 740 } |
753 } | 741 } |
754 | 742 |
755 void MediaRouterMojoImpl::OnPresentationConnectionStateChanged( | 743 void MediaRouterMojoImpl::OnPresentationConnectionStateChanged( |
756 const std::string& route_id, | 744 const std::string& route_id, |
757 mojom::MediaRouter::PresentationConnectionState state) { | 745 content::PresentationConnectionState state) { |
758 NotifyPresentationConnectionStateChange( | 746 NotifyPresentationConnectionStateChange(route_id, state); |
759 route_id, mojo::PresentationConnectionStateFromMojo(state)); | |
760 } | 747 } |
761 | 748 |
762 void MediaRouterMojoImpl::OnPresentationConnectionClosed( | 749 void MediaRouterMojoImpl::OnPresentationConnectionClosed( |
763 const std::string& route_id, | 750 const std::string& route_id, |
764 mojom::MediaRouter::PresentationConnectionCloseReason reason, | 751 content::PresentationConnectionCloseReason reason, |
765 const std::string& message) { | 752 const std::string& message) { |
766 NotifyPresentationConnectionClose( | 753 NotifyPresentationConnectionClose(route_id, reason, message); |
767 route_id, mojo::PresentationConnectionCloseReasonFromMojo(reason), | |
768 message); | |
769 } | 754 } |
770 | 755 |
771 void MediaRouterMojoImpl::OnTerminateRouteResult( | 756 void MediaRouterMojoImpl::OnTerminateRouteResult( |
772 const MediaRoute::Id& route_id, | 757 const MediaRoute::Id& route_id, |
773 const base::Optional<std::string>& error_text, | 758 const base::Optional<std::string>& error_text, |
774 mojom::RouteRequestResultCode result_code) { | 759 RouteRequestResult::ResultCode result_code) { |
775 if (result_code != mojom::RouteRequestResultCode::OK) { | 760 if (result_code != RouteRequestResult::OK) { |
776 LOG(WARNING) << "Failed to terminate route " << route_id | 761 LOG(WARNING) << "Failed to terminate route " << route_id |
777 << ": result_code = " << result_code << ", " | 762 << ": result_code = " << result_code << ", " |
778 << error_text.value_or(std::string()); | 763 << error_text.value_or(std::string()); |
779 } | 764 } |
780 MediaRouterMojoMetrics::RecordMediaRouteProviderTerminateRoute( | 765 MediaRouterMojoMetrics::RecordMediaRouteProviderTerminateRoute(result_code); |
781 mojo::RouteRequestResultCodeFromMojo(result_code)); | |
782 } | 766 } |
783 | 767 |
784 void MediaRouterMojoImpl::DoStartObservingMediaSinks( | 768 void MediaRouterMojoImpl::DoStartObservingMediaSinks( |
785 const MediaSource::Id& source_id) { | 769 const MediaSource::Id& source_id) { |
786 DVLOG_WITH_INSTANCE(1) << "DoStartObservingMediaSinks: " << source_id; | 770 DVLOG_WITH_INSTANCE(1) << "DoStartObservingMediaSinks: " << source_id; |
787 // No need to call MRPM if there are no sinks available. | 771 // No need to call MRPM if there are no sinks available. |
788 if (availability_ == mojom::MediaRouter::SinkAvailability::UNAVAILABLE) | 772 if (availability_ == mojom::MediaRouter::SinkAvailability::UNAVAILABLE) |
789 return; | 773 return; |
790 | 774 |
791 // No need to call MRPM if all observers have been removed in the meantime. | 775 // 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... |
987 base::Unretained(this), source_id)); | 971 base::Unretained(this), source_id)); |
988 } | 972 } |
989 | 973 |
990 void MediaRouterMojoImpl::DoUpdateMediaSinks( | 974 void MediaRouterMojoImpl::DoUpdateMediaSinks( |
991 const MediaSource::Id& source_id) { | 975 const MediaSource::Id& source_id) { |
992 DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks" << source_id; | 976 DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks" << source_id; |
993 media_route_provider_->UpdateMediaSinks(source_id); | 977 media_route_provider_->UpdateMediaSinks(source_id); |
994 } | 978 } |
995 | 979 |
996 } // namespace media_router | 980 } // namespace media_router |
OLD | NEW |