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

Side by Side Diff: content/renderer/service_worker/service_worker_context_client.cc

Issue 2703343002: ServiceWorker: Use mojo's data pipe for respondWith(stream) (Closed)
Patch Set: Rebase Created 3 years, 8 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/renderer/service_worker/service_worker_context_client.h" 5 #include "content/renderer/service_worker/service_worker_context_client.h"
6 6
7 #include <map>
7 #include <memory> 8 #include <memory>
8 #include <utility> 9 #include <utility>
9 10
10 #include "base/lazy_instance.h" 11 #include "base/lazy_instance.h"
11 #include "base/logging.h" 12 #include "base/logging.h"
12 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
13 #include "base/metrics/histogram_macros.h" 14 #include "base/metrics/histogram_macros.h"
14 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
15 #include "base/threading/thread_checker.h" 16 #include "base/threading/thread_checker.h"
16 #include "base/threading/thread_local.h" 17 #include "base/threading/thread_local.h"
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 // Service workers are only available in secure contexts, so all requests 104 // Service workers are only available in secure contexts, so all requests
104 // are initiated in a secure context. 105 // are initiated in a secure context.
105 extra_data->set_initiated_in_secure_context(true); 106 extra_data->set_initiated_in_secure_context(true);
106 request.setExtraData(extra_data.release()); 107 request.setExtraData(extra_data.release());
107 } 108 }
108 109
109 private: 110 private:
110 std::unique_ptr<ServiceWorkerNetworkProvider> provider_; 111 std::unique_ptr<ServiceWorkerNetworkProvider> provider_;
111 }; 112 };
112 113
114 class StreamHandleListener
115 : public blink::WebServiceWorkerStreamHandle::Listener {
116 public:
117 StreamHandleListener(
118 blink::mojom::ServiceWorkerStreamCallbackPtr callback_ptr)
119 : callback_ptr_(std::move(callback_ptr)) {}
120
121 void OnAborted() override { callback_ptr_->OnAborted(); }
122 void OnCompleted() override { callback_ptr_->OnCompleted(); }
123
124 private:
125 blink::mojom::ServiceWorkerStreamCallbackPtr callback_ptr_;
126 };
127
113 ServiceWorkerStatusCode EventResultToStatus( 128 ServiceWorkerStatusCode EventResultToStatus(
114 blink::WebServiceWorkerEventResult result) { 129 blink::WebServiceWorkerEventResult result) {
115 switch (result) { 130 switch (result) {
116 case blink::WebServiceWorkerEventResultCompleted: 131 case blink::WebServiceWorkerEventResultCompleted:
117 return SERVICE_WORKER_OK; 132 return SERVICE_WORKER_OK;
118 case blink::WebServiceWorkerEventResultRejected: 133 case blink::WebServiceWorkerEventResultRejected:
119 return SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED; 134 return SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED;
120 } 135 }
121 NOTREACHED() << "Got invalid result: " << result; 136 NOTREACHED() << "Got invalid result: " << result;
122 return SERVICE_WORKER_ERROR_FAILED; 137 return SERVICE_WORKER_ERROR_FAILED;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 web_response->setStatusText(blink::WebString::fromUTF8(response.status_text)); 227 web_response->setStatusText(blink::WebString::fromUTF8(response.status_text));
213 web_response->setResponseType(response.response_type); 228 web_response->setResponseType(response.response_type);
214 for (const auto& pair : response.headers) { 229 for (const auto& pair : response.headers) {
215 web_response->setHeader(blink::WebString::fromUTF8(pair.first), 230 web_response->setHeader(blink::WebString::fromUTF8(pair.first),
216 blink::WebString::fromUTF8(pair.second)); 231 blink::WebString::fromUTF8(pair.second));
217 } 232 }
218 if (!response.blob_uuid.empty()) { 233 if (!response.blob_uuid.empty()) {
219 web_response->setBlob(blink::WebString::fromASCII(response.blob_uuid), 234 web_response->setBlob(blink::WebString::fromASCII(response.blob_uuid),
220 response.blob_size); 235 response.blob_size);
221 } 236 }
222 web_response->setStreamURL(blink::WebURL(response.stream_url));
223 web_response->setError(response.error); 237 web_response->setError(response.error);
224 web_response->setResponseTime(response.response_time.ToInternalValue()); 238 web_response->setResponseTime(response.response_time.ToInternalValue());
225 if (response.is_in_cache_storage) { 239 if (response.is_in_cache_storage) {
226 web_response->setCacheStorageCacheName( 240 web_response->setCacheStorageCacheName(
227 blink::WebString::fromUTF8(response.cache_storage_cache_name)); 241 blink::WebString::fromUTF8(response.cache_storage_cache_name));
228 } 242 }
229 243
230 std::vector<blink::WebString> cors_exposed_header_names; 244 std::vector<blink::WebString> cors_exposed_header_names;
231 for (const auto& name : response.cors_exposed_header_names) 245 for (const auto& name : response.cors_exposed_header_names)
232 cors_exposed_header_names.push_back(blink::WebString::fromUTF8(name)); 246 cors_exposed_header_names.push_back(blink::WebString::fromUTF8(name));
233 247
234 web_response->setCorsExposedHeaderNames( 248 web_response->setCorsExposedHeaderNames(
235 blink::WebVector<blink::WebString>(cors_exposed_header_names)); 249 blink::WebVector<blink::WebString>(cors_exposed_header_names));
236 } 250 }
237 251
238 // Use this template in willDestroyWorkerContext to abort all the pending 252 // Use this template in willDestroyWorkerContext to abort all the pending
239 // events callbacks. 253 // events callbacks.
240 template <typename T> 254 template <typename T>
241 void AbortPendingEventCallbacks(T& callbacks) { 255 void AbortPendingEventCallbacks(T& callbacks) {
242 for (typename T::iterator it(&callbacks); !it.IsAtEnd(); it.Advance()) { 256 for (typename T::iterator it(&callbacks); !it.IsAtEnd(); it.Advance()) {
243 it.GetCurrentValue()->Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); 257 it.GetCurrentValue()->Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now());
244 } 258 }
245 } 259 }
246 260
261 template <typename Key, typename Callback>
262 void AbortPendingEventCallbacks(std::map<Key, Callback>& callbacks) {
263 for (const auto& it : callbacks)
264 it.second.Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now());
265 }
266
247 } // namespace 267 } // namespace
248 268
249 // Holding data that needs to be bound to the worker context on the 269 // Holding data that needs to be bound to the worker context on the
250 // worker thread. 270 // worker thread.
251 struct ServiceWorkerContextClient::WorkerContextData { 271 struct ServiceWorkerContextClient::WorkerContextData {
272 using SimpleEventCallback =
273 base::Callback<void(ServiceWorkerStatusCode, base::Time)>;
252 using ClientsCallbacksMap = 274 using ClientsCallbacksMap =
253 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsCallbacks>>; 275 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsCallbacks>>;
254 using ClaimClientsCallbacksMap = 276 using ClaimClientsCallbacksMap =
255 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks>>; 277 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks>>;
256 using ClientCallbacksMap = 278 using ClientCallbacksMap =
257 IDMap<std::unique_ptr<blink::WebServiceWorkerClientCallbacks>>; 279 IDMap<std::unique_ptr<blink::WebServiceWorkerClientCallbacks>>;
258 using SkipWaitingCallbacksMap = 280 using SkipWaitingCallbacksMap =
259 IDMap<std::unique_ptr<blink::WebServiceWorkerSkipWaitingCallbacks>>; 281 IDMap<std::unique_ptr<blink::WebServiceWorkerSkipWaitingCallbacks>>;
260 using ActivateEventCallbacksMap = 282 using ActivateEventCallbacksMap =
261 IDMap<std::unique_ptr<const DispatchActivateEventCallback>>; 283 IDMap<std::unique_ptr<const DispatchActivateEventCallback>>;
262 using BackgroundFetchAbortEventCallbacksMap = 284 using BackgroundFetchAbortEventCallbacksMap =
263 IDMap<std::unique_ptr<const DispatchBackgroundFetchAbortEventCallback>>; 285 IDMap<std::unique_ptr<const DispatchBackgroundFetchAbortEventCallback>>;
264 using BackgroundFetchClickEventCallbacksMap = 286 using BackgroundFetchClickEventCallbacksMap =
265 IDMap<std::unique_ptr<const DispatchBackgroundFetchClickEventCallback>>; 287 IDMap<std::unique_ptr<const DispatchBackgroundFetchClickEventCallback>>;
266 using BackgroundFetchFailEventCallbacksMap = 288 using BackgroundFetchFailEventCallbacksMap =
267 IDMap<std::unique_ptr<const DispatchBackgroundFetchFailEventCallback>>; 289 IDMap<std::unique_ptr<const DispatchBackgroundFetchFailEventCallback>>;
268 using BackgroundFetchedEventCallbacksMap = 290 using BackgroundFetchedEventCallbacksMap =
269 IDMap<std::unique_ptr<const DispatchBackgroundFetchedEventCallback>>; 291 IDMap<std::unique_ptr<const DispatchBackgroundFetchedEventCallback>>;
270 using SyncEventCallbacksMap = IDMap<std::unique_ptr<const SyncCallback>>; 292 using SyncEventCallbacksMap = IDMap<std::unique_ptr<const SyncCallback>>;
271 using NotificationClickEventCallbacksMap = 293 using NotificationClickEventCallbacksMap =
272 IDMap<std::unique_ptr<const DispatchNotificationClickEventCallback>>; 294 IDMap<std::unique_ptr<const DispatchNotificationClickEventCallback>>;
273 using NotificationCloseEventCallbacksMap = 295 using NotificationCloseEventCallbacksMap =
274 IDMap<std::unique_ptr<const DispatchNotificationCloseEventCallback>>; 296 IDMap<std::unique_ptr<const DispatchNotificationCloseEventCallback>>;
275 using PushEventCallbacksMap = 297 using PushEventCallbacksMap =
276 IDMap<std::unique_ptr<const DispatchPushEventCallback>>; 298 IDMap<std::unique_ptr<const DispatchPushEventCallback>>;
277 using FetchEventCallbacksMap = IDMap<std::unique_ptr<const FetchCallback>>;
278 using ExtendableMessageEventCallbacksMap = 299 using ExtendableMessageEventCallbacksMap =
279 IDMap<std::unique_ptr<const DispatchExtendableMessageEventCallback>>; 300 IDMap<std::unique_ptr<const DispatchExtendableMessageEventCallback>>;
280 using NavigationPreloadRequestsMap = IDMap< 301 using NavigationPreloadRequestsMap = IDMap<
281 std::unique_ptr<ServiceWorkerContextClient::NavigationPreloadRequest>>; 302 std::unique_ptr<ServiceWorkerContextClient::NavigationPreloadRequest>>;
282 303
283 explicit WorkerContextData(ServiceWorkerContextClient* owner) 304 explicit WorkerContextData(ServiceWorkerContextClient* owner)
284 : event_dispatcher_binding(owner), 305 : event_dispatcher_binding(owner),
285 weak_factory(owner), 306 weak_factory(owner),
286 proxy_weak_factory(owner->proxy_) {} 307 proxy_weak_factory(owner->proxy_) {}
287 308
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 // Pending callbacks for Notification Click Events. 355 // Pending callbacks for Notification Click Events.
335 NotificationClickEventCallbacksMap notification_click_event_callbacks; 356 NotificationClickEventCallbacksMap notification_click_event_callbacks;
336 357
337 // Pending callbacks for Notification Close Events. 358 // Pending callbacks for Notification Close Events.
338 NotificationCloseEventCallbacksMap notification_close_event_callbacks; 359 NotificationCloseEventCallbacksMap notification_close_event_callbacks;
339 360
340 // Pending callbacks for Push Events. 361 // Pending callbacks for Push Events.
341 PushEventCallbacksMap push_event_callbacks; 362 PushEventCallbacksMap push_event_callbacks;
342 363
343 // Pending callbacks for Fetch Events. 364 // Pending callbacks for Fetch Events.
344 FetchEventCallbacksMap fetch_event_callbacks; 365 std::map<int /* fetch_event_id */, SimpleEventCallback> fetch_event_callbacks;
366
367 // Pending callbacks for respondWith on each fetch event.
368 std::map<int /* fetch_event_id */,
369 mojom::ServiceWorkerFetchResponseCallbackPtr>
370 fetch_response_callbacks;
345 371
346 // Pending callbacks for Extendable Message Events. 372 // Pending callbacks for Extendable Message Events.
347 ExtendableMessageEventCallbacksMap message_event_callbacks; 373 ExtendableMessageEventCallbacksMap message_event_callbacks;
348 374
349 // Pending navigation preload requests. 375 // Pending navigation preload requests.
350 NavigationPreloadRequestsMap preload_requests; 376 NavigationPreloadRequestsMap preload_requests;
351 377
352 base::ThreadChecker thread_checker; 378 base::ThreadChecker thread_checker;
353 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory; 379 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory;
354 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory; 380 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory;
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 blink::WebServiceWorkerEventResult result, 878 blink::WebServiceWorkerEventResult result,
853 double event_dispatch_time) { 879 double event_dispatch_time) {
854 Send(new ServiceWorkerHostMsg_InstallEventFinished( 880 Send(new ServiceWorkerHostMsg_InstallEventFinished(
855 GetRoutingID(), request_id, result, proxy_->hasFetchEventHandler(), 881 GetRoutingID(), request_id, result, proxy_->hasFetchEventHandler(),
856 base::Time::FromDoubleT(event_dispatch_time))); 882 base::Time::FromDoubleT(event_dispatch_time)));
857 } 883 }
858 884
859 void ServiceWorkerContextClient::respondToFetchEvent( 885 void ServiceWorkerContextClient::respondToFetchEvent(
860 int fetch_event_id, 886 int fetch_event_id,
861 double event_dispatch_time) { 887 double event_dispatch_time) {
862 Send(new ServiceWorkerHostMsg_FetchEventResponse( 888 const mojom::ServiceWorkerFetchResponseCallbackPtr& response_callback =
863 GetRoutingID(), fetch_event_id, 889 context_->fetch_response_callbacks[fetch_event_id];
864 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse(), 890 DCHECK(response_callback.is_bound());
865 base::Time::FromDoubleT(event_dispatch_time))); 891 response_callback->OnFallback(base::Time::FromDoubleT(event_dispatch_time));
892 context_->fetch_response_callbacks.erase(fetch_event_id);
866 } 893 }
867 894
868 void ServiceWorkerContextClient::respondToFetchEvent( 895 void ServiceWorkerContextClient::respondToFetchEventWithResponse(
869 int fetch_event_id, 896 int fetch_event_id,
870 const blink::WebServiceWorkerResponse& web_response, 897 const blink::WebServiceWorkerResponse& web_response,
871 double event_dispatch_time) { 898 double event_dispatch_time) {
872 Send(new ServiceWorkerHostMsg_FetchEventResponse( 899 ServiceWorkerResponse response(
873 GetRoutingID(), fetch_event_id, 900 GetServiceWorkerResponseFromWebResponse(web_response));
874 SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, 901 const mojom::ServiceWorkerFetchResponseCallbackPtr& response_callback =
875 GetServiceWorkerResponseFromWebResponse(web_response), 902 context_->fetch_response_callbacks[fetch_event_id];
876 base::Time::FromDoubleT(event_dispatch_time))); 903 if (response.blob_uuid.size()) {
904 // Send the legacy IPC due to the ordering issue between respondWith and
905 // blob.
906 // TODO(shimazu): mojofy this IPC after blob starts using sync IPC for
907 // creation or is mojofied.
horo 2017/04/06 05:22:09 we should have crbug ID.
shimazu 2017/04/07 08:52:29 Done.
908 Send(new ServiceWorkerHostMsg_FetchEventResponse(
909 GetRoutingID(), fetch_event_id, response,
910 base::Time::FromDoubleT(event_dispatch_time)));
911 } else {
912 response_callback->OnResponse(response,
913 base::Time::FromDoubleT(event_dispatch_time));
914 }
915 context_->fetch_response_callbacks.erase(fetch_event_id);
916 }
917
918 void ServiceWorkerContextClient::respondToFetchEventWithResponseStream(
919 int fetch_event_id,
920 const blink::WebServiceWorkerResponse& web_response,
921 blink::WebServiceWorkerStreamHandle* web_stream_handle,
922 double event_dispatch_time) {
923 ServiceWorkerResponse response(
924 GetServiceWorkerResponseFromWebResponse(web_response));
925 const mojom::ServiceWorkerFetchResponseCallbackPtr& response_callback =
926 context_->fetch_response_callbacks[fetch_event_id];
927 blink::mojom::ServiceWorkerStreamHandlePtr stream_handle =
928 blink::mojom::ServiceWorkerStreamHandle::New();
929 blink::mojom::ServiceWorkerStreamCallbackPtr callback_ptr;
930 stream_handle->callback_request = mojo::MakeRequest(&callback_ptr);
931 stream_handle->stream = web_stream_handle->drainStreamDataPipe();
932
933 web_stream_handle->setListener(
934 base::MakeUnique<StreamHandleListener>(std::move(callback_ptr)));
935
936 response_callback->OnResponseStream(
937 response, std::move(stream_handle),
938 base::Time::FromDoubleT(event_dispatch_time));
939 context_->fetch_response_callbacks.erase(fetch_event_id);
877 } 940 }
878 941
879 void ServiceWorkerContextClient::didHandleFetchEvent( 942 void ServiceWorkerContextClient::didHandleFetchEvent(
880 int fetch_event_id, 943 int fetch_event_id,
881 blink::WebServiceWorkerEventResult result, 944 blink::WebServiceWorkerEventResult result,
882 double event_dispatch_time) { 945 double event_dispatch_time) {
883 const FetchCallback* callback = 946 const WorkerContextData::SimpleEventCallback& callback =
884 context_->fetch_event_callbacks.Lookup(fetch_event_id); 947 context_->fetch_event_callbacks[fetch_event_id];
885 DCHECK(callback); 948 DCHECK(callback);
886 callback->Run(EventResultToStatus(result), 949 callback.Run(EventResultToStatus(result),
887 base::Time::FromDoubleT(event_dispatch_time)); 950 base::Time::FromDoubleT(event_dispatch_time));
888 context_->fetch_event_callbacks.Remove(fetch_event_id); 951 context_->fetch_event_callbacks.erase(fetch_event_id);
889 } 952 }
890 953
891 void ServiceWorkerContextClient::didHandleNotificationClickEvent( 954 void ServiceWorkerContextClient::didHandleNotificationClickEvent(
892 int request_id, 955 int request_id,
893 blink::WebServiceWorkerEventResult result, 956 blink::WebServiceWorkerEventResult result,
894 double event_dispatch_time) { 957 double event_dispatch_time) {
895 const DispatchNotificationClickEventCallback* callback = 958 const DispatchNotificationClickEventCallback* callback =
896 context_->notification_click_event_callbacks.Lookup(request_id); 959 context_->notification_click_event_callbacks.Lookup(request_id);
897 DCHECK(callback); 960 DCHECK(callback);
898 961
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
1228 void ServiceWorkerContextClient::OnInstallEvent(int request_id) { 1291 void ServiceWorkerContextClient::OnInstallEvent(int request_id) {
1229 TRACE_EVENT0("ServiceWorker", 1292 TRACE_EVENT0("ServiceWorker",
1230 "ServiceWorkerContextClient::OnInstallEvent"); 1293 "ServiceWorkerContextClient::OnInstallEvent");
1231 proxy_->dispatchInstallEvent(request_id); 1294 proxy_->dispatchInstallEvent(request_id);
1232 } 1295 }
1233 1296
1234 void ServiceWorkerContextClient::DispatchFetchEvent( 1297 void ServiceWorkerContextClient::DispatchFetchEvent(
1235 int fetch_event_id, 1298 int fetch_event_id,
1236 const ServiceWorkerFetchRequest& request, 1299 const ServiceWorkerFetchRequest& request,
1237 mojom::FetchEventPreloadHandlePtr preload_handle, 1300 mojom::FetchEventPreloadHandlePtr preload_handle,
1301 mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
1238 const DispatchFetchEventCallback& callback) { 1302 const DispatchFetchEventCallback& callback) {
1239 std::unique_ptr<NavigationPreloadRequest> preload_request = 1303 std::unique_ptr<NavigationPreloadRequest> preload_request =
1240 preload_handle 1304 preload_handle
1241 ? base::MakeUnique<NavigationPreloadRequest>( 1305 ? base::MakeUnique<NavigationPreloadRequest>(
1242 fetch_event_id, request.url, std::move(preload_handle)) 1306 fetch_event_id, request.url, std::move(preload_handle))
1243 : nullptr; 1307 : nullptr;
1244 const bool navigation_preload_sent = !!preload_request; 1308 const bool navigation_preload_sent = !!preload_request;
1245 TRACE_EVENT0("ServiceWorker", 1309 TRACE_EVENT0("ServiceWorker",
1246 "ServiceWorkerContextClient::DispatchFetchEvent"); 1310 "ServiceWorkerContextClient::DispatchFetchEvent");
1247 context_->fetch_event_callbacks.AddWithID( 1311 context_->fetch_response_callbacks.insert(
1248 base::MakeUnique<FetchCallback>(callback), fetch_event_id); 1312 std::make_pair(fetch_event_id, std::move(response_callback)));
1313 context_->fetch_event_callbacks.insert(
1314 std::make_pair(fetch_event_id, std::move(callback)));
1249 if (preload_request) { 1315 if (preload_request) {
1250 context_->preload_requests.AddWithID(std::move(preload_request), 1316 context_->preload_requests.AddWithID(std::move(preload_request),
1251 fetch_event_id); 1317 fetch_event_id);
1252 } 1318 }
1253 1319
1254 blink::WebServiceWorkerRequest web_request; 1320 blink::WebServiceWorkerRequest web_request;
1255 ToWebServiceWorkerRequest(request, &web_request); 1321 ToWebServiceWorkerRequest(request, &web_request);
1256 1322
1257 if (request.fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) { 1323 if (request.fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) {
1258 proxy_->dispatchForeignFetchEvent(fetch_event_id, web_request); 1324 proxy_->dispatchForeignFetchEvent(fetch_event_id, web_request);
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
1522 } 1588 }
1523 1589
1524 base::WeakPtr<ServiceWorkerContextClient> 1590 base::WeakPtr<ServiceWorkerContextClient>
1525 ServiceWorkerContextClient::GetWeakPtr() { 1591 ServiceWorkerContextClient::GetWeakPtr() {
1526 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); 1592 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread());
1527 DCHECK(context_); 1593 DCHECK(context_);
1528 return context_->weak_factory.GetWeakPtr(); 1594 return context_->weak_factory.GetWeakPtr();
1529 } 1595 }
1530 1596
1531 } // namespace content 1597 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698