Remove notion of percentage intrinsic size: remove the single case that (incorrectly) sets percentage intrinsic sizes, and fix all of the tests that depend on our old incorrect behavior. (Bug 611099) r=dholbert

Needed to help CSS 2.1 meet Proposed Recommendation entrance criteria.
This commit is contained in:
L. David Baron 2011-06-12 18:52:32 -07:00
parent d69c8fdc7b
commit 2487c4de1e
24 changed files with 95 additions and 61 deletions

View File

@ -18,15 +18,15 @@
// <embed> elements. // <embed> elements.
// * FIRST TWO ROWS: <img> has width=auto height=auto // * FIRST TWO ROWS: <img> has width=auto height=auto
// - Each <img> renders w/ width = 10% * body_width = .1*600 = 60px // - Each <img> renders w/ width = 300px (default)
// - Synthesized viewBox has width = 10% * viewport_width = .1*60 = 6 // - Synthesized viewBox has width = 10% * viewport_width = .1*300 = 30
// - <img> & viewBox both get height=30px, from <svg> height attr // - <img> & viewBox both get height=30px, from <svg> height attr
svgParams.viewBox = [0, 0, 6, 30], svgParams.viewBox = [0, 0, 30, 30],
appendSVGSubArrayWithParams(svgParams, "embed", "60px", "30px"); appendSVGSubArrayWithParams(svgParams, "embed", "300px", "30px");
// * SECOND TWO ROWS: <img> has width=auto, height=20px // * SECOND TWO ROWS: <img> has width=auto, height=20px
// Calculations are as above, except <img> now imposes height="20px". // Calculations are as above, except <img> now imposes height="20px".
appendSVGSubArrayWithParams(svgParams, "embed", "60px", "20px"); appendSVGSubArrayWithParams(svgParams, "embed", "300px", "20px");
// * THIRD TWO ROWS: <img> has width=30px height=auto // * THIRD TWO ROWS: <img> has width=30px height=auto
// - <img> now renders w/ width = 30px (imposed by <img> width attr) // - <img> now renders w/ width = 30px (imposed by <img> width attr)

View File

@ -18,11 +18,11 @@
// <embed> elements. // <embed> elements.
// * FIRST TWO ROWS: <img> has width=auto height=auto // * FIRST TWO ROWS: <img> has width=auto height=auto
// - Each <img> renders w/ height = 20% * body_height = .2*600 = 120px // - Each <img> renders w/ height = 150px (default)
// - Synthesized viewBox has height = 20% * viewport_height = .2*120 = 24 // - Synthesized viewBox has height = 20% * viewport_height = .2*150 = 30
// - <img> & viewBox both get width=20px, from <svg> width attr // - <img> & viewBox both get width=20px, from <svg> width attr
svgParams.viewBox = [0, 0, 20, 24], svgParams.viewBox = [0, 0, 20, 30],
appendSVGSubArrayWithParams(svgParams, "embed", "20px", "120px"); appendSVGSubArrayWithParams(svgParams, "embed", "20px", "150px");
// * SECOND TWO ROWS: <img> has width=auto, height=20px // * SECOND TWO ROWS: <img> has width=auto, height=20px
// - <img> now renders w/ height = 20px (imposed by <img> height attr) // - <img> now renders w/ height = 20px (imposed by <img> height attr)
@ -34,8 +34,8 @@
// * THIRD TWO ROWS: <img> has width=30px height=auto // * THIRD TWO ROWS: <img> has width=30px height=auto
// Calculations are as with "FIRST TWO ROWS", except <img> now imposes // Calculations are as with "FIRST TWO ROWS", except <img> now imposes
// width="30px". // width="30px".
svgParams.viewBox = [0, 0, 20, 24], svgParams.viewBox = [0, 0, 20, 30],
appendSVGSubArrayWithParams(svgParams, "embed", "30px", "120px"); appendSVGSubArrayWithParams(svgParams, "embed", "30px", "150px");
// * FOURTH TWO ROWS: <img> has width=30px height=20px // * FOURTH TWO ROWS: <img> has width=30px height=20px
// Calculations are as with "SECOND TWO ROWS", except <img> now imposes // Calculations are as with "SECOND TWO ROWS", except <img> now imposes

View File

@ -14,6 +14,8 @@ function m() {
svg.style.position = 'absolute'; svg.style.position = 'absolute';
svg.style.left = '0px'; svg.style.left = '0px';
svg.style.top = '0px'; svg.style.top = '0px';
svg.style.width = '100%';
svg.style.height = '100%';
document.body.appendChild(svg); document.body.appendChild(svg);
var rect = document.createElementNS(SVG_NS, "rect"); var rect = document.createElementNS(SVG_NS, "rect");

View File

@ -22,7 +22,7 @@ html, body, div {
margin: 0; margin: 0;
width: 100%; width: 100%;
height: 100%; /* inline style override on the div below */ height: 100%; /* inline style override on the div below */
background: red; background: white;
overflow: hidden; overflow: hidden;
} }
@ -44,7 +44,7 @@ document.addEventListener("MozReftestInvalidate", resize_div, false);
<div style="height:50%;"> <div style="height:50%;">
<svg xmlns="http://www.w3.org/2000/svg" width="5000" height="100%"> <svg xmlns="http://www.w3.org/2000/svg" width="5000" height="100%">
<rect width="100%" height="100%" fill="lime"/> <rect width="100%" height="100%" fill="blue"/>
</svg> </svg>
</div> </div>

View File

@ -22,7 +22,7 @@ html, body, div {
margin: 0; margin: 0;
width: 100%; /* inline style override on the div below */ width: 100%; /* inline style override on the div below */
height: 100%; height: 100%;
background: red; background: white;
overflow: hidden; overflow: hidden;
} }
@ -44,7 +44,7 @@ document.addEventListener("MozReftestInvalidate", resize_div, false);
<div style="width:50%;"> <div style="width:50%;">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="5000"> <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="5000">
<rect width="100%" height="100%" fill="lime"/> <rect width="100%" height="100%" fill="blue"/>
</svg> </svg>
</div> </div>

View File

@ -10,10 +10,11 @@
<title>Test: width:auto; height:auto; width="49%" height="70px"</title> <title>Test: width:auto; height:auto; width="49%" height="70px"</title>
<!-- <!--
This testcase checks that the <object> element uses the intrinsic width and This testcase checks that the <object> element uses the intrinsic
height of the embedded SVG. Since the intrinsic width is 49% and the height of the embedded SVG, but ignores the percentage width. Since
intrinsic height is 70px, you should see a blue rectangle 49% wide by 70px the intrinsic height is 70px, you should see a blue rectangle 300px
high when viewing this file. You should not see any red. (the magic default) wide by 70px high when viewing this file. You
should not see any red.
--> -->
<style type="text/css"> <style type="text/css">

View File

@ -35,11 +35,11 @@ html, body {
<!-- div to expand parent div to a computed height of 20px --> <!-- div to expand parent div to a computed height of 20px -->
<div style="height:20px; background:red;"/> <div style="height:20px; background:red;"/>
<!-- absolutely positioned SVG - the implicity 100% percentage height <!-- absolutely positioned SVG - the explicit 100% percentage height
should compute as a percentage of the parent div's computed height, should compute as a percentage of the parent div's computed height,
not as a percentage of the body's height! I.e. no red should show. not as a percentage of the body's height! I.e. no red should show.
--> -->
<svg xmlns="http://www.w3.org/2000/svg" style="position:absolute; top:0;"> <svg xmlns="http://www.w3.org/2000/svg" style="position:absolute; top:0; width: 100%; height: 100%">
<rect width="100%" height="100%" fill="red"/> <rect width="100%" height="100%" fill="red"/>
<rect width="100%" height="20px" fill="lime"/> <rect width="100%" height="20px" fill="lime"/>
</svg> </svg>

View File

@ -26,7 +26,7 @@ div {
border: 1px solid blue; border: 1px solid blue;
margin: 50px; margin: 50px;
width: 0; width: 0;
height: 49%; height: 150px;
} }
</style> </style>

View File

@ -10,10 +10,11 @@
<title>Test: width:auto; height:auto; width="0" height="49%"</title> <title>Test: width:auto; height:auto; width="0" height="49%"</title>
<!-- <!--
This testcase checks that the <object> element uses the intrinsic width and This testcase checks that the <object> element uses the intrinsic
height of the embedded SVG. Since the intrinsic width is zero and the width of the embedded SVG but ignores the (percentage) height.
intrinsic height is 49%, you should see a 1px blue border around rectangle Since the intrinsic width is zero, you should see a 1px blue border
0px wide by 49% high when viewing this file. You should not see any red. around rectangle 0px wide by 150px high when viewing this file. You
should not see any red.
--> -->
<style type="text/css"> <style type="text/css">

View File

@ -25,7 +25,7 @@ div {
padding: 0; padding: 0;
border: 1px solid blue; border: 1px solid blue;
margin: 50px; margin: 50px;
width: 49%; width: 300px;
height: 0; height: 0;
} }

View File

@ -10,11 +10,11 @@
<title>Test: width:auto; height:auto; width="49%" height="0"</title> <title>Test: width:auto; height:auto; width="49%" height="0"</title>
<!-- <!--
This testcase checks that the <object> element uses the intrinsic width and This testcase checks that the <object> element uses the intrinsic
height of the embedded SVG. Since the intrinsic width is 49% and the height of the embedded SVG, but ignores the percentage intrinsic
intrinsic height is zero, you should see a 1px blue border around a width. Since the intrinsic height is zero, you should see a 1px blue
rectangle 49% wide by 0px high when viewing this file. You should not see border around a rectangle 300px wide by 0px high when viewing this
any red. file. You should not see any red.
--> -->
<style type="text/css"> <style type="text/css">

View File

@ -303,8 +303,10 @@ random-if(Android) == object--auto-auto--px-px.html object--auto-auto--px
== dynamic--inline-css-height.xhtml pass.svg == dynamic--inline-css-height.xhtml pass.svg
== dynamic--inline-css-width.xhtml pass.svg == dynamic--inline-css-width.xhtml pass.svg
== dynamic--inline-resize-cb-height.xhtml pass.svg # These two don't have a whole lot of point anymore now that the meaning
== dynamic--inline-resize-cb-width.xhtml pass.svg # of percentages has changed.
== dynamic--inline-resize-cb-height.xhtml standalone-sanity-height-150px.svg
== dynamic--inline-resize-cb-width.xhtml standalone-sanity-width-300px.svg
skip == dynamic--inline-resize-window-height.xhtml pass.svg # XXX breaks the reftest run as the window height somehow is not restored skip == dynamic--inline-resize-window-height.xhtml pass.svg # XXX breaks the reftest run as the window height somehow is not restored
skip == dynamic--inline-resize-window-width.xhtml pass.svg # Fails way too much skip == dynamic--inline-resize-window-width.xhtml pass.svg # Fails way too much
fails == dynamic--object-svg-unloaded.xhtml pass.svg fails == dynamic--object-svg-unloaded.xhtml pass.svg

View File

@ -9,7 +9,7 @@
<title>Test percentages dimensions for SVG inside a foreignObject</title> <title>Test percentages dimensions for SVG inside a foreignObject</title>
<foreignObject width="50%" height="50%"> <foreignObject width="50%" height="50%">
<svg xmlns="http://www.w3.org/2000/svg" width="50%" height="50%"> <svg xmlns="http://www.w3.org/2000/svg" style="width: 50%; height: 50%">
<ellipse cx="50%" cy="50%" rx="50%" ry="50%" fill="blue"/> <ellipse cx="50%" cy="50%" rx="50%" ry="50%" fill="blue"/>
</svg> </svg>
</foreignObject> </foreignObject>

Before

Width:  |  Height:  |  Size: 911 B

After

Width:  |  Height:  |  Size: 918 B

View File

@ -10,7 +10,7 @@
<foreignObject width="50%" height="50%"> <foreignObject width="50%" height="50%">
<div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;"> <div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;">
<svg xmlns="http://www.w3.org/2000/svg" width="50%" height="50%"> <svg xmlns="http://www.w3.org/2000/svg" style="width: 50%; height: 50%">
<ellipse cx="50%" cy="50%" rx="50%" ry="50%" fill="blue"/> <ellipse cx="50%" cy="50%" rx="50%" ry="50%" fill="blue"/>
</svg> </svg>
</div> </div>

Before

Width:  |  Height:  |  Size: 1009 B

After

Width:  |  Height:  |  Size: 1016 B

View File

@ -16,7 +16,7 @@
<div style="height:200px; width:100px;"/> <div style="height:200px; width:100px;"/>
<span class="unit" style="background:lime;"></span> <span class="unit" style="background:lime;"></span>
</span> </span>
<svg:svg height="0"> <svg:svg height="0" style="display: block">
<!-- use an empty g to force clipPath-html-06.xhtml to load before onload --> <!-- use an empty g to force clipPath-html-06.xhtml to load before onload -->
<svg:use xlink:href="clipPath-html-06.xhtml#empty" /> <svg:use xlink:href="clipPath-html-06.xhtml#empty" />
</svg:svg> </svg:svg>

View File

@ -17,7 +17,7 @@
<span class="unit" style="background:lime;"></span> <span class="unit" style="background:lime;"></span>
</span> </span>
<svg:svg height="0"> <svg:svg height="0" style="display: block">
<!-- so that other documents can svg:use this one and force it to <!-- so that other documents can svg:use this one and force it to
load before onload --> load before onload -->
<svg:g id="empty" /> <svg:g id="empty" />

View File

@ -7,7 +7,7 @@
<head> <head>
<title>Test that conditional processing attributes on outer 'svg' elements are honored</title> <title>Test that conditional processing attributes on outer 'svg' elements are honored</title>
<!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 --> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 -->
<style>svg { position: absolute; top: 0; left: 0 }</style> <style>svg { position: absolute; top: 0; left: 0; height: 100%; width: 100% }</style>
</head> </head>
<body> <body>

View File

@ -8,7 +8,7 @@
<head> <head>
<title>Test that using elements from conditional-failing outer 'svg' elements works</title> <title>Test that using elements from conditional-failing outer 'svg' elements works</title>
<!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 --> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 -->
<style>svg { position: absolute; top: 0; left: 0 }</style> <style>svg { position: absolute; top: 0; left: 0; height: 100%; width: 100% }</style>
</head> </head>
<body> <body>

View File

@ -7,7 +7,7 @@
<head> <head>
<title>Test that conditional processing attributes on outer 'svg' elements are honored</title> <title>Test that conditional processing attributes on outer 'svg' elements are honored</title>
<!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 --> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 -->
<style>svg { position: absolute; top: 0; left: 0 }</style> <style>svg { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style>
</head> </head>
<body onload="document.getElementById('a').setAttribute('requiredExtensions', 'x')"> <body onload="document.getElementById('a').setAttribute('requiredExtensions', 'x')">

View File

@ -7,7 +7,7 @@
<head> <head>
<title>Test that conditional processing attributes on outer 'svg' elements are honored</title> <title>Test that conditional processing attributes on outer 'svg' elements are honored</title>
<!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 --> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 -->
<style>svg { position: absolute; top: 0; left: 0 }</style> <style>svg { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style>
</head> </head>
<body onload="document.getElementById('a').removeAttribute('requiredExtensions')"> <body onload="document.getElementById('a').removeAttribute('requiredExtensions')">

View File

@ -7,7 +7,7 @@
<head> <head>
<title>Test that conditional processing attributes on outer 'svg' elements are honored</title> <title>Test that conditional processing attributes on outer 'svg' elements are honored</title>
<!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 --> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 -->
<style>svg { position: absolute; top: 0; left: 0 }</style> <style>svg { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style>
</head> </head>
<body onload="document.getElementById('a').setAttribute('requiredFeatures', 'x')"> <body onload="document.getElementById('a').setAttribute('requiredFeatures', 'x')">

View File

@ -7,7 +7,7 @@
<head> <head>
<title>Test that conditional processing attributes on outer 'svg' elements are honored</title> <title>Test that conditional processing attributes on outer 'svg' elements are honored</title>
<!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 --> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 -->
<style>svg { position: absolute; top: 0; left: 0 }</style> <style>svg { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style>
</head> </head>
<body onload="document.getElementById('a').setAttribute('requiredFeatures', 'http://www.w3.org/TR/SVG11/feature#Gradient')"> <body onload="document.getElementById('a').setAttribute('requiredFeatures', 'http://www.w3.org/TR/SVG11/feature#Gradient')">

View File

@ -248,21 +248,13 @@ nsSVGOuterSVGFrame::GetIntrinsicSize()
nsSVGLength2 &width = content->mLengthAttributes[nsSVGSVGElement::WIDTH]; nsSVGLength2 &width = content->mLengthAttributes[nsSVGSVGElement::WIDTH];
nsSVGLength2 &height = content->mLengthAttributes[nsSVGSVGElement::HEIGHT]; nsSVGLength2 &height = content->mLengthAttributes[nsSVGSVGElement::HEIGHT];
if (width.IsPercentage()) { if (!width.IsPercentage()) {
float val = width.GetAnimValInSpecifiedUnits() / 100.0f;
if (val < 0.0f) val = 0.0f;
intrinsicSize.width.SetPercentValue(val);
} else {
nscoord val = nsPresContext::CSSPixelsToAppUnits(width.GetAnimValue(content)); nscoord val = nsPresContext::CSSPixelsToAppUnits(width.GetAnimValue(content));
if (val < 0) val = 0; if (val < 0) val = 0;
intrinsicSize.width.SetCoordValue(val); intrinsicSize.width.SetCoordValue(val);
} }
if (height.IsPercentage()) { if (!height.IsPercentage()) {
float val = height.GetAnimValInSpecifiedUnits() / 100.0f;
if (val < 0.0f) val = 0.0f;
intrinsicSize.height.SetPercentValue(val);
} else {
nscoord val = nsPresContext::CSSPixelsToAppUnits(height.GetAnimValue(content)); nscoord val = nsPresContext::CSSPixelsToAppUnits(height.GetAnimValue(content));
if (val < 0) val = 0; if (val < 0) val = 0;
intrinsicSize.height.SetCoordValue(val); intrinsicSize.height.SetCoordValue(val);
@ -318,16 +310,52 @@ nsSVGOuterSVGFrame::ComputeSize(nsRenderingContext *aRenderingContext,
{ {
nsSVGSVGElement* content = static_cast<nsSVGSVGElement*>(mContent); nsSVGSVGElement* content = static_cast<nsSVGSVGElement*>(mContent);
if ((content->HasValidViewbox() || content->ShouldSynthesizeViewBox()) && IntrinsicSize intrinsicSize = GetIntrinsicSize();
(IsRootOfImage() || IsRootOfReplacedElementSubDoc())) {
// The embedding element has done the replaced element sizing, using our if (!mContent->GetParent()) {
// intrinsic dimensions as necessary. We just need to fill the viewport. if (IsRootOfImage() || IsRootOfReplacedElementSubDoc()) {
return aCBSize; // The embedding element has done the replaced element sizing,
// using our intrinsic dimensions as necessary. We just need to
// fill the viewport.
return aCBSize;
} else {
// We're the root of a browsing context, so we need to honor
// widths and heights in percentages. (GetIntrinsicSize() doesn't
// report these since there's no such thing as a percentage
// intrinsic size.)
nsSVGLength2 &width =
content->mLengthAttributes[nsSVGSVGElement::WIDTH];
if (width.IsPercentage()) {
NS_ABORT_IF_FALSE(intrinsicSize.width.GetUnit() == eStyleUnit_None,
"GetIntrinsicSize should have reported no "
"intrinsic width");
float val = width.GetAnimValInSpecifiedUnits() / 100.0f;
if (val < 0.0f) val = 0.0f;
intrinsicSize.width.SetCoordValue(val * aCBSize.width);
}
nsSVGLength2 &height =
content->mLengthAttributes[nsSVGSVGElement::HEIGHT];
NS_ABORT_IF_FALSE(aCBSize.height != NS_AUTOHEIGHT,
"root should not have auto-height containing block");
if (height.IsPercentage()) {
NS_ABORT_IF_FALSE(intrinsicSize.height.GetUnit() == eStyleUnit_None,
"GetIntrinsicSize should have reported no "
"intrinsic height");
float val = height.GetAnimValInSpecifiedUnits() / 100.0f;
if (val < 0.0f) val = 0.0f;
intrinsicSize.height.SetCoordValue(val * aCBSize.height);
}
NS_ABORT_IF_FALSE(intrinsicSize.height.GetUnit() == eStyleUnit_Coord &&
intrinsicSize.width.GetUnit() == eStyleUnit_Coord,
"We should have just handled the only situation where"
"we lack an intrinsic height or width.");
}
} }
return nsLayoutUtils::ComputeSizeWithIntrinsicDimensions( return nsLayoutUtils::ComputeSizeWithIntrinsicDimensions(
aRenderingContext, this, aRenderingContext, this,
GetIntrinsicSize(), GetIntrinsicRatio(), aCBSize, intrinsicSize, GetIntrinsicRatio(), aCBSize,
aMargin, aBorder, aPadding); aMargin, aBorder, aPadding);
} }

View File

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html style="width:100%;height:100%;margin:0;border:0;overflow:hidden"> <html style="width:100%;height:100%;margin:0;border:0;overflow:hidden">
<body style="width:100%;height:100%;margin:0;border:0;overflow:hidden"> <body style="width:100%;height:100%;margin:0;border:0;overflow:hidden">
<svg> <svg style="width:100%;height:100%">
<rect height="100%" width="100%" fill="red"/> <rect height="100%" width="100%" fill="red"/>
<foreignObject> <foreignObject>
<html> <html>