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

Side by Side Diff: third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp

Issue 2416843002: Implement FetchEvent.navigationPreload (Closed)
Patch Set: stop using nullable promise Created 4 years, 1 month 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 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 #include "modules/serviceworkers/ForeignFetchEvent.h" 53 #include "modules/serviceworkers/ForeignFetchEvent.h"
54 #include "modules/serviceworkers/InstallEvent.h" 54 #include "modules/serviceworkers/InstallEvent.h"
55 #include "modules/serviceworkers/ServiceWorkerClient.h" 55 #include "modules/serviceworkers/ServiceWorkerClient.h"
56 #include "modules/serviceworkers/ServiceWorkerGlobalScope.h" 56 #include "modules/serviceworkers/ServiceWorkerGlobalScope.h"
57 #include "modules/serviceworkers/ServiceWorkerWindowClient.h" 57 #include "modules/serviceworkers/ServiceWorkerWindowClient.h"
58 #include "modules/serviceworkers/WaitUntilObserver.h" 58 #include "modules/serviceworkers/WaitUntilObserver.h"
59 #include "platform/RuntimeEnabledFeatures.h" 59 #include "platform/RuntimeEnabledFeatures.h"
60 #include "public/platform/modules/notifications/WebNotificationData.h" 60 #include "public/platform/modules/notifications/WebNotificationData.h"
61 #include "public/platform/modules/serviceworker/WebServiceWorkerEventResult.h" 61 #include "public/platform/modules/serviceworker/WebServiceWorkerEventResult.h"
62 #include "public/platform/modules/serviceworker/WebServiceWorkerRequest.h" 62 #include "public/platform/modules/serviceworker/WebServiceWorkerRequest.h"
63 #include "public/platform/modules/serviceworker/WebServiceWorkerResponse.h"
63 #include "public/web/WebSerializedScriptValue.h" 64 #include "public/web/WebSerializedScriptValue.h"
64 #include "public/web/modules/serviceworker/WebServiceWorkerContextClient.h" 65 #include "public/web/modules/serviceworker/WebServiceWorkerContextClient.h"
65 #include "web/WebEmbeddedWorkerImpl.h" 66 #include "web/WebEmbeddedWorkerImpl.h"
66 #include "wtf/Assertions.h" 67 #include "wtf/Assertions.h"
67 #include "wtf/Functional.h" 68 #include "wtf/Functional.h"
68 #include "wtf/PtrUtil.h" 69 #include "wtf/PtrUtil.h"
69 #include <memory> 70 #include <memory>
70 #include <utility> 71 #include <utility>
71 72
72 namespace blink { 73 namespace blink {
73 74
74 ServiceWorkerGlobalScopeProxy* ServiceWorkerGlobalScopeProxy::create( 75 ServiceWorkerGlobalScopeProxy* ServiceWorkerGlobalScopeProxy::create(
75 WebEmbeddedWorkerImpl& embeddedWorker, 76 WebEmbeddedWorkerImpl& embeddedWorker,
76 Document& document, 77 Document& document,
77 WebServiceWorkerContextClient& client) { 78 WebServiceWorkerContextClient& client) {
78 return new ServiceWorkerGlobalScopeProxy(embeddedWorker, document, client); 79 return new ServiceWorkerGlobalScopeProxy(embeddedWorker, document, client);
79 } 80 }
80 81
81 ServiceWorkerGlobalScopeProxy::~ServiceWorkerGlobalScopeProxy() { 82 ServiceWorkerGlobalScopeProxy::~ServiceWorkerGlobalScopeProxy() {
82 // Verify that the proxy has been detached. 83 // Verify that the proxy has been detached.
83 DCHECK(!m_embeddedWorker); 84 DCHECK(!m_embeddedWorker);
84 } 85 }
85 86
86 DEFINE_TRACE(ServiceWorkerGlobalScopeProxy) { 87 DEFINE_TRACE(ServiceWorkerGlobalScopeProxy) {
87 visitor->trace(m_document); 88 visitor->trace(m_document);
89 visitor->trace(m_pendingPreloadFetchEvents);
88 } 90 }
89 91
90 void ServiceWorkerGlobalScopeProxy::setRegistration( 92 void ServiceWorkerGlobalScopeProxy::setRegistration(
91 std::unique_ptr<WebServiceWorkerRegistration::Handle> handle) { 93 std::unique_ptr<WebServiceWorkerRegistration::Handle> handle) {
92 workerGlobalScope()->setRegistration(std::move(handle)); 94 workerGlobalScope()->setRegistration(std::move(handle));
93 } 95 }
94 96
95 void ServiceWorkerGlobalScopeProxy::dispatchActivateEvent(int eventID) { 97 void ServiceWorkerGlobalScopeProxy::dispatchActivateEvent(int eventID) {
96 WaitUntilObserver* observer = WaitUntilObserver::create( 98 WaitUntilObserver* observer = WaitUntilObserver::create(
97 workerGlobalScope(), WaitUntilObserver::Activate, eventID); 99 workerGlobalScope(), WaitUntilObserver::Activate, eventID);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 WaitUntilObserver* observer = WaitUntilObserver::create( 146 WaitUntilObserver* observer = WaitUntilObserver::create(
145 workerGlobalScope(), WaitUntilObserver::Message, eventID); 147 workerGlobalScope(), WaitUntilObserver::Message, eventID);
146 148
147 Event* event = 149 Event* event =
148 ExtendableMessageEvent::create(value, origin, ports, source, observer); 150 ExtendableMessageEvent::create(value, origin, ports, source, observer);
149 workerGlobalScope()->dispatchExtendableEvent(event, observer); 151 workerGlobalScope()->dispatchExtendableEvent(event, observer);
150 } 152 }
151 153
152 void ServiceWorkerGlobalScopeProxy::dispatchFetchEvent( 154 void ServiceWorkerGlobalScopeProxy::dispatchFetchEvent(
153 int fetchEventID, 155 int fetchEventID,
154 const WebServiceWorkerRequest& webRequest) { 156 const WebServiceWorkerRequest& webRequest,
157 bool navigationPreloadSent) {
155 ScriptState::Scope scope( 158 ScriptState::Scope scope(
156 workerGlobalScope()->scriptController()->getScriptState()); 159 workerGlobalScope()->scriptController()->getScriptState());
157 WaitUntilObserver* waitUntilObserver = WaitUntilObserver::create( 160 WaitUntilObserver* waitUntilObserver = WaitUntilObserver::create(
158 workerGlobalScope(), WaitUntilObserver::Fetch, fetchEventID); 161 workerGlobalScope(), WaitUntilObserver::Fetch, fetchEventID);
159 RespondWithObserver* respondWithObserver = RespondWithObserver::create( 162 RespondWithObserver* respondWithObserver = RespondWithObserver::create(
160 workerGlobalScope(), fetchEventID, webRequest.url(), webRequest.mode(), 163 workerGlobalScope(), fetchEventID, webRequest.url(), webRequest.mode(),
161 webRequest.frameType(), webRequest.requestContext(), waitUntilObserver); 164 webRequest.frameType(), webRequest.requestContext(), waitUntilObserver);
162 Request* request = Request::create( 165 Request* request = Request::create(
163 workerGlobalScope()->scriptController()->getScriptState(), webRequest); 166 workerGlobalScope()->scriptController()->getScriptState(), webRequest);
164 request->getHeaders()->setGuard(Headers::ImmutableGuard); 167 request->getHeaders()->setGuard(Headers::ImmutableGuard);
165 FetchEventInit eventInit; 168 FetchEventInit eventInit;
166 eventInit.setCancelable(true); 169 eventInit.setCancelable(true);
167 eventInit.setRequest(request); 170 eventInit.setRequest(request);
168 eventInit.setClientId( 171 eventInit.setClientId(
169 webRequest.isMainResourceLoad() ? WebString() : webRequest.clientId()); 172 webRequest.isMainResourceLoad() ? WebString() : webRequest.clientId());
170 eventInit.setIsReload(webRequest.isReload()); 173 eventInit.setIsReload(webRequest.isReload());
174 ScriptState* scriptState =
175 workerGlobalScope()->scriptController()->getScriptState();
171 FetchEvent* fetchEvent = FetchEvent::create( 176 FetchEvent* fetchEvent = FetchEvent::create(
172 workerGlobalScope()->scriptController()->getScriptState(), 177 scriptState, EventTypeNames::fetch, eventInit, respondWithObserver,
173 EventTypeNames::fetch, eventInit, respondWithObserver, waitUntilObserver); 178 waitUntilObserver, navigationPreloadSent);
179 if (navigationPreloadSent) {
180 // Keep |fetchEvent| until onNavigationPreloadResponse() or
181 // onNavigationPreloadError() will be called.
182 m_pendingPreloadFetchEvents.add(fetchEventID, fetchEvent);
183 }
174 waitUntilObserver->willDispatchEvent(); 184 waitUntilObserver->willDispatchEvent();
175 respondWithObserver->willDispatchEvent(); 185 respondWithObserver->willDispatchEvent();
176 DispatchEventResult dispatchResult = 186 DispatchEventResult dispatchResult =
177 workerGlobalScope()->dispatchEvent(fetchEvent); 187 workerGlobalScope()->dispatchEvent(fetchEvent);
178 respondWithObserver->didDispatchEvent(dispatchResult); 188 respondWithObserver->didDispatchEvent(dispatchResult);
179 // false is okay because waitUntil for fetch event doesn't care about the 189 // false is okay because waitUntil for fetch event doesn't care about the
180 // promise rejection or an uncaught runtime script error. 190 // promise rejection or an uncaught runtime script error.
181 waitUntilObserver->didDispatchEvent(false /* errorOccurred */); 191 waitUntilObserver->didDispatchEvent(false /* errorOccurred */);
182 } 192 }
183 193
194 void ServiceWorkerGlobalScopeProxy::onNavigationPreloadResponse(
195 int fetchEventID,
196 std::unique_ptr<WebServiceWorkerResponse> response,
197 std::unique_ptr<WebDataConsumerHandle> dataConsumeHandle) {
198 FetchEvent* fetchEvent = m_pendingPreloadFetchEvents.take(fetchEventID);
199 DCHECK(fetchEvent);
200 fetchEvent->onNavigationPreloadResponse(std::move(response),
201 std::move(dataConsumeHandle));
202 }
203
204 void ServiceWorkerGlobalScopeProxy::onNavigationPreloadError(
205 int fetchEventID,
206 std::unique_ptr<WebServiceWorkerError> error) {
207 FetchEvent* fetchEvent = m_pendingPreloadFetchEvents.take(fetchEventID);
208 DCHECK(fetchEvent);
209 fetchEvent->onNavigationPreloadError(std::move(error));
210 }
211
184 void ServiceWorkerGlobalScopeProxy::dispatchForeignFetchEvent( 212 void ServiceWorkerGlobalScopeProxy::dispatchForeignFetchEvent(
185 int fetchEventID, 213 int fetchEventID,
186 const WebServiceWorkerRequest& webRequest) { 214 const WebServiceWorkerRequest& webRequest) {
187 if (!OriginTrials::foreignFetchEnabled(workerGlobalScope())) { 215 if (!OriginTrials::foreignFetchEnabled(workerGlobalScope())) {
188 // If origin trial tokens have expired, or are otherwise no longer valid 216 // If origin trial tokens have expired, or are otherwise no longer valid
189 // no events should be dispatched. 217 // no events should be dispatched.
190 // TODO(mek): Ideally the browser wouldn't even start the service worker 218 // TODO(mek): Ideally the browser wouldn't even start the service worker
191 // if its tokens have expired. 219 // if its tokens have expired.
192 ServiceWorkerGlobalScopeClient::from(workerGlobalScope()) 220 ServiceWorkerGlobalScopeClient::from(workerGlobalScope())
193 ->respondToFetchEvent(fetchEventID, WTF::currentTime()); 221 ->respondToFetchEvent(fetchEventID, WTF::currentTime());
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 return *m_document; 435 return *m_document;
408 } 436 }
409 437
410 ServiceWorkerGlobalScope* ServiceWorkerGlobalScopeProxy::workerGlobalScope() 438 ServiceWorkerGlobalScope* ServiceWorkerGlobalScopeProxy::workerGlobalScope()
411 const { 439 const {
412 DCHECK(m_workerGlobalScope); 440 DCHECK(m_workerGlobalScope);
413 return m_workerGlobalScope; 441 return m_workerGlobalScope;
414 } 442 }
415 443
416 } // namespace blink 444 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698