2009-11-13 Vitaly Repeshko <vitalyr@chromium.org>
authoreric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Nov 2009 19:56:43 +0000 (19:56 +0000)
committereric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Nov 2009 19:56:43 +0000 (19:56 +0000)
        Reviewed by Dimitri Glazkov.

        [V8] Protect SVG animated properties from destruction in bindings.
        https://bugs.webkit.org/show_bug.cgi?id=31474

        See http://crbug.com/26719.

        Tested by LayoutTests/svg/custom/js-update-transform-addition.svg
        under Valgrind.

        Made sure we keep a reference to SVG properties while setting a
        context:
        * bindings/scripts/CodeGeneratorV8.pm:
        * bindings/v8/V8Proxy.h:
        (WebCore::V8Proxy::withSVGContext):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@50958 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/bindings/scripts/CodeGeneratorV8.pm
WebCore/bindings/v8/V8Proxy.h

index 548ad42059fe3544762622553fd112fc51b74ae4..18714af49b0f985d63e5e5548521c3d35b3991f1 100644 (file)
@@ -1,3 +1,21 @@
+2009-11-13  Vitaly Repeshko  <vitalyr@chromium.org>
+
+        Reviewed by Dimitri Glazkov.
+
+        [V8] Protect SVG animated properties from destruction in bindings.
+        https://bugs.webkit.org/show_bug.cgi?id=31474
+
+        See http://crbug.com/26719.
+
+        Tested by LayoutTests/svg/custom/js-update-transform-addition.svg
+        under Valgrind.
+
+        Made sure we keep a reference to SVG properties while setting a
+        context:
+        * bindings/scripts/CodeGeneratorV8.pm:
+        * bindings/v8/V8Proxy.h:
+        (WebCore::V8Proxy::withSVGContext):
+
 2009-11-13  Brent Fulgham  <bfulgham@webkit.org>
 
         Reviewed by Alexey Proskuryakov.
index 18141d6e07a6f017d87f23c2da6f991558b8b842..a41f648461419ee7d4db334cec84aa144c38bfd1 100644 (file)
@@ -646,8 +646,8 @@ END
         if ($attrIsPodType) {
             $resultObject = "wrapper";
         }
-        $resultObject = "WTF::getPtr(" . $resultObject . ")";
-        push(@implContentDecls, GenerateSVGContextAssignment($implClassName, $resultObject, "    "));
+        push(@implContentDecls, GenerateSVGContextRetrieval($implClassName, "    "));
+        $result = "V8Proxy::withSVGContext($resultObject, context)";
     }
 
     if ($attrIsPodType) {
index 99ae1f28cbdcd6965d56cf4c50542d57d52e7991..e299d628b7e19f6052f60890a176e48eef68fc8f 100644 (file)
@@ -177,6 +177,33 @@ namespace WebCore {
 #if ENABLE(SVG)
         static void setSVGContext(void*, SVGElement*);
         static SVGElement* svgContext(void*);
+
+        // These helper functions are required in case we are given a PassRefPtr
+        // to a (possibly) newly created object and must prevent its reference
+        // count from dropping to zero as would happen in code like
+        //
+        //   V8Proxy::setSVGContext(imp->getNewlyCreatedObject().get(), context);
+        //   foo(imp->getNewlyCreatedObject().get());
+        //
+        // In the above two lines each time getNewlyCreatedObject() is called it
+        // creates a new object because we don't ref() it. (So our attemts to
+        // associate a context with it fail.) Such code should be rewritten to
+        //
+        //   foo(V8Proxy::withSVGContext(imp->getNewlyCreatedObject(), context).get());
+        //
+        // where PassRefPtr::~PassRefPtr() is invoked only after foo() is
+        // called.
+        template <typename T>
+        static PassRefPtr<T> withSVGContext(PassRefPtr<T> object, SVGElement* context)
+        {
+            setSVGContext(object.get(), context);
+            return object;
+        }
+        static void* withSVGContext(void* object, SVGElement* context)
+        {
+            setSVGContext(object, context);
+            return object;
+        }
 #endif
 
         void setEventHandlerLineNumber(int lineNumber) { m_handlerLineNumber = lineNumber; }