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

Side by Side Diff: content/browser/service_worker/service_worker_version.cc

Issue 1171173002: [Background Sync] Use Mojo IPC to fire background sync events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Retire old IPC; fix memory leak in ServiceWorkerRegistraion test Created 5 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/service_worker/service_worker_version.h" 5 #include "content/browser/service_worker/service_worker_version.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
10 #include "base/metrics/histogram_macros.h" 10 #include "base/metrics/histogram_macros.h"
11 #include "base/single_thread_task_runner.h" 11 #include "base/single_thread_task_runner.h"
12 #include "base/stl_util.h" 12 #include "base/stl_util.h"
13 #include "base/strings/string16.h" 13 #include "base/strings/string16.h"
14 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
15 #include "base/thread_task_runner_handle.h" 15 #include "base/thread_task_runner_handle.h"
16 #include "base/time/time.h" 16 #include "base/time/time.h"
17 #include "content/browser/bad_message.h" 17 #include "content/browser/bad_message.h"
18 #include "content/browser/child_process_security_policy_impl.h" 18 #include "content/browser/child_process_security_policy_impl.h"
19 #include "content/browser/message_port_message_filter.h" 19 #include "content/browser/message_port_message_filter.h"
20 #include "content/browser/message_port_service.h" 20 #include "content/browser/message_port_service.h"
21 #include "content/browser/service_worker/embedded_worker_instance.h" 21 #include "content/browser/service_worker/embedded_worker_instance.h"
22 #include "content/browser/service_worker/embedded_worker_registry.h" 22 #include "content/browser/service_worker/embedded_worker_registry.h"
23 #include "content/browser/service_worker/service_worker_context_core.h" 23 #include "content/browser/service_worker/service_worker_context_core.h"
24 #include "content/browser/service_worker/service_worker_context_wrapper.h" 24 #include "content/browser/service_worker/service_worker_context_wrapper.h"
25 #include "content/browser/service_worker/service_worker_event_dispatcher.h"
25 #include "content/browser/service_worker/service_worker_metrics.h" 26 #include "content/browser/service_worker/service_worker_metrics.h"
26 #include "content/browser/service_worker/service_worker_registration.h" 27 #include "content/browser/service_worker/service_worker_registration.h"
27 #include "content/browser/service_worker/service_worker_utils.h" 28 #include "content/browser/service_worker/service_worker_utils.h"
28 #include "content/browser/service_worker/stashed_port_manager.h" 29 #include "content/browser/service_worker/stashed_port_manager.h"
29 #include "content/browser/storage_partition_impl.h" 30 #include "content/browser/storage_partition_impl.h"
30 #include "content/common/service_worker/service_worker_messages.h" 31 #include "content/common/service_worker/service_worker_messages.h"
31 #include "content/public/browser/browser_thread.h" 32 #include "content/public/browser/browser_thread.h"
32 #include "content/public/browser/content_browser_client.h" 33 #include "content/public/browser/content_browser_client.h"
33 #include "content/public/browser/page_navigator.h" 34 #include "content/public/browser/page_navigator.h"
34 #include "content/public/browser/render_frame_host.h" 35 #include "content/public/browser/render_frame_host.h"
35 #include "content/public/browser/render_process_host.h" 36 #include "content/public/browser/render_process_host.h"
36 #include "content/public/browser/web_contents.h" 37 #include "content/public/browser/web_contents.h"
37 #include "content/public/browser/web_contents_observer.h" 38 #include "content/public/browser/web_contents_observer.h"
38 #include "content/public/common/child_process_host.h" 39 #include "content/public/common/child_process_host.h"
39 #include "content/public/common/content_client.h" 40 #include "content/public/common/content_client.h"
40 #include "content/public/common/content_switches.h" 41 #include "content/public/common/content_switches.h"
41 #include "content/public/common/result_codes.h" 42 #include "content/public/common/result_codes.h"
43 #include "content/public/common/service_registry.h"
42 #include "net/http/http_response_headers.h" 44 #include "net/http/http_response_headers.h"
43 #include "net/http/http_response_info.h" 45 #include "net/http/http_response_info.h"
44 46
45 namespace content { 47 namespace content {
46 48
47 using StatusCallback = ServiceWorkerVersion::StatusCallback; 49 using StatusCallback = ServiceWorkerVersion::StatusCallback;
48 using ServiceWorkerClients = std::vector<ServiceWorkerClientInfo>; 50 using ServiceWorkerClients = std::vector<ServiceWorkerClientInfo>;
49 using GetClientsCallback = 51 using GetClientsCallback =
50 base::Callback<void(scoped_ptr<ServiceWorkerClients>)>; 52 base::Callback<void(scoped_ptr<ServiceWorkerClients>)>;
51 53
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 int64 version_id, 476 int64 version_id,
475 base::WeakPtr<ServiceWorkerContextCore> context) 477 base::WeakPtr<ServiceWorkerContextCore> context)
476 : version_id_(version_id), 478 : version_id_(version_id),
477 registration_id_(registration->id()), 479 registration_id_(registration->id()),
478 script_url_(script_url), 480 script_url_(script_url),
479 scope_(registration->pattern()), 481 scope_(registration->pattern()),
480 context_(context), 482 context_(context),
481 script_cache_map_(this, context), 483 script_cache_map_(this, context),
482 ping_controller_(new PingController(this)), 484 ping_controller_(new PingController(this)),
483 metrics_(new Metrics), 485 metrics_(new Metrics),
486 event_dispatcher_(new ServiceWorkerEventDispatcher()),
484 weak_factory_(this) { 487 weak_factory_(this) {
485 DCHECK(context_); 488 DCHECK(context_);
486 DCHECK(registration); 489 DCHECK(registration);
487 context_->AddLiveVersion(this); 490 context_->AddLiveVersion(this);
488 embedded_worker_ = context_->embedded_worker_registry()->CreateWorker(); 491 embedded_worker_ = context_->embedded_worker_registry()->CreateWorker();
489 embedded_worker_->AddListener(this); 492 embedded_worker_->AddListener(this);
490 } 493 }
491 494
492 ServiceWorkerVersion::~ServiceWorkerVersion() { 495 ServiceWorkerVersion::~ServiceWorkerVersion() {
493 // The user may have closed the tab waiting for SW to start up. 496 // The user may have closed the tab waiting for SW to start up.
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 if (running_status() != RUNNING) { 738 if (running_status() != RUNNING) {
736 // Schedule calling this method after starting the worker. 739 // Schedule calling this method after starting the worker.
737 StartWorker(base::Bind(&RunTaskAfterStartWorker, 740 StartWorker(base::Bind(&RunTaskAfterStartWorker,
738 weak_factory_.GetWeakPtr(), callback, 741 weak_factory_.GetWeakPtr(), callback,
739 base::Bind(&self::DispatchSyncEvent, 742 base::Bind(&self::DispatchSyncEvent,
740 weak_factory_.GetWeakPtr(), 743 weak_factory_.GetWeakPtr(),
741 callback))); 744 callback)));
742 return; 745 return;
743 } 746 }
744 747
745 int request_id = AddRequest(callback, &sync_callbacks_, REQUEST_SYNC); 748 // We can only get the embedded worker's process and thread ids on the IO
746 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( 749 // thread, but we need to be on the UI thread to get the the mojo service
747 ServiceWorkerMsg_SyncEvent(request_id)); 750 // registry from the RenderProcessHost.
748 if (status != SERVICE_WORKER_OK) { 751 BrowserThread::PostTask(
749 sync_callbacks_.Remove(request_id); 752 BrowserThread::UI, FROM_HERE,
750 RunSoon(base::Bind(callback, status)); 753 base::Bind(
754 &ServiceWorkerEventDispatcher::DispatchSyncEvent, event_dispatcher_,
755 embedded_worker_->process_id(), embedded_worker_->thread_id(),
756 base::Bind(&ServiceWorkerVersion::OnSyncEventFinished,
757 base::Unretained(this), callback),
758 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)));
759 }
760
761 void ServiceWorkerVersion::OnSyncEventFinished(const StatusCallback& callback,
jkarlin 2015/06/12 21:08:14 What happens if the ServiceWorker dies mid sync? D
762 ServiceWorkerStatusCode status) {
763 DCHECK_CURRENTLY_ON(BrowserThread::IO);
764
jkarlin 2015/06/12 21:08:14 You're missing the TRACE_EVENT macro that the orig
iclelland 2015/06/16 15:59:16 You're right -- that got lost in a reorg. Fixed, t
765 scoped_refptr<ServiceWorkerVersion> protect(this);
766 callback.Run(status);
767
768 RestartTick(&idle_time_);
769 // TODO(iclelland) factor this out of RemoveCallbackAndStopIfRedundant
jkarlin 2015/06/12 21:08:14 You might as well make a StopIfRedundant function
iclelland 2015/06/16 15:59:16 Yep; that was the intended refactor. Done.
770 if (is_redundant()) {
771 // The stop should be already scheduled, but try to stop immediately, in
772 // order to release worker resources soon.
773 StopWorkerIfIdle();
751 } 774 }
752 } 775 }
753 776
754 void ServiceWorkerVersion::DispatchNotificationClickEvent( 777 void ServiceWorkerVersion::DispatchNotificationClickEvent(
755 const StatusCallback& callback, 778 const StatusCallback& callback,
756 int64_t persistent_notification_id, 779 int64_t persistent_notification_id,
757 const PlatformNotificationData& notification_data) { 780 const PlatformNotificationData& notification_data) {
758 DCHECK_EQ(ACTIVATED, status()) << status(); 781 DCHECK_EQ(ACTIVATED, status()) << status();
759 if (running_status() != RUNNING) { 782 if (running_status() != RUNNING) {
760 // Schedule calling this method after starting the worker. 783 // Schedule calling this method after starting the worker.
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 // callbacks for events). 1117 // callbacks for events).
1095 // TODO(kinuko): Consider if we want to add queue+resend mechanism here. 1118 // TODO(kinuko): Consider if we want to add queue+resend mechanism here.
1096 RunIDMapCallbacks(&activate_callbacks_, 1119 RunIDMapCallbacks(&activate_callbacks_,
1097 SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); 1120 SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED);
1098 RunIDMapCallbacks(&install_callbacks_, 1121 RunIDMapCallbacks(&install_callbacks_,
1099 SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED); 1122 SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED);
1100 RunIDMapCallbacks(&fetch_callbacks_, 1123 RunIDMapCallbacks(&fetch_callbacks_,
1101 SERVICE_WORKER_ERROR_FAILED, 1124 SERVICE_WORKER_ERROR_FAILED,
1102 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, 1125 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK,
1103 ServiceWorkerResponse()); 1126 ServiceWorkerResponse());
1104 RunIDMapCallbacks(&sync_callbacks_,
1105 SERVICE_WORKER_ERROR_FAILED);
1106 RunIDMapCallbacks(&notification_click_callbacks_, 1127 RunIDMapCallbacks(&notification_click_callbacks_,
1107 SERVICE_WORKER_ERROR_FAILED); 1128 SERVICE_WORKER_ERROR_FAILED);
1108 RunIDMapCallbacks(&push_callbacks_, 1129 RunIDMapCallbacks(&push_callbacks_,
1109 SERVICE_WORKER_ERROR_FAILED); 1130 SERVICE_WORKER_ERROR_FAILED);
1110 RunIDMapCallbacks(&geofencing_callbacks_, 1131 RunIDMapCallbacks(&geofencing_callbacks_,
1111 SERVICE_WORKER_ERROR_FAILED); 1132 SERVICE_WORKER_ERROR_FAILED);
1112 RunIDMapCallbacks(&cross_origin_connect_callbacks_, 1133 RunIDMapCallbacks(&cross_origin_connect_callbacks_,
1113 SERVICE_WORKER_ERROR_FAILED, 1134 SERVICE_WORKER_ERROR_FAILED,
1114 false); 1135 false);
1115 1136
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1152 bool handled = true; 1173 bool handled = true;
1153 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerVersion, message) 1174 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerVersion, message)
1154 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClients, 1175 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClients,
1155 OnGetClients) 1176 OnGetClients)
1156 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ActivateEventFinished, 1177 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ActivateEventFinished,
1157 OnActivateEventFinished) 1178 OnActivateEventFinished)
1158 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_InstallEventFinished, 1179 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_InstallEventFinished,
1159 OnInstallEventFinished) 1180 OnInstallEventFinished)
1160 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, 1181 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished,
1161 OnFetchEventFinished) 1182 OnFetchEventFinished)
1162 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished,
1163 OnSyncEventFinished)
1164 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationClickEventFinished, 1183 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationClickEventFinished,
1165 OnNotificationClickEventFinished) 1184 OnNotificationClickEventFinished)
1166 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, 1185 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished,
1167 OnPushEventFinished) 1186 OnPushEventFinished)
1168 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished, 1187 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished,
1169 OnGeofencingEventFinished) 1188 OnGeofencingEventFinished)
1170 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CrossOriginConnectEventFinished, 1189 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CrossOriginConnectEventFinished,
1171 OnCrossOriginConnectEventFinished) 1190 OnCrossOriginConnectEventFinished)
1172 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, 1191 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow,
1173 OnOpenWindow) 1192 OnOpenWindow)
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
1325 1344
1326 // TODO(kinuko): Record other event statuses too. 1345 // TODO(kinuko): Record other event statuses too.
1327 const bool handled = (result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE); 1346 const bool handled = (result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE);
1328 metrics_->RecordEventStatus(handled); 1347 metrics_->RecordEventStatus(handled);
1329 1348
1330 scoped_refptr<ServiceWorkerVersion> protect(this); 1349 scoped_refptr<ServiceWorkerVersion> protect(this);
1331 callback->Run(SERVICE_WORKER_OK, result, response); 1350 callback->Run(SERVICE_WORKER_OK, result, response);
1332 RemoveCallbackAndStopIfRedundant(&fetch_callbacks_, request_id); 1351 RemoveCallbackAndStopIfRedundant(&fetch_callbacks_, request_id);
1333 } 1352 }
1334 1353
1335 void ServiceWorkerVersion::OnSyncEventFinished(
1336 int request_id,
1337 blink::WebServiceWorkerEventResult result) {
1338 TRACE_EVENT1("ServiceWorker",
1339 "ServiceWorkerVersion::OnSyncEventFinished",
1340 "Request id", request_id);
1341 StatusCallback* callback = sync_callbacks_.Lookup(request_id);
1342 if (!callback) {
1343 NOTREACHED() << "Got unexpected message: " << request_id;
1344 return;
1345 }
1346
1347 ServiceWorkerStatusCode status = SERVICE_WORKER_OK;
1348 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
1349 switches::kEnableServiceWorkerSync)) {
1350 // Avoid potential race condition where flag is disabled after a sync event
1351 // was dispatched
1352 status = SERVICE_WORKER_ERROR_ABORT;
1353 } else if (result == blink::WebServiceWorkerEventResultRejected) {
1354 status = SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED;
1355 }
1356
1357 scoped_refptr<ServiceWorkerVersion> protect(this);
1358 callback->Run(status);
1359 RemoveCallbackAndStopIfRedundant(&sync_callbacks_, request_id);
1360 }
1361
1362 void ServiceWorkerVersion::OnNotificationClickEventFinished( 1354 void ServiceWorkerVersion::OnNotificationClickEventFinished(
1363 int request_id) { 1355 int request_id) {
1364 TRACE_EVENT1("ServiceWorker", 1356 TRACE_EVENT1("ServiceWorker",
1365 "ServiceWorkerVersion::OnNotificationClickEventFinished", 1357 "ServiceWorkerVersion::OnNotificationClickEventFinished",
1366 "Request id", request_id); 1358 "Request id", request_id);
1367 StatusCallback* callback = notification_click_callbacks_.Lookup(request_id); 1359 StatusCallback* callback = notification_click_callbacks_.Lookup(request_id);
1368 if (!callback) { 1360 if (!callback) {
1369 NOTREACHED() << "Got unexpected message: " << request_id; 1361 NOTREACHED() << "Got unexpected message: " << request_id;
1370 return; 1362 return;
1371 } 1363 }
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
1896 // forcibly fail pending callbacks so no one is stuck waiting 1888 // forcibly fail pending callbacks so no one is stuck waiting
1897 // for the worker. 1889 // for the worker.
1898 embedded_worker_->StopIfIdle(); 1890 embedded_worker_->StopIfIdle();
1899 } 1891 }
1900 1892
1901 bool ServiceWorkerVersion::HasInflightRequests() const { 1893 bool ServiceWorkerVersion::HasInflightRequests() const {
1902 return 1894 return
1903 !activate_callbacks_.IsEmpty() || 1895 !activate_callbacks_.IsEmpty() ||
1904 !install_callbacks_.IsEmpty() || 1896 !install_callbacks_.IsEmpty() ||
1905 !fetch_callbacks_.IsEmpty() || 1897 !fetch_callbacks_.IsEmpty() ||
1906 !sync_callbacks_.IsEmpty() ||
1907 !notification_click_callbacks_.IsEmpty() || 1898 !notification_click_callbacks_.IsEmpty() ||
1908 !push_callbacks_.IsEmpty() || 1899 !push_callbacks_.IsEmpty() ||
1909 !geofencing_callbacks_.IsEmpty() || 1900 !geofencing_callbacks_.IsEmpty() ||
1910 !cross_origin_connect_callbacks_.IsEmpty() || 1901 !cross_origin_connect_callbacks_.IsEmpty() ||
1911 !streaming_url_request_jobs_.empty(); 1902 !streaming_url_request_jobs_.empty();
1912 } 1903 }
1913 1904
1914 void ServiceWorkerVersion::RecordStartWorkerResult( 1905 void ServiceWorkerVersion::RecordStartWorkerResult(
1915 ServiceWorkerStatusCode status) { 1906 ServiceWorkerStatusCode status) {
1916 base::TimeTicks start_time = start_time_; 1907 base::TimeTicks start_time = start_time_;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1977 return RunIDMapCallback(&activate_callbacks_, info.id, 1968 return RunIDMapCallback(&activate_callbacks_, info.id,
1978 SERVICE_WORKER_ERROR_TIMEOUT); 1969 SERVICE_WORKER_ERROR_TIMEOUT);
1979 case REQUEST_INSTALL: 1970 case REQUEST_INSTALL:
1980 return RunIDMapCallback(&install_callbacks_, info.id, 1971 return RunIDMapCallback(&install_callbacks_, info.id,
1981 SERVICE_WORKER_ERROR_TIMEOUT); 1972 SERVICE_WORKER_ERROR_TIMEOUT);
1982 case REQUEST_FETCH: 1973 case REQUEST_FETCH:
1983 return RunIDMapCallback( 1974 return RunIDMapCallback(
1984 &fetch_callbacks_, info.id, SERVICE_WORKER_ERROR_TIMEOUT, 1975 &fetch_callbacks_, info.id, SERVICE_WORKER_ERROR_TIMEOUT,
1985 /* The other args are ignored for non-OK status. */ 1976 /* The other args are ignored for non-OK status. */
1986 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse()); 1977 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse());
1987 case REQUEST_SYNC:
1988 return RunIDMapCallback(&sync_callbacks_, info.id,
1989 SERVICE_WORKER_ERROR_TIMEOUT);
1990 case REQUEST_NOTIFICATION_CLICK: 1978 case REQUEST_NOTIFICATION_CLICK:
1991 return RunIDMapCallback(&notification_click_callbacks_, info.id, 1979 return RunIDMapCallback(&notification_click_callbacks_, info.id,
1992 SERVICE_WORKER_ERROR_TIMEOUT); 1980 SERVICE_WORKER_ERROR_TIMEOUT);
1993 case REQUEST_PUSH: 1981 case REQUEST_PUSH:
1994 return RunIDMapCallback(&push_callbacks_, info.id, 1982 return RunIDMapCallback(&push_callbacks_, info.id,
1995 SERVICE_WORKER_ERROR_TIMEOUT); 1983 SERVICE_WORKER_ERROR_TIMEOUT);
1996 case REQUEST_GEOFENCING: 1984 case REQUEST_GEOFENCING:
1997 return RunIDMapCallback(&geofencing_callbacks_, info.id, 1985 return RunIDMapCallback(&geofencing_callbacks_, info.id,
1998 SERVICE_WORKER_ERROR_TIMEOUT); 1986 SERVICE_WORKER_ERROR_TIMEOUT);
1999 case REQUEST_CROSS_ORIGIN_CONNECT: 1987 case REQUEST_CROSS_ORIGIN_CONNECT:
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2035 return SERVICE_WORKER_ERROR_ABORT; 2023 return SERVICE_WORKER_ERROR_ABORT;
2036 default: 2024 default:
2037 return SERVICE_WORKER_ERROR_NETWORK; 2025 return SERVICE_WORKER_ERROR_NETWORK;
2038 } 2026 }
2039 } 2027 }
2040 2028
2041 return default_code; 2029 return default_code;
2042 } 2030 }
2043 2031
2044 } // namespace content 2032 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698