Incorrect beforeChild parent calculation in RenderRubyBase::moveChildren.
authorinferno@chromium.org <inferno@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Mar 2012 16:52:55 +0000 (16:52 +0000)
committerinferno@chromium.org <inferno@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Mar 2012 16:52:55 +0000 (16:52 +0000)
https://bugs.webkit.org/show_bug.cgi?id=80297

Reviewed by Julien Chaffraix.

Source/WebCore:

beforeChild might share the same anonymous block parent with other previous
siblings. Before moving the children across ruby bases, we need to make sure
to split the tree across the beforeChild correctly.

Test: fast/ruby/ruby-text-before-child-split.html

* rendering/RenderRubyBase.cpp:
(WebCore::RenderRubyBase::moveChildren):

LayoutTests:

Test passes if you see the inline continuation in the first ruby base and only the
simple text in the second ruby base.

* fast/ruby/ruby-text-before-child-split-expected.png: Added.
* fast/ruby/ruby-text-before-child-split-expected.txt: Added.
* fast/ruby/ruby-text-before-child-split.html: Added.

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

LayoutTests/ChangeLog
LayoutTests/fast/ruby/ruby-text-before-child-split-expected.png [new file with mode: 0644]
LayoutTests/fast/ruby/ruby-text-before-child-split-expected.txt [new file with mode: 0644]
LayoutTests/fast/ruby/ruby-text-before-child-split.html [new file with mode: 0755]
Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderRubyBase.cpp

index 229ef2792ec0c5e004b54486b58ff439c5708a3d..5144cac25c9eeffc446939f379e6cf24ea444c87 100644 (file)
@@ -1,3 +1,17 @@
+2012-03-22  Abhishek Arya  <inferno@chromium.org>
+
+        Incorrect beforeChild parent calculation in RenderRubyBase::moveChildren.
+        https://bugs.webkit.org/show_bug.cgi?id=80297
+
+        Reviewed by Julien Chaffraix.
+
+        Test passes if you see the inline continuation in the first ruby base and only the
+        simple text in the second ruby base.
+
+        * fast/ruby/ruby-text-before-child-split-expected.png: Added.
+        * fast/ruby/ruby-text-before-child-split-expected.txt: Added.
+        * fast/ruby/ruby-text-before-child-split.html: Added.
+
 2012-03-22  Raphael Kubo da Costa  <rakuco@FreeBSD.org>
 
         [EFL] Gardening, update a few more fast/forms baselines.
diff --git a/LayoutTests/fast/ruby/ruby-text-before-child-split-expected.png b/LayoutTests/fast/ruby/ruby-text-before-child-split-expected.png
new file mode 100644 (file)
index 0000000..f3d974c
Binary files /dev/null and b/LayoutTests/fast/ruby/ruby-text-before-child-split-expected.png differ
diff --git a/LayoutTests/fast/ruby/ruby-text-before-child-split-expected.txt b/LayoutTests/fast/ruby/ruby-text-before-child-split-expected.txt
new file mode 100644 (file)
index 0000000..9290feb
--- /dev/null
@@ -0,0 +1,24 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x26
+  RenderBlock {HTML} at (0,0) size 800x26 [color=#FFFFFF]
+    RenderBody {BODY} at (8,8) size 784x10
+      RenderRuby (inline) {RUBY} at (0,0) size 20x10
+        RenderRubyRun (anonymous) at (0,0) size 10x10
+          RenderRubyText {RT} at (0,0) size 10x0
+          RenderRubyBase (anonymous) at (0,0) size 10x10
+            RenderBlock (anonymous) at (0,0) size 10x10
+              RenderText {#text} at (0,0) size 10x10
+                text run at (0,0) width 10: "A"
+              RenderInline {I} at (0,0) size 0x10
+            RenderBlock (anonymous) at (0,10) size 10x0
+              RenderBlock {DIV} at (0,0) size 10x0
+            RenderBlock (anonymous) at (0,10) size 10x0
+              RenderInline {I} at (0,0) size 0x0
+        RenderRubyRun (anonymous) at (10,0) size 10x10
+          RenderRubyBase (anonymous) at (0,0) size 10x10
+            RenderBlock (anonymous) at (0,0) size 10x10
+              RenderText {#text} at (0,0) size 10x10
+                text run at (0,0) width 10: "B"
+      RenderText {#text} at (0,0) size 0x0
+      RenderText {#text} at (0,0) size 0x0
diff --git a/LayoutTests/fast/ruby/ruby-text-before-child-split.html b/LayoutTests/fast/ruby/ruby-text-before-child-split.html
new file mode 100755 (executable)
index 0000000..498cfcd
--- /dev/null
@@ -0,0 +1,14 @@
+<!DOCTYPE html>\r
+<html style="font-family: ahem; font-size: 10px; -webkit-font-smoothing: none; color: white;">\r
+<body>\r
+<ruby id="ruby1">\r
+A<i><div></div></i>B\r
+</ruby>\r
+<script>\r
+    document.body.offsetTop;\r
+    ruby1 = document.getElementById('ruby1');\r
+    ruby1.insertBefore(document.createElement('rt'), ruby1.lastChild);\r
+</script>\r
+</body>\r
+</html>\r
+\r
index 74c1998214d922efe80b3b5b293b5620d90c8996..be0885cb670bf4c392f09f0c63990948848d5b28 100644 (file)
@@ -1,3 +1,19 @@
+2012-03-22  Abhishek Arya  <inferno@chromium.org>
+
+        Incorrect beforeChild parent calculation in RenderRubyBase::moveChildren.
+        https://bugs.webkit.org/show_bug.cgi?id=80297
+
+        Reviewed by Julien Chaffraix.
+
+        beforeChild might share the same anonymous block parent with other previous
+        siblings. Before moving the children across ruby bases, we need to make sure
+        to split the tree across the beforeChild correctly.
+
+        Test: fast/ruby/ruby-text-before-child-split.html
+
+        * rendering/RenderRubyBase.cpp:
+        (WebCore::RenderRubyBase::moveChildren):
+
 2012-03-22  Krist√≥f Koszty√≥  <kkristof@inf.u-szeged.hu>
 
         [Qt] Fix Qt minimal build after r111692
index d62795538930fa94dea235caac036ed1237c01fa..a079bdb15b33c11b29c225f22161a3606df0d5fa 100644 (file)
@@ -58,13 +58,9 @@ void RenderRubyBase::moveChildren(RenderRubyBase* toBase, RenderObject* beforeCh
     // This function removes all children that are before (!) beforeChild
     // and appends them to toBase.
     ASSERT_ARG(toBase, toBase);
-    
-    // First make sure that beforeChild (if set) is indeed a direct child of this.
-    // Inline children might be wrapped in an anonymous block if there's a continuation.
-    // Theoretically, in ruby bases, this can happen with only the first such a child,
-    // so it should be OK to just climb the tree.
-    while (beforeChild && beforeChild->parent() != this)
-        beforeChild = beforeChild->parent();
+
+    if (beforeChild && beforeChild->parent() != this)
+        beforeChild = splitAnonymousBlocksAroundChild(beforeChild);
 
     if (childrenInline())
         moveInlineChildren(toBase, beforeChild);