Bug 1275546 - Use CSS lexer to parse angle values in css-angle.js . r=nchevobbe
MozReview-Commit-ID: DVqlbrruf2b
--- a/devtools/client/shared/css-angle.js
+++ b/devtools/client/shared/css-angle.js
@@ -5,16 +5,18 @@
"use strict";
const SPECIALVALUES = new Set([
"initial",
"inherit",
"unset"
]);
+const {getCSSLexer} = require("devtools/shared/css-lexer");
+
/**
* This module is used to convert between various angle units.
*
* Usage:
* let {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
* let {angleUtils} = require("devtools/client/shared/css-angle");
* let angle = new angleUtils.CssAngle("180deg");
*
@@ -61,17 +63,22 @@ CssAngle.prototype = {
return this._angleUnit;
},
set angleUnit(unit) {
this._angleUnit = unit;
},
get valid() {
- return /^-?\d+\.?\d*(deg|rad|grad|turn)$/gi.test(this.authored);
+ let token = getCSSLexer(this.authored).nextToken();
+ if (!token) {
+ return false;
+ }
+ return (token.tokenType === "dimension"
+ && token.text.toLowerCase() in CssAngle.ANGLEUNIT);
},
get specialValue() {
return SPECIALVALUES.has(this.lowerCased) ? this.authored : null;
},
get deg() {
let invalidOrSpecialValue = this._getInvalidOrSpecialValue();
--- a/devtools/client/shared/output-parser.js
+++ b/devtools/client/shared/output-parser.js
@@ -151,17 +151,17 @@ OutputParser.prototype = {
let colorOK = function () {
return options.supportsColor ||
(options.expectFilter && parenDepth === 1 &&
outerMostFunctionTakesColor);
};
let angleOK = function (angle) {
- return /^-?\d+\.?\d*(deg|rad|grad|turn)$/gi.test(angle);
+ return (new angleUtils.CssAngle(angle)).valid;
};
while (true) {
let token = tokenStream.nextToken();
if (!token) {
break;
}
if (token.tokenType === "comment") {
--- a/devtools/client/shared/test/browser_css_angle.js
+++ b/devtools/client/shared/test/browser_css_angle.js
@@ -8,16 +8,17 @@ const TEST_URI = "data:text/html;charset
var {angleUtils} = require("devtools/client/shared/css-angle");
add_task(function* () {
yield addTab("about:blank");
let [host] = yield createHost("bottom", TEST_URI);
info("Starting the test");
testAngleUtils();
+ testAngleValidity();
host.destroy();
gBrowser.removeCurrentTab();
});
function testAngleUtils() {
let data = getTestData();
@@ -30,30 +31,77 @@ function testAngleUtils() {
is(angle.rad, rad, "color.rad === rad");
is(angle.grad, grad, "color.grad === grad");
is(angle.turn, turn, "color.turn === turn");
testToString(angle, deg, rad, grad, turn);
}
}
+function testAngleValidity() {
+ let data = getAngleValidityData();
+
+ for (let {angle, result} of data) {
+ let testAngle = new angleUtils.CssAngle(angle);
+
+ is(testAngle.valid, result, `Testing that "${angle}" is ${testAngle.valid ? " a valid" : "an invalid" } angle`);
+ }
+}
+
function testToString(angle, deg, rad, grad, turn) {
angle.angleUnit = angleUtils.CssAngle.ANGLEUNIT.deg;
is(angle.toString(), deg, "toString() with deg type");
angle.angleUnit = angleUtils.CssAngle.ANGLEUNIT.rad;
is(angle.toString(), rad, "toString() with rad type");
angle.angleUnit = angleUtils.CssAngle.ANGLEUNIT.grad;
is(angle.toString(), grad, "toString() with grad type");
angle.angleUnit = angleUtils.CssAngle.ANGLEUNIT.turn;
is(angle.toString(), turn, "toString() with turn type");
}
+function getAngleValidityData() {
+ return [{
+ angle: "0.2turn",
+ result: true
+ }, {
+ angle: "-0.2turn",
+ result: true
+ }, {
+ angle: "-.2turn",
+ result: true
+ }, {
+ angle: "1e02turn",
+ result: true
+ }, {
+ angle: "-2e2turn",
+ result: true
+ }, {
+ angle: ".2turn",
+ result: true
+ }, {
+ angle: "0.2aaturn",
+ result: false
+ }, {
+ angle: "2dega",
+ result: false
+ }, {
+ angle: "0.deg",
+ result: false
+ }, {
+ angle: ".deg",
+ result: false
+ }, {
+ angle: "..2turn",
+ result: false
+ }];
+}
+
function getTestData() {
return [{
authored: "0deg",
deg: "0deg",
rad: "0rad",
grad: "0grad",
turn: "0turn"
}, {