| Index: third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp
|
| diff --git a/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp b/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp
|
| similarity index 67%
|
| copy from third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp
|
| copy to third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp
|
| index abde40fe3f13b834c847d000bce79648f3322295..39cd2ddd8f53c45c38f02064ef3f5b8ccbd0ac3c 100644
|
| --- a/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp
|
| +++ b/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp
|
| @@ -2,25 +2,21 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "modules/serviceworkers/RespondWithObserver.h"
|
| +#include "modules/serviceworkers/FetchRespondWithObserver.h"
|
|
|
| -#include "bindings/core/v8/ScriptFunction.h"
|
| -#include "bindings/core/v8/ScriptPromise.h"
|
| +#include <v8.h>
|
| #include "bindings/core/v8/ScriptValue.h"
|
| #include "bindings/core/v8/V8Binding.h"
|
| #include "bindings/modules/v8/V8Response.h"
|
| -#include "core/dom/ExceptionCode.h"
|
| #include "core/dom/ExecutionContext.h"
|
| #include "core/inspector/ConsoleMessage.h"
|
| +#include "core/inspector/ConsoleTypes.h"
|
| #include "core/streams/Stream.h"
|
| #include "modules/fetch/BodyStreamBuffer.h"
|
| #include "modules/fetch/BytesConsumer.h"
|
| #include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h"
|
| -#include "platform/RuntimeEnabledFeatures.h"
|
| +#include "modules/serviceworkers/WaitUntilObserver.h"
|
| #include "public/platform/modules/serviceworker/WebServiceWorkerResponse.h"
|
| -#include "v8/include/v8.h"
|
| -#include "wtf/Assertions.h"
|
| -#include "wtf/RefPtr.h"
|
|
|
| namespace blink {
|
| namespace {
|
| @@ -55,7 +51,7 @@ const String getMessageForResponseError(WebServiceWorkerResponseError error,
|
| "is not no-cors";
|
| break;
|
| case WebServiceWorkerResponseErrorResponseTypeNotBasicOrDefault:
|
| - ASSERT_NOT_REACHED();
|
| + NOTREACHED();
|
| break;
|
| case WebServiceWorkerResponseErrorBodyUsed:
|
| errorMessage = errorMessage +
|
| @@ -145,55 +141,7 @@ class NoopLoaderClient final
|
|
|
| } // namespace
|
|
|
| -class RespondWithObserver::ThenFunction final : public ScriptFunction {
|
| - public:
|
| - enum ResolveType {
|
| - Fulfilled,
|
| - Rejected,
|
| - };
|
| -
|
| - static v8::Local<v8::Function> createFunction(ScriptState* scriptState,
|
| - RespondWithObserver* observer,
|
| - ResolveType type) {
|
| - ThenFunction* self = new ThenFunction(scriptState, observer, type);
|
| - return self->bindToV8Function();
|
| - }
|
| -
|
| - DEFINE_INLINE_VIRTUAL_TRACE() {
|
| - visitor->trace(m_observer);
|
| - ScriptFunction::trace(visitor);
|
| - }
|
| -
|
| - private:
|
| - ThenFunction(ScriptState* scriptState,
|
| - RespondWithObserver* observer,
|
| - ResolveType type)
|
| - : ScriptFunction(scriptState),
|
| - m_observer(observer),
|
| - m_resolveType(type) {}
|
| -
|
| - ScriptValue call(ScriptValue value) override {
|
| - ASSERT(m_observer);
|
| - ASSERT(m_resolveType == Fulfilled || m_resolveType == Rejected);
|
| - if (m_resolveType == Rejected) {
|
| - m_observer->responseWasRejected(
|
| - WebServiceWorkerResponseErrorPromiseRejected);
|
| - value =
|
| - ScriptPromise::reject(value.getScriptState(), value).getScriptValue();
|
| - } else {
|
| - m_observer->responseWasFulfilled(value);
|
| - }
|
| - m_observer = nullptr;
|
| - return value;
|
| - }
|
| -
|
| - Member<RespondWithObserver> m_observer;
|
| - ResolveType m_resolveType;
|
| -};
|
| -
|
| -RespondWithObserver::~RespondWithObserver() {}
|
| -
|
| -RespondWithObserver* RespondWithObserver::create(
|
| +FetchRespondWithObserver* FetchRespondWithObserver::create(
|
| ExecutionContext* context,
|
| int fetchEventID,
|
| const KURL& requestURL,
|
| @@ -202,59 +150,14 @@ RespondWithObserver* RespondWithObserver::create(
|
| WebURLRequest::FrameType frameType,
|
| WebURLRequest::RequestContext requestContext,
|
| WaitUntilObserver* observer) {
|
| - return new RespondWithObserver(context, fetchEventID, requestURL, requestMode,
|
| - redirectMode, frameType, requestContext,
|
| - observer);
|
| + return new FetchRespondWithObserver(context, fetchEventID, requestURL,
|
| + requestMode, redirectMode, frameType,
|
| + requestContext, observer);
|
| }
|
|
|
| -void RespondWithObserver::contextDestroyed(ExecutionContext*) {
|
| - if (m_observer) {
|
| - DCHECK_EQ(Pending, m_state);
|
| - m_observer.clear();
|
| - }
|
| - m_state = Done;
|
| -}
|
| -
|
| -void RespondWithObserver::willDispatchEvent() {
|
| - m_eventDispatchTime = WTF::currentTime();
|
| -}
|
| -
|
| -void RespondWithObserver::didDispatchEvent(DispatchEventResult dispatchResult) {
|
| - ASSERT(getExecutionContext());
|
| - if (m_state != Initial)
|
| - return;
|
| -
|
| - if (dispatchResult != DispatchEventResult::NotCanceled) {
|
| - m_observer->incrementPendingActivity();
|
| - responseWasRejected(WebServiceWorkerResponseErrorDefaultPrevented);
|
| - return;
|
| - }
|
| -
|
| - ServiceWorkerGlobalScopeClient::from(getExecutionContext())
|
| - ->respondToFetchEvent(m_fetchEventID, m_eventDispatchTime);
|
| - m_state = Done;
|
| - m_observer.clear();
|
| -}
|
| -
|
| -void RespondWithObserver::respondWith(ScriptState* scriptState,
|
| - ScriptPromise scriptPromise,
|
| - ExceptionState& exceptionState) {
|
| - if (m_state != Initial) {
|
| - exceptionState.throwDOMException(
|
| - InvalidStateError, "The fetch event has already been responded to.");
|
| - return;
|
| - }
|
| -
|
| - m_state = Pending;
|
| - m_observer->incrementPendingActivity();
|
| - scriptPromise.then(
|
| - ThenFunction::createFunction(scriptState, this, ThenFunction::Fulfilled),
|
| - ThenFunction::createFunction(scriptState, this, ThenFunction::Rejected));
|
| -}
|
| -
|
| -void RespondWithObserver::responseWasRejected(
|
| +void FetchRespondWithObserver::onResponseRejected(
|
| WebServiceWorkerResponseError error) {
|
| - ASSERT(getExecutionContext());
|
| + DCHECK(getExecutionContext());
|
| getExecutionContext()->addConsoleMessage(
|
| ConsoleMessage::create(JSMessageSource, WarningMessageLevel,
|
| getMessageForResponseError(error, m_requestURL)));
|
| @@ -264,17 +167,14 @@ void RespondWithObserver::responseWasRejected(
|
| WebServiceWorkerResponse webResponse;
|
| webResponse.setError(error);
|
| ServiceWorkerGlobalScopeClient::from(getExecutionContext())
|
| - ->respondToFetchEvent(m_fetchEventID, webResponse, m_eventDispatchTime);
|
| - m_state = Done;
|
| - m_observer->decrementPendingActivity();
|
| - m_observer.clear();
|
| + ->respondToFetchEvent(m_eventID, webResponse, m_eventDispatchTime);
|
| }
|
|
|
| -void RespondWithObserver::responseWasFulfilled(const ScriptValue& value) {
|
| - ASSERT(getExecutionContext());
|
| +void FetchRespondWithObserver::onResponseFulfilled(const ScriptValue& value) {
|
| + DCHECK(getExecutionContext());
|
| if (!V8Response::hasInstance(value.v8Value(),
|
| toIsolate(getExecutionContext()))) {
|
| - responseWasRejected(WebServiceWorkerResponseErrorNoV8Instance);
|
| + onResponseRejected(WebServiceWorkerResponseErrorNoV8Instance);
|
| return;
|
| }
|
| Response* response = V8Response::toImplWithTypeCheck(
|
| @@ -286,12 +186,12 @@ void RespondWithObserver::responseWasFulfilled(const ScriptValue& value) {
|
| // |basic| nor |default|."
|
| const FetchResponseData::Type responseType = response->response()->getType();
|
| if (responseType == FetchResponseData::ErrorType) {
|
| - responseWasRejected(WebServiceWorkerResponseErrorResponseTypeError);
|
| + onResponseRejected(WebServiceWorkerResponseErrorResponseTypeError);
|
| return;
|
| }
|
| if (responseType == FetchResponseData::OpaqueType) {
|
| if (m_requestMode != WebURLRequest::FetchRequestModeNoCORS) {
|
| - responseWasRejected(WebServiceWorkerResponseErrorResponseTypeOpaque);
|
| + onResponseRejected(WebServiceWorkerResponseErrorResponseTypeOpaque);
|
| return;
|
| }
|
|
|
| @@ -301,21 +201,20 @@ void RespondWithObserver::responseWasFulfilled(const ScriptValue& value) {
|
| // remove this check when the spec will be updated.
|
| // Spec issue: https://github.com/whatwg/fetch/issues/101
|
| if (isClientRequest(m_frameType, m_requestContext)) {
|
| - responseWasRejected(
|
| + onResponseRejected(
|
| WebServiceWorkerResponseErrorResponseTypeOpaqueForClientRequest);
|
| return;
|
| }
|
| }
|
| if (m_redirectMode != WebURLRequest::FetchRedirectModeManual &&
|
| responseType == FetchResponseData::OpaqueRedirectType) {
|
| - responseWasRejected(
|
| - WebServiceWorkerResponseErrorResponseTypeOpaqueRedirect);
|
| + onResponseRejected(WebServiceWorkerResponseErrorResponseTypeOpaqueRedirect);
|
| return;
|
| }
|
| if (m_redirectMode != WebURLRequest::FetchRedirectModeFollow &&
|
| response->redirected()) {
|
| if (!isNavigationRequest(m_frameType)) {
|
| - responseWasRejected(
|
| + onResponseRejected(
|
| WebServiceWorkerResponseErrorRedirectedResponseForNotFollowRequest);
|
| return;
|
| }
|
| @@ -328,11 +227,11 @@ void RespondWithObserver::responseWasFulfilled(const ScriptValue& value) {
|
| m_requestURL, response->internalURLList())));
|
| }
|
| if (response->isBodyLocked()) {
|
| - responseWasRejected(WebServiceWorkerResponseErrorBodyLocked);
|
| + onResponseRejected(WebServiceWorkerResponseErrorBodyLocked);
|
| return;
|
| }
|
| if (response->bodyUsed()) {
|
| - responseWasRejected(WebServiceWorkerResponseErrorBodyUsed);
|
| + onResponseRejected(WebServiceWorkerResponseErrorBodyUsed);
|
| return;
|
| }
|
|
|
| @@ -352,13 +251,15 @@ void RespondWithObserver::responseWasFulfilled(const ScriptValue& value) {
|
| }
|
| }
|
| ServiceWorkerGlobalScopeClient::from(getExecutionContext())
|
| - ->respondToFetchEvent(m_fetchEventID, webResponse, m_eventDispatchTime);
|
| - m_state = Done;
|
| - m_observer->decrementPendingActivity();
|
| - m_observer.clear();
|
| + ->respondToFetchEvent(m_eventID, webResponse, m_eventDispatchTime);
|
| +}
|
| +
|
| +void FetchRespondWithObserver::onNoResponse() {
|
| + ServiceWorkerGlobalScopeClient::from(getExecutionContext())
|
| + ->respondToFetchEvent(m_eventID, m_eventDispatchTime);
|
| }
|
|
|
| -RespondWithObserver::RespondWithObserver(
|
| +FetchRespondWithObserver::FetchRespondWithObserver(
|
| ExecutionContext* context,
|
| int fetchEventID,
|
| const KURL& requestURL,
|
| @@ -367,19 +268,15 @@ RespondWithObserver::RespondWithObserver(
|
| WebURLRequest::FrameType frameType,
|
| WebURLRequest::RequestContext requestContext,
|
| WaitUntilObserver* observer)
|
| - : ContextLifecycleObserver(context),
|
| - m_fetchEventID(fetchEventID),
|
| + : RespondWithObserver(context, fetchEventID, observer),
|
| m_requestURL(requestURL),
|
| m_requestMode(requestMode),
|
| m_redirectMode(redirectMode),
|
| m_frameType(frameType),
|
| - m_requestContext(requestContext),
|
| - m_state(Initial),
|
| - m_observer(observer) {}
|
| + m_requestContext(requestContext) {}
|
|
|
| -DEFINE_TRACE(RespondWithObserver) {
|
| - visitor->trace(m_observer);
|
| - ContextLifecycleObserver::trace(visitor);
|
| +DEFINE_TRACE(FetchRespondWithObserver) {
|
| + RespondWithObserver::trace(visitor);
|
| }
|
|
|
| } // namespace blink
|
|
|