OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 | 93 |
94 // Associates this instance with the given |wrapper| if this instance is not | 94 // Associates this instance with the given |wrapper| if this instance is not |
95 // yet associated with any wrapper. Returns true if the given wrapper is | 95 // yet associated with any wrapper. Returns true if the given wrapper is |
96 // associated with this instance, or false if this instance is already | 96 // associated with this instance, or false if this instance is already |
97 // associated with a wrapper. In the latter case, |wrapper| will be updated | 97 // associated with a wrapper. In the latter case, |wrapper| will be updated |
98 // to the existing wrapper. | 98 // to the existing wrapper. |
99 bool setWrapper(v8::Isolate* isolate, const WrapperTypeInfo* wrapperTypeInfo
, v8::Local<v8::Object>& wrapper) WARN_UNUSED_RETURN | 99 bool setWrapper(v8::Isolate* isolate, const WrapperTypeInfo* wrapperTypeInfo
, v8::Local<v8::Object>& wrapper) WARN_UNUSED_RETURN |
100 { | 100 { |
101 ASSERT(!wrapper.IsEmpty()); | 101 ASSERT(!wrapper.IsEmpty()); |
102 if (UNLIKELY(containsWrapper())) { | 102 if (UNLIKELY(containsWrapper())) { |
103 wrapper = newLocalWrapper(isolate); | 103 wrapper = mainWorldWrapper(isolate); |
104 return false; | 104 return false; |
105 } | 105 } |
106 m_wrapper.Reset(isolate, wrapper); | 106 m_mainWorldWrapper.Reset(isolate, wrapper); |
107 wrapperTypeInfo->configureWrapper(&m_wrapper); | 107 wrapperTypeInfo->configureWrapper(&m_mainWorldWrapper); |
108 m_wrapper.SetWeak(); | 108 m_mainWorldWrapper.SetWeak(); |
109 ASSERT(containsWrapper()); | 109 ASSERT(containsWrapper()); |
110 return true; | 110 return true; |
111 } | 111 } |
112 | 112 |
113 v8::Local<v8::Object> newLocalWrapper(v8::Isolate* isolate) const | |
114 { | |
115 return v8::Local<v8::Object>::New(isolate, m_wrapper); | |
116 } | |
117 | |
118 bool isEqualTo(const v8::Local<v8::Object>& other) const | 113 bool isEqualTo(const v8::Local<v8::Object>& other) const |
119 { | 114 { |
120 return m_wrapper == other; | 115 return m_mainWorldWrapper == other; |
121 } | 116 } |
122 | 117 |
123 // Provides a way to convert Node* to ScriptWrappable* without including | 118 // Provides a way to convert Node* to ScriptWrappable* without including |
124 // "core/dom/Node.h". | 119 // "core/dom/Node.h". |
125 // | 120 // |
126 // Example: | 121 // Example: |
127 // void foo(const void*) { ... } // [1] | 122 // void foo(const void*) { ... } // [1] |
128 // void foo(ScriptWrappable*) { ... } // [2] | 123 // void foo(ScriptWrappable*) { ... } // [2] |
129 // class Node; | 124 // class Node; |
130 // Node* node; | 125 // Node* node; |
131 // foo(node); // This calls [1] because there is no definition of Node | 126 // foo(node); // This calls [1] because there is no definition of Node |
132 // // and compilers do not know that Node is a subclass of | 127 // // and compilers do not know that Node is a subclass of |
133 // // ScriptWrappable. | 128 // // ScriptWrappable. |
134 // foo(ScriptWrappable::fromNode(node)); // This calls [2] as expected. | 129 // foo(ScriptWrappable::fromNode(node)); // This calls [2] as expected. |
135 // | 130 // |
136 // The definition of fromNode is placed in Node.h because we'd like to | 131 // The definition of fromNode is placed in Node.h because we'd like to |
137 // inline calls to fromNode as much as possible. | 132 // inline calls to fromNode as much as possible. |
138 static ScriptWrappable* fromNode(Node*); | 133 static ScriptWrappable* fromNode(Node*); |
139 | 134 |
140 bool setReturnValue(v8::ReturnValue<v8::Value> returnValue) | 135 bool setReturnValue(v8::ReturnValue<v8::Value> returnValue) |
141 { | 136 { |
142 returnValue.Set(m_wrapper); | 137 returnValue.Set(m_mainWorldWrapper); |
143 return containsWrapper(); | 138 return containsWrapper(); |
144 } | 139 } |
145 | 140 |
146 void setReference(const v8::Persistent<v8::Object>& parent, v8::Isolate* iso
late) | 141 void setReference(const v8::Persistent<v8::Object>& parent, v8::Isolate* iso
late) |
147 { | 142 { |
148 isolate->SetReference(parent, m_wrapper); | 143 isolate->SetReference(parent, m_mainWorldWrapper); |
149 } | 144 } |
150 | 145 |
151 bool containsWrapper() const { return !m_wrapper.IsEmpty(); } | 146 bool containsWrapper() const { return !m_mainWorldWrapper.IsEmpty(); } |
152 | 147 |
153 /** | 148 /** |
154 * Mark wrapper of this ScriptWrappable as alive in V8. Only marks | 149 * Mark wrapper of this ScriptWrappable as alive in V8. Only marks |
155 * wrapper in the main world. To mark wrappers in all worlds call | 150 * wrapper in the main world. To mark wrappers in all worlds call |
156 * ScriptWrappableVisitor::markWrapper(ScriptWrappable*, v8::Isolate*) | 151 * ScriptWrappableVisitor::markWrapper(ScriptWrappable*, v8::Isolate*) |
157 */ | 152 */ |
158 void markWrapper(v8::Isolate*) const; | 153 void markWrapper(v8::Isolate*) const; |
159 | 154 |
160 DECLARE_VIRTUAL_TRACE_WRAPPERS() {}; | 155 DECLARE_VIRTUAL_TRACE_WRAPPERS() {}; |
161 | 156 |
162 // With Oilpan we don't need a ScriptWrappable destructor. | 157 // With Oilpan we don't need a ScriptWrappable destructor. |
163 // | 158 // |
164 // 'RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(!containsWrapper())' is not nee
ded | 159 // 'RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(!containsWrapper())' is not nee
ded |
165 // because Oilpan is not using reference counting at all. If containsWrapper
() is true, | 160 // because Oilpan is not using reference counting at all. If containsWrapper
() is true, |
166 // it means that ScriptWrappable still has a wrapper. In this case, the dest
ructor | 161 // it means that ScriptWrappable still has a wrapper. In this case, the dest
ructor |
167 // must not be called since the wrapper has a persistent handle back to this
ScriptWrappable object. | 162 // must not be called since the wrapper has a persistent handle back to this
ScriptWrappable object. |
168 // Assuming that Oilpan's GC is correct (If we cannot assume this, a lot of
more things are | 163 // Assuming that Oilpan's GC is correct (If we cannot assume this, a lot of
more things are |
169 // already broken), we must not hit the RELEASE_ASSERT. | 164 // already broken), we must not hit the RELEASE_ASSERT. |
170 | 165 |
171 private: | 166 private: |
172 v8::Persistent<v8::Object> m_wrapper; | 167 // These classes are exceptionally allowed to use mainWorldWrapper(). |
| 168 friend class DOMDataStore; |
| 169 friend class V8HiddenValue; |
| 170 friend class V8PrivateProperty; |
| 171 friend class WebGLRenderingContextBase; |
| 172 |
| 173 v8::Local<v8::Object> mainWorldWrapper(v8::Isolate* isolate) const |
| 174 { |
| 175 return v8::Local<v8::Object>::New(isolate, m_mainWorldWrapper); |
| 176 } |
| 177 |
| 178 v8::Persistent<v8::Object> m_mainWorldWrapper; |
173 }; | 179 }; |
174 | 180 |
175 // Defines 'wrapperTypeInfo' virtual method which returns the WrapperTypeInfo of | 181 // Defines 'wrapperTypeInfo' virtual method which returns the WrapperTypeInfo of |
176 // the instance. Also declares a static member of type WrapperTypeInfo, of which | 182 // the instance. Also declares a static member of type WrapperTypeInfo, of which |
177 // the definition is given by the IDL code generator. | 183 // the definition is given by the IDL code generator. |
178 // | 184 // |
179 // All the derived classes of ScriptWrappable, regardless of directly or | 185 // All the derived classes of ScriptWrappable, regardless of directly or |
180 // indirectly, must write this macro in the class definition as long as the | 186 // indirectly, must write this macro in the class definition as long as the |
181 // class has a corresponding .idl file. | 187 // class has a corresponding .idl file. |
182 #define DEFINE_WRAPPERTYPEINFO() \ | 188 #define DEFINE_WRAPPERTYPEINFO() \ |
(...skipping 17 matching lines...) Expand all Loading... |
200 // in X's cpp code, and instantiate X, i.e. "template class X;". | 206 // in X's cpp code, and instantiate X, i.e. "template class X;". |
201 #define DECLARE_WRAPPERTYPEINFO() \ | 207 #define DECLARE_WRAPPERTYPEINFO() \ |
202 public: \ | 208 public: \ |
203 const WrapperTypeInfo* wrapperTypeInfo() const override; \ | 209 const WrapperTypeInfo* wrapperTypeInfo() const override; \ |
204 private: \ | 210 private: \ |
205 typedef void end_of_define_wrappertypeinfo_not_reached_t | 211 typedef void end_of_define_wrappertypeinfo_not_reached_t |
206 | 212 |
207 } // namespace blink | 213 } // namespace blink |
208 | 214 |
209 #endif // ScriptWrappable_h | 215 #endif // ScriptWrappable_h |
OLD | NEW |