[Text Autosizing] Collect narrow descendants and process them separately. Refactoring for
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 11 Feb 2013 23:48:51 +0000 (23:48 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 11 Feb 2013 23:48:51 +0000 (23:48 +0000)
a change to follow.
https://bugs.webkit.org/show_bug.cgi?id=109054

Preparational change to combine narrow descendants of the same autosizing cluster into
groups by the width difference between the descendant and the block containing all text of
the parent autosizing cluster. The groups will be autosized with the same multiplier.

For example, on sites with a sidebar, sometimes the paragraphs next to the sidebar will have
a large margin individually applied (via a CSS selector), causing them all to individually
appear narrower than their enclosing blockContainingAllText. Rather than making each of
these paragraphs into a separate cluster, we eventually want to be able to merge them back
together into one (or a few) descendant clusters.

Patch by Anton Vayvod <avayvod@chromium.org> on 2013-02-11
Reviewed by Julien Chaffraix.

No behavioral changes thus no new tests or test changes.

* rendering/TextAutosizer.cpp:
(TextAutosizingClusterInfo): Vector of narrow descendants.
(WebCore::TextAutosizer::processCluster): Process narrow descendants separately.
(WebCore::TextAutosizer::processContainer):

    Remember narrow descendants of the parent cluster for later processing.

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

Source/WebCore/ChangeLog
Source/WebCore/rendering/TextAutosizer.cpp

index 2fa409dbc6c844ef3b94016bbc496120d00ad0c5..f2d85f6e600ee0538e37ad4b33539f8d717e200a 100644 (file)
@@ -1,3 +1,30 @@
+2013-02-11  Anton Vayvod  <avayvod@chromium.org>
+
+        [Text Autosizing] Collect narrow descendants and process them separately. Refactoring for
+        a change to follow.
+        https://bugs.webkit.org/show_bug.cgi?id=109054
+
+        Preparational change to combine narrow descendants of the same autosizing cluster into
+        groups by the width difference between the descendant and the block containing all text of
+        the parent autosizing cluster. The groups will be autosized with the same multiplier.
+
+        For example, on sites with a sidebar, sometimes the paragraphs next to the sidebar will have
+        a large margin individually applied (via a CSS selector), causing them all to individually
+        appear narrower than their enclosing blockContainingAllText. Rather than making each of
+        these paragraphs into a separate cluster, we eventually want to be able to merge them back
+        together into one (or a few) descendant clusters.
+
+        Reviewed by Julien Chaffraix.
+
+        No behavioral changes thus no new tests or test changes.
+
+        * rendering/TextAutosizer.cpp:
+        (TextAutosizingClusterInfo): Vector of narrow descendants.
+        (WebCore::TextAutosizer::processCluster): Process narrow descendants separately.
+        (WebCore::TextAutosizer::processContainer):
+
+            Remember narrow descendants of the parent cluster for later processing.
+
 2013-02-11  Enrica Casucci  <enrica@apple.com>
 
         Add ENABLE_DELETION_UI to control the use of the deletion UI.
index 901b9d7c512725bfccd6679c6dae83f6720c2295..b7f3718a65e94f9b7b88cc68e14e56dde4d2b648 100644 (file)
@@ -37,6 +37,7 @@
 
 #include <algorithm>
 #include <wtf/StdLibExtras.h>
+#include <wtf/Vector.h>
 
 namespace WebCore {
 
@@ -47,6 +48,7 @@ struct TextAutosizingWindowInfo {
     IntSize minLayoutSize;
 };
 
+// Represents cluster related data. Instances should not persist between calls to processSubtree.
 struct TextAutosizingClusterInfo {
     explicit TextAutosizingClusterInfo(RenderBlock* root)
         : root(root)
@@ -61,6 +63,10 @@ struct TextAutosizingClusterInfo {
     // Upper limit on the difference between the width of the cluster's block containing all
     // text and that of a narrow child before the child becomes a separate cluster.
     float maxAllowedDifferenceFromTextWidth;
+
+    // Descendants of the cluster that are narrower than the block containing all text and must be
+    // processed together.
+    Vector<TextAutosizingClusterInfo> narrowDescendants;
 };
 
 
@@ -150,6 +156,12 @@ void TextAutosizer::processCluster(TextAutosizingClusterInfo& clusterInfo, Rende
     }
 
     processContainer(multiplier, container, clusterInfo, subtreeRoot, windowInfo);
+
+    Vector<TextAutosizingClusterInfo>& narrowDescendants = clusterInfo.narrowDescendants;
+    for (size_t i = 0; i < narrowDescendants.size(); ++i) {
+        TextAutosizingClusterInfo& descendantClusterInfo = narrowDescendants[i];
+        processCluster(descendantClusterInfo, descendantClusterInfo.root, descendantClusterInfo.root, windowInfo);
+    }
 }
 
 void TextAutosizer::processContainer(float multiplier, RenderBlock* container, TextAutosizingClusterInfo& clusterInfo, RenderObject* subtreeRoot, const TextAutosizingWindowInfo& windowInfo)
@@ -168,9 +180,13 @@ void TextAutosizer::processContainer(float multiplier, RenderBlock* container, T
             // FIXME: Increase list marker size proportionately.
         } else if (isAutosizingContainer(descendant)) {
             RenderBlock* descendantBlock = toRenderBlock(descendant);
-            if (isAutosizingCluster(descendantBlock, clusterInfo)) {
-                TextAutosizingClusterInfo descendantClusterInfo(descendantBlock);
+            TextAutosizingClusterInfo descendantClusterInfo(descendantBlock);
+            if (isWiderDescendant(descendantBlock, clusterInfo) || isIndependentDescendant(descendantBlock))
                 processCluster(descendantClusterInfo, descendantBlock, descendantBlock, windowInfo);
+            else if (isNarrowDescendant(descendantBlock, clusterInfo)) {
+                // Narrow descendants are processed together later to be able to apply the same multiplier
+                // to each of them if necessary.
+                clusterInfo.narrowDescendants.append(descendantClusterInfo);
             } else
                 processContainer(multiplier, descendantBlock, clusterInfo, descendantBlock, windowInfo);
         }