Title: [112199] trunk/Source/WebCore
Revision
112199
Author
[email protected]
Date
2012-03-26 19:58:28 -0700 (Mon, 26 Mar 2012)

Log Message

Always set V8 wrappers via V8DOMWrapper::setJSWrapperFor* instead of WeakReferenceMap::set()
https://bugs.webkit.org/show_bug.cgi?id=82256

Reviewed by Adam Barth.

This moves leakRef() calls out of generated code, centralizing them in
V8DOMWrapper implementation. Ideally, WeakReferenceMap::set would take
PassRefPtrs, but that's tricky given that some WeakReferenceMap's KeyType is 'void'
(which clearly can't be wrapped in a PassRefPtr).

Updated binding tests to reflect changes in CodeGeneratorV8.pm, no change in behavior.

* bindings/scripts/CodeGeneratorV8.pm:
(GenerateConstructorCallback): Use GetDomMapFunction instead of custom logic.
(GenerateNamedConstructorCallback): ditto.
(GenerateToV8Converters): Call V8DOMWrapper::setJSWrapper* method
instead of directly accessing the wrapper maps and calling set.
(GetDomMapFunction): Refactored to call new GetDomWrapperMapName function.
(GetDomWrapperMapName): Helper pulled out of GetDomMapFunction.
* bindings/scripts/test/V8/V8Float64Array.cpp:
(WebCore::V8Float64Array::wrapSlow):
* bindings/scripts/test/V8/V8TestActiveDOMObject.cpp:
(WebCore::V8TestActiveDOMObject::wrapSlow):
* bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp:
(WebCore::V8TestCustomNamedGetter::wrapSlow):
* bindings/scripts/test/V8/V8TestEventConstructor.cpp:
(WebCore::V8TestEventConstructor::wrapSlow):
* bindings/scripts/test/V8/V8TestEventTarget.cpp:
(WebCore::V8TestEventTarget::wrapSlow):
* bindings/scripts/test/V8/V8TestInterface.cpp:
(WebCore::V8TestInterface::wrapSlow):
* bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp:
(WebCore::V8TestMediaQueryListListener::wrapSlow):
* bindings/scripts/test/V8/V8TestNamedConstructor.cpp:
(WebCore::V8TestNamedConstructor::wrapSlow):
* bindings/scripts/test/V8/V8TestObj.cpp:
(WebCore::V8TestObj::wrapSlow):
* bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp:
(WebCore::V8TestSerializedScriptValueInterface::wrapSlow):
* bindings/v8/V8DOMWrapper.cpp: Moved setJSWrapperForDOMNode method to header to inline it.
* bindings/v8/V8DOMWrapper.h:
(WebCore): Forward decls.
(V8DOMWrapper):
(WebCore::V8DOMWrapper::setJSWrapperForDOMObject): Made inline.
(WebCore::V8DOMWrapper::setJSWrapperForActiveDOMObject): ditto.
(WebCore::V8DOMWrapper::setJSWrapperForDOMNode): Refactored into two methods;
this one handles non-active Nodes.
(WebCore::V8DOMWrapper::setJSWrapperForActiveDOMNode): Pulled out of previouse
DOMNode method, now handles only active Nodes.
(WebCore::V8DOMWrapper::setJSWrapperForDOMSVGElementInstance): New helper method for SVGElementInstances.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (112198 => 112199)


--- trunk/Source/WebCore/ChangeLog	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/ChangeLog	2012-03-27 02:58:28 UTC (rev 112199)
@@ -1,3 +1,56 @@
+2012-03-26  Adam Klein  <[email protected]>
+
+        Always set V8 wrappers via V8DOMWrapper::setJSWrapperFor* instead of WeakReferenceMap::set()
+        https://bugs.webkit.org/show_bug.cgi?id=82256
+
+        Reviewed by Adam Barth.
+
+        This moves leakRef() calls out of generated code, centralizing them in
+        V8DOMWrapper implementation. Ideally, WeakReferenceMap::set would take
+        PassRefPtrs, but that's tricky given that some WeakReferenceMap's KeyType is 'void'
+        (which clearly can't be wrapped in a PassRefPtr).
+
+        Updated binding tests to reflect changes in CodeGeneratorV8.pm, no change in behavior.
+
+        * bindings/scripts/CodeGeneratorV8.pm:
+        (GenerateConstructorCallback): Use GetDomMapFunction instead of custom logic.
+        (GenerateNamedConstructorCallback): ditto.
+        (GenerateToV8Converters): Call V8DOMWrapper::setJSWrapper* method
+        instead of directly accessing the wrapper maps and calling set.
+        (GetDomMapFunction): Refactored to call new GetDomWrapperMapName function.
+        (GetDomWrapperMapName): Helper pulled out of GetDomMapFunction.
+        * bindings/scripts/test/V8/V8Float64Array.cpp:
+        (WebCore::V8Float64Array::wrapSlow):
+        * bindings/scripts/test/V8/V8TestActiveDOMObject.cpp:
+        (WebCore::V8TestActiveDOMObject::wrapSlow):
+        * bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp:
+        (WebCore::V8TestCustomNamedGetter::wrapSlow):
+        * bindings/scripts/test/V8/V8TestEventConstructor.cpp:
+        (WebCore::V8TestEventConstructor::wrapSlow):
+        * bindings/scripts/test/V8/V8TestEventTarget.cpp:
+        (WebCore::V8TestEventTarget::wrapSlow):
+        * bindings/scripts/test/V8/V8TestInterface.cpp:
+        (WebCore::V8TestInterface::wrapSlow):
+        * bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp:
+        (WebCore::V8TestMediaQueryListListener::wrapSlow):
+        * bindings/scripts/test/V8/V8TestNamedConstructor.cpp:
+        (WebCore::V8TestNamedConstructor::wrapSlow):
+        * bindings/scripts/test/V8/V8TestObj.cpp:
+        (WebCore::V8TestObj::wrapSlow):
+        * bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp:
+        (WebCore::V8TestSerializedScriptValueInterface::wrapSlow):
+        * bindings/v8/V8DOMWrapper.cpp: Moved setJSWrapperForDOMNode method to header to inline it.
+        * bindings/v8/V8DOMWrapper.h:
+        (WebCore): Forward decls.
+        (V8DOMWrapper):
+        (WebCore::V8DOMWrapper::setJSWrapperForDOMObject): Made inline.
+        (WebCore::V8DOMWrapper::setJSWrapperForActiveDOMObject): ditto.
+        (WebCore::V8DOMWrapper::setJSWrapperForDOMNode): Refactored into two methods;
+        this one handles non-active Nodes.
+        (WebCore::V8DOMWrapper::setJSWrapperForActiveDOMNode): Pulled out of previouse
+        DOMNode method, now handles only active Nodes.
+        (WebCore::V8DOMWrapper::setJSWrapperForDOMSVGElementInstance): New helper method for SVGElementInstances.
+
 2012-03-26  Pratik Solanki  <[email protected]>
 
         Fix typo in method name - WebCore::miminumValueForLength should be WebCore::minimumValueForLength

Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm (112198 => 112199)


--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm	2012-03-27 02:58:28 UTC (rev 112199)
@@ -1752,13 +1752,7 @@
         push(@implContent, "        goto fail;\n");
     }
 
-    my $DOMObject = "DOMObject";
-    if (IsNodeSubType($dataNode)) {
-        $DOMObject = "DOMNode";
-    } elsif ($dataNode->extendedAttributes->{"ActiveDOMObject"}) {
-        $DOMObject = "ActiveDOMObject";
-    }
-
+    my $DOMObject = GetDomWrapperMapName($dataNode, $implClassName);
     push(@implContent, <<END);
 
     V8DOMWrapper::setDOMWrapper(wrapper, &info, impl.get());
@@ -1932,14 +1926,7 @@
         push(@implContent, "        goto fail;\n");
     }
 
-    my $DOMObject = "DOMObject";
-    # A DOMObject that is an ActiveDOMObject and also a DOMNode should be treated as an DOMNode here.
-    # setJSWrapperForDOMNode() will look if node is active and choose correct map to add node to.
-    if (IsNodeSubType($dataNode)) {
-        $DOMObject = "DOMNode";
-    } elsif ($dataNode->extendedAttributes->{"ActiveDOMObject"}) {
-        $DOMObject = "ActiveDOMObject";
-    }
+    my $DOMObject = GetDomWrapperMapName($dataNode, $implClassName);
     push(@implContent, <<END);
 
     V8DOMWrapper::setDOMWrapper(wrapper, &V8${implClassName}Constructor::info, impl.get());
@@ -3093,7 +3080,7 @@
     my $className = shift;
     my $nativeType = shift;
 
-    my $domMapFunction = GetDomMapFunction($dataNode, $interfaceName);
+    my $domMapName = GetDomWrapperMapName($dataNode, $interfaceName);
     my $forceNewObjectInput = IsDOMNodeType($interfaceName) ? ", bool forceNewObject" : "";
     my $forceNewObjectCall = IsDOMNodeType($interfaceName) ? ", forceNewObject" : "";
     my $wrapSlowArgumentType = GetPassRefPtrType($nativeType);
@@ -3180,7 +3167,7 @@
 END
     }
     push(@implContent, <<END);
-    ${domMapFunction}.set(impl.leakRef(), wrapperHandle);
+    V8DOMWrapper::setJSWrapperFor${domMapName}(impl, wrapperHandle);
     return wrapper;
 }
 END
@@ -3188,13 +3175,19 @@
 
 sub GetDomMapFunction
 {
+    my $mapName = GetDomWrapperMapName(@_);
+    return "get${mapName}Map()";
+}
+
+sub GetDomWrapperMapName
+{
     my $dataNode = shift;
     my $type = shift;
-    return "getDOMSVGElementInstanceMap()" if $type eq "SVGElementInstance";
-    return "getActiveDOMNodeMap()" if (IsNodeSubType($dataNode) && $dataNode->extendedAttributes->{"ActiveDOMObject"});
-    return "getDOMNodeMap()" if (IsNodeSubType($dataNode));
-    return "getActiveDOMObjectMap()" if $dataNode->extendedAttributes->{"ActiveDOMObject"};
-    return "getDOMObjectMap()";
+    return "DOMSVGElementInstance" if $type eq "SVGElementInstance";
+    return "ActiveDOMNode" if (IsNodeSubType($dataNode) && $dataNode->extendedAttributes->{"ActiveDOMObject"});
+    return "DOMNode" if (IsNodeSubType($dataNode));
+    return "ActiveDOMObject" if $dataNode->extendedAttributes->{"ActiveDOMObject"};
+    return "DOMObject";
 }
 
 sub GetNativeTypeForConversions

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.cpp (112198 => 112199)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.cpp	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.cpp	2012-03-27 02:58:28 UTC (rev 112199)
@@ -132,7 +132,7 @@
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
+    V8DOMWrapper::setJSWrapperForDOMObject(impl, wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp (112198 => 112199)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp	2012-03-27 02:58:28 UTC (rev 112199)
@@ -186,7 +186,7 @@
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
+    V8DOMWrapper::setJSWrapperForDOMObject(impl, wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp (112198 => 112199)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp	2012-03-27 02:58:28 UTC (rev 112199)
@@ -122,7 +122,7 @@
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
+    V8DOMWrapper::setJSWrapperForDOMObject(impl, wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.cpp (112198 => 112199)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.cpp	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.cpp	2012-03-27 02:58:28 UTC (rev 112199)
@@ -157,7 +157,7 @@
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
+    V8DOMWrapper::setJSWrapperForDOMObject(impl, wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp (112198 => 112199)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp	2012-03-27 02:58:28 UTC (rev 112199)
@@ -185,7 +185,7 @@
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
+    V8DOMWrapper::setJSWrapperForDOMObject(impl, wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp (112198 => 112199)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp	2012-03-27 02:58:28 UTC (rev 112199)
@@ -317,7 +317,7 @@
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getActiveDOMObjectMap().set(impl.leakRef(), wrapperHandle);
+    V8DOMWrapper::setJSWrapperForActiveDOMObject(impl, wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp (112198 => 112199)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp	2012-03-27 02:58:28 UTC (rev 112199)
@@ -122,7 +122,7 @@
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
+    V8DOMWrapper::setJSWrapperForDOMObject(impl, wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.cpp (112198 => 112199)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.cpp	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.cpp	2012-03-27 02:58:28 UTC (rev 112199)
@@ -166,7 +166,7 @@
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getActiveDOMObjectMap().set(impl.leakRef(), wrapperHandle);
+    V8DOMWrapper::setJSWrapperForActiveDOMObject(impl, wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp (112198 => 112199)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp	2012-03-27 02:58:28 UTC (rev 112199)
@@ -2172,7 +2172,7 @@
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
+    V8DOMWrapper::setJSWrapperForDOMObject(impl, wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp (112198 => 112199)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp	2012-03-27 02:58:28 UTC (rev 112199)
@@ -288,7 +288,7 @@
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
+    V8DOMWrapper::setJSWrapperForDOMObject(impl, wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/v8/V8DOMWrapper.cpp (112198 => 112199)


--- trunk/Source/WebCore/bindings/v8/V8DOMWrapper.cpp	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/bindings/v8/V8DOMWrapper.cpp	2012-03-27 02:58:28 UTC (rev 112199)
@@ -66,15 +66,6 @@
 
 namespace WebCore {
 
-void V8DOMWrapper::setJSWrapperForDOMNode(PassRefPtr<Node> node, v8::Persistent<v8::Object> wrapper)
-{
-    ASSERT(maybeDOMWrapper(wrapper));
-    if (node->isActiveNode())
-        getActiveDOMNodeMap().set(node.leakRef(), wrapper);
-    else
-        getDOMNodeMap().set(node.leakRef(), wrapper);
-}
-
 v8::Local<v8::Function> V8DOMWrapper::getConstructor(WrapperTypeInfo* type, v8::Handle<v8::Value> objectPrototype)
 {
     // A DOM constructor is a function instance created from a DOM constructor

Modified: trunk/Source/WebCore/bindings/v8/V8DOMWrapper.h (112198 => 112199)


--- trunk/Source/WebCore/bindings/v8/V8DOMWrapper.h	2012-03-27 02:45:03 UTC (rev 112198)
+++ trunk/Source/WebCore/bindings/v8/V8DOMWrapper.h	2012-03-27 02:58:28 UTC (rev 112199)
@@ -54,7 +54,7 @@
     class DOMWindow;
     class EventTarget;
     class Frame;
-    class Node;
+    class SVGElementInstance;
     class V8Proxy;
     class WorkerContext;
 
@@ -110,6 +110,10 @@
         template<typename T> static void setJSWrapperForDOMObject(PassRefPtr<T>, v8::Persistent<v8::Object>);
         template<typename T> static void setJSWrapperForActiveDOMObject(PassRefPtr<T>, v8::Persistent<v8::Object>);
         static void setJSWrapperForDOMNode(PassRefPtr<Node>, v8::Persistent<v8::Object>);
+        static void setJSWrapperForActiveDOMNode(PassRefPtr<Node>, v8::Persistent<v8::Object>);
+#if ENABLE(SVG)
+        static void setJSWrapperForDOMSVGElementInstance(PassRefPtr<SVGElementInstance>, v8::Persistent<v8::Object>);
+#endif
 
         static bool isValidDOMObject(v8::Handle<v8::Value>);
 
@@ -150,7 +154,7 @@
     };
 
     template<typename T>
-    void V8DOMWrapper::setJSWrapperForDOMObject(PassRefPtr<T> object, v8::Persistent<v8::Object> wrapper)
+    inline void V8DOMWrapper::setJSWrapperForDOMObject(PassRefPtr<T> object, v8::Persistent<v8::Object> wrapper)
     {
         ASSERT(maybeDOMWrapper(wrapper));
         ASSERT(!domWrapperType(wrapper)->toActiveDOMObjectFunction);
@@ -158,12 +162,37 @@
     }
 
     template<typename T>
-    void V8DOMWrapper::setJSWrapperForActiveDOMObject(PassRefPtr<T> object, v8::Persistent<v8::Object> wrapper)
+    inline void V8DOMWrapper::setJSWrapperForActiveDOMObject(PassRefPtr<T> object, v8::Persistent<v8::Object> wrapper)
     {
         ASSERT(maybeDOMWrapper(wrapper));
         ASSERT(domWrapperType(wrapper)->toActiveDOMObjectFunction);
         getActiveDOMObjectMap().set(object.leakRef(), wrapper);
     }
+
+    inline void V8DOMWrapper::setJSWrapperForDOMNode(PassRefPtr<Node> node, v8::Persistent<v8::Object> wrapper)
+    {
+        ASSERT(maybeDOMWrapper(wrapper));
+        ASSERT(!domWrapperType(wrapper)->toActiveDOMObjectFunction);
+        ASSERT(!node->isActiveNode());
+        getDOMNodeMap().set(node.leakRef(), wrapper);
+    }
+
+    inline void V8DOMWrapper::setJSWrapperForActiveDOMNode(PassRefPtr<Node> node, v8::Persistent<v8::Object> wrapper)
+    {
+        ASSERT(maybeDOMWrapper(wrapper));
+        ASSERT(domWrapperType(wrapper)->toActiveDOMObjectFunction);
+        ASSERT(node->isActiveNode());
+        getActiveDOMNodeMap().set(node.leakRef(), wrapper);
+    }
+
+#if ENABLE(SVG)
+    inline void V8DOMWrapper::setJSWrapperForDOMSVGElementInstance(PassRefPtr<SVGElementInstance> element, v8::Persistent<v8::Object> wrapper)
+    {
+        ASSERT(maybeDOMWrapper(wrapper));
+        getDOMSVGElementInstanceMap().set(element.leakRef(), wrapper);
+    }
+#endif
+
 } // namespace WebCore
 
 #endif // V8DOMWrapper_h
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to