Fix a few more issues with eSyleUnit_Chars in computed style.
Bug 391221, r+sr+a=dbaron
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -3005,17 +3005,17 @@ nsComputedDOMStyle::SetValueToCoord(nsRO
nsCOMPtr<nsIRenderingContext> cx;
nsIFrame* frame = mPresShell->FrameManager()->GetRootFrame();
if (frame) {
mPresShell->CreateRenderingContext(frame, getter_AddRefs(cx));
}
if (cx) {
nscoord val =
nsLayoutUtils::CharsToCoord(aCoord, cx, mStyleContextHolder);
- aValue->SetAppUnits(PR_MAX(aMinAppUnits, val));
+ aValue->SetAppUnits(PR_MAX(aMinAppUnits, PR_MIN(val, aMaxAppUnits)));
} else {
// Oh, well. Give up.
aValue->SetAppUnits(0);
}
break;
}
case eStyleUnit_None:
@@ -3032,16 +3032,31 @@ nscoord
nsComputedDOMStyle::StyleCoordToNSCoord(const nsStyleCoord& aCoord,
PercentageBaseGetter aPercentageBaseGetter,
nscoord aDefaultValue)
{
NS_PRECONDITION(aPercentageBaseGetter, "Must have a percentage base getter");
switch (aCoord.GetUnit()) {
case eStyleUnit_Coord:
return aCoord.GetCoordValue();
+ case eStyleUnit_Chars:
+ {
+ // Get a rendering context
+ nsCOMPtr<nsIRenderingContext> cx;
+ nsIFrame* frame = mPresShell->FrameManager()->GetRootFrame();
+ if (frame) {
+ mPresShell->CreateRenderingContext(frame, getter_AddRefs(cx));
+ }
+ if (!cx) {
+ // Return the default value, I guess
+ break;
+ }
+
+ return nsLayoutUtils::CharsToCoord(aCoord, cx, mStyleContextHolder);
+ }
case eStyleUnit_Percent:
{
nscoord percentageBase;
if ((this->*aPercentageBaseGetter)(percentageBase)) {
return nscoord(aCoord.GetPercentValue() * percentageBase);
}
}
// Fall through to returning aDefaultValue if we have no percentage base.
--- a/layout/style/test/Makefile.in
+++ b/layout/style/test/Makefile.in
@@ -75,16 +75,17 @@ css_properties.js: host_ListCSSPropertie
test_bug372770.html \
test_bug373293.html \
test_bug377947.html \
test_bug379440.html \
test_bug379741.html \
test_bug383075.html \
test_bug387615.html \
test_bug389464.html \
+ test_bug391221.html \
test_compute_data_with_start_struct.html \
test_dont_use_document_colors.html \
test_inherit_storage.html \
test_inherit_computation.html \
test_initial_storage.html \
test_initial_computation.html \
test_property_database.html \
test_property_syntax_errors.html \
new file mode 100644
--- /dev/null
+++ b/layout/style/test/test_bug391221.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=391221
+-->
+<head>
+ <title>Test for Bug 391221</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=391221">Mozilla Bug 391221</a>
+<p id="display">
+ <div id="width-ref" style="width: 2ch"></div>
+</p>
+<div id="content" style="display: none">
+
+<div id="one" style="width: 1000px; max-width: 2ch"></div>
+<div id="two" style="width: 0px; min-width: 2ch"></div>
+<div id="three" style="width: 1000ch; max-width: 2px"></div>
+
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+/** Test for Bug 391221 **/
+function getComp(id) {
+ return document.defaultView.getComputedStyle($(id), "");
+}
+
+is(getComp("one").width, getComp("width-ref").width,
+ "max-width in ch units not working?");
+
+is(getComp("two").width, getComp("width-ref").width,
+ "min-width in ch units not working?");
+
+is(getComp("three").width, "2px", "max-width not applied to width in chars?");
+
+</script>
+</pre>
+</body>
+</html>
+