Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(971)

Side by Side Diff: Source/bindings/core/v8/ScriptPromiseProperty.h

Issue 361863003: Add a helper for implementing Promise-valued properties. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: More feedback. Keeping separate header file for now. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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 ScriptPromiseProperty_h
6 #define ScriptPromiseProperty_h
7
8 #include "bindings/core/v8/ScriptPromise.h"
9 #include "bindings/core/v8/ScriptPromisePropertyBase.h"
10 #include "bindings/core/v8/V8Binding.h"
11 #include "wtf/Noncopyable.h"
12 #include "wtf/PassRefPtr.h"
13
14 namespace WebCore {
15
16 class ExecutionContext;
17
18 // ScriptPromiseProperty is a helper for implementing a DOM method or
19 // attribute whose value is a Promise, and the same Promise must be
20 // returned each time.
21 //
22 // ScriptPromiseProperty does not keep Promises or worlds alive to
23 // deliver Promise resolution/rejection to them; the Promise
24 // resolution/rejections are delivered if the holder's wrapper is
25 // alive. This is achieved by keeping a weak reference from
26 // ScriptPromiseProperty to the holder's wrapper, and references in
27 // hidden values from the wrapper to the promise and resolver
28 // (coincidentally the Resolver and Promise may be the same object,
29 // but that is an implementation detail of v8.)
30 //
31 // ----> Resolver
32 // /
33 // ScriptPromiseProperty - - -> Holder Wrapper ----> Promise
34 //
35 // To avoid exposing the action of the garbage collector to script,
36 // you should keep the wrapper alive as long as a promise may be
37 // settled.
38 //
39 // ScriptPromiseProperty only supports the main world.
40 // FIXME: Implement support for isolated worlds.
41 template<typename HolderType, typename ResolvedType, typename RejectedType>
42 class ScriptPromiseProperty : public ScriptPromisePropertyBase {
43 WTF_MAKE_NONCOPYABLE(ScriptPromiseProperty);
44 public:
45 // Creates a ScriptPromiseProperty that will create Promises in
46 // the specified ExecutionContext for a property of 'holder'
47 // (typically ScriptPromiseProperty should be a member of the
48 // property holder).
49 //
50 // When implementing a ScriptPromiseProperty add the property name
51 // to ScriptPromiseProperties.h and pass
52 // ScriptPromiseProperty::Foo to create. The name must be unique
53 // per kind of holder.
54 template<typename PassHolderType>
55 static PassRefPtrWillBeRawPtr<ScriptPromiseProperty<HolderType, ResolvedType , RejectedType> > create(ExecutionContext*, PassHolderType, Name);
56
57 virtual ~ScriptPromiseProperty() { }
58
59 template<typename PassResolvedType>
60 void resolve(PassResolvedType);
61
62 template<typename PassRejectedType>
63 void reject(PassRejectedType);
64
65 private:
66 template<typename PassHolderType>
67 ScriptPromiseProperty(ExecutionContext*, PassHolderType, Name);
68
69 virtual v8::Handle<v8::Object> holder(v8::Handle<v8::Object> creationContext , v8::Isolate*) OVERRIDE;
70 virtual v8::Handle<v8::Value> resolvedValue(v8::Handle<v8::Object> creationC ontext, v8::Isolate*) OVERRIDE;
71 virtual v8::Handle<v8::Value> rejectedValue(v8::Handle<v8::Object> creationC ontext, v8::Isolate*) OVERRIDE;
72
73 HolderType m_holder;
74 ResolvedType m_resolved;
75 RejectedType m_rejected;
76 };
77
78 template<typename HolderType, typename ResolvedType, typename RejectedType>
79 template<typename PassHolderType>
80 PassRefPtrWillBeRawPtr<ScriptPromiseProperty<HolderType, ResolvedType, RejectedT ype> > ScriptPromiseProperty<HolderType, ResolvedType, RejectedType>::create(Exe cutionContext* executionContext, PassHolderType holder, Name name)
81 {
82 return adoptRef(new ScriptPromiseProperty<HolderType, ResolvedType, Rejected Type>(executionContext, holder, name));
83 }
84
85 template<typename HolderType, typename ResolvedType, typename RejectedType>
86 template<typename PassHolderType>
87 ScriptPromiseProperty<HolderType, ResolvedType, RejectedType>::ScriptPromiseProp erty(ExecutionContext* executionContext, PassHolderType holder, Name name)
88 : ScriptPromisePropertyBase(executionContext, name)
89 , m_holder(holder)
90 {
91 }
92
93 template<typename HolderType, typename ResolvedType, typename RejectedType>
94 template<typename PassResolvedType>
95 void ScriptPromiseProperty<HolderType, ResolvedType, RejectedType>::resolve(Pass ResolvedType value)
96 {
97 if (state() != Pending) {
98 ASSERT_NOT_REACHED();
99 return;
100 }
101 if (!executionContext())
102 return;
103 m_resolved = value;
104 resolveOrReject(Resolved);
105 }
106
107 template<typename HolderType, typename ResolvedType, typename RejectedType>
108 template<typename PassRejectedType>
109 void ScriptPromiseProperty<HolderType, ResolvedType, RejectedType>::reject(PassR ejectedType value)
110 {
111 if (state() != Pending) {
112 ASSERT_NOT_REACHED();
113 return;
114 }
115 if (!executionContext())
116 return;
117 m_rejected = value;
118 resolveOrReject(Rejected);
119 }
120
121 template<typename HolderType, typename ResolvedType, typename RejectedType>
122 v8::Handle<v8::Object> ScriptPromiseProperty<HolderType, ResolvedType, RejectedT ype>::holder(v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
123 {
124 v8::Handle<v8::Value> value = V8ValueTraits<HolderType>::toV8Value(m_holder, creationContext, isolate);
125 return value.As<v8::Object>();
126 }
127
128 template<typename HolderType, typename ResolvedType, typename RejectedType>
129 v8::Handle<v8::Value> ScriptPromiseProperty<HolderType, ResolvedType, RejectedTy pe>::resolvedValue(v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
130 {
131 ASSERT(state() == Resolved);
132 return V8ValueTraits<ResolvedType>::toV8Value(m_resolved, creationContext, i solate);
133 }
134
135 template<typename HolderType, typename ResolvedType, typename RejectedType>
136 v8::Handle<v8::Value> ScriptPromiseProperty<HolderType, ResolvedType, RejectedTy pe>::rejectedValue(v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
137 {
138 ASSERT(state() == Rejected);
139 return V8ValueTraits<RejectedType>::toV8Value(m_rejected, creationContext, i solate);
140 }
141
142 } // namespace WebCore
143
144 #endif // ScriptPromiseProperty_h
OLDNEW
« no previous file with comments | « Source/bindings/core/v8/ScriptPromiseProperties.h ('k') | Source/bindings/core/v8/ScriptPromisePropertyBase.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698