Bug 1429625 - Remove decimal places handling and unused methods from numberbox binding. r=Paolo draft
authorTim Nguyen <ntim.bugs@gmail.com>
Tue, 23 Jan 2018 12:32:37 +0000
changeset 723511 800f7f1727ebc58f5354b5d549c3b8de465e039a
parent 723510 94472d41963d1ce2d76b18965f7b0064fc75fbb7
child 746876 c5cfa1c32849c76e7cf0e882abd37dc13b4f6481
push id96447
push userbmo:ntim.bugs@gmail.com
push dateTue, 23 Jan 2018 12:33:10 +0000
reviewersPaolo
bugs1429625
milestone60.0a1
Bug 1429625 - Remove decimal places handling and unused methods from numberbox binding. r=Paolo MozReview-Commit-ID: 7KTqAD0BYr5
toolkit/content/tests/chrome/test_textbox_number.xul
toolkit/content/widgets/numberbox.xml
--- a/toolkit/content/tests/chrome/test_textbox_number.xul
+++ b/toolkit/content/tests/chrome/test_textbox_number.xul
@@ -9,27 +9,21 @@
   <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>  
   <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>  
 
 <hbox>
   <textbox id="n1" type="number" size="4"/>
   <textbox id="n2" type="number" value="10" min="5" max="15"/>
 </hbox>
 <hbox>
-  <textbox id="n3" type="number" size="4" value="25" min="1" max="12" increment="3"/>
-</hbox>
-<hbox>
   <textbox id="n4" type="number" size="4" value="-2" min="-8" max="18"/>
   <textbox id="n5" type="number" value="-17" min="-10" max="-3"/>
 </hbox>
 <hbox>
   <textbox id="n6" type="number" size="4" value="9" min="12" max="8"/>
-</hbox>
-<hbox>
-  <textbox id="n7" type="number" size="4" value="4.678" min="2" max="10.5" decimalplaces="2"/>
   <textbox id="n8" type="number" hidespinbuttons="true"/>
 </hbox>
 <hbox>
   <textbox id="n9" type="number" size="4" oninput="updateInputEventCount();"/>
 </hbox>
 
   <!-- test results are displayed in the html:body -->
   <body xmlns="http://www.w3.org/1999/xhtml" style="height: 300px; overflow: auto;"/>
@@ -39,131 +33,73 @@
 SimpleTest.waitForExplicitFinish();
 
 // ---- NOTE: the numbers used in these tests are carefully chosen to avoid
 // ----       floating point rounding issues
 
 function doTests() {
   var n1 = $("n1");
   var n2 = $("n2");
-  var n3 = $("n3");
   var n4 = $("n4");
   var n5 = $("n5");
   var n6 = $("n6");
-  var n7 = $("n7");
 
   testValsMinMax(n1, "initial n1", 0, 0, Infinity);
   testValsMinMax(n2, "initial n2", 10, 5, 15);
-  testValsMinMax(n3, "initial n3", 12, 1, 12);
   testValsMinMax(n4, "initial n4", -2, -8, 18);
   testValsMinMax(n5, "initial n5", -10, -10, -3);
   testValsMinMax(n6, "initial n6", 12, 12, 12);
-  testValsMinMax(n7, "initial n7", 4.68, 2, 10.5); // value should be rounded
 
   ok(n1.spinButtons != null && n1.spinButtons.localName == "spinbuttons", "spinButtons set");
-  isnot(n1.decimalSymbol, "", "n1.decimalSymbol is set to something");
-  n1.decimalSymbol = ".";
-  SimpleTest.is(n1.decimalSymbol, ".", "n1.decimalSymbol set to '.'");
-  SimpleTest.is(n1.increment, 1, "increment defaults to 1");
-  SimpleTest.is(n1.decimalPlaces, 0, "decimalPlaces defaults to 0");
-
-  SimpleTest.is(n3.increment, 3, "increment when set to 1");
-  SimpleTest.is(n7.decimalPlaces, 2, "decimalPlaces when set to 2");
 
   // test changing the value
   n1.value = "1700";
   testVals(n1, "set value,", 1700);
   n1.value = 1600;
   testVals(n1, "set value int,", 1600);
   n2.value = "2";
   testVals(n2, "set value below min,", 5);
   n2.value = 2;
   testVals(n2, "set value below min int,", 5);
   n2.value = 18;
   testVals(n2, "set value above max,", 15);
   n2.value = -6;
   testVals(n2, "set value below min negative,", 5);
   n5.value = -2;
   testVals(n5, "set value above max positive,", -3);
-  n7.value = 5.999;
-  testVals(n7, "set value to decimal,", 6, "6.00");
-  n7.value = "1.42";
-  testVals(n7, "set value to decimal below min,", 2.00, "2.00");
-  n7.value = 24.1;
-  testVals(n7, "set value to decimal above max,", 10.5, "10.50");
   n1.value = 4.75;
   testVals(n1, "set value to decimal round,", 5);
 
   // test changing the valueNumber
   n1.valueNumber = 27;
   testVals(n1, "set valueNumber,", 27);
   n2.valueNumber = 1;
   testVals(n2, "set valueNumber below min,", 5);
   n2.valueNumber = 77;
   testVals(n2, "set valueNumber above max,", 15);
   n2.valueNumber = -5;
   testVals(n2, "set valueNumber below min negative,", 5);
   n5.valueNumber = -8;
   n5.valueNumber = -1;
   testVals(n5, "set valueNumber above max positive,", -3);
-  n7.valueNumber = 8.23;
-  testVals(n7, "set valueNumber to decimal,", 8.23);
-  n7.valueNumber = 0.77;
-  testVals(n7, "set valueNumber to decimal below min,", 2.00, "2.00");
-  n7.valueNumber = 29.157;
-  testVals(n7, "set valueNumber to decimal above max,", 10.5, "10.50");
   n1.value = 8.9;
   testVals(n1, "set valueNumber to decimal round,", 9);
 
   // test changing the min
   n1.value = 6;
   n1.min = 8;
   testValsMinMax(n1, "set integer min,", 8, 8, Infinity);
-  n7.value = 5.5;
-  n7.min = 6.7;
-  testValsMinMax(n7, "set decimal min,", 6.7, 6.7, 10.5, "6.70");
 
   // test changing the max
   n1.value = 25;
   n1.max = 22;
   testValsMinMax(n1, "set integer max,", 22, 8, 22);
-  n7.value = 10.2;
-  n7.max = 10.1;
-  testValsMinMax(n7, "set decimal max,", 10.1, 6.7, 10.1, "10.10");
 
-  // test decrease() and increase() methods
+  // test increase and decrease via the keyboard and the spinbuttons
   testIncreaseDecrease(n1, "integer", 1, 0, 8, 22);
-  testIncreaseDecrease(n7, "decimal", 1, 2, 6.7, 10.1);
-  testIncreaseDecrease(n3, "integer with increment", 3, 0, 1, 12);
-
-  n7.min = 2.7;
-  n7.value = 10.1;
-  n7.increment = 4.3;
-  SimpleTest.is(n7.increment, 4.3, "increment changed");
-  testIncreaseDecrease(n7, "integer with increment", 4.3, 2, 2.7, 10.1);
-
-  n1.value = 22;
-  n1.decimalPlaces = 3;
-  testVals(n1, "set decimalPlaces 3", 22, "22.000");
-  n1.value = 10.624;
-  testVals(n1, "set decimalPlaces 3 set value,", 10.624);
-  n1.decimalPlaces = 0;
-  testVals(n1, "set decimalPlaces 0 set value,", 11);
-  n1.decimalPlaces = Infinity;
-  n1.value = 10.678123;
-  testVals(n1, "set decimalPlaces Infinity set value,", 10.678123);
-
-  n1.decimalSymbol = ",";
-  SimpleTest.is(n1.decimalSymbol, ",", "n1.decimalSymbol set to ','");
-  n1.value = "9.67";
-  testVals(n1, "set decimalPlaces set value,", 9.67);
-
-  n1.decimalSymbol = ".";
-  SimpleTest.is(n1.decimalSymbol, ".", "n1.decimalSymbol set back to '.'");
-  n1.decimalPlaces = 0;
 
   // UI tests
   n1.min = 5;
   n1.max = 15;
   n1.value = 5;
   n1.focus();
 
   var sb = n1.spinButtons;
@@ -251,46 +187,29 @@ function updateInputEventCount() {
 };
 
 function testVals(nb, name, valueNumber, valueFieldNumber) {
   if (valueFieldNumber === undefined)
     valueFieldNumber = "" + valueNumber;
 
   SimpleTest.is(nb.value, "" + valueNumber, name + " value is '" + valueNumber + "'");
   SimpleTest.is(nb.valueNumber, valueNumber, name + " valueNumber is " + valueNumber);
-
-  // This value format depends on the localized decimal symbol.
-  var localizedValue = valueFieldNumber.replace(/\./, nb.decimalSymbol);
-  SimpleTest.is(nb.inputField.value, localizedValue,
-      name + " inputField value is '" + localizedValue + "'");
+  SimpleTest.is(nb.inputField.value, valueFieldNumber,
+      name + " inputField value is '" + valueFieldNumber + "'");
 }
 
 function testValsMinMax(nb, name, valueNumber, min, max, valueFieldNumber) {
   testVals(nb, name, valueNumber, valueFieldNumber);
   SimpleTest.is(nb.min, min, name + " min is " + min);
   SimpleTest.is(nb.max, max, name + " max is " + max);
 }
 
-function testIncreaseDecrease(nb, testid, increment, fixedCount, min, max)
-{
+function testIncreaseDecrease(nb, testid, increment, fixedCount, min, max) {
   testid += " ";
 
-  nb.value = max;
-  nb.decrease();
-  testVals(nb, testid + "decrease method", max - increment,
-           (max - increment).toFixed(fixedCount));
-  nb.increase();
-  testVals(nb, testid + "increase method", max, max.toFixed(fixedCount));
-  nb.value = min;
-  nb.decrease();
-  testVals(nb, testid + "decrease method at min", min, min.toFixed(fixedCount));
-  nb.value = max;
-  nb.increase();
-  testVals(nb, testid + "increase method at max", max, max.toFixed(fixedCount));
-
   nb.focus();
   nb.value = min;
 
   // pressing the cursor up and down keys should adjust the value
   synthesizeKeyExpectEvent("VK_UP", { }, nb, "change", testid + "key up");
   is(nb.value, String(min + increment), testid + "key up");
   nb.value = max;
   synthesizeKeyExpectEvent("VK_UP", { }, nb, "!change", testid + "key up at max");
--- a/toolkit/content/widgets/numberbox.xml
+++ b/toolkit/content/widgets/numberbox.xml
@@ -24,17 +24,16 @@
       </xul:hbox>
       <xul:spinbuttons anonid="buttons" xbl:inherits="disabled,hidden=hidespinbuttons"/>
     </content>
 
     <implementation>
       <field name="_valueEntered">false</field>
       <field name="_spinButtons">null</field>
       <field name="_value">0</field>
-      <field name="decimalSymbol">"."</field>
 
       <property name="spinButtons" readonly="true">
         <getter>
           <![CDATA[
             if (!this._spinButtons)
               this._spinButtons = document.getAnonymousElementByAttribute(this, "anonid", "buttons");
             return this._spinButtons;
           ]]>
@@ -43,37 +42,36 @@
 
       <property name="value" onget="return '' + this.valueNumber"
                              onset="return this.valueNumber = val;"/>
 
       <property name="valueNumber">
         <getter>
           if (this._valueEntered) {
             var newval = this.inputField.value;
-            newval = newval.replace(this.decimalSymbol, ".");
-            this._validateValue(newval, false);
+            this._validateValue(newval);
           }
           return this._value;
         </getter>
         <setter>
-          this._validateValue(val, false);
+          this._validateValue(val);
           return val;
         </setter>
       </property>
       <property name="min">
         <getter>
           var min = this.getAttribute("min");
           return min ? Number(min) : 0;
         </getter>
         <setter>
         <![CDATA[
           if (typeof val == "number") {
             this.setAttribute("min", val);
             if (this.valueNumber < val)
-              this._validateValue(val, false);
+              this._validateValue(val);
           }
           return val;
         ]]>
         </setter>
       </property>
 
       <property name="max">
         <getter>
@@ -84,82 +82,42 @@
         <![CDATA[
           if (typeof val != "number")
             return val;
           var min = this.min;
           if (val < min)
             val = min;
           this.setAttribute("max", val);
           if (this.valueNumber > val)
-            this._validateValue(val, false);
+            this._validateValue(val);
           return val;
         ]]>
         </setter>
       </property>
 
-      <property name="decimalPlaces">
-        <getter>
-          var places = this.getAttribute("decimalplaces");
-          return places ? Number(places) : 0;
-        </getter>
-        <setter>
-          if (typeof val == "number") {
-            this.setAttribute("decimalplaces", val);
-            this._validateValue(this.valueNumber, false);
-          }
-          return val;
-        </setter>
-      </property>
-
-      <property name="increment">
-        <getter>
-          var increment = this.getAttribute("increment");
-          return increment ? Number(increment) : 1;
-        </getter>
-        <setter>
-        <![CDATA[
-          if (typeof val == "number")
-            this.setAttribute("increment", val);
-          return val;
-        ]]>
-        </setter>
-      </property>
-
-      <method name="decrease">
-        <body>
-          return this._validateValue(this.valueNumber - this.increment, true);
-        </body>
-      </method>
-
-      <method name="increase">
-        <body>
-          return this._validateValue(this.valueNumber + this.increment, true);
-        </body>
-      </method>
-
       <method name="_modifyUp">
         <body>
           <![CDATA[
             if (this.disabled || this.readOnly)
               return;
             var oldval = this.valueNumber;
-            var newval = this.increase();
+            var newval = this._validateValue(this.valueNumber + 1);
             this.inputField.select();
             if (oldval != newval)
               this._fireChange();
           ]]>
         </body>
       </method>
       <method name="_modifyDown">
         <body>
           <![CDATA[
             if (this.disabled || this.readOnly)
               return;
             var oldval = this.valueNumber;
-            var newval = this.decrease();
+            var newval = this._validateValue(this.valueNumber - 1);
             this.inputField.select();
             if (oldval != newval)
               this._fireChange();
           ]]>
         </body>
       </method>
 
       <method name="_enableDisableButtons">
@@ -173,34 +131,31 @@
               buttons.increaseDisabled = (this.valueNumber >= this.max);
             }
           ]]>
         </body>
       </method>
 
       <method name="_validateValue">
         <parameter name="aValue"/>
-        <parameter name="aIsIncDec"/>
         <body>
           <![CDATA[
             aValue = Number(aValue) || 0;
+            aValue = Math.round(aValue);
 
             var min = this.min;
             var max = this.max;
             if (aValue < min)
               aValue = min;
             else if (aValue > max)
               aValue = max;
 
-            var places = this.decimalPlaces;
-            aValue = (places == Infinity) ? "" + aValue : aValue.toFixed(places);
-
             this._valueEntered = false;
             this._value = Number(aValue);
-            this.inputField.value = aValue.replace(/\./, this.decimalSymbol);
+            this.inputField.value = aValue;
 
             this._enableDisableButtons();
 
             return aValue;
           ]]>
         </body>
       </method>
 
@@ -211,39 +166,30 @@
           this.dispatchEvent(evt);
         </body>
       </method>
 
       <constructor><![CDATA[
         if (this.max < this.min)
           this.max = this.min;
 
-        var dsymbol = (Number(5.4)).toLocaleString().match(/\D/);
-        if (dsymbol != null)
-          this.decimalSymbol = dsymbol[0];
-
         var value = this.inputField.value || 0;
-        this._validateValue(value, false);
+        this._validateValue(value);
       ]]></constructor>
 
     </implementation>
 
     <handlers>
       <handler event="input" phase="capturing">
         this._valueEntered = true;
       </handler>
 
       <handler event="keypress">
         <![CDATA[
           if (!event.ctrlKey && !event.metaKey && !event.altKey && event.charCode) {
-            if (event.charCode == this.decimalSymbol.charCodeAt(0) &&
-                this.decimalPlaces &&
-                String(this.inputField.value).indexOf(this.decimalSymbol) == -1)
-              return;
-
             if (event.charCode == 45 && this.min < 0)
               return;
 
             if (event.charCode < 48 || event.charCode > 57)
               event.preventDefault();
           }
         ]]>
       </handler>
@@ -262,17 +208,16 @@
 
       <handler event="down" preventdefault="true">
         this._modifyDown();
       </handler>
 
       <handler event="change">
         if (event.originalTarget == this.inputField) {
           var newval = this.inputField.value;
-          newval = newval.replace(this.decimalSymbol, ".");
-          this._validateValue(newval, false);
+          this._validateValue(newval);
         }
       </handler>
     </handlers>
 
   </binding>
 
 </bindings>