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

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: Feedback. 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 between the wrapper, 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 <------.
34 // \ |
35 // -----> Promise
36 //
37 // To avoid exposing the action of the garbage collector to script,
38 // you should keep the wrapper alive as long as a promise may be
39 // settled.
40 //
41 // ScriptPromiseProperty only supports the main world.
42 // FIXME: Implement support for isolated worlds.
43 template<typename HolderType, typename ResolvedType, typename RejectedType>
44 class ScriptPromiseProperty : public ScriptPromisePropertyBase {
45 WTF_MAKE_NONCOPYABLE(ScriptPromiseProperty);
46 public:
47 // Creates a ScriptPromiseProperty that will create Promises in
48 // the specified ExecutionContext for a property of 'holder'
49 // (typically ScriptPromiseProperty should be a member of the
50 // property holder).
51 //
52 // When implementing a ScriptPromiseProperty add the property name
53 // to ScriptPromiseProperties.h and pass
54 // ScriptPromiseProperty::Foo to create. The name must be unique
55 // per kind of holder.
56 template<typename PassHolderType>
57 static PassRefPtrWillBeRawPtr<ScriptPromiseProperty<HolderType, ResolvedType , RejectedType> > create(ExecutionContext*, PassHolderType, Name);
58
59 virtual ~ScriptPromiseProperty() { }
60
61 template<typename PassResolvedType>
62 void resolve(PassResolvedType);
63
64 template<typename PassRejectedType>
65 void reject(PassRejectedType);
66
67 private:
68 template<typename PassHolderType>
69 ScriptPromiseProperty(ExecutionContext*, PassHolderType, Name);
70
71 virtual v8::Handle<v8::Object> holder(v8::Handle<v8::Object> creationContext , v8::Isolate*) OVERRIDE;
72 virtual v8::Handle<v8::Value> resolvedValue(v8::Handle<v8::Object> creationC ontext, v8::Isolate*) OVERRIDE;
73 virtual v8::Handle<v8::Value> rejectedValue(v8::Handle<v8::Object> creationC ontext, v8::Isolate*) OVERRIDE;
74
75 HolderType m_holder;
76 ResolvedType m_resolved;
77 RejectedType m_rejected;
78 };
79
80 template<typename HolderType, typename ResolvedType, typename RejectedType>
81 template<typename PassHolderType>
82 PassRefPtrWillBeRawPtr<ScriptPromiseProperty<HolderType, ResolvedType, RejectedT ype> > ScriptPromiseProperty<HolderType, ResolvedType, RejectedType>::create(Exe cutionContext* executionContext, PassHolderType holder, Name name)
83 {
84 return adoptRef(new ScriptPromiseProperty<HolderType, ResolvedType, Rejected Type>(executionContext, holder, name));
85 }
86
87 template<typename HolderType, typename ResolvedType, typename RejectedType>
88 template<typename PassHolderType>
89 ScriptPromiseProperty<HolderType, ResolvedType, RejectedType>::ScriptPromiseProp erty(ExecutionContext* executionContext, PassHolderType holder, Name name)
90 : ScriptPromisePropertyBase(executionContext, name)
91 , m_holder(holder)
92 {
93 }
94
95 template<typename HolderType, typename ResolvedType, typename RejectedType>
96 template<typename PassResolvedType>
97 void ScriptPromiseProperty<HolderType, ResolvedType, RejectedType>::resolve(Pass ResolvedType value)
98 {
99 if (state() != Pending) {
100 ASSERT_NOT_REACHED();
101 return;
102 }
103 if (!executionContext())
104 return;
105 m_resolved = value;
106 resolveOrReject(Resolved);
107 }
108
109 template<typename HolderType, typename ResolvedType, typename RejectedType>
110 template<typename PassRejectedType>
111 void ScriptPromiseProperty<HolderType, ResolvedType, RejectedType>::reject(PassR ejectedType value)
112 {
113 if (state() != Pending) {
114 ASSERT_NOT_REACHED();
115 return;
116 }
117 if (!executionContext())
118 return;
119 m_rejected = value;
120 resolveOrReject(Rejected);
121 }
122
123 template<typename HolderType, typename ResolvedType, typename RejectedType>
124 v8::Handle<v8::Object> ScriptPromiseProperty<HolderType, ResolvedType, RejectedT ype>::holder(v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
125 {
126 v8::Handle<v8::Value> value = V8ValueTraits<HolderType>::toV8Value(m_holder, creationContext, isolate);
127 return value.As<v8::Object>();
128 }
129
130 template<typename HolderType, typename ResolvedType, typename RejectedType>
131 v8::Handle<v8::Value> ScriptPromiseProperty<HolderType, ResolvedType, RejectedTy pe>::resolvedValue(v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
132 {
133 ASSERT(state() == Resolved);
134 return V8ValueTraits<ResolvedType>::toV8Value(m_resolved, creationContext, i solate);
135 }
136
137 template<typename HolderType, typename ResolvedType, typename RejectedType>
138 v8::Handle<v8::Value> ScriptPromiseProperty<HolderType, ResolvedType, RejectedTy pe>::rejectedValue(v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
139 {
140 ASSERT(state() == Rejected);
141 return V8ValueTraits<RejectedType>::toV8Value(m_rejected, creationContext, i solate);
142 }
143
144 } // namespace WebCore
145
146 #endif // ScriptPromiseProperty_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698