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

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

Issue 2746783002: [ServiceWorker] Mojofy InstallEvent of Service Worker (Closed)
Patch Set: Rebase and address shimazu's comment #33 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 <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 // worker thread. 241 // worker thread.
242 struct ServiceWorkerContextClient::WorkerContextData { 242 struct ServiceWorkerContextClient::WorkerContextData {
243 using ClientsCallbacksMap = 243 using ClientsCallbacksMap =
244 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsCallbacks>>; 244 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsCallbacks>>;
245 using ClaimClientsCallbacksMap = 245 using ClaimClientsCallbacksMap =
246 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks>>; 246 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks>>;
247 using ClientCallbacksMap = 247 using ClientCallbacksMap =
248 IDMap<std::unique_ptr<blink::WebServiceWorkerClientCallbacks>>; 248 IDMap<std::unique_ptr<blink::WebServiceWorkerClientCallbacks>>;
249 using SkipWaitingCallbacksMap = 249 using SkipWaitingCallbacksMap =
250 IDMap<std::unique_ptr<blink::WebServiceWorkerSkipWaitingCallbacks>>; 250 IDMap<std::unique_ptr<blink::WebServiceWorkerSkipWaitingCallbacks>>;
251 using InstallEventCallbacksMap =
252 IDMap<std::unique_ptr<const DispatchInstallEventCallback>>;
251 using ActivateEventCallbacksMap = 253 using ActivateEventCallbacksMap =
252 IDMap<std::unique_ptr<const DispatchActivateEventCallback>>; 254 IDMap<std::unique_ptr<const DispatchActivateEventCallback>>;
253 using BackgroundFetchAbortEventCallbacksMap = 255 using BackgroundFetchAbortEventCallbacksMap =
254 IDMap<std::unique_ptr<const DispatchBackgroundFetchAbortEventCallback>>; 256 IDMap<std::unique_ptr<const DispatchBackgroundFetchAbortEventCallback>>;
255 using BackgroundFetchClickEventCallbacksMap = 257 using BackgroundFetchClickEventCallbacksMap =
256 IDMap<std::unique_ptr<const DispatchBackgroundFetchClickEventCallback>>; 258 IDMap<std::unique_ptr<const DispatchBackgroundFetchClickEventCallback>>;
257 using BackgroundFetchFailEventCallbacksMap = 259 using BackgroundFetchFailEventCallbacksMap =
258 IDMap<std::unique_ptr<const DispatchBackgroundFetchFailEventCallback>>; 260 IDMap<std::unique_ptr<const DispatchBackgroundFetchFailEventCallback>>;
259 using BackgroundFetchedEventCallbacksMap = 261 using BackgroundFetchedEventCallbacksMap =
260 IDMap<std::unique_ptr<const DispatchBackgroundFetchedEventCallback>>; 262 IDMap<std::unique_ptr<const DispatchBackgroundFetchedEventCallback>>;
(...skipping 26 matching lines...) Expand all
287 289
288 // Pending callbacks for OpenWindow() and FocusClient(). 290 // Pending callbacks for OpenWindow() and FocusClient().
289 ClientCallbacksMap client_callbacks; 291 ClientCallbacksMap client_callbacks;
290 292
291 // Pending callbacks for SkipWaiting(). 293 // Pending callbacks for SkipWaiting().
292 SkipWaitingCallbacksMap skip_waiting_callbacks; 294 SkipWaitingCallbacksMap skip_waiting_callbacks;
293 295
294 // Pending callbacks for ClaimClients(). 296 // Pending callbacks for ClaimClients().
295 ClaimClientsCallbacksMap claim_clients_callbacks; 297 ClaimClientsCallbacksMap claim_clients_callbacks;
296 298
299 // Pending callbacks for Install Events.
300 InstallEventCallbacksMap install_event_callbacks;
301
297 // Pending callbacks for Activate Events. 302 // Pending callbacks for Activate Events.
298 ActivateEventCallbacksMap activate_event_callbacks; 303 ActivateEventCallbacksMap activate_event_callbacks;
299 304
300 // Pending callbacks for Background Fetch Abort Events. 305 // Pending callbacks for Background Fetch Abort Events.
301 BackgroundFetchAbortEventCallbacksMap background_fetch_abort_event_callbacks; 306 BackgroundFetchAbortEventCallbacksMap background_fetch_abort_event_callbacks;
302 307
303 // Pending callbacks for Background Fetch Click Events. 308 // Pending callbacks for Background Fetch Click Events.
304 BackgroundFetchClickEventCallbacksMap background_fetch_click_event_callbacks; 309 BackgroundFetchClickEventCallbacksMap background_fetch_click_event_callbacks;
305 310
306 // Pending callbacks for Background Fetch Fail Events. 311 // Pending callbacks for Background Fetch Fail Events.
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 533
529 ServiceWorkerContextClient::~ServiceWorkerContextClient() {} 534 ServiceWorkerContextClient::~ServiceWorkerContextClient() {}
530 535
531 void ServiceWorkerContextClient::OnMessageReceived( 536 void ServiceWorkerContextClient::OnMessageReceived(
532 int thread_id, 537 int thread_id,
533 int embedded_worker_id, 538 int embedded_worker_id,
534 const IPC::Message& message) { 539 const IPC::Message& message) {
535 CHECK_EQ(embedded_worker_id_, embedded_worker_id); 540 CHECK_EQ(embedded_worker_id_, embedded_worker_id);
536 bool handled = true; 541 bool handled = true;
537 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message) 542 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message)
538 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent)
539 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClient, OnDidGetClient) 543 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClient, OnDidGetClient)
540 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients, OnDidGetClients) 544 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients, OnDidGetClients)
541 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse, 545 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse,
542 OnOpenWindowResponse) 546 OnOpenWindowResponse)
543 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowError, 547 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowError,
544 OnOpenWindowError) 548 OnOpenWindowError)
545 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FocusClientResponse, 549 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FocusClientResponse,
546 OnFocusClientResponse) 550 OnFocusClientResponse)
547 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NavigateClientResponse, 551 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NavigateClientResponse,
548 OnNavigateClientResponse) 552 OnNavigateClientResponse)
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 context, service_worker_version_id_, script_url_); 694 context, service_worker_version_id_, script_url_);
691 } 695 }
692 696
693 void ServiceWorkerContextClient::WillDestroyWorkerContext( 697 void ServiceWorkerContextClient::WillDestroyWorkerContext(
694 v8::Local<v8::Context> context) { 698 v8::Local<v8::Context> context) {
695 // At this point WillStopCurrentWorkerThread is already called, so 699 // At this point WillStopCurrentWorkerThread is already called, so
696 // worker_task_runner_->RunsTasksOnCurrentThread() returns false 700 // worker_task_runner_->RunsTasksOnCurrentThread() returns false
697 // (while we're still on the worker thread). 701 // (while we're still on the worker thread).
698 proxy_ = NULL; 702 proxy_ = NULL;
699 703
700 // Aborts all the pending events callbacks. 704 // Clear all install event methods.
705 install_methods_map_.clear();
706
707 // Aborts the all pending install event callbacks which has three
708 // parameters so that here can't use AbortPendingEventCallbacks.
709 for (WorkerContextData::InstallEventCallbacksMap::iterator it(
710 &context_->install_event_callbacks);
711 !it.IsAtEnd(); it.Advance()) {
712 it.GetCurrentValue()->Run(SERVICE_WORKER_ERROR_ABORT, false,
713 base::Time::Now());
714 }
715 // Aborts all other pending events callbacks.
701 AbortPendingEventCallbacks(context_->activate_event_callbacks); 716 AbortPendingEventCallbacks(context_->activate_event_callbacks);
702 AbortPendingEventCallbacks(context_->background_fetch_abort_event_callbacks); 717 AbortPendingEventCallbacks(context_->background_fetch_abort_event_callbacks);
703 AbortPendingEventCallbacks(context_->background_fetch_click_event_callbacks); 718 AbortPendingEventCallbacks(context_->background_fetch_click_event_callbacks);
704 AbortPendingEventCallbacks(context_->background_fetch_fail_event_callbacks); 719 AbortPendingEventCallbacks(context_->background_fetch_fail_event_callbacks);
705 AbortPendingEventCallbacks(context_->background_fetched_event_callbacks); 720 AbortPendingEventCallbacks(context_->background_fetched_event_callbacks);
706 AbortPendingEventCallbacks(context_->sync_event_callbacks); 721 AbortPendingEventCallbacks(context_->sync_event_callbacks);
707 AbortPendingEventCallbacks(context_->notification_click_event_callbacks); 722 AbortPendingEventCallbacks(context_->notification_click_event_callbacks);
708 AbortPendingEventCallbacks(context_->notification_close_event_callbacks); 723 AbortPendingEventCallbacks(context_->notification_close_event_callbacks);
709 AbortPendingEventCallbacks(context_->push_event_callbacks); 724 AbortPendingEventCallbacks(context_->push_event_callbacks);
710 AbortPendingEventCallbacks(context_->fetch_event_callbacks); 725 AbortPendingEventCallbacks(context_->fetch_event_callbacks);
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 DCHECK(callback); 875 DCHECK(callback);
861 callback->Run(EventResultToStatus(result), 876 callback->Run(EventResultToStatus(result),
862 base::Time::FromDoubleT(event_dispatch_time)); 877 base::Time::FromDoubleT(event_dispatch_time));
863 context_->message_event_callbacks.Remove(request_id); 878 context_->message_event_callbacks.Remove(request_id);
864 } 879 }
865 880
866 void ServiceWorkerContextClient::DidHandleInstallEvent( 881 void ServiceWorkerContextClient::DidHandleInstallEvent(
867 int request_id, 882 int request_id,
868 blink::WebServiceWorkerEventResult result, 883 blink::WebServiceWorkerEventResult result,
869 double event_dispatch_time) { 884 double event_dispatch_time) {
870 Send(new ServiceWorkerHostMsg_InstallEventFinished( 885 const DispatchInstallEventCallback* callback =
871 GetRoutingID(), request_id, result, proxy_->HasFetchEventHandler(), 886 context_->install_event_callbacks.Lookup(request_id);
872 base::Time::FromDoubleT(event_dispatch_time))); 887 DCHECK(callback);
888 callback->Run(EventResultToStatus(result), proxy_->HasFetchEventHandler(),
889 base::Time::FromDoubleT(event_dispatch_time));
890 context_->install_event_callbacks.Remove(request_id);
891 install_methods_map_.erase(request_id);
873 } 892 }
874 893
875 void ServiceWorkerContextClient::RespondToFetchEvent( 894 void ServiceWorkerContextClient::RespondToFetchEvent(
876 int fetch_event_id, 895 int fetch_event_id,
877 double event_dispatch_time) { 896 double event_dispatch_time) {
878 Send(new ServiceWorkerHostMsg_FetchEventResponse( 897 Send(new ServiceWorkerHostMsg_FetchEventResponse(
879 GetRoutingID(), fetch_event_id, 898 GetRoutingID(), fetch_event_id,
880 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse(), 899 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse(),
881 base::Time::FromDoubleT(event_dispatch_time))); 900 base::Time::FromDoubleT(event_dispatch_time)));
882 } 901 }
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1047 } 1066 }
1048 1067
1049 void ServiceWorkerContextClient::Claim( 1068 void ServiceWorkerContextClient::Claim(
1050 std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks> callbacks) { 1069 std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks> callbacks) {
1051 DCHECK(callbacks); 1070 DCHECK(callbacks);
1052 int request_id = context_->claim_clients_callbacks.Add(std::move(callbacks)); 1071 int request_id = context_->claim_clients_callbacks.Add(std::move(callbacks));
1053 Send(new ServiceWorkerHostMsg_ClaimClients(GetRoutingID(), request_id)); 1072 Send(new ServiceWorkerHostMsg_ClaimClients(GetRoutingID(), request_id));
1054 } 1073 }
1055 1074
1056 void ServiceWorkerContextClient::RegisterForeignFetchScopes( 1075 void ServiceWorkerContextClient::RegisterForeignFetchScopes(
1076 const int event_id,
1057 const blink::WebVector<blink::WebURL>& sub_scopes, 1077 const blink::WebVector<blink::WebURL>& sub_scopes,
1058 const blink::WebVector<blink::WebSecurityOrigin>& origins) { 1078 const blink::WebVector<blink::WebSecurityOrigin>& origins) {
1059 Send(new ServiceWorkerHostMsg_RegisterForeignFetchScopes( 1079 std::vector<GURL> urls;
1060 GetRoutingID(), std::vector<GURL>(sub_scopes.begin(), sub_scopes.end()), 1080 for (const auto& url : sub_scopes)
1061 std::vector<url::Origin>(origins.begin(), origins.end()))); 1081 urls.push_back(url);
1082
1083 std::vector<url::Origin> url_origins;
1084 for (const auto& origin : origins)
1085 url_origins.push_back(origin);
1086
1087 install_methods_map_[event_id]->RegisterForeignFetchScopes(urls, url_origins);
1062 } 1088 }
1063 1089
1064 void ServiceWorkerContextClient::DispatchSyncEvent( 1090 void ServiceWorkerContextClient::DispatchSyncEvent(
1065 const std::string& tag, 1091 const std::string& tag,
1066 blink::mojom::BackgroundSyncEventLastChance last_chance, 1092 blink::mojom::BackgroundSyncEventLastChance last_chance,
1067 const DispatchSyncEventCallback& callback) { 1093 const DispatchSyncEventCallback& callback) {
1068 TRACE_EVENT0("ServiceWorker", 1094 TRACE_EVENT0("ServiceWorker",
1069 "ServiceWorkerContextClient::DispatchSyncEvent"); 1095 "ServiceWorkerContextClient::DispatchSyncEvent");
1070 int request_id = context_->sync_event_callbacks.Add( 1096 int request_id = context_->sync_event_callbacks.Add(
1071 base::MakeUnique<SyncCallback>(callback)); 1097 base::MakeUnique<SyncCallback>(callback));
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1199 fetches.size()); 1225 fetches.size());
1200 for (size_t i = 0; i < fetches.size(); ++i) { 1226 for (size_t i = 0; i < fetches.size(); ++i) {
1201 ToWebServiceWorkerRequest(fetches[i].request, &web_fetches[i].request); 1227 ToWebServiceWorkerRequest(fetches[i].request, &web_fetches[i].request);
1202 ToWebServiceWorkerResponse(fetches[i].response, &web_fetches[i].response); 1228 ToWebServiceWorkerResponse(fetches[i].response, &web_fetches[i].response);
1203 } 1229 }
1204 1230
1205 proxy_->DispatchBackgroundFetchedEvent( 1231 proxy_->DispatchBackgroundFetchedEvent(
1206 request_id, blink::WebString::FromUTF8(tag), web_fetches); 1232 request_id, blink::WebString::FromUTF8(tag), web_fetches);
1207 } 1233 }
1208 1234
1235 void ServiceWorkerContextClient::DispatchInstallEvent(
1236 mojom::ServiceWorkerInstallEventMethodsAssociatedPtrInfo client,
1237 const DispatchInstallEventCallback& callback) {
1238 TRACE_EVENT0("ServiceWorker",
1239 "ServiceWorkerContextClient::DispatchInstallEvent");
1240
1241 int request_id = context_->install_event_callbacks.Add(
1242 base::MakeUnique<DispatchInstallEventCallback>(callback));
1243
1244 auto it = install_methods_map_.find(request_id);
1245 DCHECK(it == install_methods_map_.end());
1246 mojom::ServiceWorkerInstallEventMethodsAssociatedPtr install_method_client_;
1247 install_method_client_.Bind(std::move(client));
1248 install_methods_map_[request_id] = std::move(install_method_client_);
1249
1250 proxy_->DispatchInstallEvent(request_id);
1251 }
1252
1209 void ServiceWorkerContextClient::DispatchExtendableMessageEvent( 1253 void ServiceWorkerContextClient::DispatchExtendableMessageEvent(
1210 mojom::ExtendableMessageEventPtr event, 1254 mojom::ExtendableMessageEventPtr event,
1211 const DispatchExtendableMessageEventCallback& callback) { 1255 const DispatchExtendableMessageEventCallback& callback) {
1212 TRACE_EVENT0("ServiceWorker", 1256 TRACE_EVENT0("ServiceWorker",
1213 "ServiceWorkerContextClient::DispatchExtendableMessageEvent"); 1257 "ServiceWorkerContextClient::DispatchExtendableMessageEvent");
1214 int request_id = context_->message_event_callbacks.Add( 1258 int request_id = context_->message_event_callbacks.Add(
1215 base::MakeUnique<DispatchExtendableMessageEventCallback>(callback)); 1259 base::MakeUnique<DispatchExtendableMessageEventCallback>(callback));
1216 1260
1217 blink::WebMessagePortChannelArray ports = 1261 blink::WebMessagePortChannelArray ports =
1218 WebMessagePortChannelImpl::CreateFromMessagePipeHandles( 1262 WebMessagePortChannelImpl::CreateFromMessagePipeHandles(
(...skipping 15 matching lines...) Expand all
1234 ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance( 1278 ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance(
1235 sender_.get(), main_thread_task_runner_.get()); 1279 sender_.get(), main_thread_task_runner_.get());
1236 scoped_refptr<WebServiceWorkerImpl> worker = 1280 scoped_refptr<WebServiceWorkerImpl> worker =
1237 dispatcher->GetOrCreateServiceWorker(std::move(handle)); 1281 dispatcher->GetOrCreateServiceWorker(std::move(handle));
1238 proxy_->DispatchExtendableMessageEvent( 1282 proxy_->DispatchExtendableMessageEvent(
1239 request_id, blink::WebString::FromUTF16(event->message), 1283 request_id, blink::WebString::FromUTF16(event->message),
1240 event->source_origin, std::move(ports), 1284 event->source_origin, std::move(ports),
1241 WebServiceWorkerImpl::CreateHandle(worker)); 1285 WebServiceWorkerImpl::CreateHandle(worker));
1242 } 1286 }
1243 1287
1244 void ServiceWorkerContextClient::OnInstallEvent(int request_id) {
1245 TRACE_EVENT0("ServiceWorker",
1246 "ServiceWorkerContextClient::OnInstallEvent");
1247 proxy_->DispatchInstallEvent(request_id);
1248 }
1249
1250 void ServiceWorkerContextClient::DispatchFetchEvent( 1288 void ServiceWorkerContextClient::DispatchFetchEvent(
1251 int fetch_event_id, 1289 int fetch_event_id,
1252 const ServiceWorkerFetchRequest& request, 1290 const ServiceWorkerFetchRequest& request,
1253 mojom::FetchEventPreloadHandlePtr preload_handle, 1291 mojom::FetchEventPreloadHandlePtr preload_handle,
1254 const DispatchFetchEventCallback& callback) { 1292 const DispatchFetchEventCallback& callback) {
1255 std::unique_ptr<NavigationPreloadRequest> preload_request = 1293 std::unique_ptr<NavigationPreloadRequest> preload_request =
1256 preload_handle 1294 preload_handle
1257 ? base::MakeUnique<NavigationPreloadRequest>( 1295 ? base::MakeUnique<NavigationPreloadRequest>(
1258 fetch_event_id, request.url, std::move(preload_handle)) 1296 fetch_event_id, request.url, std::move(preload_handle))
1259 : nullptr; 1297 : nullptr;
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
1538 } 1576 }
1539 1577
1540 base::WeakPtr<ServiceWorkerContextClient> 1578 base::WeakPtr<ServiceWorkerContextClient>
1541 ServiceWorkerContextClient::GetWeakPtr() { 1579 ServiceWorkerContextClient::GetWeakPtr() {
1542 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); 1580 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread());
1543 DCHECK(context_); 1581 DCHECK(context_);
1544 return context_->weak_factory.GetWeakPtr(); 1582 return context_->weak_factory.GetWeakPtr();
1545 } 1583 }
1546 1584
1547 } // namespace content 1585 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698