1197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// found in the LICENSE file. 4197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 5197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#ifndef ScriptPromisePropertyBase_h 6197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#define ScriptPromisePropertyBase_h 7197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 8197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScopedPersistent.h" 9197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptPromise.h" 10197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptPromiseProperties.h" 11197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/dom/ContextLifecycleObserver.h" 12c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "wtf/OwnPtr.h" 13197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "wtf/RefCounted.h" 14c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "wtf/Vector.h" 15197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include <v8.h> 16197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 17c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 18197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 19c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class DOMWrapperWorld; 20197021e6b966cfb06891637935ef33fff06433d1Ben Murdochclass ExecutionContext; 21c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class ScriptState; 22197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 23c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class ScriptPromisePropertyBase : public GarbageCollectedFinalized<ScriptPromisePropertyBase>, public ContextLifecycleObserver { 24197021e6b966cfb06891637935ef33fff06433d1Ben Murdochpublic: 25197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual ~ScriptPromisePropertyBase(); 26197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 27197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch enum Name { 28c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#define P(Name) Name, 29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch SCRIPT_PROMISE_PROPERTIES(P) 30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#undef P 31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch }; 32197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch enum State { 34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Pending, 35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Resolved, 36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Rejected, 37197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch }; 38197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch State state() const { return m_state; } 39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 40197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ScriptPromise promise(DOMWrapperWorld&); 41197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 42197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual void trace(Visitor*) { } 43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 44197021e6b966cfb06891637935ef33fff06433d1Ben Murdochprotected: 45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ScriptPromisePropertyBase(ExecutionContext*, Name); 46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 47197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch void resolveOrReject(State targetState); 48197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 49197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // ScriptPromiseProperty overrides these to wrap the holder, 50197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // rejected value and resolved value. The 51197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // ScriptPromisePropertyBase caller will enter the V8Context for 52197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // the property's execution context and the world it is 53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // creating/settling promises in; the implementation should use 54197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // this context. 55197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual v8::Handle<v8::Object> holder(v8::Handle<v8::Object> creationContext, v8::Isolate*) = 0; 56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual v8::Handle<v8::Value> resolvedValue(v8::Handle<v8::Object> creationContext, v8::Isolate*) = 0; 57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual v8::Handle<v8::Value> rejectedValue(v8::Handle<v8::Object> creationContext, v8::Isolate*) = 0; 58197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 59e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) void resetBase(); 60e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 61197021e6b966cfb06891637935ef33fff06433d1Ben Murdochprivate: 62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) typedef Vector<OwnPtr<ScopedPersistent<v8::Object> > > WeakPersistentSet; 63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch void resolveOrRejectInternal(v8::Handle<v8::Promise::Resolver>); 65c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v8::Local<v8::Object> ensureHolderWrapper(ScriptState*); 66e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) void clearWrappers(); 67197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 68197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch v8::Handle<v8::String> promiseName(); 69197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch v8::Handle<v8::String> resolverName(); 70197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 71197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch v8::Isolate* m_isolate; 72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Name m_name; 73197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch State m_state; 74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 75c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) WeakPersistentSet m_wrappers; 76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}; 77197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 79197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 80197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif // ScriptPromisePropertyBase_h 81