| 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 #ifndef CHROME_BROWSER_MEDIA_ROUTER_MEDIA_ROUTER_MOJO_IMPL_H_ | 5 #ifndef CHROME_BROWSER_MEDIA_ROUTER_MEDIA_ROUTER_MOJO_IMPL_H_ |
| 6 #define CHROME_BROWSER_MEDIA_ROUTER_MEDIA_ROUTER_MOJO_IMPL_H_ | 6 #define CHROME_BROWSER_MEDIA_ROUTER_MEDIA_ROUTER_MOJO_IMPL_H_ |
| 7 | 7 |
| 8 #include <deque> |
| 8 #include <map> | 9 #include <map> |
| 9 #include <set> | 10 #include <set> |
| 10 #include <string> | 11 #include <string> |
| 11 #include <vector> | 12 #include <vector> |
| 12 | 13 |
| 13 #include "base/containers/hash_tables.h" | 14 #include "base/containers/hash_tables.h" |
| 14 #include "base/containers/scoped_ptr_hash_map.h" | 15 #include "base/containers/scoped_ptr_hash_map.h" |
| 15 #include "base/gtest_prod_util.h" | 16 #include "base/gtest_prod_util.h" |
| 16 #include "base/macros.h" | 17 #include "base/macros.h" |
| 17 #include "base/memory/ref_counted.h" | 18 #include "base/memory/ref_counted.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 } | 92 } |
| 92 | 93 |
| 93 void set_instance_id_for_test(const std::string& instance_id) { | 94 void set_instance_id_for_test(const std::string& instance_id) { |
| 94 instance_id_ = instance_id; | 95 instance_id_ = instance_id; |
| 95 } | 96 } |
| 96 | 97 |
| 97 private: | 98 private: |
| 98 friend class MediaRouterFactory; | 99 friend class MediaRouterFactory; |
| 99 friend class MediaRouterMojoExtensionTest; | 100 friend class MediaRouterMojoExtensionTest; |
| 100 friend class MediaRouterMojoTest; | 101 friend class MediaRouterMojoTest; |
| 101 | |
| 102 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, | 102 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, |
| 103 RegisterAndUnregisterMediaSinksObserver); | 103 RegisterAndUnregisterMediaSinksObserver); |
| 104 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, | 104 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, |
| 105 RegisterMediaSinksObserverWithAvailabilityChange); | 105 RegisterMediaSinksObserverWithAvailabilityChange); |
| 106 FRIEND_TEST_ALL_PREFIXES( | 106 FRIEND_TEST_ALL_PREFIXES( |
| 107 MediaRouterMojoImplTest, | 107 MediaRouterMojoImplTest, |
| 108 RegisterAndUnregisterMediaSinksObserverWithAvailabilityChange); | 108 RegisterAndUnregisterMediaSinksObserverWithAvailabilityChange); |
| 109 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, | 109 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, |
| 110 RegisterAndUnregisterMediaRoutesObserver); | 110 RegisterAndUnregisterMediaRoutesObserver); |
| 111 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, HandleIssue); | 111 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, HandleIssue); |
| 112 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoExtensionTest, | 112 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoExtensionTest, |
| 113 DeferredBindingAndSuspension); | 113 DeferredBindingAndSuspension); |
| 114 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoExtensionTest, |
| 115 DrainPendingRequestQueue); |
| 116 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoExtensionTest, |
| 117 DropOldestPendingRequest); |
| 118 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoExtensionTest, |
| 119 AttemptedWakeupTooManyTimes); |
| 120 FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoExtensionTest, |
| 121 WakeupFailedDrainsQueue); |
| 122 |
| 123 // The max number of pending requests allowed. When number of pending requests |
| 124 // exceeds this number, the oldest request will be dropped. |
| 125 static const int kMaxPendingRequests = 30; |
| 126 |
| 127 // Max consecutive attempts to wake up the component extension before |
| 128 // giving up and draining the pending request queue. |
| 129 static const int kMaxWakeupAttemptCount = 3; |
| 114 | 130 |
| 115 class MediaRouterMediaRoutesObserver : | 131 class MediaRouterMediaRoutesObserver : |
| 116 public media_router::MediaRoutesObserver { | 132 public media_router::MediaRoutesObserver { |
| 117 public: | 133 public: |
| 118 explicit MediaRouterMediaRoutesObserver(MediaRouterMojoImpl* router); | 134 explicit MediaRouterMediaRoutesObserver(MediaRouterMojoImpl* router); |
| 119 ~MediaRouterMediaRoutesObserver() override; | 135 ~MediaRouterMediaRoutesObserver() override; |
| 120 | 136 |
| 121 // media_router::MediaRoutesObserver: | 137 // media_router::MediaRoutesObserver: |
| 122 void OnRoutesUpdated(const std::vector<media_router::MediaRoute>& routes) | 138 void OnRoutesUpdated(const std::vector<media_router::MediaRoute>& routes) |
| 123 override; | 139 override; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 // Enqueues a closure for later execution by ExecutePendingRequests(). | 173 // Enqueues a closure for later execution by ExecutePendingRequests(). |
| 158 void EnqueueTask(const base::Closure& closure); | 174 void EnqueueTask(const base::Closure& closure); |
| 159 | 175 |
| 160 // Runs a closure if the extension monitored by |extension_monitor_| is | 176 // Runs a closure if the extension monitored by |extension_monitor_| is |
| 161 // active, or defers it for later execution if the extension is suspended. | 177 // active, or defers it for later execution if the extension is suspended. |
| 162 void RunOrDefer(const base::Closure& request); | 178 void RunOrDefer(const base::Closure& request); |
| 163 | 179 |
| 164 // Dispatches the Mojo requests queued in |pending_requests_|. | 180 // Dispatches the Mojo requests queued in |pending_requests_|. |
| 165 void ExecutePendingRequests(); | 181 void ExecutePendingRequests(); |
| 166 | 182 |
| 183 // Drops all pending requests. Called when we have a connection error to |
| 184 // component extension and further reattempts are unlikely to help. |
| 185 void DrainPendingRequests(); |
| 186 |
| 167 // MediaRouter implementation. | 187 // MediaRouter implementation. |
| 168 bool RegisterMediaSinksObserver(MediaSinksObserver* observer) override; | 188 bool RegisterMediaSinksObserver(MediaSinksObserver* observer) override; |
| 169 void UnregisterMediaSinksObserver(MediaSinksObserver* observer) override; | 189 void UnregisterMediaSinksObserver(MediaSinksObserver* observer) override; |
| 170 void RegisterMediaRoutesObserver(MediaRoutesObserver* observer) override; | 190 void RegisterMediaRoutesObserver(MediaRoutesObserver* observer) override; |
| 171 void UnregisterMediaRoutesObserver(MediaRoutesObserver* observer) override; | 191 void UnregisterMediaRoutesObserver(MediaRoutesObserver* observer) override; |
| 172 void RegisterIssuesObserver(IssuesObserver* observer) override; | 192 void RegisterIssuesObserver(IssuesObserver* observer) override; |
| 173 void UnregisterIssuesObserver(IssuesObserver* observer) override; | 193 void UnregisterIssuesObserver(IssuesObserver* observer) override; |
| 174 void RegisterPresentationSessionMessagesObserver( | 194 void RegisterPresentationSessionMessagesObserver( |
| 175 PresentationSessionMessagesObserver* observer) override; | 195 PresentationSessionMessagesObserver* observer) override; |
| 176 void UnregisterPresentationSessionMessagesObserver( | 196 void UnregisterPresentationSessionMessagesObserver( |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 // Converts the callback result of calling Mojo CreateRoute()/JoinRoute() | 253 // Converts the callback result of calling Mojo CreateRoute()/JoinRoute() |
| 234 // into a local callback. | 254 // into a local callback. |
| 235 void RouteResponseReceived( | 255 void RouteResponseReceived( |
| 236 const std::string& presentation_id, | 256 const std::string& presentation_id, |
| 237 const std::vector<MediaRouteResponseCallback>& callbacks, | 257 const std::vector<MediaRouteResponseCallback>& callbacks, |
| 238 interfaces::MediaRoutePtr media_route, | 258 interfaces::MediaRoutePtr media_route, |
| 239 const mojo::String& error_text); | 259 const mojo::String& error_text); |
| 240 | 260 |
| 241 void UpdateHasLocalRoute(bool has_local_route); | 261 void UpdateHasLocalRoute(bool has_local_route); |
| 242 | 262 |
| 263 // Callback invoked by |event_page_tracker_| after an attempt to wake the |
| 264 // component extension. If |success| is false, the pending request queue is |
| 265 // drained. |
| 266 void EventPageWakeComplete(bool success); |
| 267 |
| 268 // Removes all requests from the pending requests queue. Called when there is |
| 269 // a permanent error connecting to component extension. |
| 270 void DrainRequestQueue(); |
| 271 |
| 272 // Calls to |event_page_tracker_| to wake the component extension. |
| 273 // |media_route_provider_extension_id_| must not be empty and the extension |
| 274 // should be currently suspended. |
| 275 // If there have already been too many wakeup attempts, give up and drain |
| 276 // the pending request queue. |
| 277 void AttemptWakeEventPage(); |
| 278 |
| 243 // Pending requests queued to be executed once component extension | 279 // Pending requests queued to be executed once component extension |
| 244 // becomes ready. | 280 // becomes ready. |
| 245 std::vector<base::Closure> pending_requests_; | 281 std::deque<base::Closure> pending_requests_; |
| 246 | 282 |
| 247 base::ScopedPtrHashMap<MediaSource::Id, scoped_ptr<MediaSinksQuery>> | 283 base::ScopedPtrHashMap<MediaSource::Id, scoped_ptr<MediaSinksQuery>> |
| 248 sinks_queries_; | 284 sinks_queries_; |
| 249 | 285 |
| 250 base::ObserverList<LocalMediaRoutesObserver> local_routes_observers_; | 286 base::ObserverList<LocalMediaRoutesObserver> local_routes_observers_; |
| 251 | 287 |
| 252 base::ObserverList<MediaRoutesObserver> routes_observers_; | 288 base::ObserverList<MediaRoutesObserver> routes_observers_; |
| 253 | 289 |
| 254 using PresentationSessionMessagesObserverList = | 290 using PresentationSessionMessagesObserverList = |
| 255 base::ObserverList<PresentationSessionMessagesObserver>; | 291 base::ObserverList<PresentationSessionMessagesObserver>; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 // Set to true if there are routes started on this instance. | 327 // Set to true if there are routes started on this instance. |
| 292 bool has_local_route_; | 328 bool has_local_route_; |
| 293 | 329 |
| 294 // Observes local routes in order to notify LocalMediaRoutesObservers when | 330 // Observes local routes in order to notify LocalMediaRoutesObservers when |
| 295 // there are no more local routes. | 331 // there are no more local routes. |
| 296 scoped_ptr<MediaRoutesObserver> routes_observer_; | 332 scoped_ptr<MediaRoutesObserver> routes_observer_; |
| 297 | 333 |
| 298 // The last reported sink availability from the media route provider manager. | 334 // The last reported sink availability from the media route provider manager. |
| 299 interfaces::MediaRouter::SinkAvailability availability_; | 335 interfaces::MediaRouter::SinkAvailability availability_; |
| 300 | 336 |
| 337 int wakeup_attempt_count_; |
| 338 |
| 301 base::ThreadChecker thread_checker_; | 339 base::ThreadChecker thread_checker_; |
| 302 | 340 |
| 341 base::WeakPtrFactory<MediaRouterMojoImpl> weak_factory_; |
| 342 |
| 303 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoImpl); | 343 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoImpl); |
| 304 }; | 344 }; |
| 305 | 345 |
| 306 } // namespace media_router | 346 } // namespace media_router |
| 307 | 347 |
| 308 #endif // CHROME_BROWSER_MEDIA_ROUTER_MEDIA_ROUTER_MOJO_IMPL_H_ | 348 #endif // CHROME_BROWSER_MEDIA_ROUTER_MEDIA_ROUTER_MOJO_IMPL_H_ |
| OLD | NEW |