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