Index: chrome/browser/media/router/media_router_mojo_impl.h |
diff --git a/chrome/browser/media/router/media_router_mojo_impl.h b/chrome/browser/media/router/media_router_mojo_impl.h |
index a2daceea74b982bf5bf60efff32e36116d661e2f..08ad41a82c9f6c2eda2f79b1ebc4513130c6a1e8 100644 |
--- a/chrome/browser/media/router/media_router_mojo_impl.h |
+++ b/chrome/browser/media/router/media_router_mojo_impl.h |
@@ -5,6 +5,7 @@ |
#ifndef CHROME_BROWSER_MEDIA_ROUTER_MEDIA_ROUTER_MOJO_IMPL_H_ |
#define CHROME_BROWSER_MEDIA_ROUTER_MEDIA_ROUTER_MOJO_IMPL_H_ |
+#include <deque> |
#include <map> |
#include <set> |
#include <string> |
@@ -98,7 +99,6 @@ class MediaRouterMojoImpl : public MediaRouter, |
friend class MediaRouterFactory; |
friend class MediaRouterMojoExtensionTest; |
friend class MediaRouterMojoTest; |
- |
FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, |
RegisterAndUnregisterMediaSinksObserver); |
FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, |
@@ -111,6 +111,22 @@ class MediaRouterMojoImpl : public MediaRouter, |
FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, HandleIssue); |
FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoExtensionTest, |
DeferredBindingAndSuspension); |
+ FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoExtensionTest, |
+ DrainPendingRequestQueue); |
+ FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoExtensionTest, |
+ DropOldestPendingRequest); |
+ FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoExtensionTest, |
+ AttemptedWakeupTooManyTimes); |
+ FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoExtensionTest, |
+ WakeupFailedDrainsQueue); |
+ |
+ // The max number of pending requests allowed. When number of pending requests |
+ // exceeds this number, the oldest request will be dropped. |
+ static const int kMaxPendingRequests = 30; |
+ |
+ // Max consecutive attempts to wake up the component extension before |
+ // giving up and draining the pending request queue. |
+ static const int kMaxWakeupAttemptCount = 3; |
class MediaRouterMediaRoutesObserver : |
public media_router::MediaRoutesObserver { |
@@ -164,6 +180,10 @@ class MediaRouterMojoImpl : public MediaRouter, |
// Dispatches the Mojo requests queued in |pending_requests_|. |
void ExecutePendingRequests(); |
+ // Drops all pending requests. Called when we have a connection error to |
+ // component extension and further reattempts are unlikely to help. |
+ void DrainPendingRequests(); |
+ |
// MediaRouter implementation. |
bool RegisterMediaSinksObserver(MediaSinksObserver* observer) override; |
void UnregisterMediaSinksObserver(MediaSinksObserver* observer) override; |
@@ -240,9 +260,25 @@ class MediaRouterMojoImpl : public MediaRouter, |
void UpdateHasLocalRoute(bool has_local_route); |
+ // Callback invoked by |event_page_tracker_| after an attempt to wake the |
+ // component extension. If |success| is false, the pending request queue is |
+ // drained. |
+ void EventPageWakeComplete(bool success); |
+ |
+ // Removes all requests from the pending requests queue. Called when there is |
+ // a permanent error connecting to component extension. |
+ void DrainRequestQueue(); |
+ |
+ // Calls to |event_page_tracker_| to wake the component extension. |
+ // |media_route_provider_extension_id_| must not be empty and the extension |
+ // should be currently suspended. |
+ // If there have already been too many wakeup attempts, give up and drain |
+ // the pending request queue. |
+ void AttemptWakeEventPage(); |
+ |
// Pending requests queued to be executed once component extension |
// becomes ready. |
- std::vector<base::Closure> pending_requests_; |
+ std::deque<base::Closure> pending_requests_; |
base::ScopedPtrHashMap<MediaSource::Id, scoped_ptr<MediaSinksQuery>> |
sinks_queries_; |
@@ -298,8 +334,12 @@ class MediaRouterMojoImpl : public MediaRouter, |
// The last reported sink availability from the media route provider manager. |
interfaces::MediaRouter::SinkAvailability availability_; |
+ int wakeup_attempt_count_; |
+ |
base::ThreadChecker thread_checker_; |
+ base::WeakPtrFactory<MediaRouterMojoImpl> weak_factory_; |
+ |
DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoImpl); |
}; |