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

Unified Diff: content/browser/service_worker/service_worker_version.h

Issue 1027113002: Service Worker: Add a timeout for inflight requests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: event Created 5 years, 9 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
Index: content/browser/service_worker/service_worker_version.h
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h
index c0037623358f80d493317b8ec29d2822046771ab..67b29b57249186dc1abc9c80fb488c8b30d2b430 100644
--- a/content/browser/service_worker/service_worker_version.h
+++ b/content/browser/service_worker/service_worker_version.h
@@ -6,6 +6,7 @@
#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_VERSION_H_
#include <map>
+#include <queue>
#include <set>
#include <string>
#include <vector>
@@ -68,7 +69,8 @@ class CONTENT_EXPORT ServiceWorkerVersion
typedef base::Callback<void(ServiceWorkerStatusCode,
ServiceWorkerFetchEventResult,
const ServiceWorkerResponse&)> FetchCallback;
- typedef base::Callback<void(ServiceWorkerStatusCode, bool)>
+ typedef base::Callback<void(ServiceWorkerStatusCode,
+ bool /* accept_connction */)>
CrossOriginConnectCallback;
enum RunningStatus {
@@ -305,6 +307,7 @@ class CONTENT_EXPORT ServiceWorkerVersion
FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, KeepAlive);
FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, ListenerAvailability);
FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, SetDevToolsAttached);
+ FRIEND_TEST_ALL_PREFIXES(ServiceWorkerWaitForeverInFetchTest, RequestTimeout);
FRIEND_TEST_ALL_PREFIXES(ServiceWorkerFailToStartTest, Timeout);
FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionBrowserTest,
TimeoutStartingWorker);
@@ -314,10 +317,30 @@ class CONTENT_EXPORT ServiceWorkerVersion
typedef ServiceWorkerVersion self;
+ enum RequestType {
+ REQUEST_ACTIVATE,
+ REQUEST_INSTALL,
+ REQUEST_FETCH,
+ REQUEST_SYNC,
+ REQUEST_NOTIFICATION_CLICK,
+ REQUEST_PUSH,
+ REQUEST_GEOFENCING,
+ REQUEST_CROSS_ORIGIN_CONNECT
+ };
enum PingState { NOT_PINGING, PINGING, PING_TIMED_OUT };
+ struct RequestInfo {
+ RequestInfo(int id, RequestType type);
+ ~RequestInfo();
+ int id;
+ RequestType type;
+ base::TimeTicks time;
+ };
+
// Timeout for the worker to start.
static const int kStartWorkerTimeoutMinutes;
+ // Timeout for a request to be handled.
+ static const int kRequestTimeoutMinutes;
~ServiceWorkerVersion() override;
@@ -430,6 +453,14 @@ class CONTENT_EXPORT ServiceWorkerVersion
template <typename IDMAP>
void RemoveCallbackAndStopIfDoomed(IDMAP* callbacks, int request_id);
+ template <typename CallbackType>
+ int AddRequest(const CallbackType& callback,
+ IDMap<CallbackType, IDMapOwnPointer>* callback_map,
+ RequestType request_type);
+
+ bool OnRequestTimeout(const RequestInfo& info);
+ void SetAllRequestTimes(const base::TimeTicks& ticks);
+
const int64 version_id_;
int64 registration_id_;
GURL script_url_;
@@ -473,6 +504,12 @@ class CONTENT_EXPORT ServiceWorkerVersion
// Holds the time that the outstanding StartWorker() request started.
base::TimeTicks start_time_;
+ // New requests are added to |requests_| along with their entry in a callback
+ // map. The timeout timer periodically checks |requests_| for entries that
+ // should time out or have already been fulfilled (i.e., removed from the
+ // callback map).
+ std::queue<RequestInfo> requests_;
+
bool is_doomed_ = false;
bool skip_waiting_ = false;
bool skip_recording_startup_time_ = false;

Powered by Google App Engine
This is Rietveld 408576698