| 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(bool isNode, void* domObject) | 69 static Dart_WeakPersistentHandle lookupWrapper(bool isNode, void* domObject) |
| 66 { | 70 { |
| 67 ASSERT(domObject); | 71 ASSERT(domObject); |
| 68 DartDOMData* domData = DartDOMData::current(); | 72 DartDOMData* domData = DartDOMData::current(); |
| 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 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 DartDOMData* domData = DartDOMData::current(); | 245 DartDOMData* domData = DartDOMData::current(); |
| 246 typename BindingsClass::NativeType* domObject = static_cast<typename Bin
dingsClass::NativeType*>(peer); | 246 typename BindingsClass::NativeType* domObject = static_cast<typename Bin
dingsClass::NativeType*>(peer); |
| 247 if (DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->con
tains(domObject)) { | 247 if (DartDOMWrapperTraits<BindingsClass>::MapTraits::domMap(domData)->con
tains(domObject)) { |
| 248 Traits::MapTraits::domMap(domData)->remove(domObject); | 248 Traits::MapTraits::domMap(domData)->remove(domObject); |
| 249 Traits::ActiveTraits::removeWrapper(domData, domObject); | 249 Traits::ActiveTraits::removeWrapper(domData, domObject); |
| 250 Traits::EventTargetTraits::removeWrapper(domData, domObject); | 250 Traits::EventTargetTraits::removeWrapper(domData, domObject); |
| 251 } | 251 } |
| 252 domObject->deref(); | 252 domObject->deref(); |
| 253 } | 253 } |
| 254 | 254 |
| 255 static Dart_WeakPersistentHandle lookupCustomElementWrapper( | |
| 256 DartDOMData*, Dart_WeakPersistentHandle wrapper, Node* domObject); | |
| 257 | |
| 258 template <class BindingsClass> | 255 template <class BindingsClass> |
| 259 static void associateWrapper(typename BindingsClass::NativeType* domObject,
Dart_Handle newInstance) | 256 static void associateWrapper(typename BindingsClass::NativeType* domObject,
Dart_Handle newInstance) |
| 260 { | 257 { |
| 261 typedef DartDOMWrapperTraits<BindingsClass> Traits; | 258 typedef DartDOMWrapperTraits<BindingsClass> Traits; |
| 262 | 259 |
| 263 DartDOMData* domData = DartDOMData::current(); | 260 DartDOMData* domData = DartDOMData::current(); |
| 264 Dart_WeakPersistentHandle wrapper = DartUtilities::createPrologueWeakPer
sistentHandle( | 261 Dart_WeakPersistentHandle wrapper = DartUtilities::createPrologueWeakPer
sistentHandle( |
| 265 newInstance, domObject, &wrapperWeakCallback<BindingsClass>); | 262 newInstance, domObject, &wrapperWeakCallback<BindingsClass>); |
| 266 Traits::MapTraits::domMap(domData)->set(domObject, wrapper); | 263 Traits::MapTraits::domMap(domData)->set(domObject, wrapper); |
| 267 Traits::ActiveTraits::setWrapper(domData, domObject, wrapper); | 264 Traits::ActiveTraits::setWrapper(domData, domObject, wrapper); |
| 268 Traits::EventTargetTraits::setWrapper(domData, domObject, wrapper); | 265 Traits::EventTargetTraits::setWrapper(domData, domObject, wrapper); |
| 269 domObject->ref(); | 266 domObject->ref(); |
| 270 } | 267 } |
| 271 | 268 |
| 272 template <class BindingsClass> | 269 template <class BindingsClass> |
| 273 static void disassociateWrapper(typename BindingsClass::NativeType* domObjec
t, Dart_Handle oldInstance) | 270 static void disassociateWrapper(typename BindingsClass::NativeType* domObjec
t, Dart_Handle oldInstance) |
| 274 { | 271 { |
| 275 typedef DartDOMWrapperTraits<BindingsClass> Traits; | 272 typedef DartDOMWrapperTraits<BindingsClass> Traits; |
| 276 | 273 |
| 277 DartDOMData* domData = DartDOMData::current(); | 274 DartDOMData* domData = DartDOMData::current(); |
| 278 Dart_WeakPersistentHandle wrapper = Traits::MapTraits::domMap(domData)->
get(domObject); | 275 Dart_WeakPersistentHandle wrapper = Traits::MapTraits::domMap(domData)->
get(domObject); |
| 279 ASSERT(Dart_IdentityEquals(Dart_HandleFromWeakPersistent(wrapper), oldIn
stance)); | 276 ASSERT(Dart_IdentityEquals(Dart_HandleFromWeakPersistent(wrapper), oldIn
stance)); |
| 280 Traits::MapTraits::domMap(domData)->remove(domObject); | 277 Traits::MapTraits::domMap(domData)->remove(domObject); |
| 281 Traits::ActiveTraits::removeWrapper(domData, domObject); | 278 Traits::ActiveTraits::removeWrapper(domData, domObject); |
| 282 Traits::EventTargetTraits::removeWrapper(domData, domObject); | 279 Traits::EventTargetTraits::removeWrapper(domData, domObject); |
| 283 } | 280 } |
| 284 | 281 |
| 285 friend class DartCustomElement; | 282 friend class DartCustomElementWrapper<HTMLElement>; |
| 286 }; | 283 }; |
| 287 | 284 |
| 288 template<bool isNode> | 285 template<bool isNode> |
| 289 struct DartDOMWrapperMapTraits { }; | 286 struct DartDOMWrapperMapTraits { }; |
| 290 | 287 |
| 291 template<> | 288 template<> |
| 292 struct DartDOMWrapperMapTraits<false> { | 289 struct DartDOMWrapperMapTraits<false> { |
| 293 static DartDOMObjectMap* domMap(DartDOMData* domData) { return domData->obje
ctMap(); } | 290 static DartDOMObjectMap* domMap(DartDOMData* domData) { return domData->obje
ctMap(); } |
| 294 }; | 291 }; |
| 295 | 292 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 static DartMessagePortMap* domMap(DartDOMData* domData) { return domData
->messagePortMap(); } | 356 static DartMessagePortMap* domMap(DartDOMData* domData) { return domData
->messagePortMap(); } |
| 360 }; | 357 }; |
| 361 typedef MessagePortMapTraits MapTraits; | 358 typedef MessagePortMapTraits MapTraits; |
| 362 typedef DartDOMWrapperActiveTraits<DartMessagePort, false> ActiveTraits; | 359 typedef DartDOMWrapperActiveTraits<DartMessagePort, false> ActiveTraits; |
| 363 typedef DartDOMWrapperEventTargetTraits<DartMessagePort, true> EventTargetTr
aits; | 360 typedef DartDOMWrapperEventTargetTraits<DartMessagePort, true> EventTargetTr
aits; |
| 364 }; | 361 }; |
| 365 | 362 |
| 366 } | 363 } |
| 367 | 364 |
| 368 #endif // DartDOMWrapper_h | 365 #endif // DartDOMWrapper_h |
| OLD | NEW |