Fix a few more issues with eSyleUnit_Chars in computed style. Bug 391221, r+sr+a=dbaron
authorbzbarsky@mit.edu
Tue, 14 Aug 2007 11:44:39 -0700
changeset 4635 a7d638b7fd01d46cf39dd003fb7de1301f3803db
parent 4634 2d672cdfda149d4d34cf4e9c14ac94cbc9e69047
child 4636 6b0556ae518fff01781d9dd9e420ba7029df7e18
push idunknown
push userunknown
push dateunknown
bugs391221
milestone1.9a8pre
Fix a few more issues with eSyleUnit_Chars in computed style. Bug 391221, r+sr+a=dbaron
layout/style/nsComputedDOMStyle.cpp
layout/style/test/Makefile.in
layout/style/test/test_bug391221.html
--- 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>
+