1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "modules/serviceworkers/RespondWithObserver.h"
8 #include "bindings/core/v8/ScriptFunction.h"
9 #include "bindings/core/v8/ScriptPromise.h"
10 #include "bindings/core/v8/ScriptValue.h"
11 #include "bindings/core/v8/V8Binding.h"
12 #include "bindings/modules/v8/V8Response.h"
13 #include "core/dom/ExecutionContext.h"
14 #include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h"
15 #include "wtf/Assertions.h"
16 #include "wtf/RefPtr.h"
21 class RespondWithObserver::ThenFunction FINAL : public ScriptFunction {
28 static PassOwnPtr<ScriptFunction> create(PassRefPtr<RespondWithObserver> observer, ResolveType type)
30 ExecutionContext* executionContext = observer->executionContext();
31 return adoptPtr(new ThenFunction(toIsolate(executionContext), observer, type));
35 ThenFunction(v8::Isolate* isolate, PassRefPtr<RespondWithObserver> observer, ResolveType type)
36 : ScriptFunction(isolate)
37 , m_observer(observer)
42 virtual ScriptValue call(ScriptValue value) OVERRIDE
45 ASSERT(m_resolveType == Fulfilled || m_resolveType == Rejected);
46 if (m_resolveType == Rejected)
47 m_observer->responseWasRejected();
49 m_observer->responseWasFulfilled(value);
54 RefPtr<RespondWithObserver> m_observer;
55 ResolveType m_resolveType;
58 PassRefPtr<RespondWithObserver> RespondWithObserver::create(ExecutionContext* context, int eventID)
60 return adoptRef(new RespondWithObserver(context, eventID));
63 RespondWithObserver::~RespondWithObserver()
67 void RespondWithObserver::contextDestroyed()
69 ContextLifecycleObserver::contextDestroyed();
73 void RespondWithObserver::didDispatchEvent()
75 if (m_state == Initial)
76 sendResponse(nullptr);
79 void RespondWithObserver::respondWith(ScriptState* scriptState, const ScriptValue& value)
81 if (m_state != Initial)
85 ScriptPromise::cast(scriptState, value).then(
86 ThenFunction::create(this, ThenFunction::Fulfilled),
87 ThenFunction::create(this, ThenFunction::Rejected));
90 void RespondWithObserver::sendResponse(PassRefPtrWillBeRawPtr<Response> response)
92 if (!executionContext())
94 ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleFetchEvent(m_eventID, response);
98 void RespondWithObserver::responseWasRejected()
100 // FIXME: Throw a NetworkError to service worker's execution context.
101 sendResponse(nullptr);
104 void RespondWithObserver::responseWasFulfilled(const ScriptValue& value)
106 if (!executionContext())
108 if (!V8Response::hasInstance(value.v8Value(), toIsolate(executionContext()))) {
109 responseWasRejected();
112 v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(value.v8Value());
113 sendResponse(V8Response::toNative(object));
116 RespondWithObserver::RespondWithObserver(ExecutionContext* context, int eventID)
117 : ContextLifecycleObserver(context)