diff options
author | Ben Murdoch <benm@google.com> | 2011-06-02 12:07:03 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2011-06-10 10:47:21 +0100 |
commit | 2daae5fd11344eaa88a0d92b0f6d65f8d2255c00 (patch) | |
tree | e4964fbd1cb70599f7718ff03e50ea1dab33890b /Source/WebCore/bindings/js/JSNamedNodeMapCustom.cpp | |
parent | 87bdf0060a247bfbe668342b87e0874182e0ffa9 (diff) | |
download | external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.zip external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.tar.gz external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.tar.bz2 |
Merge WebKit at r84325: Initial merge by git.
Change-Id: Ic1a909300ecc0a13ddc6b4e784371d2ac6e3d59b
Diffstat (limited to 'Source/WebCore/bindings/js/JSNamedNodeMapCustom.cpp')
-rw-r--r-- | Source/WebCore/bindings/js/JSNamedNodeMapCustom.cpp | 52 |
1 files changed, 47 insertions, 5 deletions
diff --git a/Source/WebCore/bindings/js/JSNamedNodeMapCustom.cpp b/Source/WebCore/bindings/js/JSNamedNodeMapCustom.cpp index 8df9304..9b06767 100644 --- a/Source/WebCore/bindings/js/JSNamedNodeMapCustom.cpp +++ b/Source/WebCore/bindings/js/JSNamedNodeMapCustom.cpp @@ -27,7 +27,6 @@ #include "JSNamedNodeMap.h" #include "JSNode.h" - #include "Element.h" #include "NamedNodeMap.h" @@ -35,6 +34,40 @@ using namespace JSC; namespace WebCore { +class JSNamedNodeMapOwner : public JSC::WeakHandleOwner { + virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::MarkStack&); + virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); +}; + +bool JSNamedNodeMapOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, MarkStack& markStack) +{ + JSNamedNodeMap* jsNamedNodeMap = static_cast<JSNamedNodeMap*>(handle.get().asCell()); + if (!jsNamedNodeMap->hasCustomProperties()) + return false; + Element* element = jsNamedNodeMap->impl()->element(); + if (!element) + return false; + return markStack.containsOpaqueRoot(root(element)); +} + +void JSNamedNodeMapOwner::finalize(JSC::Handle<JSC::Unknown> handle, void* context) +{ + JSNamedNodeMap* jsNamedNodeMap = static_cast<JSNamedNodeMap*>(handle.get().asCell()); + DOMWrapperWorld* world = static_cast<DOMWrapperWorld*>(context); + uncacheWrapper(world, jsNamedNodeMap->impl(), jsNamedNodeMap); +} + +inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld*, NamedNodeMap*) +{ + DEFINE_STATIC_LOCAL(JSNamedNodeMapOwner, jsNamedNodeMapOwner, ()); + return &jsNamedNodeMapOwner; +} + +inline void* wrapperContext(DOMWrapperWorld* world, NamedNodeMap*) +{ + return world; +} + bool JSNamedNodeMap::canGetItemsForName(ExecState*, NamedNodeMap* impl, const Identifier& propertyName) { return impl->getNamedItem(identifierToString(propertyName)); @@ -50,10 +83,19 @@ void JSNamedNodeMap::markChildren(MarkStack& markStack) { Base::markChildren(markStack); - // Mark the element so that this will work to access the attribute even if the last - // other reference goes away. - if (Element* element = impl()->element()) - markDOMNodeWrapper(markStack, element->document(), element); + // We need to keep the wrapper for our underlying NamedNodeMap's element + // alive because NamedNodeMap and Attr rely on the element for data, and + // don't know how to keep it alive correctly. + // FIXME: Fix this lifetime issue in the DOM, and remove this. + Element* element = impl()->element(); + if (!element) + return; + markStack.addOpaqueRoot(root(element)); +} + +JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, NamedNodeMap* impl) +{ + return wrap<JSNamedNodeMap>(exec, globalObject, impl); } } // namespace WebCore |