Text Autosizing: Increase line height in proportion to font size.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 17 Aug 2012 19:17:54 +0000 (19:17 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 17 Aug 2012 19:17:54 +0000 (19:17 +0000)
https://bugs.webkit.org/show_bug.cgi?id=91660

Patch by John Mellor <johnme@chromium.org> on 2012-08-17
Reviewed by Julien Chaffraix.

Source/WebCore:

This patch causes line heights to be increased in proportion to font
size (so autosized text doesn't overlap itself). It does this by adding
a textAutosizingMultiplier() to RenderStyle, which the lineHeight()
getter multiplies its response by.

It also cleans up one or two things, for example treatAsInline is
renamed isNotAnAutosizingContainer to clarify that its purpose is to
discriminate autosizing containers (the smallest unit that we can turn
Text Autosizing on or off for; in particular these are not allowed to
be line participants, since multiple sizes on one line looks awful).

Tests: fast/text-autosizing/em-margin-border-padding.html
       fast/text-autosizing/narrow-child.html
       fast/text-autosizing/nested-em-line-height.html
       fast/text-autosizing/simple-paragraph.html
       fast/text-autosizing/span-child.html
       fast/text-autosizing/wide-child.html

* css/StyleBuilder.cpp:
(WebCore::ApplyPropertyLineHeight::applyValue):

    Replaced Length(-100.0, Percent) with RenderStyle::initialLineHeight(),
    which is equivalent but makes the intent clearer.

(WebCore::ApplyPropertyLineHeight::createHandler):

    Use specifiedLineHeight to match setLineHeight which takes a specified
    line height (and generally this avoids accidentally inheriting text
    autosizing).

* css/StyleResolver.cpp:
(WebCore::StyleResolver::applyProperty):

    Similarly use specifiedLineHeight when inheriting line height.

* page/animation/CSSPropertyAnimation.cpp:
(WebCore::CSSPropertyAnimation::ensurePropertyMap):

    Get and set specified lineHeight/fontSize if Text Autosizing is
    enabled to avoid setting the specified value to the computed value
    (causing values to be multiplied more than once!).

* platform/blackberry/RenderThemeBlackBerry.cpp:
(WebCore::RenderThemeBlackBerry::adjustMediaControlStyle):

    Adjust for renamed setBlendedFontSize, and maintain cast to int.

* rendering/RenderTextControlSingleLine.cpp:
(WebCore::RenderTextControlSingleLine::createInnerTextStyle):

    Replaced Length(-100.0, Percent) with RenderStyle::initialLineHeight(),
    which is equivalent but makes the intent clearer.

* rendering/TextAutosizer.cpp:
(WebCore::TextAutosizer::processSubtree):

    Use nextInPreOrderMatchingFilter instead of traverseNext, and some
    other methods that got renamed.

(WebCore::TextAutosizer::processBox):

    Renamed from processBlock, since RenderBoxes are sufficient; use
    renamed nextInPreOrderMatchingFilter; make two calls to setMultiplier
    (one for parent for line height) instead of processText.

(WebCore::TextAutosizer::setMultiplier):

    Simplified from previous processText method; this just sets the
    style's textAutosizingMultiplier (and the style does the rest).

(WebCore::TextAutosizer::isNotAnAutosizingContainer):

    Renamed from treatAsInline; added explanatory comment; changed
    isRenderBlock to isBox as boxes still have logicalWidth; changed
    isInlineBlockOrInlineTable to isInline as it was an omission that
    other inlines were allowed.

(WebCore::TextAutosizer::nextInPreOrderMatchingFilter):

    Renamed from TextAutosizer::traverseNext.

(RenderObjectFilterFunctor):

    Renamed from RenderObjectFilter to clafiry that it's a function ptr.

* rendering/TextAutosizer.h:
(TextAutosizer): Previously mentioned renamings.

* rendering/mathml/RenderMathMLSubSup.cpp:
(WebCore::RenderMathMLSubSup::fixScriptsStyle):

    Adjust for renamed setBlendedFontSize.

* rendering/style/RenderStyle.cpp:
(WebCore::RenderStyle::diff):

    textAutosizingMultiplier is a StyleDifferenceLayout (we want
    setNeedsLayoutAndPrefWidthsRecalc to get called).

(WebCore::RenderStyle::setFontSize):

    Renamed from setBlendedFontSize; if Text Autosizing is enabled and a
    multiplier is set it auto-calculates the computedSize; float
    param instead of int as discussed on webkit.org/b/91660.

* rendering/style/RenderStyle.h:

    Added specifiedFontSize, computedFontSize and specifiedLineHeight
    getters; changed lineHeight to dynamically calculate autosized line
    height, and made computedLineHeight use this value instead of the
    specified line height; also added textAutosizingMultiplier
    getter/setter (the setter updated the font description's computed
    size, by calling setFontSize); also renamed the parameter to
    setLineHeight to explicitly note that it's setting the
    specifiedLineHeight (and can still be adjusted by autosizing).

* rendering/style/StyleVisualData.cpp/.h:

    Added m_textAutosizingMultiplier (this seems the best place to put a
    non-inherited non-rare presentational property).

LayoutTests:

Adjusted the expectation for simple-paragraph.html and
font-scale-factor.html now that line-height is correctly increased.
Also added 5 more tests making sure that autosized children of
non-autosized parents work correctly, and vice versa; that nested
inline elements behave correctly; and documenting the behavior of
margins, borders, and padding with em lengths.

* fast/text-autosizing/em-margin-border-padding-expected.html: Added.
* fast/text-autosizing/em-margin-border-padding.html: Copied from LayoutTests/fast/text-autosizing/simple-paragraph.html.
* fast/text-autosizing/font-scale-factor-expected.html:
* fast/text-autosizing/font-scale-factor.html:
* fast/text-autosizing/narrow-child-expected.html: Added.
* fast/text-autosizing/narrow-child.html: Copied from LayoutTests/fast/text-autosizing/simple-paragraph.html.
* fast/text-autosizing/nested-em-line-height-expected.html: Added.
* fast/text-autosizing/nested-em-line-height.html: Added.
* fast/text-autosizing/simple-paragraph-expected.html:
* fast/text-autosizing/simple-paragraph.html:
* fast/text-autosizing/span-child-expected.html: Added.
* fast/text-autosizing/span-child.html: Copied from LayoutTests/fast/text-autosizing/simple-paragraph.html.
* fast/text-autosizing/wide-child-expected.html: Added.
* fast/text-autosizing/wide-child.html: Copied from LayoutTests/fast/text-autosizing/simple-paragraph.html.

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

28 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/text-autosizing/em-margin-border-padding-expected.html [new file with mode: 0644]
LayoutTests/fast/text-autosizing/em-margin-border-padding.html [new file with mode: 0644]
LayoutTests/fast/text-autosizing/font-scale-factor-expected.html
LayoutTests/fast/text-autosizing/font-scale-factor.html
LayoutTests/fast/text-autosizing/narrow-child-expected.html [new file with mode: 0644]
LayoutTests/fast/text-autosizing/narrow-child.html [new file with mode: 0644]
LayoutTests/fast/text-autosizing/nested-em-line-height-expected.html [new file with mode: 0644]
LayoutTests/fast/text-autosizing/nested-em-line-height.html [new file with mode: 0644]
LayoutTests/fast/text-autosizing/simple-paragraph-expected.html
LayoutTests/fast/text-autosizing/simple-paragraph.html
LayoutTests/fast/text-autosizing/span-child-expected.html [new file with mode: 0644]
LayoutTests/fast/text-autosizing/span-child.html [new file with mode: 0644]
LayoutTests/fast/text-autosizing/wide-child-expected.html [new file with mode: 0644]
LayoutTests/fast/text-autosizing/wide-child.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/css/StyleBuilder.cpp
Source/WebCore/css/StyleResolver.cpp
Source/WebCore/page/animation/CSSPropertyAnimation.cpp
Source/WebCore/platform/blackberry/RenderThemeBlackBerry.cpp
Source/WebCore/rendering/RenderTextControlSingleLine.cpp
Source/WebCore/rendering/TextAutosizer.cpp
Source/WebCore/rendering/TextAutosizer.h
Source/WebCore/rendering/mathml/RenderMathMLSubSup.cpp
Source/WebCore/rendering/style/RenderStyle.cpp
Source/WebCore/rendering/style/RenderStyle.h
Source/WebCore/rendering/style/StyleVisualData.cpp
Source/WebCore/rendering/style/StyleVisualData.h

index 79e0dc4..609f73c 100644 (file)
@@ -1,3 +1,32 @@
+2012-08-17  John Mellor  <johnme@chromium.org>
+
+        Text Autosizing: Increase line height in proportion to font size.
+        https://bugs.webkit.org/show_bug.cgi?id=91660
+
+        Reviewed by Julien Chaffraix.
+
+        Adjusted the expectation for simple-paragraph.html and
+        font-scale-factor.html now that line-height is correctly increased.
+        Also added 5 more tests making sure that autosized children of
+        non-autosized parents work correctly, and vice versa; that nested
+        inline elements behave correctly; and documenting the behavior of
+        margins, borders, and padding with em lengths.
+
+        * fast/text-autosizing/em-margin-border-padding-expected.html: Added.
+        * fast/text-autosizing/em-margin-border-padding.html: Copied from LayoutTests/fast/text-autosizing/simple-paragraph.html.
+        * fast/text-autosizing/font-scale-factor-expected.html:
+        * fast/text-autosizing/font-scale-factor.html:
+        * fast/text-autosizing/narrow-child-expected.html: Added.
+        * fast/text-autosizing/narrow-child.html: Copied from LayoutTests/fast/text-autosizing/simple-paragraph.html.
+        * fast/text-autosizing/nested-em-line-height-expected.html: Added.
+        * fast/text-autosizing/nested-em-line-height.html: Added.
+        * fast/text-autosizing/simple-paragraph-expected.html:
+        * fast/text-autosizing/simple-paragraph.html:
+        * fast/text-autosizing/span-child-expected.html: Added.
+        * fast/text-autosizing/span-child.html: Copied from LayoutTests/fast/text-autosizing/simple-paragraph.html.
+        * fast/text-autosizing/wide-child-expected.html: Added.
+        * fast/text-autosizing/wide-child.html: Copied from LayoutTests/fast/text-autosizing/simple-paragraph.html.
+
 2012-08-17  Zan Dobersek  <zandobersek@gmail.com>
 
         Unreviewed GTK gardening.
diff --git a/LayoutTests/fast/text-autosizing/em-margin-border-padding-expected.html b/LayoutTests/fast/text-autosizing/em-margin-border-padding-expected.html
new file mode 100644 (file)
index 0000000..9bb798d
--- /dev/null
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+
+<meta name="viewport" content="width=800">
+<style type="text/css">
+body { width: 800px; margin: 0; }
+</style>
+
+</head>
+<body>
+
+<!-- Note that em margins, borders and padding do not get scaled in proportion
+     to the font size. While unusual, this probably looks more consistent. -->
+<p style="font-size: 2.375rem; margin: 1rem; border: 1rem solid blue; padding: 1rem">
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+</p>
+
+</body>
+</html>
diff --git a/LayoutTests/fast/text-autosizing/em-margin-border-padding.html b/LayoutTests/fast/text-autosizing/em-margin-border-padding.html
new file mode 100644 (file)
index 0000000..6d9a9f7
--- /dev/null
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+
+<meta name="viewport" content="width=800">
+<style type="text/css">
+body { width: 800px; margin: 0; }
+</style>
+
+<script type="text/javascript">
+if (window.internals) {
+    window.internals.settings.setTextAutosizingEnabled(true);
+    window.internals.settings.setTextAutosizingWindowSizeOverride(320, 480);
+} else if (window.console && console.warn) {
+    console.warn("This test depends on the Text Autosizing setting being true, so run it in DumpRenderTree, or manually enable Text Autosizing, and either use a mobile device with 320px device-width (like Nexus S or iPhone), or define HACK_FORCE_TEXT_AUTOSIZING_ON_DESKTOP.");
+}
+</script>
+
+</head>
+<body>
+
+<p style="margin: 1em; border: 1em solid blue; padding: 1em">
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+</p>
+
+</body>
+</html>
index a804ed1..53ba031 100644 (file)
@@ -1,3 +1,4 @@
+<!DOCTYPE html>
 <html>
   <head>
     <meta name="viewport" content="width=800" />
@@ -9,7 +10,6 @@
     </style>
   </head>
   <body>
-    <!-- FIXME: The line-height and margin-top shouldn't need to be changed here. The margins are a bug. See http://wkbug.com/91660. -->
-    <p style="font-size: 5rem; line-height: 0.30; margin: 2.20rem 0 1rem 0">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sapien sapien, tempus id egestas a, consectetur et felis. Ut pharetra mi eget lectus laoreet rutrum. Mauris tellus odio, egestas vitae sodales in, vehicula eget ante. Pellentesque id egestas arcu. Quisque tellus quam, rhoncus ac elementum vel, volutpat vel felis. Aliquam ut leo dolor, eget egestas tellus. Nunc ut velit gravida nisl fringilla rutrum eget at arcu. Vivamus et pretium mauris.</p>
+    <div style="font-size: 5rem">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sapien sapien, tempus id egestas a, consectetur et felis. Ut pharetra mi eget lectus laoreet rutrum. Mauris tellus odio, egestas vitae sodales in, vehicula eget ante. Pellentesque id egestas arcu. Quisque tellus quam, rhoncus ac elementum vel, volutpat vel felis. Aliquam ut leo dolor, eget egestas tellus. Nunc ut velit gravida nisl fringilla rutrum eget at arcu. Vivamus et pretium mauris.</div>
   </body>
 </html>
index 2975d1f..1d5c88e 100644 (file)
@@ -1,3 +1,4 @@
+<!DOCTYPE html>
 <html>
   <head>
     <meta name="viewport" content="width=800" />
@@ -18,7 +19,6 @@
     </script>
   </head>
   <body>
-    <!-- FIXME: The line-height and margin-top shouldn't need to be changed here. See http://wkbug.com/91660. -->
-    <p style="line-height: 1.5">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sapien sapien, tempus id egestas a, consectetur et felis. Ut pharetra mi eget lectus laoreet rutrum. Mauris tellus odio, egestas vitae sodales in, vehicula eget ante. Pellentesque id egestas arcu. Quisque tellus quam, rhoncus ac elementum vel, volutpat vel felis. Aliquam ut leo dolor, eget egestas tellus. Nunc ut velit gravida nisl fringilla rutrum eget at arcu. Vivamus et pretium mauris.</p>
+    <div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sapien sapien, tempus id egestas a, consectetur et felis. Ut pharetra mi eget lectus laoreet rutrum. Mauris tellus odio, egestas vitae sodales in, vehicula eget ante. Pellentesque id egestas arcu. Quisque tellus quam, rhoncus ac elementum vel, volutpat vel felis. Aliquam ut leo dolor, eget egestas tellus. Nunc ut velit gravida nisl fringilla rutrum eget at arcu. Vivamus et pretium mauris.</div>
   </body>
 </html>
diff --git a/LayoutTests/fast/text-autosizing/narrow-child-expected.html b/LayoutTests/fast/text-autosizing/narrow-child-expected.html
new file mode 100644 (file)
index 0000000..00cf42c
--- /dev/null
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+
+<meta name="viewport" content="width=800">
+<style type="text/css">
+body { width: 800px; margin: 0; }
+</style>
+
+</head>
+<body>
+
+<div style="font-size: 2.5rem">
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    <div style="width: 320px; font-size: 1rem">
+        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    </div>
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/LayoutTests/fast/text-autosizing/narrow-child.html b/LayoutTests/fast/text-autosizing/narrow-child.html
new file mode 100644 (file)
index 0000000..f206019
--- /dev/null
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+
+<meta name="viewport" content="width=800">
+<style type="text/css">
+body { width: 800px; margin: 0; }
+</style>
+
+<script type="text/javascript">
+if (window.internals) {
+    window.internals.settings.setTextAutosizingEnabled(true);
+    window.internals.settings.setTextAutosizingWindowSizeOverride(320, 480);
+} else if (window.console && console.warn) {
+    console.warn("This test depends on the Text Autosizing setting being true, so run it in DumpRenderTree, or manually enable Text Autosizing, and either use a mobile device with 320px device-width (like Nexus S or iPhone), or define HACK_FORCE_TEXT_AUTOSIZING_ON_DESKTOP.");
+}
+</script>
+
+</head>
+<body>
+
+<div>
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    <div style="width: 320px">
+        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    </div>
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/LayoutTests/fast/text-autosizing/nested-em-line-height-expected.html b/LayoutTests/fast/text-autosizing/nested-em-line-height-expected.html
new file mode 100644 (file)
index 0000000..3ac08cd
--- /dev/null
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+
+<meta name="viewport" content="width=800">
+<style type="text/css">
+body { width: 800px; margin: 0; }
+</style>
+
+</head>
+<body>
+
+<div style="font-size: 2.5rem; line-height: 1">
+       Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+       <b>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</b>
+       Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+       <b><i>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</i></b>
+       Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/LayoutTests/fast/text-autosizing/nested-em-line-height.html b/LayoutTests/fast/text-autosizing/nested-em-line-height.html
new file mode 100644 (file)
index 0000000..03b89f7
--- /dev/null
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+
+<meta name="viewport" content="width=800">
+<style type="text/css">
+body { width: 800px; margin: 0; }
+</style>
+
+<script type="text/javascript">
+if (window.internals) {
+    window.internals.settings.setTextAutosizingEnabled(true);
+    window.internals.settings.setTextAutosizingWindowSizeOverride(320, 480);
+} else if (window.console && console.warn) {
+    console.warn("This test depends on the Text Autosizing setting being true, so run it in DumpRenderTree, or manually enable Text Autosizing, and either use a mobile device with 320px device-width (like Nexus S or iPhone), or define HACK_FORCE_TEXT_AUTOSIZING_ON_DESKTOP.");
+}
+</script>
+
+</head>
+<body>
+
+<div style="line-height: 1em">
+       Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+       <b>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</b>
+       Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+       <b><i>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</i></b>
+       Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+</div>
+
+</body>
+</html>
\ No newline at end of file
index 21cb9e2..e777d23 100644 (file)
@@ -1,3 +1,4 @@
+<!DOCTYPE html>
 <html>
 <head>
 
@@ -9,8 +10,9 @@ body { width: 800px; margin: 0; }
 </head>
 <body>
 
-<!-- The font-size change is intentional; the line-height change is a known FIXME; the margin-top change is a bug -->
-<p style="font-size: 2.5rem; line-height: 0.6; margin-top: 0.8rem">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sapien sapien, tempus id egestas a, consectetur et felis. Ut pharetra mi eget lectus laoreet rutrum. Mauris tellus odio, egestas vitae sodales in, vehicula eget ante. Pellentesque id egestas arcu. Quisque tellus quam, rhoncus ac elementum vel, volutpat vel felis. Aliquam ut leo dolor, eget egestas tellus. Nunc ut velit gravida nisl fringilla rutrum eget at arcu. Vivamus et pretium mauris.</p>
+<div style="font-size: 2.5rem">
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+</div>
 
 </body>
 </html>
index 7080d46..f328c94 100644 (file)
@@ -1,3 +1,4 @@
+<!DOCTYPE html>
 <html>
 <head>
 
@@ -18,7 +19,9 @@ if (window.internals) {
 </head>
 <body>
 
-<p style="line-height: 1.5">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sapien sapien, tempus id egestas a, consectetur et felis. Ut pharetra mi eget lectus laoreet rutrum. Mauris tellus odio, egestas vitae sodales in, vehicula eget ante. Pellentesque id egestas arcu. Quisque tellus quam, rhoncus ac elementum vel, volutpat vel felis. Aliquam ut leo dolor, eget egestas tellus. Nunc ut velit gravida nisl fringilla rutrum eget at arcu. Vivamus et pretium mauris.</p>
+<div>
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+</div>
 
 </body>
 </html>
diff --git a/LayoutTests/fast/text-autosizing/span-child-expected.html b/LayoutTests/fast/text-autosizing/span-child-expected.html
new file mode 100644 (file)
index 0000000..32a856c
--- /dev/null
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+
+<meta name="viewport" content="width=800">
+<style type="text/css">
+body { width: 800px; margin: 0; }
+</style>
+
+</head>
+<body>
+
+<div style="font-size: 2.5rem">
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    <span>
+        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    </span>
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/LayoutTests/fast/text-autosizing/span-child.html b/LayoutTests/fast/text-autosizing/span-child.html
new file mode 100644 (file)
index 0000000..baf98a5
--- /dev/null
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+
+<meta name="viewport" content="width=800">
+<style type="text/css">
+body { width: 800px; margin: 0; }
+</style>
+
+<script type="text/javascript">
+if (window.internals) {
+    window.internals.settings.setTextAutosizingEnabled(true);
+    window.internals.settings.setTextAutosizingWindowSizeOverride(320, 480);
+} else if (window.console && console.warn) {
+    console.warn("This test depends on the Text Autosizing setting being true, so run it in DumpRenderTree, or manually enable Text Autosizing, and either use a mobile device with 320px device-width (like Nexus S or iPhone), or define HACK_FORCE_TEXT_AUTOSIZING_ON_DESKTOP.");
+}
+</script>
+
+</head>
+<body>
+
+<div>
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    <span>
+        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    </span>
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/LayoutTests/fast/text-autosizing/wide-child-expected.html b/LayoutTests/fast/text-autosizing/wide-child-expected.html
new file mode 100644 (file)
index 0000000..529facd
--- /dev/null
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+
+<meta name="viewport" content="width=800">
+<style type="text/css">
+body { width: 800px; margin: 0; }
+</style>
+
+</head>
+<body>
+
+<div style="width: 320px">
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    <div style="width: 800px; font-size: 2.5rem">
+        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    </div>
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/LayoutTests/fast/text-autosizing/wide-child.html b/LayoutTests/fast/text-autosizing/wide-child.html
new file mode 100644 (file)
index 0000000..5c1d788
--- /dev/null
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+
+<meta name="viewport" content="width=800">
+<style type="text/css">
+body { width: 800px; margin: 0; }
+</style>
+
+<script type="text/javascript">
+if (window.internals) {
+    window.internals.settings.setTextAutosizingEnabled(true);
+    window.internals.settings.setTextAutosizingWindowSizeOverride(320, 480);
+} else if (window.console && console.warn) {
+    console.warn("This test depends on the Text Autosizing setting being true, so run it in DumpRenderTree, or manually enable Text Autosizing, and either use a mobile device with 320px device-width (like Nexus S or iPhone), or define HACK_FORCE_TEXT_AUTOSIZING_ON_DESKTOP.");
+}
+</script>
+
+</head>
+<body>
+
+<div style="width: 320px">
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    <div style="width: 800px">
+        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+    </div>
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+</div>
+
+</body>
+</html>
\ No newline at end of file
index 4bc897f..2ed4ca9 100644 (file)
@@ -1,3 +1,131 @@
+2012-08-17  John Mellor  <johnme@chromium.org>
+
+        Text Autosizing: Increase line height in proportion to font size.
+        https://bugs.webkit.org/show_bug.cgi?id=91660
+
+        Reviewed by Julien Chaffraix.
+
+        This patch causes line heights to be increased in proportion to font
+        size (so autosized text doesn't overlap itself). It does this by adding
+        a textAutosizingMultiplier() to RenderStyle, which the lineHeight()
+        getter multiplies its response by.
+
+        It also cleans up one or two things, for example treatAsInline is
+        renamed isNotAnAutosizingContainer to clarify that its purpose is to
+        discriminate autosizing containers (the smallest unit that we can turn
+        Text Autosizing on or off for; in particular these are not allowed to
+        be line participants, since multiple sizes on one line looks awful).
+
+        Tests: fast/text-autosizing/em-margin-border-padding.html
+               fast/text-autosizing/narrow-child.html
+               fast/text-autosizing/nested-em-line-height.html
+               fast/text-autosizing/simple-paragraph.html
+               fast/text-autosizing/span-child.html
+               fast/text-autosizing/wide-child.html
+
+        * css/StyleBuilder.cpp:
+        (WebCore::ApplyPropertyLineHeight::applyValue):
+
+            Replaced Length(-100.0, Percent) with RenderStyle::initialLineHeight(),
+            which is equivalent but makes the intent clearer.
+
+        (WebCore::ApplyPropertyLineHeight::createHandler):
+
+            Use specifiedLineHeight to match setLineHeight which takes a specified
+            line height (and generally this avoids accidentally inheriting text
+            autosizing).
+
+        * css/StyleResolver.cpp:
+        (WebCore::StyleResolver::applyProperty):
+
+            Similarly use specifiedLineHeight when inheriting line height.
+
+        * page/animation/CSSPropertyAnimation.cpp:
+        (WebCore::CSSPropertyAnimation::ensurePropertyMap):
+
+            Get and set specified lineHeight/fontSize if Text Autosizing is
+            enabled to avoid setting the specified value to the computed value
+            (causing values to be multiplied more than once!).
+
+        * platform/blackberry/RenderThemeBlackBerry.cpp:
+        (WebCore::RenderThemeBlackBerry::adjustMediaControlStyle):
+
+            Adjust for renamed setBlendedFontSize, and maintain cast to int.
+
+        * rendering/RenderTextControlSingleLine.cpp:
+        (WebCore::RenderTextControlSingleLine::createInnerTextStyle):
+
+            Replaced Length(-100.0, Percent) with RenderStyle::initialLineHeight(),
+            which is equivalent but makes the intent clearer.
+
+        * rendering/TextAutosizer.cpp:
+        (WebCore::TextAutosizer::processSubtree):
+
+            Use nextInPreOrderMatchingFilter instead of traverseNext, and some
+            other methods that got renamed.
+
+        (WebCore::TextAutosizer::processBox):
+
+            Renamed from processBlock, since RenderBoxes are sufficient; use
+            renamed nextInPreOrderMatchingFilter; make two calls to setMultiplier
+            (one for parent for line height) instead of processText.
+
+        (WebCore::TextAutosizer::setMultiplier):
+
+            Simplified from previous processText method; this just sets the
+            style's textAutosizingMultiplier (and the style does the rest).
+
+        (WebCore::TextAutosizer::isNotAnAutosizingContainer):
+
+            Renamed from treatAsInline; added explanatory comment; changed
+            isRenderBlock to isBox as boxes still have logicalWidth; changed
+            isInlineBlockOrInlineTable to isInline as it was an omission that
+            other inlines were allowed.
+
+        (WebCore::TextAutosizer::nextInPreOrderMatchingFilter):
+
+            Renamed from TextAutosizer::traverseNext.
+
+        (RenderObjectFilterFunctor):
+
+            Renamed from RenderObjectFilter to clafiry that it's a function ptr.
+
+        * rendering/TextAutosizer.h:
+        (TextAutosizer): Previously mentioned renamings.
+
+        * rendering/mathml/RenderMathMLSubSup.cpp:
+        (WebCore::RenderMathMLSubSup::fixScriptsStyle):
+
+            Adjust for renamed setBlendedFontSize.
+
+        * rendering/style/RenderStyle.cpp:
+        (WebCore::RenderStyle::diff):
+
+            textAutosizingMultiplier is a StyleDifferenceLayout (we want
+            setNeedsLayoutAndPrefWidthsRecalc to get called).
+
+        (WebCore::RenderStyle::setFontSize):
+
+            Renamed from setBlendedFontSize; if Text Autosizing is enabled and a
+            multiplier is set it auto-calculates the computedSize; float
+            param instead of int as discussed on webkit.org/b/91660.
+
+        * rendering/style/RenderStyle.h:
+
+            Added specifiedFontSize, computedFontSize and specifiedLineHeight
+            getters; changed lineHeight to dynamically calculate autosized line
+            height, and made computedLineHeight use this value instead of the
+            specified line height; also added textAutosizingMultiplier
+            getter/setter (the setter updated the font description's computed
+            size, by calling setFontSize); also renamed the parameter to
+            setLineHeight to explicitly note that it's setting the
+            specifiedLineHeight (and can still be adjusted by autosizing).
+
+        * rendering/style/StyleVisualData.cpp/.h:
+
+            Added m_textAutosizingMultiplier (this seems the best place to put a
+            non-inherited non-rare presentational property).
+
 2012-08-17  Raphael Kubo da Costa  <rakuco@webkit.org>
 
         [CMake] Add FindDBus.cmake and use it in the EFL port.
index f0e1b65..ea17324 100644 (file)
@@ -1211,7 +1211,7 @@ public:
         Length lineHeight;
 
         if (primitiveValue->getIdent() == CSSValueNormal)
-            lineHeight = Length(-100.0, Percent);
+            lineHeight = RenderStyle::initialLineHeight();
         else if (primitiveValue->isLength()) {
             double multiplier = styleResolver->style()->effectiveZoom();
             if (styleResolver->style()->textSizeAdjust()) {
@@ -1233,7 +1233,7 @@ public:
     }
     static PropertyHandler createHandler()
     {
-        PropertyHandler handler = ApplyPropertyDefaultBase<Length, &RenderStyle::lineHeight, Length, &RenderStyle::setLineHeight, Length, &RenderStyle::initialLineHeight>::createHandler();
+        PropertyHandler handler = ApplyPropertyDefaultBase<Length, &RenderStyle::specifiedLineHeight, Length, &RenderStyle::setLineHeight, Length, &RenderStyle::initialLineHeight>::createHandler();
         return PropertyHandler(handler.inheritFunction(), handler.initialFunction(), &applyValue);
     }
 };
index 2a6b049..a65fd45 100644 (file)
@@ -3669,7 +3669,7 @@ void StyleResolver::applyProperty(CSSPropertyID id, CSSValue* value)
     case CSSPropertyFont:
         if (isInherit) {
             FontDescription fontDescription = m_parentStyle->fontDescription();
-            m_style->setLineHeight(m_parentStyle->lineHeight());
+            m_style->setLineHeight(m_parentStyle->specifiedLineHeight());
             m_lineHeightValue = 0;
             setFontDescription(fontDescription);
         } else if (isInitial) {
index 45b90a3..f2a81cb 100644 (file)
@@ -1087,7 +1087,16 @@ void CSSPropertyAnimation::ensurePropertyMap()
     gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyWebkitMaskPositionY, &RenderStyle::maskLayers, &RenderStyle::accessMaskLayers));
     gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyWebkitMaskSize, &RenderStyle::maskLayers, &RenderStyle::accessMaskLayers));
 
-    gPropertyWrappers->append(new PropertyWrapper<int>(CSSPropertyFontSize, &RenderStyle::fontSize, &RenderStyle::setBlendedFontSize));
+    gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyFontSize,
+        // Must pass a specified size to setFontSize if Text Autosizing is enabled, but a computed size
+        // if text zoom is enabled (if neither is enabled it's irrelevant as they're probably the same).
+        // FIXME: Find some way to assert that text zoom isn't activated when Text Autosizing is compiled in.
+#if ENABLE(TEXT_AUTOSIZING)
+        &RenderStyle::specifiedFontSize,
+#else
+        &RenderStyle::computedFontSize,
+#endif
+        &RenderStyle::setFontSize));
     gPropertyWrappers->append(new PropertyWrapper<unsigned short>(CSSPropertyWebkitColumnRuleWidth, &RenderStyle::columnRuleWidth, &RenderStyle::setColumnRuleWidth));
     gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyWebkitColumnGap, &RenderStyle::columnGap, &RenderStyle::setColumnGap));
     gPropertyWrappers->append(new PropertyWrapper<unsigned short>(CSSPropertyWebkitColumnCount, &RenderStyle::columnCount, &RenderStyle::setColumnCount));
@@ -1095,7 +1104,7 @@ void CSSPropertyAnimation::ensurePropertyMap()
     gPropertyWrappers->append(new PropertyWrapper<short>(CSSPropertyWebkitBorderHorizontalSpacing, &RenderStyle::horizontalBorderSpacing, &RenderStyle::setHorizontalBorderSpacing));
     gPropertyWrappers->append(new PropertyWrapper<short>(CSSPropertyWebkitBorderVerticalSpacing, &RenderStyle::verticalBorderSpacing, &RenderStyle::setVerticalBorderSpacing));
     gPropertyWrappers->append(new PropertyWrapper<int>(CSSPropertyZIndex, &RenderStyle::zIndex, &RenderStyle::setZIndex));
-    gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyLineHeight, &RenderStyle::lineHeight, &RenderStyle::setLineHeight));
+    gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyLineHeight, &RenderStyle::specifiedLineHeight, &RenderStyle::setLineHeight));
     gPropertyWrappers->append(new PropertyWrapper<int>(CSSPropertyOutlineOffset, &RenderStyle::outlineOffset, &RenderStyle::setOutlineOffset));
     gPropertyWrappers->append(new PropertyWrapper<unsigned short>(CSSPropertyOutlineWidth, &RenderStyle::outlineWidth, &RenderStyle::setOutlineWidth));
     gPropertyWrappers->append(new PropertyWrapper<int>(CSSPropertyLetterSpacing, &RenderStyle::letterSpacing, &RenderStyle::setLetterSpacing));
index 85b2e17..3bbb231 100644 (file)
@@ -788,7 +788,7 @@ void RenderThemeBlackBerry::adjustMediaControlStyle(StyleResolver*, RenderStyle*
         style->setWidth(timeWidth);
         style->setHeight(controlsHeight);
         style->setPaddingRight(padding);
-        style->setBlendedFontSize(fontSize);
+        style->setFontSize(static_cast<int>(fontSize));
         break;
     case MediaVolumeSliderContainerPart:
         style->setWidth(controlsHeight);
index 312cb83..665af32 100644 (file)
@@ -351,7 +351,7 @@ PassRefPtr<RenderStyle> RenderTextControlSingleLine::createInnerTextStyle(const
         textBlockStyle->setHeight(Length(m_desiredInnerTextHeight, Fixed));
     // Do not allow line-height to be smaller than our default.
     if (textBlockStyle->fontMetrics().lineSpacing() > lineHeight(true, HorizontalLine, PositionOfInteriorLineBoxes))
-        textBlockStyle->setLineHeight(Length(-100.0f, Percent));
+        textBlockStyle->setLineHeight(RenderStyle::initialLineHeight());
 
     textBlockStyle->setDisplay(BLOCK);
 
index 82399c7..95b3e29 100644 (file)
@@ -27,6 +27,7 @@
 #include "Document.h"
 #include "InspectorInstrumentation.h"
 #include "RenderObject.h"
+#include "RenderStyle.h"
 #include "RenderText.h"
 #include "RenderView.h"
 #include "Settings.h"
@@ -56,68 +57,63 @@ bool TextAutosizer::processSubtree(RenderObject* layoutRoot)
         windowSize = mainFrame->view()->visibleContentRect(includeScrollbars).size(); // FIXME: Check that this is always in logical (density-independent) pixels (see wkbug.com/87440).
     }
 
-    for (RenderObject* descendant = traverseNext(layoutRoot, layoutRoot); descendant; descendant = traverseNext(descendant, layoutRoot)) {
-        if (!treatAsInline(descendant))
-            processBlock(toRenderBlock(descendant), windowSize);
+    for (RenderObject* descendant = layoutRoot->nextInPreOrder(layoutRoot); descendant; descendant = descendant->nextInPreOrder(layoutRoot)) {
+        if (isNotAnAutosizingContainer(descendant))
+            continue;
+        processBox(toRenderBox(descendant), windowSize);
     }
 
     return true;
 }
 
-void TextAutosizer::processBlock(RenderBlock* block, const IntSize& windowSize)
+void TextAutosizer::processBox(RenderBox* box, const IntSize& windowSize)
 {
-    int windowLogicalWidth = block->isHorizontalWritingMode() ? windowSize.width() : windowSize.height();
-    float multiplier = static_cast<float>(block->logicalWidth()) / windowLogicalWidth; // FIXME: This is overly simplistic.
+    int windowLogicalWidth = box->isHorizontalWritingMode() ? windowSize.width() : windowSize.height();
+    float multiplier = static_cast<float>(box->logicalWidth()) / windowLogicalWidth; // FIXME: This is overly simplistic.
     multiplier *= m_document->settings()->textAutosizingFontScaleFactor();
 
     if (multiplier < 1)
         return;
-    for (RenderObject* descendant = traverseNext(block, block, treatAsInline); descendant; descendant = traverseNext(descendant, block, treatAsInline)) {
-        if (descendant->isText())
-            processText(toRenderText(descendant), multiplier);
+    RenderObject* descendant = nextInPreOrderMatchingFilter(box, box, isNotAnAutosizingContainer);
+    while (descendant) {
+        if (descendant->isText()) {
+            setMultiplier(descendant, multiplier);
+            setMultiplier(descendant->parent(), multiplier); // Parent does line spacing.
+            // FIXME: Increase list marker size proportionately.
+        }
+        descendant = nextInPreOrderMatchingFilter(descendant, box, isNotAnAutosizingContainer);
     }
 }
 
-void TextAutosizer::processText(RenderText* text, float multiplier)
+void TextAutosizer::setMultiplier(RenderObject* renderer, float multiplier)
 {
-    float specifiedSize = text->style()->fontDescription().specifiedSize();
-    float newSize = specifiedSize * multiplier; // FIXME: This is overly simplistic.
-
-    RefPtr<RenderStyle> style = RenderStyle::clone(text->style());
-    FontDescription fontDescription(style->fontDescription());
-    fontDescription.setComputedSize(newSize);
-    style->setFontDescription(fontDescription);
-    style->font().update(style->font().fontSelector());
-    text->setStyle(style.release());
-
-    // FIXME: Increase computed line height proportionately.
-    // FIXME: Increase list marker size proportionately.
+    RefPtr<RenderStyle> newStyle = RenderStyle::clone(renderer->style());
+    newStyle->setTextAutosizingMultiplier(multiplier);
+    renderer->setStyle(newStyle.release());
 }
 
-bool TextAutosizer::treatAsInline(const RenderObject* renderer)
+bool TextAutosizer::isNotAnAutosizingContainer(const RenderObject* renderer)
 {
-    return !renderer->isRenderBlock() || renderer->isListItem() || renderer->isInlineBlockOrInlineTable();
+    // "Autosizing containers" are the smallest unit for which we can enable/disable
+    // Text Autosizing. A uniform text size multiplier is enforced within them.
+    // - Must be RenderBoxes since they need a well-defined logicalWidth().
+    // - Must not be inline, as different multipliers on one line looks terrible.
+    // - Must not be list items, as items in the same list should look consistent.
+    return !renderer->isBox() || renderer->isInline() || renderer->isListItem();
 }
 
-// FIXME: Consider making this a method on RenderObject if it remains this generic.
-RenderObject* TextAutosizer::traverseNext(RenderObject* current, const RenderObject* stayWithin, RenderObjectFilter filter)
+RenderObject* TextAutosizer::nextInPreOrderMatchingFilter(RenderObject* current, const RenderObject* stayWithin, RenderObjectFilterFunctor filter)
 {
-    for (RenderObject* child = current->firstChild(); child; child = child->nextSibling()) {
-        if (!filter || filter(child)) {
-            ASSERT(!stayWithin || child->isDescendantOf(stayWithin));
+    for (RenderObject* child = current->firstChild(); child; child = child->nextSibling())
+        if (filter(child))
             return child;
-        }
-    }
 
-    for (RenderObject* ancestor = current; ancestor; ancestor = ancestor->parent()) {
+    for (const RenderObject* ancestor = current; ancestor; ancestor = ancestor->parent()) {
         if (ancestor == stayWithin)
             return 0;
-        for (RenderObject* sibling = ancestor->nextSibling(); sibling; sibling = sibling->nextSibling()) {
-            if (!filter || filter(sibling)) {
-                ASSERT(!stayWithin || sibling->isDescendantOf(stayWithin));
+        for (RenderObject* sibling = ancestor->nextSibling(); sibling; sibling = sibling->nextSibling())
+            if (filter(sibling))
                 return sibling;
-            }
-        }
     }
 
     return 0;
index f5e14cf..4b0bc4a 100644 (file)
@@ -36,7 +36,7 @@
 namespace WebCore {
 
 class Document;
-class RenderBlock;
+class RenderBox;
 class RenderObject;
 class RenderStyle;
 class RenderText;
@@ -54,13 +54,14 @@ public:
 private:
     explicit TextAutosizer(Document*);
 
-    void processBlock(RenderBlock*, const IntSize& windowSize);
-    void processText(RenderText*, float multiplier);
+    void processBox(RenderBox*, const IntSize& windowSize);
+    void setMultiplier(RenderObject*, float);
 
-    typedef bool (*RenderObjectFilter)(const RenderObject*);
-    static bool treatAsInline(const RenderObject*);
+    static bool isNotAnAutosizingContainer(const RenderObject*);
 
-    RenderObject* traverseNext(RenderObject* current, const RenderObject* stayWithin, RenderObjectFilter = 0);
+    typedef bool (*RenderObjectFilterFunctor)(const RenderObject*);
+    // Use to traverse the tree of descendants, excluding any subtrees within that whose root doesn't pass the filter.
+    static RenderObject* nextInPreOrderMatchingFilter(RenderObject* current, const RenderObject* stayWithin, RenderObjectFilterFunctor);
 
     Document* m_document;
 };
index d8dab71..dd0261d 100644 (file)
@@ -71,7 +71,7 @@ void RenderMathMLSubSup::fixScriptsStyle()
     scriptsStyle->setMarginLeft(Length(gSubsupScriptMargin, Fixed));
     scriptsStyle->setTextAlign(LEFT);
     // Set this wrapper's font-size for its line-height & baseline position, for its children.
-    scriptsStyle->setBlendedFontSize(static_cast<int>(0.75 * style()->fontSize()));
+    scriptsStyle->setFontSize(static_cast<int>(0.75 * style()->fontSize()));
 }
 
 void RenderMathMLSubSup::addChild(RenderObject* child, RenderObject* beforeChild)
index b24692e..5b4c3b9 100644 (file)
@@ -488,6 +488,11 @@ StyleDifference RenderStyle::diff(const RenderStyle* other, unsigned& changedCon
             return StyleDifferenceLayout;
     }
 
+#if ENABLE(TEXT_AUTOSIZING)
+    if (visual->m_textAutosizingMultiplier != other->visual->m_textAutosizingMultiplier)
+        return StyleDifferenceLayout;
+#endif
+
     if (inherited->line_height != other->inherited->line_height
         || inherited->list_style_image != other->inherited->list_style_image
         || inherited->font != other->inherited->font
@@ -1184,6 +1189,8 @@ const Animation* RenderStyle::transitionForProperty(CSSPropertyID property) cons
 const Font& RenderStyle::font() const { return inherited->font; }
 const FontMetrics& RenderStyle::fontMetrics() const { return inherited->font.fontMetrics(); }
 const FontDescription& RenderStyle::fontDescription() const { return inherited->font.fontDescription(); }
+float RenderStyle::specifiedFontSize() const { return fontDescription().specifiedSize(); }
+float RenderStyle::computedFontSize() const { return fontDescription().computedSize(); }
 int RenderStyle::fontSize() const { return inherited->font.pixelSize(); }
 
 int RenderStyle::wordSpacing() const { return inherited->font.wordSpacing(); }
@@ -1198,12 +1205,26 @@ bool RenderStyle::setFontDescription(const FontDescription& v)
     return false;
 }
 
-Length RenderStyle::lineHeight() const { return inherited->line_height; }
-void RenderStyle::setLineHeight(Length v) { SET_VAR(inherited, line_height, v); }
+Length RenderStyle::specifiedLineHeight() const { return inherited->line_height; }
+Length RenderStyle::lineHeight() const
+{
+    const Length& lh = inherited->line_height;
+#if ENABLE(TEXT_AUTOSIZING)
+    // Unlike fontDescription().computedSize() and hence fontSize(), this is
+    // recalculated on demand as we only store the specified line height.
+    // FIXME: Should consider scaling the fixed part of any calc expressions
+    // too, though this involves messily poking into CalcExpressionLength.
+    float multiplier = textAutosizingMultiplier();
+    if (multiplier > 1 && lh.isFixed())
+        return Length(lh.value() * multiplier, Fixed);
+#endif
+    return lh;
+}
+void RenderStyle::setLineHeight(Length specifiedLineHeight) { SET_VAR(inherited, line_height, specifiedLineHeight); }
 
 int RenderStyle::computedLineHeight(RenderView* renderView) const
 {
-    const Length& lh = inherited->line_height;
+    const Length& lh = lineHeight();
 
     // Negative value means the line height is not set. Use the font's built-in spacing.
     if (lh.isNegative())
@@ -1221,12 +1242,24 @@ int RenderStyle::computedLineHeight(RenderView* renderView) const
 void RenderStyle::setWordSpacing(int v) { inherited.access()->font.setWordSpacing(v); }
 void RenderStyle::setLetterSpacing(int v) { inherited.access()->font.setLetterSpacing(v); }
 
-void RenderStyle::setBlendedFontSize(int size)
+void RenderStyle::setFontSize(float size)
 {
+    // size must be specifiedSize if Text Autosizing is enabled, but computedSize if text
+    // zoom is enabled (if neither is enabled it's irrelevant as they're probably the same).
+
     FontSelector* currentFontSelector = font().fontSelector();
     FontDescription desc(fontDescription());
     desc.setSpecifiedSize(size);
     desc.setComputedSize(size);
+
+#if ENABLE(TEXT_AUTOSIZING)
+    float multiplier = textAutosizingMultiplier();
+    if (multiplier > 1) {
+        // FIXME: Large font sizes needn't be multiplied as much since they are already more legible.
+        desc.setComputedSize(size * multiplier);
+    }
+#endif
+
     setFontDescription(desc);
     font().update(currentFontSelector);
 }
index 30ebbc8..808f2ef 100644 (file)
@@ -597,8 +597,14 @@ public:
     const Font& font() const;
     const FontMetrics& fontMetrics() const;
     const FontDescription& fontDescription() const;
+    float specifiedFontSize() const;
+    float computedFontSize() const;
     int fontSize() const;
 
+#if ENABLE(TEXT_AUTOSIZING)
+    float textAutosizingMultiplier() const { return visual->m_textAutosizingMultiplier; }
+#endif
+
     Length textIndent() const { return rareInheritedData->indent; }
     ETextAlign textAlign() const { return static_cast<ETextAlign>(inherited_flags._text_align); }
     ETextTransform textTransform() const { return static_cast<ETextTransform>(inherited_flags._text_transform); }
@@ -613,6 +619,7 @@ public:
     TextDirection direction() const { return static_cast<TextDirection>(inherited_flags._direction); }
     bool isLeftToRightDirection() const { return direction() == LTR; }
 
+    Length specifiedLineHeight() const;
     Length lineHeight() const;
     int computedLineHeight(RenderView* = 0) const;
 
@@ -1102,9 +1109,16 @@ public:
     void setTableLayout(ETableLayout v) { noninherited_flags._table_layout = v; }
 
     bool setFontDescription(const FontDescription&);
+    // Only used for blending font sizes when animating, for MathML anonymous blocks, and for text autosizing.
+    void setFontSize(float);
 
-    // Only used for blending font sizes when animating, or MathML anonymous blocks.
-    void setBlendedFontSize(int);
+#if ENABLE(TEXT_AUTOSIZING)
+    void setTextAutosizingMultiplier(float v)
+    {
+        SET_VAR(visual, m_textAutosizingMultiplier, v)
+        setFontSize(fontDescription().specifiedSize());
+    }
+#endif
 
     void setColor(const Color&);
     void setTextIndent(Length v) { SET_VAR(rareInheritedData, indent, v) }
@@ -1114,7 +1128,7 @@ public:
     void setTextDecorationsInEffect(ETextDecoration v) { inherited_flags._text_decorations = v; }
     void setTextDecoration(ETextDecoration v) { SET_VAR(visual, textDecoration, v); }
     void setDirection(TextDirection v) { inherited_flags._direction = v; }
-    void setLineHeight(Length);
+    void setLineHeight(Length specifiedLineHeight);
     bool setZoom(float);
     void setZoomWithoutReturnValue(float f) { setZoom(f); }
     bool setEffectiveZoom(float);
index 14996c9..628a20a 100644 (file)
@@ -29,6 +29,9 @@ namespace WebCore {
 StyleVisualData::StyleVisualData()
     : hasClip(false)
     , textDecoration(RenderStyle::initialTextDecoration())
+#if ENABLE(TEXT_AUTOSIZING)
+    , m_textAutosizingMultiplier(1)
+#endif
     , m_zoom(RenderStyle::initialZoom())
 {
 }
@@ -42,6 +45,9 @@ StyleVisualData::StyleVisualData(const StyleVisualData& o)
     , clip(o.clip)
     , hasClip(o.hasClip)
     , textDecoration(o.textDecoration)
+#if ENABLE(TEXT_AUTOSIZING)
+    , m_textAutosizingMultiplier(o.m_textAutosizingMultiplier)
+#endif
     , m_zoom(RenderStyle::initialZoom())
 {
 }
index 1affdb0..b5140a7 100644 (file)
@@ -40,17 +40,23 @@ public:
 
     bool operator==(const StyleVisualData& o) const
     {
-        return ( clip == o.clip &&
-                 hasClip == o.hasClip &&
-                 textDecoration == o.textDecoration &&
-                 m_zoom == o.m_zoom);
+        return clip == o.clip
+            && hasClip == o.hasClip
+            && textDecoration == o.textDecoration
+#if ENABLE(TEXT_AUTOSIZING)
+            && m_textAutosizingMultiplier == o.m_textAutosizingMultiplier
+#endif
+            && m_zoom == o.m_zoom;
     }
     bool operator!=(const StyleVisualData& o) const { return !(*this == o); }
 
     LengthBox clip;
     bool hasClip : 1;
     unsigned textDecoration : ETextDecorationBits; // Text decorations defined *only* by this element.
-    
+
+#if ENABLE(TEXT_AUTOSIZING)
+    float m_textAutosizingMultiplier;
+#endif
     float m_zoom;
 
 private: