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

Side by Side Diff: content/browser/push_messaging/push_messaging_router.cc

Issue 2506393003: Add a timeout to push message processing. (Closed)
Patch Set: Updated comment and added entry in histograms.xml Created 4 years 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "content/browser/push_messaging/push_messaging_router.h" 5 #include "content/browser/push_messaging/push_messaging_router.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/metrics/histogram_macros.h" 10 #include "base/metrics/histogram_macros.h"
11 #include "content/browser/service_worker/service_worker_context_wrapper.h" 11 #include "content/browser/service_worker/service_worker_context_wrapper.h"
12 #include "content/browser/service_worker/service_worker_registration.h" 12 #include "content/browser/service_worker/service_worker_registration.h"
13 #include "content/browser/service_worker/service_worker_storage.h" 13 #include "content/browser/service_worker/service_worker_storage.h"
14 #include "content/common/service_worker/service_worker_messages.h" 14 #include "content/common/service_worker/service_worker_messages.h"
15 #include "content/common/service_worker/service_worker_status_code.h" 15 #include "content/common/service_worker/service_worker_status_code.h"
16 #include "content/public/browser/browser_context.h" 16 #include "content/public/browser/browser_context.h"
17 #include "content/public/browser/browser_thread.h" 17 #include "content/public/browser/browser_thread.h"
18 #include "content/public/browser/storage_partition.h" 18 #include "content/public/browser/storage_partition.h"
19 #include "content/public/common/push_event_payload.h" 19 #include "content/public/common/push_event_payload.h"
20 20
21 namespace content { 21 namespace content {
22 22
23 namespace { 23 namespace {
24 24
25 // The number of seconds for which the event triggered by a push message should
26 // be allowed to run.
27 const int kPushMessageTimeoutSeconds = 90;
28
25 void RunDeliverCallback( 29 void RunDeliverCallback(
26 const PushMessagingRouter::DeliverMessageCallback& deliver_message_callback, 30 const PushMessagingRouter::DeliverMessageCallback& deliver_message_callback,
27 PushDeliveryStatus delivery_status) { 31 PushDeliveryStatus delivery_status) {
28 DCHECK_CURRENTLY_ON(BrowserThread::IO); 32 DCHECK_CURRENTLY_ON(BrowserThread::IO);
29 BrowserThread::PostTask( 33 BrowserThread::PostTask(
30 BrowserThread::UI, FROM_HERE, 34 BrowserThread::UI, FROM_HERE,
31 base::Bind(deliver_message_callback, delivery_status)); 35 base::Bind(deliver_message_callback, delivery_status));
32 } 36 }
33 37
34 } // namespace 38 } // namespace
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 deliver_message_callback, service_worker_registration)); 110 deliver_message_callback, service_worker_registration));
107 } 111 }
108 112
109 // static 113 // static
110 void PushMessagingRouter::DeliverMessageToWorker( 114 void PushMessagingRouter::DeliverMessageToWorker(
111 const scoped_refptr<ServiceWorkerVersion>& service_worker, 115 const scoped_refptr<ServiceWorkerVersion>& service_worker,
112 const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration, 116 const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration,
113 const PushEventPayload& payload, 117 const PushEventPayload& payload,
114 const DeliverMessageCallback& deliver_message_callback) { 118 const DeliverMessageCallback& deliver_message_callback) {
115 DCHECK_CURRENTLY_ON(BrowserThread::IO); 119 DCHECK_CURRENTLY_ON(BrowserThread::IO);
116 int request_id = service_worker->StartRequest( 120 int request_id = service_worker->StartRequestWithCustomTimeout(
117 ServiceWorkerMetrics::EventType::PUSH, 121 ServiceWorkerMetrics::EventType::PUSH,
118 base::Bind(&PushMessagingRouter::DeliverMessageEnd, 122 base::Bind(&PushMessagingRouter::DeliverMessageEnd,
119 deliver_message_callback, service_worker_registration)); 123 deliver_message_callback, service_worker_registration),
124 base::TimeDelta::FromSeconds(kPushMessageTimeoutSeconds),
125 ServiceWorkerVersion::KILL_ON_TIMEOUT);
120 service_worker->DispatchSimpleEvent<ServiceWorkerHostMsg_PushEventFinished>( 126 service_worker->DispatchSimpleEvent<ServiceWorkerHostMsg_PushEventFinished>(
121 request_id, ServiceWorkerMsg_PushEvent(request_id, payload)); 127 request_id, ServiceWorkerMsg_PushEvent(request_id, payload));
122 } 128 }
123 129
124 // static 130 // static
125 void PushMessagingRouter::DeliverMessageEnd( 131 void PushMessagingRouter::DeliverMessageEnd(
126 const DeliverMessageCallback& deliver_message_callback, 132 const DeliverMessageCallback& deliver_message_callback,
127 const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration, 133 const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration,
128 ServiceWorkerStatusCode service_worker_status) { 134 ServiceWorkerStatusCode service_worker_status) {
129 DCHECK_CURRENTLY_ON(BrowserThread::IO); 135 DCHECK_CURRENTLY_ON(BrowserThread::IO);
130 UMA_HISTOGRAM_ENUMERATION("PushMessaging.DeliveryStatus.ServiceWorkerEvent", 136 UMA_HISTOGRAM_ENUMERATION("PushMessaging.DeliveryStatus.ServiceWorkerEvent",
131 service_worker_status, 137 service_worker_status,
132 SERVICE_WORKER_ERROR_MAX_VALUE); 138 SERVICE_WORKER_ERROR_MAX_VALUE);
133 PushDeliveryStatus delivery_status = 139 PushDeliveryStatus delivery_status =
134 PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR; 140 PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR;
135 switch (service_worker_status) { 141 switch (service_worker_status) {
136 case SERVICE_WORKER_OK: 142 case SERVICE_WORKER_OK:
137 delivery_status = PUSH_DELIVERY_STATUS_SUCCESS; 143 delivery_status = PUSH_DELIVERY_STATUS_SUCCESS;
138 break; 144 break;
139 case SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED: 145 case SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED:
140 delivery_status = PUSH_DELIVERY_STATUS_EVENT_WAITUNTIL_REJECTED; 146 delivery_status = PUSH_DELIVERY_STATUS_EVENT_WAITUNTIL_REJECTED;
141 break; 147 break;
148 case SERVICE_WORKER_ERROR_TIMEOUT:
149 delivery_status = PUSH_DELIVERY_STATUS_TIMEOUT;
150 break;
142 case SERVICE_WORKER_ERROR_FAILED: 151 case SERVICE_WORKER_ERROR_FAILED:
143 case SERVICE_WORKER_ERROR_ABORT: 152 case SERVICE_WORKER_ERROR_ABORT:
144 case SERVICE_WORKER_ERROR_START_WORKER_FAILED: 153 case SERVICE_WORKER_ERROR_START_WORKER_FAILED:
145 case SERVICE_WORKER_ERROR_PROCESS_NOT_FOUND: 154 case SERVICE_WORKER_ERROR_PROCESS_NOT_FOUND:
146 case SERVICE_WORKER_ERROR_NOT_FOUND: 155 case SERVICE_WORKER_ERROR_NOT_FOUND:
147 case SERVICE_WORKER_ERROR_IPC_FAILED: 156 case SERVICE_WORKER_ERROR_IPC_FAILED:
148 case SERVICE_WORKER_ERROR_TIMEOUT:
149 case SERVICE_WORKER_ERROR_SCRIPT_EVALUATE_FAILED: 157 case SERVICE_WORKER_ERROR_SCRIPT_EVALUATE_FAILED:
150 case SERVICE_WORKER_ERROR_DISK_CACHE: 158 case SERVICE_WORKER_ERROR_DISK_CACHE:
151 case SERVICE_WORKER_ERROR_REDUNDANT: 159 case SERVICE_WORKER_ERROR_REDUNDANT:
152 case SERVICE_WORKER_ERROR_DISALLOWED: 160 case SERVICE_WORKER_ERROR_DISALLOWED:
153 delivery_status = PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR; 161 delivery_status = PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR;
154 break; 162 break;
155 case SERVICE_WORKER_ERROR_EXISTS: 163 case SERVICE_WORKER_ERROR_EXISTS:
156 case SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED: 164 case SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED:
157 case SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED: 165 case SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED:
158 case SERVICE_WORKER_ERROR_NETWORK: 166 case SERVICE_WORKER_ERROR_NETWORK:
159 case SERVICE_WORKER_ERROR_SECURITY: 167 case SERVICE_WORKER_ERROR_SECURITY:
160 case SERVICE_WORKER_ERROR_STATE: 168 case SERVICE_WORKER_ERROR_STATE:
161 case SERVICE_WORKER_ERROR_MAX_VALUE: 169 case SERVICE_WORKER_ERROR_MAX_VALUE:
162 NOTREACHED() << "Got unexpected error code: " << service_worker_status 170 NOTREACHED() << "Got unexpected error code: " << service_worker_status
163 << " " << ServiceWorkerStatusToString(service_worker_status); 171 << " " << ServiceWorkerStatusToString(service_worker_status);
164 delivery_status = PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR; 172 delivery_status = PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR;
165 break; 173 break;
166 } 174 }
167 RunDeliverCallback(deliver_message_callback, delivery_status); 175 RunDeliverCallback(deliver_message_callback, delivery_status);
168 } 176 }
169 177
170 } // namespace content 178 } // namespace content
OLDNEW
« no previous file with comments | « chrome/browser/push_messaging/push_messaging_service_impl.cc ('k') | content/public/common/push_messaging_status.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698