SVG elements should inherit the root's flow thread state.
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 20 Dec 2016 21:47:31 +0000 (21:47 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 20 Dec 2016 21:47:31 +0000 (21:47 +0000)
https://bugs.webkit.org/show_bug.cgi?id=166173
rdar://problem/29704862

Reviewed by Simon Fraser.

Source/WebCore:

When the <svg> is not part of the multicolumn context (out of flow positioning), its descendants should not be in the flow either.

Test: fast/multicol/svg-inside-multicolumn.html

* rendering/RenderObject.cpp:
(WebCore::RenderObject::computedFlowThreadState):
* rendering/RenderObject.h:
(WebCore::RenderObject::isProgress):
(WebCore::RenderObject::isRenderSVGBlock):
* rendering/svg/RenderSVGBlock.h:

LayoutTests:

* fast/multicol/svg-inside-multicolumn-expected.txt: Added.
* fast/multicol/svg-inside-multicolumn.html: Added.

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

LayoutTests/ChangeLog
LayoutTests/fast/multicol/svg-inside-multicolumn-expected.txt [new file with mode: 0644]
LayoutTests/fast/multicol/svg-inside-multicolumn.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderObject.cpp
Source/WebCore/rendering/RenderObject.h
Source/WebCore/rendering/svg/RenderSVGBlock.h

index b5aca7f..d6755b4 100644 (file)
@@ -1,3 +1,14 @@
+2016-12-20  Zalan Bujtas  <zalan@apple.com>
+
+        SVG elements should inherit the root's flow thread state.
+        https://bugs.webkit.org/show_bug.cgi?id=166173
+        rdar://problem/29704862
+
+        Reviewed by Simon Fraser.
+
+        * fast/multicol/svg-inside-multicolumn-expected.txt: Added.
+        * fast/multicol/svg-inside-multicolumn.html: Added.
+
 2016-12-20  Joseph Pecoraro  <pecoraro@apple.com>
 
         Web Inspector: Console could be made useful for very simple await expressions
diff --git a/LayoutTests/fast/multicol/svg-inside-multicolumn-expected.txt b/LayoutTests/fast/multicol/svg-inside-multicolumn-expected.txt
new file mode 100644 (file)
index 0000000..06ad3b0
--- /dev/null
@@ -0,0 +1,2 @@
+Pass if no crash or assert.
+
diff --git a/LayoutTests/fast/multicol/svg-inside-multicolumn.html b/LayoutTests/fast/multicol/svg-inside-multicolumn.html
new file mode 100644 (file)
index 0000000..4b37c3e
--- /dev/null
@@ -0,0 +1,50 @@
+<!--======================================================================-->
+<!--======================================================================-->
+<!--======================================================================-->
+<!--======================================================================-->
+<!--======================================================================-->
+<!--======================================================================-->
+<!--======================================================================-->
+<!--======================================================================-->
+<!--======================================================================-->
+<!--======================================================================-->
+<!--======================================================================-->
+<!--======================================================================-->
+<!--======================================================================-->
+<!--======================================================================-->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="svgroot" width="100%" height="100%" viewBox="0 0 480 360">
+       <text fill="black">Pass if no crash or assert.</text>
+<style>
+svg {
+  position: absolute;
+}
+  
+body {
+  animation-name: name0;
+  animation-duration: 100s;
+}
+
+@-webkit-keyframes name0 {
+  from {
+    column-width: auto;
+  }
+  to {
+    column-width: 1;
+  }
+}
+
+body:last-child {
+  animation-name: foobar;
+}
+</style>
+
+<script type="text/javascript">
+// <![CDATA[
+if (window.testRunner)
+  testRunner.dumpAsText();
+document.getElementById("svgroot").offsetHeight;
+document.getElementById("svgroot").insertBefore(document.createElementNS("http://www.w3.org/2000/svg", "text"), null);
+// ]]>
+</script>
+</svg>
index 387440a..94b8aad 100644 (file)
@@ -1,3 +1,22 @@
+2016-12-20  Zalan Bujtas  <zalan@apple.com>
+
+        SVG elements should inherit the root's flow thread state.
+        https://bugs.webkit.org/show_bug.cgi?id=166173
+        rdar://problem/29704862
+
+        Reviewed by Simon Fraser.
+
+        When the <svg> is not part of the multicolumn context (out of flow positioning), its descendants should not be in the flow either.
+
+        Test: fast/multicol/svg-inside-multicolumn.html
+
+        * rendering/RenderObject.cpp:
+        (WebCore::RenderObject::computedFlowThreadState):
+        * rendering/RenderObject.h:
+        (WebCore::RenderObject::isProgress):
+        (WebCore::RenderObject::isRenderSVGBlock):
+        * rendering/svg/RenderSVGBlock.h:
+
 2016-12-20  Alex Christensen  <achristensen@webkit.org>
 
         Fix yet another app that uses initEvent with fewer than 3 parameters
index e3638a5..af3cc59 100644 (file)
 #include "RenderNamedFlowFragment.h"
 #include "RenderNamedFlowThread.h" 
 #include "RenderRuby.h"
+#include "RenderSVGBlock.h"
+#include "RenderSVGInline.h"
+#include "RenderSVGModelObject.h"
 #include "RenderSVGResourceContainer.h"
+#include "RenderSVGRoot.h"
 #include "RenderScrollbarPart.h"
 #include "RenderTableRow.h"
 #include "RenderTheme.h"
@@ -185,7 +189,11 @@ RenderObject::FlowThreadState RenderObject::computedFlowThreadState(const Render
     auto inheritedFlowState = RenderObject::NotInsideFlowThread;
     if (is<RenderText>(renderer))
         inheritedFlowState = renderer.parent()->flowThreadState();
-    else if (auto* containingBlock = renderer.containingBlock())
+    else if (is<RenderSVGBlock>(renderer) || is<RenderSVGInline>(renderer) || is<RenderSVGModelObject>(renderer)) {
+        // containingBlock() skips svg boundary (SVG root is a RenderReplaced).
+        if (auto* svgRoot = SVGRenderSupport::findTreeRootObject(downcast<RenderElement>(renderer)))
+            inheritedFlowState = svgRoot->flowThreadState();
+    } else if (auto* containingBlock = renderer.containingBlock())
         inheritedFlowState = containingBlock->flowThreadState();
     else {
         // Splitting lines or doing continuation, so just keep the current state.
index f8b4c40..7d38b94 100644 (file)
@@ -243,7 +243,6 @@ public:
 #endif
     virtual bool isSnapshottedPlugIn() const { return false; }
     virtual bool isProgress() const { return false; }
-    virtual bool isRenderSVGBlock() const { return false; };
     virtual bool isRenderButton() const { return false; }
     virtual bool isRenderIFrame() const { return false; }
     virtual bool isRenderImage() const { return false; }
@@ -349,6 +348,7 @@ public:
     // FIXME: Until all SVG renders can be subclasses of RenderSVGModelObject we have
     // to add SVG renderer methods to RenderObject with an ASSERT_NOT_REACHED() default implementation.
     virtual bool isRenderSVGModelObject() const { return false; }
+    virtual bool isRenderSVGBlock() const { return false; };
     virtual bool isSVGRoot() const { return false; }
     virtual bool isSVGContainer() const { return false; }
     virtual bool isSVGTransformableContainer() const { return false; }
index 5dde619..c231156 100644 (file)
@@ -50,3 +50,5 @@ private:
 };
 
 } // namespace WebCore
+
+SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderSVGBlock, isRenderSVGBlock())