| OLD | NEW |
| 1 // Copyright 2011, Google Inc. | 1 // Copyright 2011, Google Inc. |
| 2 // All rights reserved. | 2 // 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 28 matching lines...) Expand all Loading... |
| 39 #include "core/dom/ExceptionCode.h" | 39 #include "core/dom/ExceptionCode.h" |
| 40 | 40 |
| 41 #include <dart_api.h> | 41 #include <dart_api.h> |
| 42 #include <wtf/PassRefPtr.h> | 42 #include <wtf/PassRefPtr.h> |
| 43 #include <wtf/RefPtr.h> | 43 #include <wtf/RefPtr.h> |
| 44 #include <wtf/text/AtomicString.h> | 44 #include <wtf/text/AtomicString.h> |
| 45 #include <wtf/text/WTFString.h> | 45 #include <wtf/text/WTFString.h> |
| 46 | 46 |
| 47 namespace WebCore { | 47 namespace WebCore { |
| 48 | 48 |
| 49 template<typename HTMLElement> |
| 50 class DartCustomElementWrapper; |
| 51 class HTMLElement; |
| 52 |
| 49 template<class BindingsClass> | 53 template<class BindingsClass> |
| 50 struct DartDOMWrapperTraits; | 54 struct DartDOMWrapperTraits; |
| 51 | 55 |
| 52 class DartDOMWrapper { | 56 class DartDOMWrapper { |
| 53 public: | 57 public: |
| 54 template <class WebKitClass> | 58 template <class WebKitClass> |
| 55 static Dart_Handle newWrapper(const char* className, const char* libraryName
, intptr_t cid, WebKitClass* domObject) | 59 static Dart_Handle newWrapper(const char* className, const char* libraryName
, intptr_t cid, WebKitClass* domObject) |
| 56 { | 60 { |
| 57 | 61 |
| 58 Dart_Handle type = dartClass(className, libraryName, cid); | 62 Dart_Handle type = dartClass(className, libraryName, cid); |
| 59 ASSERT(!Dart_IsError(type)); | 63 ASSERT(!Dart_IsError(type)); |
| 60 Dart_Handle wrapper = Dart_Allocate(type); | 64 Dart_Handle wrapper = Dart_Allocate(type); |
| 61 writeNativePointer(wrapper, kNativeImplementationIndex, domObject); | 65 writeNativePointer(wrapper, kNativeImplementationIndex, domObject); |
| 62 return wrapper; | 66 return wrapper; |
| 63 } | 67 } |
| 64 | 68 |
| 65 static Dart_WeakPersistentHandle lookupWrapper(DartDOMData* domData, bool is
Node, void* domObject) | 69 static Dart_WeakPersistentHandle lookupWrapper(DartDOMData* domData, bool is
Node, void* domObject) |
| 66 { | 70 { |
| 67 ASSERT(domObject); | 71 ASSERT(domObject); |
| 68 ASSERT(domData); | 72 ASSERT(domData); |
| 69 if (isNode) { | 73 if (isNode) { |
| 70 Node* domNodeObject = reinterpret_cast<Node*>(domObject); | 74 Node* domNodeObject = reinterpret_cast<Node*>(domObject); |
| 71 Dart_WeakPersistentHandle wrapper = domData->nodeMap()->get(domNodeO
bject); | 75 return domData->nodeMap()->get(domNodeObject); |
| 72 if (wrapper && domNodeObject->isCustomElement()) { | |
| 73 return lookupCustomElementWrapper(domData, wrapper, domNodeObjec
t); | |
| 74 } | |
| 75 return wrapper; | |
| 76 } | 76 } |
| 77 return domData->objectMap()->get(domObject); | 77 return domData->objectMap()->get(domObject); |
| 78 } | 78 } |
| 79 | 79 |
| 80 template <class BindingsClass> | 80 template <class BindingsClass> |
| 81 static Dart_Handle createWrapper(typename BindingsClass::NativeType* domObje
ct) | 81 static Dart_Handle createWrapper(typename BindingsClass::NativeType* domObje
ct) |
| 82 { | 82 { |
| 83 ASSERT(domObject); | 83 ASSERT(domObject); |
| 84 return createWrapperWithClassName<BindingsClass>( | 84 return createWrapperWithClassName<BindingsClass>( |
| 85 domObject, | 85 domObject, |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 static void returnToDart(Dart_NativeArguments args, PassRefPtr<typename Bind
ingsClass::NativeType> domObject) | 195 static void returnToDart(Dart_NativeArguments args, PassRefPtr<typename Bind
ingsClass::NativeType> domObject) |
| 196 { | 196 { |
| 197 returnToDart<BindingsClass>(args, domObject.get()); | 197 returnToDart<BindingsClass>(args, domObject.get()); |
| 198 } | 198 } |
| 199 | 199 |
| 200 static int wrapperNativeFieldCount() { return kNativeFieldCount; } | 200 static int wrapperNativeFieldCount() { return kNativeFieldCount; } |
| 201 | 201 |
| 202 static Dart_Handle exceptionCodeToDartException(ExceptionCode); | 202 static Dart_Handle exceptionCodeToDartException(ExceptionCode); |
| 203 static Dart_Handle exceptionCodeToDartException(DartExceptionState&); | 203 static Dart_Handle exceptionCodeToDartException(DartExceptionState&); |
| 204 | 204 |
| 205 template <class BindingsClass> |
| 206 static Dart_Handle dartClass() |
| 207 { |
| 208 return dartClass(BindingsClass::dartImplementationClassName, |
| 209 BindingsClass::dartImplementationLibraryName, BindingsClass::dartCla
ssId); |
| 210 } |
| 211 |
| 205 private: | 212 private: |
| 206 enum NativeFieldIndices { | 213 enum NativeFieldIndices { |
| 207 kNativeImplementationIndex = 0, | 214 kNativeImplementationIndex = 0, |
| 208 kNativeFieldCount | 215 kNativeFieldCount |
| 209 }; | 216 }; |
| 210 | 217 |
| 211 static Dart_Handle dartClass(const char* dartImplementationClassName, | 218 static Dart_Handle dartClass(const char* dartImplementationClassName, |
| 212 const char* dartImplementationLibraryName, intptr_t classIndex); | 219 const char* dartImplementationLibraryName, intptr_t classIndex); |
| 213 | 220 |
| 214 template <class BindingsClass> | |
| 215 static Dart_Handle dartClass() | |
| 216 { | |
| 217 return dartClass(BindingsClass::dartImplementationClassName, | |
| 218 BindingsClass::dartImplementationLibraryName, BindingsClass::dartCla
ssId); | |
| 219 } | |
| 220 | |
| 221 static void writeNativePointer(Dart_Handle wrapper, int index, void* pointer
) | 221 static void writeNativePointer(Dart_Handle wrapper, int index, void* pointer
) |
| 222 { | 222 { |
| 223 DartApiScope scope; | 223 DartApiScope scope; |
| 224 Dart_Handle result = Dart_SetNativeInstanceField(wrapper, index, reinter
pret_cast<intptr_t>(pointer)); | 224 Dart_Handle result = Dart_SetNativeInstanceField(wrapper, index, reinter
pret_cast<intptr_t>(pointer)); |
| 225 UNUSED_PARAM(result); | 225 UNUSED_PARAM(result); |
| 226 ASSERT(!Dart_IsError(result)); | 226 ASSERT(!Dart_IsError(result)); |
| 227 } | 227 } |
| 228 | 228 |
| 229 static void* readNativePointer(Dart_Handle wrapper, int index) | 229 static void* readNativePointer(Dart_Handle wrapper, int index) |
| 230 { | 230 { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 246 DartDOMData* domData = DartDOMData::current(); | 246 DartDOMData* domData = DartDOMData::current(); |
| 247 typename BindingsClass::NativeType* domObject = static_cast<typename Bin
dingsClass::NativeType*>(peer); | 247 typename BindingsClass::NativeType* domObject = static_cast<typename Bin
dingsClass::NativeType*>(peer); |
| 248 if (DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->con
tains(domObject)) { | 248 if (DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->con
tains(domObject)) { |
| 249 Traits::MapTraits::domMap(domData)->remove(domObject); | 249 Traits::MapTraits::domMap(domData)->remove(domObject); |
| 250 Traits::ActiveTraits::removeWrapper(domData, domObject); | 250 Traits::ActiveTraits::removeWrapper(domData, domObject); |
| 251 Traits::EventTargetTraits::removeWrapper(domData, domObject); | 251 Traits::EventTargetTraits::removeWrapper(domData, domObject); |
| 252 } | 252 } |
| 253 domObject->deref(); | 253 domObject->deref(); |
| 254 } | 254 } |
| 255 | 255 |
| 256 static Dart_WeakPersistentHandle lookupCustomElementWrapper( | |
| 257 DartDOMData*, Dart_WeakPersistentHandle wrapper, Node* domObject); | |
| 258 | |
| 259 template <class BindingsClass> | 256 template <class BindingsClass> |
| 260 static void associateWrapper(typename BindingsClass::NativeType* domObject,
Dart_Handle newInstance) | 257 static void associateWrapper(typename BindingsClass::NativeType* domObject,
Dart_Handle newInstance) |
| 261 { | 258 { |
| 262 typedef DartDOMWrapperTraits<BindingsClass> Traits; | 259 typedef DartDOMWrapperTraits<BindingsClass> Traits; |
| 263 | 260 |
| 264 DartDOMData* domData = DartDOMData::current(); | 261 DartDOMData* domData = DartDOMData::current(); |
| 265 Dart_WeakPersistentHandle wrapper = DartUtilities::createPrologueWeakPer
sistentHandle( | 262 Dart_WeakPersistentHandle wrapper = DartUtilities::createPrologueWeakPer
sistentHandle( |
| 266 newInstance, domObject, &wrapperWeakCallback<BindingsClass>); | 263 newInstance, domObject, &wrapperWeakCallback<BindingsClass>); |
| 267 Traits::MapTraits::domMap(domData)->set(domObject, wrapper); | 264 Traits::MapTraits::domMap(domData)->set(domObject, wrapper); |
| 268 Traits::ActiveTraits::setWrapper(domData, domObject, wrapper); | 265 Traits::ActiveTraits::setWrapper(domData, domObject, wrapper); |
| 269 Traits::EventTargetTraits::setWrapper(domData, domObject, wrapper); | 266 Traits::EventTargetTraits::setWrapper(domData, domObject, wrapper); |
| 270 domObject->ref(); | 267 domObject->ref(); |
| 271 } | 268 } |
| 272 | 269 |
| 273 template <class BindingsClass> | 270 template <class BindingsClass> |
| 274 static void disassociateWrapper(typename BindingsClass::NativeType* domObjec
t, Dart_Handle oldInstance) | 271 static void disassociateWrapper(typename BindingsClass::NativeType* domObjec
t, Dart_Handle oldInstance) |
| 275 { | 272 { |
| 276 typedef DartDOMWrapperTraits<BindingsClass> Traits; | 273 typedef DartDOMWrapperTraits<BindingsClass> Traits; |
| 277 | 274 |
| 278 DartDOMData* domData = DartDOMData::current(); | 275 DartDOMData* domData = DartDOMData::current(); |
| 279 Dart_WeakPersistentHandle wrapper = Traits::MapTraits::domMap(domData)->
get(domObject); | 276 Dart_WeakPersistentHandle wrapper = Traits::MapTraits::domMap(domData)->
get(domObject); |
| 280 ASSERT(Dart_IdentityEquals(Dart_HandleFromWeakPersistent(wrapper), oldIn
stance)); | 277 ASSERT(Dart_IdentityEquals(Dart_HandleFromWeakPersistent(wrapper), oldIn
stance)); |
| 281 Traits::MapTraits::domMap(domData)->remove(domObject); | 278 Traits::MapTraits::domMap(domData)->remove(domObject); |
| 282 Traits::ActiveTraits::removeWrapper(domData, domObject); | 279 Traits::ActiveTraits::removeWrapper(domData, domObject); |
| 283 Traits::EventTargetTraits::removeWrapper(domData, domObject); | 280 Traits::EventTargetTraits::removeWrapper(domData, domObject); |
| 284 } | 281 } |
| 285 | 282 |
| 286 friend class DartCustomElement; | 283 friend class DartCustomElementWrapper<HTMLElement>; |
| 287 }; | 284 }; |
| 288 | 285 |
| 289 template<bool isNode> | 286 template<bool isNode> |
| 290 struct DartDOMWrapperMapTraits { }; | 287 struct DartDOMWrapperMapTraits { }; |
| 291 | 288 |
| 292 template<> | 289 template<> |
| 293 struct DartDOMWrapperMapTraits<false> { | 290 struct DartDOMWrapperMapTraits<false> { |
| 294 static DartDOMObjectMap* domMap(DartDOMData* domData) { return domData->obje
ctMap(); } | 291 static DartDOMObjectMap* domMap(DartDOMData* domData) { return domData->obje
ctMap(); } |
| 295 }; | 292 }; |
| 296 | 293 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 static DartMessagePortMap* domMap(DartDOMData* domData) { return domData
->messagePortMap(); } | 357 static DartMessagePortMap* domMap(DartDOMData* domData) { return domData
->messagePortMap(); } |
| 361 }; | 358 }; |
| 362 typedef MessagePortMapTraits MapTraits; | 359 typedef MessagePortMapTraits MapTraits; |
| 363 typedef DartDOMWrapperActiveTraits<DartMessagePort, false> ActiveTraits; | 360 typedef DartDOMWrapperActiveTraits<DartMessagePort, false> ActiveTraits; |
| 364 typedef DartDOMWrapperEventTargetTraits<DartMessagePort, true> EventTargetTr
aits; | 361 typedef DartDOMWrapperEventTargetTraits<DartMessagePort, true> EventTargetTr
aits; |
| 365 }; | 362 }; |
| 366 | 363 |
| 367 } | 364 } |
| 368 | 365 |
| 369 #endif // DartDOMWrapper_h | 366 #endif // DartDOMWrapper_h |
| OLD | NEW |