Index: third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp |
diff --git a/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp b/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp |
index 8fbfe0a4f40226baeab272924e7e50b0ce705893..521f9467f6809e5c7950a4e8cbc63ab814f1e14b 100644 |
--- a/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp |
+++ b/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp |
@@ -4,10 +4,17 @@ |
#include "modules/serviceworkers/FetchEvent.h" |
+#include "bindings/core/v8/ScriptState.h" |
#include "bindings/core/v8/ToV8.h" |
#include "bindings/core/v8/V8HiddenValue.h" |
+#include "modules/fetch/BytesConsumerForDataConsumerHandle.h" |
#include "modules/fetch/Request.h" |
+#include "modules/fetch/Response.h" |
+#include "modules/serviceworkers/ServiceWorkerError.h" |
#include "modules/serviceworkers/ServiceWorkerGlobalScope.h" |
+#include "public/platform/modules/serviceworker/WebServiceWorkerError.h" |
+#include "public/platform/modules/serviceworker/WebServiceWorkerResponse.h" |
+#include "wtf/PtrUtil.h" |
#include "wtf/RefPtr.h" |
namespace blink { |
@@ -15,16 +22,18 @@ namespace blink { |
FetchEvent* FetchEvent::create(ScriptState* scriptState, |
const AtomicString& type, |
const FetchEventInit& initializer) { |
- return new FetchEvent(scriptState, type, initializer, nullptr, nullptr); |
+ return new FetchEvent(scriptState, type, initializer, nullptr, nullptr, |
+ false); |
} |
FetchEvent* FetchEvent::create(ScriptState* scriptState, |
const AtomicString& type, |
const FetchEventInit& initializer, |
RespondWithObserver* respondWithObserver, |
- WaitUntilObserver* waitUntilObserver) { |
+ WaitUntilObserver* waitUntilObserver, |
+ bool navigationPreloadSent) { |
return new FetchEvent(scriptState, type, initializer, respondWithObserver, |
- waitUntilObserver); |
+ waitUntilObserver, navigationPreloadSent); |
} |
Request* FetchEvent::request() const { |
@@ -47,6 +56,10 @@ void FetchEvent::respondWith(ScriptState* scriptState, |
m_observer->respondWith(scriptState, scriptPromise, exceptionState); |
} |
+ScriptPromise FetchEvent::navigationPreload(ScriptState* scriptState) { |
+ return m_navigationPreloadProperty->promise(scriptState->world()); |
+} |
+ |
const AtomicString& FetchEvent::interfaceName() const { |
return EventNames::FetchEvent; |
} |
@@ -55,9 +68,21 @@ FetchEvent::FetchEvent(ScriptState* scriptState, |
const AtomicString& type, |
const FetchEventInit& initializer, |
RespondWithObserver* respondWithObserver, |
- WaitUntilObserver* waitUntilObserver) |
+ WaitUntilObserver* waitUntilObserver, |
+ bool navigationPreloadSent) |
: ExtendableEvent(type, initializer, waitUntilObserver), |
- m_observer(respondWithObserver) { |
+ m_scriptState(scriptState), |
+ m_observer(respondWithObserver), |
+ m_navigationPreloadProperty(new PreloadResponseProperty( |
+ scriptState->getExecutionContext(), |
+ this, |
+ PreloadResponseProperty::PreloadResponse)) { |
+ if (!navigationPreloadSent) { |
+ // TODO(horo): This behavior is still under the spec discussion. |
+ // https://github.com/w3c/ServiceWorker/issues/920#issuecomment-255874864 |
+ m_navigationPreloadProperty->resolve(nullptr); |
+ } |
+ |
m_clientId = initializer.clientId(); |
m_isReload = initializer.isReload(); |
if (initializer.hasRequest()) { |
@@ -84,9 +109,43 @@ FetchEvent::FetchEvent(ScriptState* scriptState, |
} |
} |
+void FetchEvent::onNavigationPreloadResponse( |
+ std::unique_ptr<WebServiceWorkerResponse> response, |
+ std::unique_ptr<WebDataConsumerHandle> dataConsumeHandle) { |
+ if (!m_scriptState->contextIsValid()) |
+ return; |
+ DCHECK(m_navigationPreloadProperty); |
+ ScriptState::Scope scope(m_scriptState.get()); |
+ FetchResponseData* responseData = |
+ FetchResponseData::createWithBuffer(new BodyStreamBuffer( |
+ m_scriptState.get(), new BytesConsumerForDataConsumerHandle( |
+ m_scriptState->getExecutionContext(), |
+ std::move(dataConsumeHandle)))); |
+ responseData->setURL(response->url()); |
+ responseData->setStatus(response->status()); |
+ responseData->setStatusMessage(response->statusText()); |
+ responseData->setResponseTime(response->responseTime()); |
+ for (const auto& header : response->headers()) |
+ responseData->headerList()->append(header.key, header.value); |
+ FetchResponseData* taintedResponse = |
+ responseData->createBasicFilteredResponse(); |
+ m_navigationPreloadProperty->resolve( |
+ Response::create(m_scriptState->getExecutionContext(), taintedResponse)); |
+} |
+ |
+void FetchEvent::onNavigationPreloadError( |
+ std::unique_ptr<WebServiceWorkerError> error) { |
+ if (!m_scriptState->contextIsValid()) |
+ return; |
+ DCHECK(m_navigationPreloadProperty); |
+ m_navigationPreloadProperty->reject( |
+ ServiceWorkerError::take(nullptr, *error.get())); |
+} |
+ |
DEFINE_TRACE(FetchEvent) { |
visitor->trace(m_observer); |
visitor->trace(m_request); |
+ visitor->trace(m_navigationPreloadProperty); |
ExtendableEvent::trace(visitor); |
} |