Chromium Code Reviews| 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..79fba748c322b23c62d0b4b8b532505f8f7e4f70 100644 |
| --- a/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp |
| +++ b/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp |
| @@ -6,8 +6,13 @@ |
| #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/WebServiceWorkerResponse.h" |
| +#include "wtf/PtrUtil.h" |
| #include "wtf/RefPtr.h" |
| namespace blink { |
| @@ -15,16 +20,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 +54,15 @@ void FetchEvent::respondWith(ScriptState* scriptState, |
| m_observer->respondWith(scriptState, scriptPromise, exceptionState); |
| } |
| +ScriptPromise FetchEvent::navigationPreload(ScriptState* scriptState, |
| + bool& isNull) { |
| + if (!m_navigationPreloadProperty) { |
| + isNull = true; |
| + return ScriptPromise(); |
| + } |
| + return m_navigationPreloadProperty->promise(scriptState->world()); |
| +} |
| + |
| const AtomicString& FetchEvent::interfaceName() const { |
| return EventNames::FetchEvent; |
| } |
| @@ -55,9 +71,16 @@ 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) { |
| + if (navigationPreloadSent) { |
| + m_navigationPreloadProperty = |
| + new PreloadResponseProperty(scriptState->getExecutionContext(), this, |
| + PreloadResponseProperty::PreloadResponse); |
| + } |
| + |
| m_clientId = initializer.clientId(); |
| m_isReload = initializer.isReload(); |
| if (initializer.hasRequest()) { |
| @@ -84,9 +107,73 @@ FetchEvent::FetchEvent(ScriptState* scriptState, |
| } |
| } |
| +class FetchEvent::PreloadResponseCallbackImpl |
| + : public WebServiceWorkerPreloadResponseCallbacks { |
| + public: |
| + PreloadResponseCallbackImpl( |
| + FetchEvent::PreloadResponseProperty* preloadResponseProperty, |
| + ScriptState* scriptState) |
| + : m_navigationPreloadProperty(preloadResponseProperty), |
| + m_scriptState(scriptState) {} |
| + ~PreloadResponseCallbackImpl() override {} |
| + |
| + void onSuccess( |
| + WebServiceWorkerPreloadResponseCallbacksResult* result) override { |
| + if (!m_navigationPreloadProperty->getExecutionContext() || |
|
haraken
2016/10/20 08:52:45
You can replace this with:
if (!m_scriptState->co
horo
2016/10/21 10:56:40
Done.
|
| + m_navigationPreloadProperty->getExecutionContext() |
| + ->activeDOMObjectsAreStopped()) { |
| + return; |
| + } |
| + ScriptState::Scope scope(m_scriptState.get()); |
| + FetchResponseData* responseData = |
| + FetchResponseData::createWithBuffer(new BodyStreamBuffer( |
| + m_scriptState.get(), |
| + new BytesConsumerForDataConsumerHandle( |
| + m_navigationPreloadProperty->getExecutionContext(), |
| + std::move(result->handle)))); |
| + responseData->setURL(result->response->url()); |
| + responseData->setStatus(result->response->status()); |
| + responseData->setStatusMessage(result->response->statusText()); |
| + responseData->setResponseTime(result->response->responseTime()); |
| + for (HTTPHeaderMap::const_iterator i = result->response->headers().begin(), |
| + end = result->response->headers().end(); |
| + i != end; ++i) { |
| + responseData->headerList()->append(i->key, i->value); |
| + } |
| + |
| + FetchResponseData* taintedResponse = |
| + responseData->createBasicFilteredResponse(); |
| + m_navigationPreloadProperty->resolve(Response::create( |
| + m_navigationPreloadProperty->getExecutionContext(), taintedResponse)); |
| + } |
| + |
| + void onError(WebServiceWorkerError error) override { |
| + if (!m_navigationPreloadProperty->getExecutionContext() || |
|
haraken
2016/10/20 08:52:45
Ditto.
if (!m_scriptState->contextIsValid())
re
horo
2016/10/21 10:56:40
Done.
|
| + m_navigationPreloadProperty->getExecutionContext() |
| + ->activeDOMObjectsAreStopped()) { |
| + return; |
| + } |
| + m_navigationPreloadProperty->reject( |
| + ServiceWorkerError::take(nullptr, error)); |
| + } |
| + |
| + private: |
| + Persistent<FetchEvent::PreloadResponseProperty> m_navigationPreloadProperty; |
|
haraken
2016/10/20 08:52:45
I'm a bit concerned if this Persistent handle may
horo
2016/10/21 10:56:40
Done.
I introduced m_pendingPreloadFetchEvents in
|
| + RefPtr<ScriptState> m_scriptState; |
| + |
| + WTF_MAKE_NONCOPYABLE(PreloadResponseCallbackImpl); |
| +}; |
| + |
| +std::unique_ptr<WebServiceWorkerPreloadResponseCallbacks> |
| +FetchEvent::createPreloadResponseCallback(ScriptState* scriptState) { |
| + return wrapUnique(new PreloadResponseCallbackImpl(m_navigationPreloadProperty, |
| + scriptState)); |
| +} |
| + |
| DEFINE_TRACE(FetchEvent) { |
| visitor->trace(m_observer); |
| visitor->trace(m_request); |
| + visitor->trace(m_navigationPreloadProperty); |
| ExtendableEvent::trace(visitor); |
| } |