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

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/V8Binding.h

Issue 2843603002: Move ScriptWrappable and dependencies to platform/bindings (Closed)
Patch Set: Rebase and try again Created 3 years, 7 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 * Copyright (C) 2012 Ericsson AB. All rights reserved. 3 * Copyright (C) 2012 Ericsson AB. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 11 matching lines...) Expand all
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */ 30 */
31 31
32 #ifndef V8Binding_h 32 // This file has been moved to platform/bindings/V8Binding.h.
33 #define V8Binding_h 33 // TODO(adithyas): Remove this file.
34 34 #include "platform/bindings/V8Binding.h"
35 #include "bindings/core/v8/DOMDataStore.h"
36 #include "bindings/core/v8/DOMWrapperWorld.h"
37 #include "bindings/core/v8/ScriptWrappable.h"
38 #include "bindings/core/v8/StringResource.h"
39 #include "bindings/core/v8/V8BindingMacros.h"
40 #include "bindings/core/v8/V8PerIsolateData.h"
41 #include "bindings/core/v8/V8ScriptRunner.h"
42 #include "bindings/core/v8/V8ValueCache.h"
43 #include "core/CoreExport.h"
44 #include "platform/heap/Handle.h"
45 #include "platform/wtf/text/AtomicString.h"
46 #include "platform/wtf/text/StringView.h"
47 #include "v8/include/v8.h"
48
49 namespace blink {
50
51 // This file contains bindings helper functions that do not have dependencies
52 // to core/ or bindings/core. For core-specific helper functions, see
53 // bindings/core/v8/V8BindingForCore.h.
54
55 template <typename T>
56 struct V8TypeOf {
57 STATIC_ONLY(V8TypeOf);
58 // |Type| provides C++ -> V8 type conversion for DOM wrappers.
59 // The Blink binding code generator will generate specialized version of
60 // V8TypeOf for each wrapper class.
61 typedef void Type;
62 };
63
64 template <typename CallbackInfo, typename S>
65 inline void V8SetReturnValue(const CallbackInfo& info,
66 const v8::Persistent<S>& handle) {
67 info.GetReturnValue().Set(handle);
68 }
69
70 template <typename CallbackInfo, typename S>
71 inline void V8SetReturnValue(const CallbackInfo& info,
72 const v8::Local<S> handle) {
73 info.GetReturnValue().Set(handle);
74 }
75
76 template <typename CallbackInfo, typename S>
77 inline void V8SetReturnValue(const CallbackInfo& info,
78 v8::MaybeLocal<S> maybe) {
79 if (LIKELY(!maybe.IsEmpty()))
80 info.GetReturnValue().Set(maybe.ToLocalChecked());
81 }
82
83 template <typename CallbackInfo>
84 inline void V8SetReturnValue(const CallbackInfo& info, bool value) {
85 info.GetReturnValue().Set(value);
86 }
87
88 template <typename CallbackInfo>
89 inline void V8SetReturnValue(const CallbackInfo& info, double value) {
90 info.GetReturnValue().Set(value);
91 }
92
93 template <typename CallbackInfo>
94 inline void V8SetReturnValue(const CallbackInfo& info, int32_t value) {
95 info.GetReturnValue().Set(value);
96 }
97
98 template <typename CallbackInfo>
99 inline void V8SetReturnValue(const CallbackInfo& info, uint32_t value) {
100 info.GetReturnValue().Set(value);
101 }
102
103 template <typename CallbackInfo>
104 inline void V8SetReturnValueBool(const CallbackInfo& info, bool v) {
105 info.GetReturnValue().Set(v);
106 }
107
108 template <typename CallbackInfo>
109 inline void V8SetReturnValueInt(const CallbackInfo& info, int v) {
110 info.GetReturnValue().Set(v);
111 }
112
113 template <typename CallbackInfo>
114 inline void V8SetReturnValueUnsigned(const CallbackInfo& info, unsigned v) {
115 info.GetReturnValue().Set(v);
116 }
117
118 template <typename CallbackInfo>
119 inline void V8SetReturnValueNull(const CallbackInfo& info) {
120 info.GetReturnValue().SetNull();
121 }
122
123 template <typename CallbackInfo>
124 inline void V8SetReturnValueUndefined(const CallbackInfo& info) {
125 info.GetReturnValue().SetUndefined();
126 }
127
128 template <typename CallbackInfo>
129 inline void V8SetReturnValueEmptyString(const CallbackInfo& info) {
130 info.GetReturnValue().SetEmptyString();
131 }
132
133 template <typename CallbackInfo>
134 inline void V8SetReturnValueString(const CallbackInfo& info,
135 const String& string,
136 v8::Isolate* isolate) {
137 if (string.IsNull()) {
138 V8SetReturnValueEmptyString(info);
139 return;
140 }
141 V8PerIsolateData::From(isolate)->GetStringCache()->SetReturnValueFromString(
142 info.GetReturnValue(), string.Impl());
143 }
144
145 template <typename CallbackInfo>
146 inline void V8SetReturnValueStringOrNull(const CallbackInfo& info,
147 const String& string,
148 v8::Isolate* isolate) {
149 if (string.IsNull()) {
150 V8SetReturnValueNull(info);
151 return;
152 }
153 V8PerIsolateData::From(isolate)->GetStringCache()->SetReturnValueFromString(
154 info.GetReturnValue(), string.Impl());
155 }
156
157 template <typename CallbackInfo>
158 inline void V8SetReturnValue(const CallbackInfo& callback_info,
159 ScriptWrappable* impl,
160 v8::Local<v8::Object> creation_context) {
161 if (UNLIKELY(!impl)) {
162 V8SetReturnValueNull(callback_info);
163 return;
164 }
165 if (DOMDataStore::SetReturnValue(callback_info.GetReturnValue(), impl))
166 return;
167 v8::Local<v8::Object> wrapper =
168 impl->Wrap(callback_info.GetIsolate(), creation_context);
169 V8SetReturnValue(callback_info, wrapper);
170 }
171
172 template <typename CallbackInfo>
173 inline void V8SetReturnValue(const CallbackInfo& callback_info,
174 ScriptWrappable* impl) {
175 V8SetReturnValue(callback_info, impl, callback_info.Holder());
176 }
177
178 template <typename CallbackInfo>
179 inline void V8SetReturnValueForMainWorld(const CallbackInfo& callback_info,
180 ScriptWrappable* impl) {
181 DCHECK(DOMWrapperWorld::Current(callback_info.GetIsolate()).IsMainWorld());
182 if (UNLIKELY(!impl)) {
183 V8SetReturnValueNull(callback_info);
184 return;
185 }
186 if (DOMDataStore::SetReturnValueForMainWorld(callback_info.GetReturnValue(),
187 impl))
188 return;
189 v8::Local<v8::Object> wrapper =
190 impl->Wrap(callback_info.GetIsolate(), callback_info.Holder());
191 V8SetReturnValue(callback_info, wrapper);
192 }
193
194 template <typename CallbackInfo>
195 inline void V8SetReturnValueFast(const CallbackInfo& callback_info,
196 ScriptWrappable* impl,
197 const ScriptWrappable* wrappable) {
198 if (UNLIKELY(!impl)) {
199 V8SetReturnValueNull(callback_info);
200 return;
201 }
202 if (DOMDataStore::SetReturnValueFast(callback_info.GetReturnValue(), impl,
203 callback_info.Holder(), wrappable))
204 return;
205 v8::Local<v8::Object> wrapper =
206 impl->Wrap(callback_info.GetIsolate(), callback_info.Holder());
207 V8SetReturnValue(callback_info, wrapper);
208 }
209
210 template <typename CallbackInfo, typename T>
211 inline void V8SetReturnValueFast(const CallbackInfo& callback_info,
212 const v8::Local<T> handle,
213 const ScriptWrappable*) {
214 V8SetReturnValue(callback_info, handle);
215 }
216
217 // Convert v8::String to a WTF::String. If the V8 string is not already
218 // an external string then it is transformed into an external string at this
219 // point to avoid repeated conversions.
220 inline String ToCoreString(v8::Local<v8::String> value) {
221 return V8StringToWebCoreString<String>(value, kExternalize);
222 }
223
224 inline String ToCoreStringWithNullCheck(v8::Local<v8::String> value) {
225 if (value.IsEmpty() || value->IsNull())
226 return String();
227 return ToCoreString(value);
228 }
229
230 inline String ToCoreStringWithUndefinedOrNullCheck(
231 v8::Local<v8::String> value) {
232 if (value.IsEmpty())
233 return String();
234 return ToCoreString(value);
235 }
236
237 inline AtomicString ToCoreAtomicString(v8::Local<v8::String> value) {
238 return V8StringToWebCoreString<AtomicString>(value, kExternalize);
239 }
240
241 // This method will return a null String if the v8::Value does not contain a
242 // v8::String. It will not call ToString() on the v8::Value. If you want
243 // ToString() to be called, please use the TONATIVE_FOR_V8STRINGRESOURCE_*()
244 // macros instead.
245 inline String ToCoreStringWithUndefinedOrNullCheck(v8::Local<v8::Value> value) {
246 if (value.IsEmpty() || !value->IsString())
247 return String();
248 return ToCoreString(value.As<v8::String>());
249 }
250
251 // Convert a string to a V8 string.
252
253 inline v8::Local<v8::String> V8String(v8::Isolate* isolate,
254 const StringView& string) {
255 DCHECK(isolate);
256 if (string.IsNull())
257 return v8::String::Empty(isolate);
258 if (StringImpl* impl = string.SharedImpl())
259 return V8PerIsolateData::From(isolate)->GetStringCache()->V8ExternalString(
260 isolate, impl);
261 if (string.Is8Bit())
262 return v8::String::NewFromOneByte(
263 isolate, reinterpret_cast<const uint8_t*>(string.Characters8()),
264 v8::NewStringType::kNormal, static_cast<int>(string.length()))
265 .ToLocalChecked();
266 return v8::String::NewFromTwoByte(
267 isolate, reinterpret_cast<const uint16_t*>(string.Characters16()),
268 v8::NewStringType::kNormal, static_cast<int>(string.length()))
269 .ToLocalChecked();
270 }
271
272 // As above, for string literals. The compiler doesn't optimize away the is8Bit
273 // and sharedImpl checks for string literals in the StringView version.
274 inline v8::Local<v8::String> V8String(v8::Isolate* isolate,
275 const char* string) {
276 DCHECK(isolate);
277 if (!string || string[0] == '\0')
278 return v8::String::Empty(isolate);
279 return v8::String::NewFromOneByte(isolate,
280 reinterpret_cast<const uint8_t*>(string),
281 v8::NewStringType::kNormal, strlen(string))
282 .ToLocalChecked();
283 }
284
285 inline v8::Local<v8::Value> V8StringOrNull(v8::Isolate* isolate,
286 const AtomicString& string) {
287 if (string.IsNull())
288 return v8::Null(isolate);
289 return V8PerIsolateData::From(isolate)->GetStringCache()->V8ExternalString(
290 isolate, string.Impl());
291 }
292
293 inline v8::Local<v8::String> V8AtomicString(v8::Isolate* isolate,
294 const StringView& string) {
295 DCHECK(isolate);
296 if (string.Is8Bit())
297 return v8::String::NewFromOneByte(
298 isolate, reinterpret_cast<const uint8_t*>(string.Characters8()),
299 v8::NewStringType::kInternalized,
300 static_cast<int>(string.length()))
301 .ToLocalChecked();
302 return v8::String::NewFromTwoByte(
303 isolate, reinterpret_cast<const uint16_t*>(string.Characters16()),
304 v8::NewStringType::kInternalized,
305 static_cast<int>(string.length()))
306 .ToLocalChecked();
307 }
308
309 // As above, for string literals. The compiler doesn't optimize away the is8Bit
310 // check for string literals in the StringView version.
311 inline v8::Local<v8::String> V8AtomicString(v8::Isolate* isolate,
312 const char* string) {
313 DCHECK(isolate);
314 if (!string || string[0] == '\0')
315 return v8::String::Empty(isolate);
316 return v8::String::NewFromOneByte(
317 isolate, reinterpret_cast<const uint8_t*>(string),
318 v8::NewStringType::kInternalized, strlen(string))
319 .ToLocalChecked();
320 }
321
322 inline v8::Local<v8::String> V8StringFromUtf8(v8::Isolate* isolate,
323 const char* bytes,
324 int length) {
325 DCHECK(isolate);
326 return v8::String::NewFromUtf8(isolate, bytes, v8::NewStringType::kNormal,
327 length)
328 .ToLocalChecked();
329 }
330
331 inline v8::Local<v8::Value> V8Undefined() {
332 return v8::Local<v8::Value>();
333 }
334
335 inline v8::MaybeLocal<v8::Value> V8DateOrNaN(v8::Isolate* isolate,
336 double value) {
337 DCHECK(isolate);
338 return v8::Date::New(isolate->GetCurrentContext(), value);
339 }
340
341 inline bool IsUndefinedOrNull(v8::Local<v8::Value> value) {
342 return value.IsEmpty() || value->IsNullOrUndefined();
343 }
344 v8::Local<v8::Function> GetBoundFunction(v8::Local<v8::Function>);
345
346 // FIXME: This will be soon embedded in the generated code.
347 template <typename Collection>
348 static void IndexedPropertyEnumerator(
349 const v8::PropertyCallbackInfo<v8::Array>& info) {
350 Collection* collection =
351 ToScriptWrappable(info.Holder())->ToImpl<Collection>();
352 int length = collection->length();
353 v8::Local<v8::Array> properties = v8::Array::New(info.GetIsolate(), length);
354 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext();
355 for (int i = 0; i < length; ++i) {
356 v8::Local<v8::Integer> integer = v8::Integer::New(info.GetIsolate(), i);
357 if (!V8CallBoolean(properties->CreateDataProperty(context, i, integer)))
358 return;
359 }
360 V8SetReturnValue(info, properties);
361 }
362
363 // These methods store hidden values into an array that is stored in the
364 // internal field of a DOM wrapper.
365 bool AddHiddenValueToArray(v8::Isolate*,
366 v8::Local<v8::Object>,
367 v8::Local<v8::Value>,
368 int cache_index);
369 void RemoveHiddenValueFromArray(v8::Isolate*,
370 v8::Local<v8::Object>,
371 v8::Local<v8::Value>,
372 int cache_index);
373
374 // Freeze a V8 object. The type of the first parameter and the return value is
375 // intentionally v8::Value so that this function can wrap ToV8().
376 // If the argument isn't an object, this will crash.
377 CORE_EXPORT v8::Local<v8::Value> FreezeV8Object(v8::Local<v8::Value>,
378 v8::Isolate*);
379
380 } // namespace blink
381
382 #endif // V8Binding_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698