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

Side by Side Diff: sky/engine/bindings-dart/core/dart/DartDOMWrapper.h

Issue 918273002: Remove bindings-dart (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 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
(Empty)
1 // Copyright 2011, Google Inc.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 // * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 #ifndef DartDOMWrapper_h
31 #define DartDOMWrapper_h
32
33 #include "bindings/common/ScriptValue.h"
34 #include "bindings/core/v8/Dictionary.h"
35 #include "bindings/core/dart/DartDOMData.h"
36 #include "bindings/core/dart/DartExceptionState.h"
37 #include "bindings/core/dart/DartUtilities.h"
38 #include "bindings/core/v8/SerializedScriptValue.h"
39 #include "bindings/dart/DartWebkitClassIds.h"
40 #include "core/dom/ExceptionCode.h"
41
42 #include "wtf/PassRefPtr.h"
43 #include "wtf/RefPtr.h"
44 #include "wtf/text/AtomicString.h"
45 #include "wtf/text/WTFString.h"
46 #include <dart_api.h>
47
48 namespace blink {
49
50 template<typename HTMLElement>
51 class DartCustomElementWrapper;
52 class HTMLElement;
53
54 template<class BindingsClass>
55 struct DartDOMWrapperTraits;
56
57 class DartDOMWrapper {
58 public:
59 enum NativeFieldIndices {
60 NativeImplementationIndex = 0,
61 NativeTypeIndex = 1,
62 NativeFieldCount
63 };
64
65 template <class BindingsClass>
66 static Dart_WeakPersistentHandle lookupWrapper(DartDOMData* domData, typenam e BindingsClass::NativeType* domObject)
67 {
68 typedef DartDOMWrapperTraits<BindingsClass> Traits;
69 ASSERT(domObject);
70 ASSERT(domData);
71 if (ScriptWrappable::wrapperCanBeStoredInObject(domObject)) {
72 Dart_WeakPersistentHandle wrapper = (Dart_WeakPersistentHandle)(Scri ptWrappable::fromObject(domObject)->getDartWrapper(domData));
73 return wrapper;
74 }
75 return Traits::MapTraits::domMap(domData)->get(domObject);
76 }
77
78 template <class BindingsClass>
79 static Dart_Handle createWrapper(DartDOMData* domData, typename BindingsClas s::NativeType* domObject)
80 {
81 return createWrapper<BindingsClass>(
82 domData,
83 domObject,
84 BindingsClass::dartClassId);
85 }
86
87 template <class BindingsClass>
88 static Dart_Handle createWrapper(
89 DartDOMData* domData, typename BindingsClass::NativeType* domObject,
90 intptr_t cid)
91 {
92 ASSERT(domData);
93 ASSERT(domObject);
94 Dart_PersistentHandle type = dartClass(domData, cid);
95 ASSERT(!Dart_IsError(type));
96 intptr_t nativeFields[NativeFieldCount];
97 nativeFields[NativeImplementationIndex] = reinterpret_cast<intptr_t>(dom Object);
98 nativeFields[NativeTypeIndex] = cid;
99 Dart_Handle wrapper = Dart_AllocateWithNativeFields(type, NativeFieldCou nt, nativeFields);
100 if (Dart_IsError(wrapper)) {
101 return wrapper;
102 }
103 associateWrapper<BindingsClass>(domData, domObject, wrapper);
104 return wrapper;
105 }
106
107 template<class BindingsClass>
108 static Dart_Handle vectorToDart(const Vector< RefPtr<typename BindingsClass: :NativeType> >& vector)
109 {
110 return DartUtilities::vectorToDart<RefPtr<typename BindingsClass::Native Type>, PassRefPtr<typename BindingsClass::NativeType>, BindingsClass::toDart>(ve ctor);
111 }
112
113 template<class BindingsClass>
114 static Dart_Handle vectorToDart(const HeapVector< Member<typename BindingsCl ass::NativeType> >& vector)
115 {
116 return DartUtilities::vectorToDart<typename BindingsClass::NativeType, B indingsClass::toDart>(vector);
117 }
118
119 static Dart_Handle vectorToDart(const Vector<float>& vector)
120 {
121 // If this is hot, consider using a Float32List instead.
122 return DartUtilities::vectorToDart<float, double, DartUtilities::doubleT oDart>(vector);
123 }
124
125 static Dart_Handle vectorToDart(const Vector<double>& vector)
126 {
127 // If this is hot, consider using a Float32List instead.
128 return DartUtilities::vectorToDart<double, double, DartUtilities::double ToDart>(vector);
129 }
130
131 static Dart_Handle vectorToDart(const Vector<unsigned>& vector)
132 {
133 // If this is hot, consider using a typed array instead.
134 return DartUtilities::vectorToDart<unsigned, unsigned, DartUtilities::un signedToDart>(vector);
135 }
136
137 static Dart_Handle vectorToDart(const Vector<String>& vector)
138 {
139 return DartUtilities::vectorToDart<String, const String&, DartUtilities: :stringToDart>(vector);
140 }
141
142 template<class T>
143 static Dart_Handle vectorToDartNullable(Nullable<T> vector)
144 {
145 if (vector.isNull())
146 return Dart_Null();
147 return vectorToDart(vector.get());
148 }
149
150 template<class BindingsClass>
151 static Dart_Handle vectorToDartNullable(Nullable< Vector< RefPtr<typename Bi ndingsClass::NativeType> > > vector)
152 {
153 if (vector.isNull())
154 return Dart_Null();
155 return vectorToDart<BindingsClass>(vector.get());
156 }
157
158 template <class BindingsClass>
159 static typename BindingsClass::NativeType* unwrapDartWrapper(
160 DartDOMData* domData, Dart_Handle wrapper, Dart_Handle& exception)
161 {
162 ASSERT(!exception);
163
164 if (Dart_IsNull(wrapper))
165 return 0;
166
167 if (subtypeOf(wrapper, BindingsClass::dartClassId)) {
168 void* nativePointer = readNativePointer(wrapper, NativeImplementatio nIndex);
169 return static_cast<typename BindingsClass::NativeType*>(nativePointe r);
170 }
171 const char* className = DartWebkitClassInfo[BindingsClass::dartClassId]. jsName;
172 String message = String("Invalid class: expected instance of ") +
173 className;
174 exception = DartUtilities::stringToDartString(message);
175 return 0;
176 }
177
178 template <class BindingsClass>
179 static typename BindingsClass::NativeType* unwrapDartWrapper(
180 Dart_NativeArguments args, int index, Dart_Handle& exception)
181 {
182 ASSERT(!exception);
183 intptr_t fieldValues[NativeFieldCount];
184 Dart_Handle result = Dart_GetNativeFieldsOfArgument(args, index, NativeF ieldCount, fieldValues);
185 if (!Dart_IsError(result)) {
186 void* wrapper = reinterpret_cast<void*>(fieldValues[NativeImplementa tionIndex]);
187 if (!wrapper) {
188 return 0;
189 }
190 intptr_t cid = fieldValues[NativeTypeIndex];
191 if (subtypeOf(cid, BindingsClass::dartClassId)) {
192 // FIXME(vsm): This is not safe if BindingsClass::NativeType is
193 // not the primary parent.
194 return static_cast<typename BindingsClass::NativeType*>(wrapper) ;
195 }
196 }
197 const char* className = DartWebkitClassInfo[BindingsClass::dartClassId]. jsName;
198 String message = String("Invalid class: expected instance of ") + classN ame;
199 exception = DartUtilities::stringToDartString(message);
200 return 0;
201 }
202
203 static bool subtypeOf(Dart_Handle wrapper, intptr_t basecid)
204 {
205 intptr_t cid = reinterpret_cast<intptr_t>(readNativePointer(wrapper, Nat iveTypeIndex));
206 return subtypeOf(cid, basecid);
207 }
208
209 static bool subtypeOf(intptr_t cid, intptr_t basecid)
210 {
211 while (cid != -1) {
212 if (cid == basecid) {
213 return true;
214 }
215 ASSERT(cid < NumWebkitClassIds);
216 cid = DartWebkitClassInfo[cid].base_class_id;
217 }
218 return false;
219 }
220
221 template <class BindingsClass>
222 static bool instanceOf(DartDOMData* domData, Dart_Handle wrapper)
223 {
224 Dart_PersistentHandle type = dartClass(domData, BindingsClass::dartClass Id);
225
226 bool isInstanceOf = false;
227 Dart_Handle ALLOW_UNUSED result = Dart_ObjectIsType(wrapper, type, &isIn stanceOf);
228 ASSERT(!Dart_IsError(result));
229 return isInstanceOf;
230 }
231
232 template <class WebKitClass>
233 static WebKitClass* receiver(Dart_NativeArguments args)
234 {
235 // Type of receiver is ensured by Dart VM runtime, so bypass additional checks.
236 intptr_t value = 0;
237 ASSERT(!NativeImplementationIndex);
238 Dart_Handle ALLOW_UNUSED result = Dart_GetNativeReceiver(args, &value);
239 ASSERT(!Dart_IsError(result));
240 WebKitClass* const recv = reinterpret_cast<WebKitClass*>(value);
241 ASSERT(recv); // Should never return 0.
242 return recv;
243 }
244
245 static EventTarget* receiverToEventTarget(Dart_NativeArguments args)
246 {
247 // If the receiver is an EventTarget, we cannot just do a static cast
248 // from void* to EventTarget due to multiple inheritance.
249 // Instead, we need to invoke toEventTarget on the dynamic type.
250 intptr_t fieldValues[NativeFieldCount];
251 Dart_Handle result = Dart_GetNativeFieldsOfArgument(args, 0, NativeField Count, fieldValues);
252 if (!Dart_IsError(result)) {
253 void* wrapper = reinterpret_cast<void*>(fieldValues[NativeImplementa tionIndex]);
254 if (!wrapper) {
255 ASSERT_NOT_REACHED();
256 return 0;
257 }
258 intptr_t cid = fieldValues[NativeTypeIndex];
259 ASSERT(subtypeOf(cid, EventTargetClassId));
260 return DartWebkitClassInfo[cid].toEventTarget(wrapper);
261 }
262 ASSERT_NOT_REACHED();
263 return 0;
264 }
265
266 template <class BindingsClass>
267 static void returnToDart(Dart_NativeArguments args, typename BindingsClass:: NativeType* domObject)
268 {
269 if (domObject) {
270 DartDOMData* domData = static_cast<DartDOMData*>(Dart_GetNativeIsola teData(args));
271 Dart_WeakPersistentHandle result = lookupWrapper<BindingsClass>(domD ata, domObject);
272 if (result)
273 Dart_SetWeakHandleReturnValue(args, result);
274 else
275 Dart_SetReturnValue(args, createWrapper<BindingsClass>(domData, domObject, BindingsClass::dartClassId));
276 }
277 }
278
279 template <class BindingsClass>
280 static void returnToDart(Dart_NativeArguments args, PassRefPtr<typename Bind ingsClass::NativeType> domObject)
281 {
282 returnToDart<BindingsClass>(args, domObject.get());
283 }
284
285 static int wrapperNativeFieldCount() { return NativeFieldCount; }
286
287 private:
288 static Dart_PersistentHandle dartClass(DartDOMData*, intptr_t classIndex);
289
290 static void writeNativePointer(Dart_Handle wrapper, void* pointer, intptr_t cid)
291 {
292 Dart_Handle ALLOW_UNUSED result = Dart_SetNativeInstanceField(
293 wrapper, NativeImplementationIndex, reinterpret_cast<intptr_t>(point er));
294 ASSERT(!Dart_IsError(result));
295 result = Dart_SetNativeInstanceField(wrapper, NativeTypeIndex, cid);
296 ASSERT(!Dart_IsError(result));
297 }
298
299 static void* readNativePointer(Dart_Handle wrapper, int index)
300 {
301 intptr_t value;
302 Dart_Handle result = Dart_GetNativeInstanceField(wrapper, index, &value) ;
303 // FIXME: the fact that we return 0 on error rather than asserting is
304 // somewhat of a hack. We currently make this method return 0 because
305 // we reuse this method to verify that objects are actually native
306 // Node objects rather than objects that implement the Node interface.
307 if (Dart_IsError(result))
308 return 0;
309 return reinterpret_cast<void*>(value);
310 }
311
312 template <class BindingsClass>
313 static void wrapperWeakCallback(void* isolateCallbackData, Dart_WeakPersiste ntHandle wrapper, void* blinkHandle)
314 {
315 typedef DartDOMWrapperTraits<BindingsClass> Traits;
316 DartDOMData* domData = reinterpret_cast<DartDOMData*>(isolateCallbackDat a);
317 typename BindingsClass::NativeType* domObject = Traits::GCTraits::read(b linkHandle);
318
319 Dart_WeakPersistentHandle currentWrapper = 0;
320 if (ScriptWrappable::wrapperCanBeStoredInObject(domObject)) {
321 currentWrapper = (Dart_WeakPersistentHandle)(ScriptWrappable::fromOb ject(domObject)->getDartWrapper(domData));
322 } else {
323 currentWrapper = Traits::MapTraits::domMap(domData)->get(domObject);
324 }
325
326 // This could be an old wrapper which has been replaced with a custom el ement.
327 if (currentWrapper != wrapper) {
328 #ifdef DEBUG
329 DartApiScope scope;
330 ASSERT(!Dart_IdentityEquals(Dart_HandleFromWeakPersistent(currentWra pper), Dart_HandleFromWeakPersistent(wrapper)));
331 #endif
332 return;
333 }
334
335 if (currentWrapper) {
336 if (ScriptWrappable::wrapperCanBeStoredInObject(domObject)) {
337 ScriptWrappable::fromObject(domObject)->clearDartWrapper(domData );
338 } else {
339 Traits::MapTraits::domMap(domData)->remove(domObject);
340 }
341 }
342 Traits::GCTraits::deref(blinkHandle);
343 }
344
345 template <class BindingsClass>
346 static void associateWrapper(
347 DartDOMData* domData, typename BindingsClass::NativeType* domObject, Dar t_Handle newInstance)
348 {
349 typedef DartDOMWrapperTraits<BindingsClass> Traits;
350 void* blinkHandle = Traits::GCTraits::ref(domObject);
351 // This is only used to inform the Dart garbage collector on how much ex ternal memory
352 // is kept alive.
353 intptr_t externalAllocationSize = sizeof(*domObject);
354
355 Dart_WeakPersistentHandle wrapper = Dart_NewPrologueWeakPersistentHandle (
356 newInstance, blinkHandle, externalAllocationSize, &wrapperWeakCallba ck<BindingsClass>);
357 if (ScriptWrappable::wrapperCanBeStoredInObject(domObject)) {
358 ScriptWrappable::fromObject(domObject)->setDartWrapper(domData, wrap per);
359 } else {
360 Traits::MapTraits::domMap(domData)->set(domObject, wrapper);
361 }
362 }
363
364 template <class BindingsClass>
365 static void disassociateWrapper(
366 DartDOMData* domData, typename BindingsClass::NativeType* domObject, Dar t_Handle oldInstance)
367 {
368 typedef DartDOMWrapperTraits<BindingsClass> Traits;
369
370 if (ScriptWrappable::wrapperCanBeStoredInObject(domObject)) {
371 #ifdef DEBUG
372 Dart_WeakPersistentHandle wrapper = (Dart_WeakPersistentHandle)(Scri ptWrappable::fromObject(domObject)->getDartWrapper(domData));
373 ASSERT(Dart_IdentityEquals(Dart_HandleFromWeakPersistent(wrapper), o ldInstance));
374 #endif
375 ScriptWrappable::fromObject(domObject)->clearDartWrapper(domData);
376 } else {
377 #ifdef DEBUG
378 Dart_WeakPersistentHandle wrapper = Traits::MapTraits::domMap(domDat a)->get(domObject);
379 ASSERT(Dart_IdentityEquals(Dart_HandleFromWeakPersistent(wrapper), o ldInstance));
380 #endif
381 Traits::MapTraits::domMap(domData)->remove(domObject);
382 }
383 }
384
385 friend class DartCustomElementConstructorBuilder;
386 friend class DartCustomElementWrapper<HTMLElement>;
387 friend class DartUtilities;
388 };
389
390 struct DartDOMWrapperMapTraits {
391 static DartDOMObjectMap* domMap(DartDOMData* domData) { return domData->obje ctMap(); }
392 };
393
394 template<class BindingsClass, bool isGarbageCollected>
395 struct DartDOMWrapperGarbageCollectedTraits { };
396
397 template<class BindingsClass>
398 struct DartDOMWrapperGarbageCollectedTraits<BindingsClass, false> {
399 static void* ref(typename BindingsClass::NativeType* domObject)
400 {
401 domObject->ref();
402 return domObject;
403 }
404
405 static void deref(void* blinkHandle)
406 {
407 typename BindingsClass::NativeType* domObject = read(blinkHandle);
408 domObject->deref();
409 }
410
411 static typename BindingsClass::NativeType* read(void* blinkHandle)
412 {
413 return static_cast<typename BindingsClass::NativeType*>(blinkHandle);
414 }
415 };
416
417 template<class BindingsClass>
418 struct DartDOMWrapperGarbageCollectedTraits<BindingsClass, true> {
419 static void* ref(typename BindingsClass::NativeType* domObject)
420 {
421 return new Persistent<typename BindingsClass::NativeType>(domObject);
422 }
423
424 static void deref(void* blinkHandle)
425 {
426 Persistent<typename BindingsClass::NativeType>* handle = static_cast<Per sistent<typename BindingsClass::NativeType>*>(blinkHandle);
427 delete handle;
428 }
429
430 static typename BindingsClass::NativeType* read(void* blinkHandle)
431 {
432 Persistent<typename BindingsClass::NativeType>* handle = static_cast<Per sistent<typename BindingsClass::NativeType>*>(blinkHandle);
433 return handle->get();
434 }
435 };
436
437 template<class BindingsClass>
438 struct DartDOMWrapperTraits {
439 typedef DartDOMWrapperMapTraits MapTraits;
440 typedef DartDOMWrapperGarbageCollectedTraits<BindingsClass, BindingsClass::i sGarbageCollected> GCTraits;
441 };
442
443 struct DartMessagePort;
444
445 template<>
446 struct DartDOMWrapperTraits<DartMessagePort> {
447 struct MessagePortMapTraits {
448 static DartMessagePortMap* domMap(DartDOMData* domData) { return domData ->messagePortMap(); }
449 };
450 typedef MessagePortMapTraits MapTraits;
451 typedef DartDOMWrapperGarbageCollectedTraits<DartMessagePort, false> GCTrait s;
452 };
453
454 }
455
456 #endif // DartDOMWrapper_h
OLDNEW
« no previous file with comments | « sky/engine/bindings-dart/core/dart/DartDOMData.cpp ('k') | sky/engine/bindings-dart/core/dart/DartDOMWrapper.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698