Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2355)

Unified Diff: chrome/browser/media/router/event_page_request_manager.h

Issue 2949933002: [Media Router] Factor extension-related logic out of MediaRouterMojoImpl (Closed)
Patch Set: Remove includes Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/media/router/BUILD.gn ('k') | chrome/browser/media/router/event_page_request_manager.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/media/router/event_page_request_manager.h
diff --git a/chrome/browser/media/router/event_page_request_manager.h b/chrome/browser/media/router/event_page_request_manager.h
new file mode 100644
index 0000000000000000000000000000000000000000..b3a26cffc85ce6fb174de7b63da1d304e9c01e2b
--- /dev/null
+++ b/chrome/browser/media/router/event_page_request_manager.h
@@ -0,0 +1,135 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_MEDIA_ROUTER_EVENT_PAGE_REQUEST_MANAGER_H_
+#define CHROME_BROWSER_MEDIA_ROUTER_EVENT_PAGE_REQUEST_MANAGER_H_
+
+#include <deque>
+#include <string>
+
+#include "base/callback.h"
+#include "base/gtest_prod_util.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/media/router/mojo/media_router_mojo_metrics.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+namespace content {
+class BrowserContext;
+}
+
+namespace extensions {
+class EventPageTracker;
+}
+
+namespace media_router {
+
+// A class that is responsible for running closures that are requests to the
+// Media Router component extension while the extension is awake, or queueing
+// requests and waking the extension up if it's suspended.
+class EventPageRequestManager : public KeyedService {
+ public:
+ ~EventPageRequestManager() override;
+
+ // KeyedService:
+ void Shutdown() override;
+
+ // Sets the ID of the component extension.
+ virtual void SetExtensionId(const std::string& extension_id);
+
+ // Runs a closure if the Mojo connections to the extensions are valid, or
+ // defers the execution until the connections have been established. If this
+ // call resulted in waking the extension, |wake_reason| is recorded as the
+ // reason.
+ virtual void RunOrDefer(base::OnceClosure request,
+ MediaRouteProviderWakeReason wake_reason);
+
+ // Executes the Mojo requests queued in |pending_requests_|.
+ virtual void OnMojoConnectionsReady();
+
+ // Attempts to wake the component extension again if there are pending
+ // requests. Otherwise the extension will be woken up the next time a request
+ // is received.
+ virtual void OnMojoConnectionError();
+
+ const std::string& media_route_provider_extension_id() const {
+ return media_route_provider_extension_id_;
+ }
+
+ protected:
+ explicit EventPageRequestManager(content::BrowserContext* context);
+
+ private:
+ friend class EventPageRequestManagerFactory;
+ friend class EventPageRequestManagerTest;
+ FRIEND_TEST_ALL_PREFIXES(EventPageRequestManagerTest,
+ DropOldestPendingRequest);
+ FRIEND_TEST_ALL_PREFIXES(EventPageRequestManagerTest,
+ TooManyWakeupAttemptsDrainsQueue);
+
+ // Max consecutive attempts to wake up the component extension before
+ // giving up and draining the pending request queue.
+ static const int kMaxWakeupAttemptCount = 3;
+
+ // 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;
+
+ // Enqueues a request to be executed when the Mojo connections to the
+ // component extension are ready.
+ void EnqueueRequest(base::OnceClosure request);
+
+ // Drops all pending requests. Called when we have a connection error to
+ // component extension and further reattempts are unlikely to help.
+ void DrainPendingRequests();
+
+ // Sets the reason why we are attempting to wake the extension. Since
+ // multiple tasks may be enqueued for execution each time the extension runs,
+ // we record the first such reason.
+ virtual void SetWakeReason(MediaRouteProviderWakeReason reason);
+
+ // Whether the component extension event page is suspended.
+ bool IsEventPageSuspended() const;
+
+ // 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();
+
+ // 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 OnWakeComplete(bool success);
+
+ // Clears the wake reason after the extension has been awoken.
+ void ClearWakeReason();
+
+ // ID of the component extension. Used for managing its suspend/wake state
+ // via |event_page_tracker_|.
+ std::string media_route_provider_extension_id_;
+
+ // Pending requests queued to be executed once component extension
+ // becomes ready.
+ std::deque<base::OnceClosure> pending_requests_;
+
+ // Allows the extension to be monitored for suspend, and woken.
+ // This is a reference to a BrowserContext keyed service that outlives this
+ // instance.
+ extensions::EventPageTracker* event_page_tracker_;
+
+ int wakeup_attempt_count_ = 0;
+
+ bool mojo_connections_ready_ = false;
+
+ // Records the current reason the extension is being woken up. Is set to
+ // MediaRouteProviderWakeReason::TOTAL_COUNT if there is no pending reason.
+ MediaRouteProviderWakeReason current_wake_reason_ =
+ MediaRouteProviderWakeReason::TOTAL_COUNT;
+
+ base::WeakPtrFactory<EventPageRequestManager> weak_factory_;
+};
+
+} // namespace media_router
+
+#endif // CHROME_BROWSER_MEDIA_ROUTER_EVENT_PAGE_REQUEST_MANAGER_H_
« no previous file with comments | « chrome/browser/media/router/BUILD.gn ('k') | chrome/browser/media/router/event_page_request_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698