Home | History | Annotate | Download | only in v8
      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.
      4 
      5 #ifndef ScriptPromisePropertyBase_h
      6 #define ScriptPromisePropertyBase_h
      7 
      8 #include "bindings/core/v8/ScopedPersistent.h"
      9 #include "bindings/core/v8/ScriptPromise.h"
     10 #include "bindings/core/v8/ScriptPromiseProperties.h"
     11 #include "core/dom/ContextLifecycleObserver.h"
     12 #include "wtf/OwnPtr.h"
     13 #include "wtf/RefCounted.h"
     14 #include "wtf/Vector.h"
     15 #include <v8.h>
     16 
     17 namespace blink {
     18 
     19 class DOMWrapperWorld;
     20 class ExecutionContext;
     21 class ScriptState;
     22 
     23 class ScriptPromisePropertyBase : public GarbageCollectedFinalized<ScriptPromisePropertyBase>, public ContextLifecycleObserver {
     24 public:
     25     virtual ~ScriptPromisePropertyBase();
     26 
     27     enum Name {
     28 #define P(Name) Name,
     29         SCRIPT_PROMISE_PROPERTIES(P)
     30 #undef P
     31     };
     32 
     33     enum State {
     34         Pending,
     35         Resolved,
     36         Rejected,
     37     };
     38     State state() const { return m_state; }
     39 
     40     ScriptPromise promise(DOMWrapperWorld&);
     41 
     42     virtual void trace(Visitor*) { }
     43 
     44 protected:
     45     ScriptPromisePropertyBase(ExecutionContext*, Name);
     46 
     47     void resolveOrReject(State targetState);
     48 
     49     // ScriptPromiseProperty overrides these to wrap the holder,
     50     // rejected value and resolved value. The
     51     // ScriptPromisePropertyBase caller will enter the V8Context for
     52     // the property's execution context and the world it is
     53     // creating/settling promises in; the implementation should use
     54     // this context.
     55     virtual v8::Handle<v8::Object> holder(v8::Handle<v8::Object> creationContext, v8::Isolate*) = 0;
     56     virtual v8::Handle<v8::Value> resolvedValue(v8::Handle<v8::Object> creationContext, v8::Isolate*) = 0;
     57     virtual v8::Handle<v8::Value> rejectedValue(v8::Handle<v8::Object> creationContext, v8::Isolate*) = 0;
     58 
     59     void resetBase();
     60 
     61 private:
     62     typedef Vector<OwnPtr<ScopedPersistent<v8::Object> > > WeakPersistentSet;
     63 
     64     void resolveOrRejectInternal(v8::Handle<v8::Promise::Resolver>);
     65     v8::Local<v8::Object> ensureHolderWrapper(ScriptState*);
     66     void clearWrappers();
     67 
     68     v8::Handle<v8::String> promiseName();
     69     v8::Handle<v8::String> resolverName();
     70 
     71     v8::Isolate* m_isolate;
     72     Name m_name;
     73     State m_state;
     74 
     75     WeakPersistentSet m_wrappers;
     76 };
     77 
     78 } // namespace blink
     79 
     80 #endif // ScriptPromisePropertyBase_h
     81