Reviewed by Eric.
authoroliver <oliver@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 Oct 2007 15:34:58 +0000 (15:34 +0000)
committeroliver <oliver@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 Oct 2007 15:34:58 +0000 (15:34 +0000)
        http://bugs.webkit.org/show_bug.cgi?id=15080
        <use> element not refresh after adding objects by script in referrer

        Update shadow tree when elements are added/removed from a tree
        that is referenced by a <use>.

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

LayoutTests/ChangeLog
LayoutTests/svg/custom/use-dynamic-append-expected.checksum [new file with mode: 0644]
LayoutTests/svg/custom/use-dynamic-append-expected.png [new file with mode: 0644]
LayoutTests/svg/custom/use-dynamic-append-expected.txt [new file with mode: 0644]
LayoutTests/svg/custom/use-dynamic-append.svg [new file with mode: 0644]
WebCore/ChangeLog
WebCore/ksvg2/svg/SVGStyledElement.cpp
WebCore/ksvg2/svg/SVGStyledElement.h

index 5beaedf0daae1e907fb97712d4034a4a3d3d2f98..c99a74841a83f277998f30e08400d0088008cf89 100644 (file)
@@ -1,3 +1,16 @@
+2007-10-09  Rob Buis  <buis@kde.org>
+
+        Reviewed by Eric.
+
+        Testcase for:
+        http://bugs.webkit.org/show_bug.cgi?id=15080
+        <use> element not refresh after adding objects by script in referrer
+
+        * svg/custom/use-dynamic-append-expected.checksum: Added.
+        * svg/custom/use-dynamic-append-expected.png: Added.
+        * svg/custom/use-dynamic-append-expected.txt: Added.
+        * svg/custom/use-dynamic-append.svg: Added.
+
 2007-10-09  Rob Buis  <buis@kde.org>
 
         Reviewed by Maciej.
diff --git a/LayoutTests/svg/custom/use-dynamic-append-expected.checksum b/LayoutTests/svg/custom/use-dynamic-append-expected.checksum
new file mode 100644 (file)
index 0000000..867264c
--- /dev/null
@@ -0,0 +1 @@
+f009b28d24fc03f9726d5c4698354bef
diff --git a/LayoutTests/svg/custom/use-dynamic-append-expected.png b/LayoutTests/svg/custom/use-dynamic-append-expected.png
new file mode 100644 (file)
index 0000000..caab808
Binary files /dev/null and b/LayoutTests/svg/custom/use-dynamic-append-expected.png differ
diff --git a/LayoutTests/svg/custom/use-dynamic-append-expected.txt b/LayoutTests/svg/custom/use-dynamic-append-expected.txt
new file mode 100644 (file)
index 0000000..1175cf8
--- /dev/null
@@ -0,0 +1,15 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderSVGRoot {svg} at (0,0) size 419x144
+    RenderSVGContainer {g} at (0,0) size 100x100
+      RenderPath {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [data="M0.00,0.00L100.00,0.00L100.00,100.00L0.00,100.00"]
+    RenderSVGContainer {use} at (0,0) size 0x0
+      RenderSVGContainer {g} at (0,0) size 0x0
+        RenderSVGContainer {g} at (0,0) size 0x0
+    RenderSVGText {text} at (10,120) size 366x17 contains 1 chunk(s)
+      RenderSVGInlineText {#text} at (0,-13) size 366x17
+        chunk 1 text run 1 at (10.00,120.00) startOffset 0 endOffset 60 width 366.00: "This test tries to change a container referenced by a <use>."
+    RenderSVGText {text} at (10,140) size 409x17 contains 1 chunk(s)
+      RenderSVGInlineText {#text} at (0,-13) size 409x17
+        chunk 1 text run 1 at (10.00,140.00) startOffset 0 endOffset 67 width 409.00: "If it is successful, there should be a green rect above. Bug 15080."
diff --git a/LayoutTests/svg/custom/use-dynamic-append.svg b/LayoutTests/svg/custom/use-dynamic-append.svg
new file mode 100644 (file)
index 0000000..b8d7650
--- /dev/null
@@ -0,0 +1,19 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" onload="runTest()">
+<script><![CDATA[
+function runTest()
+{
+    var node = document.createElementNS("http://www.w3.org/2000/svg" , "rect");
+    node.setAttributeNS(null , "x" , "0");
+    node.setAttributeNS(null , "y" , "0");
+    node.setAttributeNS(null , "width", "100");
+    node.setAttributeNS(null , "height" , "100");
+    node.setAttributeNS(null , "fill" , "green");
+    document.getElementById("groupA").appendChild(node)
+}
+]]></script>
+<g id="groupA">
+</g>
+<use xlink:href="#groupA"/>
+<text x="10" y="120" font-size="15">This test tries to change a container referenced by a &lt;use&gt;.</text>
+<text x="10" y="140" font-size="15">If it is successful, there should be a green rect above. Bug 15080.</text>
+</svg>
index 1972e7c4496986425fcf8c62b1609077eaca0797..ccb6c7f2b63facde339b1c80d6bde637cb845a7b 100644 (file)
@@ -1,3 +1,17 @@
+2007-10-09  Rob Buis  <buis@kde.org>
+
+        Reviewed by Eric.
+
+        http://bugs.webkit.org/show_bug.cgi?id=15080
+        <use> element not refresh after adding objects by script in referrer
+
+        Update shadow tree when elements are added/removed from a tree
+        that is referenced by a <use>.
+
+        * ksvg2/svg/SVGStyledElement.cpp:
+        (WebCore::SVGStyledElement::childrenChanged):
+        * ksvg2/svg/SVGStyledElement.h:
+
 2007-10-09  Rob Buis  <buis@kde.org>
 
         Reviewed by Maciej.
index 419e2596799ff513561c37ef3c48b6c9d30460c9..f626cae5f7b016279ccfa10b1472dc8a1c837e00 100644 (file)
@@ -195,6 +195,22 @@ void SVGStyledElement::notifyAttributeChange() const
     notifyResourceParentIfExistant();
 }
 
+void SVGStyledElement::childrenChanged()
+{
+    SVGElement::childrenChanged();
+    if (document()->parsing())
+        return;
+
+    SVGDocumentExtensions* extensions = document()->accessSVGExtensions();
+    if (!extensions)
+        return;
+
+    // In case we're referenced by a <use> element, we have element instances registered
+    // to us in the SVGDocumentExtensions. If childrenChanged() is called, we need
+    // to recursively update all children including ourselves.
+    updateElementInstance(extensions);
+}
+
 void SVGStyledElement::notifyResourceParentIfExistant() const
 {
     Node* node = parentNode();
index f422734f230a3ed03b83c4486b8f9efc6c3d8824..53218d9c4add7dfa46a736c9b4a90c65be5ecbbe 100644 (file)
@@ -57,6 +57,7 @@ namespace WebCore {
         virtual void parseMappedAttribute(MappedAttribute*);
 
         virtual void notifyAttributeChange() const;
+        virtual void childrenChanged();
         void notifyResourceParentIfExistant() const;
 
         virtual void attributeChanged(Attribute*, bool preserveDecls = false);