Index: third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp |
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp |
index 867168b7d5ceedaa4be5aa3fd3ec823b5b38112d..b3d1850adf7115988cb12ace8c85a4223eb20caa 100644 |
--- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp |
+++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp |
@@ -60,6 +60,7 @@ |
#include "public/platform/modules/notifications/WebNotificationData.h" |
#include "public/platform/modules/serviceworker/WebServiceWorkerEventResult.h" |
#include "public/platform/modules/serviceworker/WebServiceWorkerRequest.h" |
+#include "public/platform/modules/serviceworker/WebServiceWorkerResponse.h" |
#include "public/web/WebSerializedScriptValue.h" |
#include "public/web/modules/serviceworker/WebServiceWorkerContextClient.h" |
#include "web/WebEmbeddedWorkerImpl.h" |
@@ -85,6 +86,7 @@ ServiceWorkerGlobalScopeProxy::~ServiceWorkerGlobalScopeProxy() { |
DEFINE_TRACE(ServiceWorkerGlobalScopeProxy) { |
visitor->trace(m_document); |
+ visitor->trace(m_pendingPreloadFetchEvents); |
} |
void ServiceWorkerGlobalScopeProxy::setRegistration( |
@@ -151,7 +153,8 @@ void ServiceWorkerGlobalScopeProxy::dispatchExtendableMessageEvent( |
void ServiceWorkerGlobalScopeProxy::dispatchFetchEvent( |
int fetchEventID, |
- const WebServiceWorkerRequest& webRequest) { |
+ const WebServiceWorkerRequest& webRequest, |
+ bool navigationPreloadSent) { |
ScriptState::Scope scope( |
workerGlobalScope()->scriptController()->getScriptState()); |
WaitUntilObserver* waitUntilObserver = WaitUntilObserver::create( |
@@ -168,9 +171,16 @@ void ServiceWorkerGlobalScopeProxy::dispatchFetchEvent( |
eventInit.setClientId( |
webRequest.isMainResourceLoad() ? WebString() : webRequest.clientId()); |
eventInit.setIsReload(webRequest.isReload()); |
+ ScriptState* scriptState = |
+ workerGlobalScope()->scriptController()->getScriptState(); |
FetchEvent* fetchEvent = FetchEvent::create( |
- workerGlobalScope()->scriptController()->getScriptState(), |
- EventTypeNames::fetch, eventInit, respondWithObserver, waitUntilObserver); |
+ scriptState, EventTypeNames::fetch, eventInit, respondWithObserver, |
+ waitUntilObserver, navigationPreloadSent); |
+ if (navigationPreloadSent) { |
+ // Keep |fetchEvent| until onNavigationPreloadResponse() or |
+ // onNavigationPreloadError() will be called. |
+ m_pendingPreloadFetchEvents.add(fetchEventID, fetchEvent); |
+ } |
waitUntilObserver->willDispatchEvent(); |
respondWithObserver->willDispatchEvent(); |
DispatchEventResult dispatchResult = |
@@ -181,6 +191,24 @@ void ServiceWorkerGlobalScopeProxy::dispatchFetchEvent( |
waitUntilObserver->didDispatchEvent(false /* errorOccurred */); |
} |
+void ServiceWorkerGlobalScopeProxy::onNavigationPreloadResponse( |
+ int fetchEventID, |
+ std::unique_ptr<WebServiceWorkerResponse> response, |
+ std::unique_ptr<WebDataConsumerHandle> dataConsumeHandle) { |
+ FetchEvent* fetchEvent = m_pendingPreloadFetchEvents.take(fetchEventID); |
+ DCHECK(fetchEvent); |
+ fetchEvent->onNavigationPreloadResponse(std::move(response), |
+ std::move(dataConsumeHandle)); |
+} |
+ |
+void ServiceWorkerGlobalScopeProxy::onNavigationPreloadError( |
+ int fetchEventID, |
+ std::unique_ptr<WebServiceWorkerError> error) { |
+ FetchEvent* fetchEvent = m_pendingPreloadFetchEvents.take(fetchEventID); |
+ DCHECK(fetchEvent); |
+ fetchEvent->onNavigationPreloadError(std::move(error)); |
+} |
+ |
void ServiceWorkerGlobalScopeProxy::dispatchForeignFetchEvent( |
int fetchEventID, |
const WebServiceWorkerRequest& webRequest) { |