2010-04-24 Darin Adler <darin@apple.com>
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 25 Apr 2010 05:00:38 +0000 (05:00 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 25 Apr 2010 05:00:38 +0000 (05:00 +0000)
        Reviewed by Dan Bernstein.

        REGRESSION (r56560): Crash in parseFloat if passed invalid UTF-16 data
        https://bugs.webkit.org/show_bug.cgi?id=38083
        rdar://problem/7901044

        Tests: fast/js/ToNumber.html
               fast/js/parseFloat.html

        * runtime/JSGlobalObjectFunctions.cpp:
        (JSC::parseInt): Added a FIXME comment about a problem I noticed.
        (JSC::parseFloat): Added a FIXME comment about a problem I noticed;
        covered by test cases in the test I added.
        * runtime/UString.cpp:
        (JSC::UString::toDouble): Added FIXME comments about two problem I
        noticed; covered by test cases in the tests I added. Added a return
        statement so we don't crash when illegal UTF-16 sequences are present.
2010-04-24  Darin Adler  <darin@apple.com>

        Reviewed by Dan Bernstein.

        REGRESSION (r56560): Crash in parseFloat if passed invalid UTF-16 data
        https://bugs.webkit.org/show_bug.cgi?id=38083
        rdar://problem/7901044

        * fast/js/parseFloat-expected.txt: Added.
        * fast/js/parseFloat.html: Added.
        * fast/js/script-tests/parseFloat.js: Added.

        * fast/js/ToNumber-expected.txt: Added.
        * fast/js/ToNumber.html: Added.
        * fast/js/script-tests/ToNumber.js: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@58224 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp
JavaScriptCore/runtime/UString.cpp
LayoutTests/ChangeLog
LayoutTests/fast/js/ToNumber-expected.txt [new file with mode: 0644]
LayoutTests/fast/js/ToNumber.html [new file with mode: 0644]
LayoutTests/fast/js/parseFloat-expected.txt [new file with mode: 0644]
LayoutTests/fast/js/parseFloat.html [new file with mode: 0644]
LayoutTests/fast/js/script-tests/ToNumber.js [new file with mode: 0644]
LayoutTests/fast/js/script-tests/parseFloat.js [new file with mode: 0644]

index dcf864d..3fccff0 100644 (file)
@@ -1,3 +1,23 @@
+2010-04-24  Darin Adler  <darin@apple.com>
+
+        Reviewed by Dan Bernstein.
+
+        REGRESSION (r56560): Crash in parseFloat if passed invalid UTF-16 data
+        https://bugs.webkit.org/show_bug.cgi?id=38083
+        rdar://problem/7901044
+
+        Tests: fast/js/ToNumber.html
+               fast/js/parseFloat.html
+
+        * runtime/JSGlobalObjectFunctions.cpp:
+        (JSC::parseInt): Added a FIXME comment about a problem I noticed.
+        (JSC::parseFloat): Added a FIXME comment about a problem I noticed;
+        covered by test cases in the test I added.
+        * runtime/UString.cpp:
+        (JSC::UString::toDouble): Added FIXME comments about two problem I
+        noticed; covered by test cases in the tests I added. Added a return
+        statement so we don't crash when illegal UTF-16 sequences are present.
+
 2010-04-24  Anton Muhin  <antonm@chromium.org>
 
         Reviewed by Darin Adler.
index 5b6369a..5da5194 100644 (file)
@@ -241,6 +241,7 @@ static double parseInt(const UString& s, int radix)
     }
 
     if (number >= mantissaOverflowLowerBound) {
+        // FIXME: It is incorrect to use UString::ascii() here because it's not thread-safe.
         if (radix == 10)
             number = WTF::strtod(s.substr(firstDigitPosition, p - firstDigitPosition).ascii(), 0);
         else if (radix == 2 || radix == 4 || radix == 8 || radix == 16 || radix == 32)
@@ -269,6 +270,8 @@ static double parseFloat(const UString& s)
     if (length - p >= 2 && data[p] == '0' && (data[p + 1] == 'x' || data[p + 1] == 'X'))
         return 0;
 
+    // FIXME: UString::toDouble will ignore leading ASCII spaces, but we need to ignore
+    // other StrWhiteSpaceChar values as well.
     return s.toDouble(true /*tolerant*/, false /* NaN for empty string */);
 }
 
index ce91040..6b16274 100644 (file)
@@ -254,7 +254,15 @@ double UString::toDouble(bool tolerateTrailingJunk, bool tolerateEmptyString) co
         return NaN;
     }
 
+    // FIXME: If tolerateTrailingJunk is true, then we want to tolerate junk 
+    // after the number, even if it contains invalid UTF-16 sequences. So we
+    // shouldn't use the UTF8String function, which returns null when it
+    // encounters invalid UTF-16. Further, we have no need to convert the
+    // non-ASCII characters to UTF-8, so the UTF8String does quite a bit of
+    // unnecessary work.
     CString s = UTF8String();
+    if (s.isNull())
+        return NaN;
     const char* c = s.data();
 
     // skip leading white space
@@ -318,6 +326,7 @@ double UString::toDouble(bool tolerateTrailingJunk, bool tolerateEmptyString) co
     while (isASCIISpace(*c))
         c++;
     // don't allow anything after - unless tolerant=true
+    // FIXME: If string contains a U+0000 character, then this check is incorrect.
     if (!tolerateTrailingJunk && *c != '\0')
         d = NaN;
 
index 959d426..46cb130 100644 (file)
@@ -1,3 +1,19 @@
+2010-04-24  Darin Adler  <darin@apple.com>
+
+        Reviewed by Dan Bernstein.
+
+        REGRESSION (r56560): Crash in parseFloat if passed invalid UTF-16 data
+        https://bugs.webkit.org/show_bug.cgi?id=38083
+        rdar://problem/7901044
+
+        * fast/js/parseFloat-expected.txt: Added.
+        * fast/js/parseFloat.html: Added.
+        * fast/js/script-tests/parseFloat.js: Added.
+
+        * fast/js/ToNumber-expected.txt: Added.
+        * fast/js/ToNumber.html: Added.
+        * fast/js/script-tests/ToNumber.js: Added.
+
 2010-04-24  Dan Bernstein  <mitz@apple.com>
 
         Add platform-specific results for Mac after r58222.
diff --git a/LayoutTests/fast/js/ToNumber-expected.txt b/LayoutTests/fast/js/ToNumber-expected.txt
new file mode 100644 (file)
index 0000000..d373af8
--- /dev/null
@@ -0,0 +1,122 @@
+Test the JavaScript ToNumber operation.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS +undefined is NaN
+PASS +null is 0
+PASS +false is 0
+PASS +true is 1
+PASS +2 is 2
+PASS +'' is 0
+PASS +' 1' is 1
+PASS +'1 ' is 1
+PASS +'x1' is NaN
+PASS +'1x' is NaN
+PASS +'0x1' is 1
+PASS +'1x0' is NaN
+FAIL +(nullCharacter + '1') should be NaN. Was 0.
+FAIL +('1' + nullCharacter) should be NaN. Was 1.
+FAIL +('1' + nullCharacter + '1') should be NaN. Was 1.
+PASS +(nonASCIICharacter + '1') is NaN
+PASS +('1' + nonASCIICharacter) is NaN
+PASS +('1' + nonASCIICharacter + '1') is NaN
+PASS +('1' + nonASCIINonSpaceCharacter) is NaN
+PASS +(nonASCIINonSpaceCharacter + '1') is NaN
+PASS +('1' + nonASCIINonSpaceCharacter + '1') is NaN
+PASS +(illegalUTF16Sequence + '1') is NaN
+PASS +('1' + illegalUTF16Sequence) is NaN
+PASS +('1' + illegalUTF16Sequence + '1') is NaN
+PASS +'inf' is NaN
+PASS +'infinity' is NaN
+PASS +'Inf' is NaN
+PASS +'+inf' is NaN
+PASS +'+infinity' is NaN
+PASS +'+Inf' is NaN
+PASS +'-inf' is NaN
+PASS +'-infinity' is NaN
+PASS +'-Inf' is NaN
+PASS +'Infinity' is Infinity
+PASS +'+Infinity' is Infinity
+PASS +'-Infinity' is -Infinity
+PASS +'++1' is NaN
+PASS +'AB' is NaN
+PASS +'0xAB' is 171
+PASS +'1e1' is 10
+PASS +'1E1' is 10
+PASS +(tab + '1') is 1
+FAIL +(nbsp + '1') should be 1. Was NaN.
+PASS +(ff + '1') is 1
+PASS +(vt + '1') is 1
+PASS +(cr + '1') is 1
+PASS +(lf + '1') is 1
+FAIL +(ls + '1') should be 1. Was NaN.
+FAIL +(ps + '1') should be 1. Was NaN.
+FAIL +(oghamSpaceMark + '1') should be 1. Was NaN.
+FAIL +(mongolianVowelSeparator + '1') should be 1. Was NaN.
+FAIL +(enQuad + '1') should be 1. Was NaN.
+FAIL +(emQuad + '1') should be 1. Was NaN.
+FAIL +(enSpace + '1') should be 1. Was NaN.
+FAIL +(emSpace + '1') should be 1. Was NaN.
+FAIL +(threePerEmSpace + '1') should be 1. Was NaN.
+FAIL +(fourPerEmSpace + '1') should be 1. Was NaN.
+FAIL +(sixPerEmSpace + '1') should be 1. Was NaN.
+FAIL +(figureSpace + '1') should be 1. Was NaN.
+FAIL +(punctuationSpace + '1') should be 1. Was NaN.
+FAIL +(thinSpace + '1') should be 1. Was NaN.
+FAIL +(hairSpace + '1') should be 1. Was NaN.
+FAIL +(narrowNoBreakSpace + '1') should be 1. Was NaN.
+FAIL +(mediumMathematicalSpace + '1') should be 1. Was NaN.
+FAIL +(ideographicSpace + '1') should be 1. Was NaN.
+PASS +('1' + tab) is 1
+FAIL +('1' + nbsp) should be 1. Was NaN.
+PASS +('1' + ff) is 1
+PASS +('1' + vt) is 1
+PASS +('1' + cr) is 1
+PASS +('1' + lf) is 1
+FAIL +('1' + ls) should be 1. Was NaN.
+FAIL +('1' + ps) should be 1. Was NaN.
+FAIL +('1' + oghamSpaceMark) should be 1. Was NaN.
+FAIL +('1' + mongolianVowelSeparator) should be 1. Was NaN.
+FAIL +('1' + enQuad) should be 1. Was NaN.
+FAIL +('1' + emQuad) should be 1. Was NaN.
+FAIL +('1' + enSpace) should be 1. Was NaN.
+FAIL +('1' + emSpace) should be 1. Was NaN.
+FAIL +('1' + threePerEmSpace) should be 1. Was NaN.
+FAIL +('1' + fourPerEmSpace) should be 1. Was NaN.
+FAIL +('1' + sixPerEmSpace) should be 1. Was NaN.
+FAIL +('1' + figureSpace) should be 1. Was NaN.
+FAIL +('1' + punctuationSpace) should be 1. Was NaN.
+FAIL +('1' + thinSpace) should be 1. Was NaN.
+FAIL +('1' + hairSpace) should be 1. Was NaN.
+FAIL +('1' + narrowNoBreakSpace) should be 1. Was NaN.
+FAIL +('1' + mediumMathematicalSpace) should be 1. Was NaN.
+FAIL +('1' + ideographicSpace) should be 1. Was NaN.
+PASS +('1' + tab + '1') is NaN
+PASS +('1' + nbsp + '1') is NaN
+PASS +('1' + ff + '1') is NaN
+PASS +('1' + vt + '1') is NaN
+PASS +('1' + cr + '1') is NaN
+PASS +('1' + lf + '1') is NaN
+PASS +('1' + ls + '1') is NaN
+PASS +('1' + ps + '1') is NaN
+PASS +('1' + oghamSpaceMark + '1') is NaN
+PASS +('1' + mongolianVowelSeparator + '1') is NaN
+PASS +('1' + enQuad + '1') is NaN
+PASS +('1' + emQuad + '1') is NaN
+PASS +('1' + enSpace + '1') is NaN
+PASS +('1' + emSpace + '1') is NaN
+PASS +('1' + threePerEmSpace + '1') is NaN
+PASS +('1' + fourPerEmSpace + '1') is NaN
+PASS +('1' + sixPerEmSpace + '1') is NaN
+PASS +('1' + figureSpace + '1') is NaN
+PASS +('1' + punctuationSpace + '1') is NaN
+PASS +('1' + thinSpace + '1') is NaN
+PASS +('1' + hairSpace + '1') is NaN
+PASS +('1' + narrowNoBreakSpace + '1') is NaN
+PASS +('1' + mediumMathematicalSpace + '1') is NaN
+PASS +('1' + ideographicSpace + '1') is NaN
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/js/ToNumber.html b/LayoutTests/fast/js/ToNumber.html
new file mode 100644 (file)
index 0000000..f6d5327
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="resources/js-test-style.css">
+<script src="resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/ToNumber.js"></script>
+<script src="resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/js/parseFloat-expected.txt b/LayoutTests/fast/js/parseFloat-expected.txt
new file mode 100644 (file)
index 0000000..d57aa85
--- /dev/null
@@ -0,0 +1,52 @@
+Tests for the parseFloat function.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS parseFloat() is NaN
+PASS parseFloat('') is NaN
+PASS parseFloat(' 0') is 0
+PASS parseFloat('0 ') is 0
+PASS parseFloat('x0') is NaN
+PASS parseFloat('0x') is 0
+PASS parseFloat(' 1') is 1
+PASS parseFloat('1 ') is 1
+PASS parseFloat('x1') is NaN
+PASS parseFloat('1x') is 1
+PASS parseFloat(' 2.3') is 2.3
+PASS parseFloat('2.3 ') is 2.3
+PASS parseFloat('x2.3') is NaN
+PASS parseFloat('2.3x') is 2.3
+PASS parseFloat('0x2') is 0
+PASS parseFloat('1' + nonASCIINonSpaceCharacter) is 1
+PASS parseFloat(nonASCIINonSpaceCharacter + '1') is NaN
+FAIL parseFloat('1' + illegalUTF16Sequence) should be 1. Was NaN.
+PASS parseFloat(illegalUTF16Sequence + '1') is NaN
+PASS parseFloat(tab + '1') is 1
+FAIL parseFloat(nbsp + '1') should be 1. Was NaN.
+PASS parseFloat(ff + '1') is 1
+PASS parseFloat(vt + '1') is 1
+PASS parseFloat(cr + '1') is 1
+PASS parseFloat(lf + '1') is 1
+FAIL parseFloat(ls + '1') should be 1. Was NaN.
+FAIL parseFloat(ps + '1') should be 1. Was NaN.
+FAIL parseFloat(oghamSpaceMark + '1') should be 1. Was NaN.
+FAIL parseFloat(mongolianVowelSeparator + '1') should be 1. Was NaN.
+FAIL parseFloat(enQuad + '1') should be 1. Was NaN.
+FAIL parseFloat(emQuad + '1') should be 1. Was NaN.
+FAIL parseFloat(enSpace + '1') should be 1. Was NaN.
+FAIL parseFloat(emSpace + '1') should be 1. Was NaN.
+FAIL parseFloat(threePerEmSpace + '1') should be 1. Was NaN.
+FAIL parseFloat(fourPerEmSpace + '1') should be 1. Was NaN.
+FAIL parseFloat(sixPerEmSpace + '1') should be 1. Was NaN.
+FAIL parseFloat(figureSpace + '1') should be 1. Was NaN.
+FAIL parseFloat(punctuationSpace + '1') should be 1. Was NaN.
+FAIL parseFloat(thinSpace + '1') should be 1. Was NaN.
+FAIL parseFloat(hairSpace + '1') should be 1. Was NaN.
+FAIL parseFloat(narrowNoBreakSpace + '1') should be 1. Was NaN.
+FAIL parseFloat(mediumMathematicalSpace + '1') should be 1. Was NaN.
+FAIL parseFloat(ideographicSpace + '1') should be 1. Was NaN.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/js/parseFloat.html b/LayoutTests/fast/js/parseFloat.html
new file mode 100644 (file)
index 0000000..c49b080
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="resources/js-test-style.css">
+<script src="resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/parseFloat.js"></script>
+<script src="resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/js/script-tests/ToNumber.js b/LayoutTests/fast/js/script-tests/ToNumber.js
new file mode 100644 (file)
index 0000000..a4cb18b
--- /dev/null
@@ -0,0 +1,148 @@
+description('Test the JavaScript ToNumber operation.')
+
+var nullCharacter = String.fromCharCode(0);
+var nonASCIICharacter = String.fromCharCode(0x100);
+var nonASCIINonSpaceCharacter = String.fromCharCode(0x13A0);
+var illegalUTF16Sequence = String.fromCharCode(0xD800);
+
+var tab = String.fromCharCode(9);
+var nbsp = String.fromCharCode(0xA0);
+var ff = String.fromCharCode(0xC);
+var vt = String.fromCharCode(0xB);
+var cr = String.fromCharCode(0xD);
+var lf = String.fromCharCode(0xA);
+var ls = String.fromCharCode(0x2028);
+var ps = String.fromCharCode(0x2029);
+
+var oghamSpaceMark = String.fromCharCode(0x1680);
+var mongolianVowelSeparator = String.fromCharCode(0x180E);
+var enQuad = String.fromCharCode(0x2000);
+var emQuad = String.fromCharCode(0x2001);
+var enSpace = String.fromCharCode(0x2002);
+var emSpace = String.fromCharCode(0x2003);
+var threePerEmSpace = String.fromCharCode(0x2004);
+var fourPerEmSpace = String.fromCharCode(0x2005);
+var sixPerEmSpace = String.fromCharCode(0x2006);
+var figureSpace = String.fromCharCode(0x2007);
+var punctuationSpace = String.fromCharCode(0x2008);
+var thinSpace = String.fromCharCode(0x2009);
+var hairSpace = String.fromCharCode(0x200A);
+var narrowNoBreakSpace = String.fromCharCode(0x202F);
+var mediumMathematicalSpace = String.fromCharCode(0x205F);
+var ideographicSpace = String.fromCharCode(0x3000);
+
+shouldBe("+undefined", "NaN");
+shouldBe("+null", "0");
+shouldBe("+false", "0");
+shouldBe("+true", "1");
+shouldBe("+2", "2");
+shouldBe("+''", "0");
+shouldBe("+' 1'", "1");
+shouldBe("+'1 '", "1");
+shouldBe("+'x1'", "NaN");
+shouldBe("+'1x'", "NaN");
+shouldBe("+'0x1'", "1");
+shouldBe("+'1x0'", "NaN");
+shouldBe("+(nullCharacter + '1')", "NaN");
+shouldBe("+('1' + nullCharacter)", "NaN");
+shouldBe("+('1' + nullCharacter + '1')", "NaN");
+shouldBe("+(nonASCIICharacter + '1')", "NaN");
+shouldBe("+('1' + nonASCIICharacter)", "NaN");
+shouldBe("+('1' + nonASCIICharacter + '1')", "NaN");
+shouldBe("+('1' + nonASCIINonSpaceCharacter)", "NaN");
+shouldBe("+(nonASCIINonSpaceCharacter + '1')", "NaN");
+shouldBe("+('1' + nonASCIINonSpaceCharacter + '1')", "NaN");
+shouldBe("+(illegalUTF16Sequence + '1')", "NaN");
+shouldBe("+('1' + illegalUTF16Sequence)", "NaN");
+shouldBe("+('1' + illegalUTF16Sequence + '1')", "NaN");
+shouldBe("+'inf'", "NaN");
+shouldBe("+'infinity'", "NaN");
+shouldBe("+'Inf'", "NaN");
+shouldBe("+'+inf'", "NaN");
+shouldBe("+'+infinity'", "NaN");
+shouldBe("+'+Inf'", "NaN");
+shouldBe("+'-inf'", "NaN");
+shouldBe("+'-infinity'", "NaN");
+shouldBe("+'-Inf'", "NaN");
+shouldBe("+'Infinity'", "Infinity");
+shouldBe("+'+Infinity'", "Infinity");
+shouldBe("+'-Infinity'", "-Infinity");
+shouldBe("+'++1'", "NaN");
+shouldBe("+'AB'", "NaN");
+shouldBe("+'0xAB'", "171");
+shouldBe("+'1e1'", "10");
+shouldBe("+'1E1'", "10");
+shouldBe("+(tab + '1')", "1");
+shouldBe("+(nbsp + '1')", "1");
+shouldBe("+(ff + '1')", "1");
+shouldBe("+(vt + '1')", "1");
+shouldBe("+(cr + '1')", "1");
+shouldBe("+(lf + '1')", "1");
+shouldBe("+(ls + '1')", "1");
+shouldBe("+(ps + '1')", "1");
+shouldBe("+(oghamSpaceMark + '1')", "1");
+shouldBe("+(mongolianVowelSeparator + '1')", "1");
+shouldBe("+(enQuad + '1')", "1");
+shouldBe("+(emQuad + '1')", "1");
+shouldBe("+(enSpace + '1')", "1");
+shouldBe("+(emSpace + '1')", "1");
+shouldBe("+(threePerEmSpace + '1')", "1");
+shouldBe("+(fourPerEmSpace + '1')", "1");
+shouldBe("+(sixPerEmSpace + '1')", "1");
+shouldBe("+(figureSpace + '1')", "1");
+shouldBe("+(punctuationSpace + '1')", "1");
+shouldBe("+(thinSpace + '1')", "1");
+shouldBe("+(hairSpace + '1')", "1");
+shouldBe("+(narrowNoBreakSpace + '1')", "1");
+shouldBe("+(mediumMathematicalSpace + '1')", "1");
+shouldBe("+(ideographicSpace + '1')", "1");
+shouldBe("+('1' + tab)", "1");
+shouldBe("+('1' + nbsp)", "1");
+shouldBe("+('1' + ff)", "1");
+shouldBe("+('1' + vt)", "1");
+shouldBe("+('1' + cr)", "1");
+shouldBe("+('1' + lf)", "1");
+shouldBe("+('1' + ls)", "1");
+shouldBe("+('1' + ps)", "1");
+shouldBe("+('1' + oghamSpaceMark)", "1");
+shouldBe("+('1' + mongolianVowelSeparator)", "1");
+shouldBe("+('1' + enQuad)", "1");
+shouldBe("+('1' + emQuad)", "1");
+shouldBe("+('1' + enSpace)", "1");
+shouldBe("+('1' + emSpace)", "1");
+shouldBe("+('1' + threePerEmSpace)", "1");
+shouldBe("+('1' + fourPerEmSpace)", "1");
+shouldBe("+('1' + sixPerEmSpace)", "1");
+shouldBe("+('1' + figureSpace)", "1");
+shouldBe("+('1' + punctuationSpace)", "1");
+shouldBe("+('1' + thinSpace)", "1");
+shouldBe("+('1' + hairSpace)", "1");
+shouldBe("+('1' + narrowNoBreakSpace)", "1");
+shouldBe("+('1' + mediumMathematicalSpace)", "1");
+shouldBe("+('1' + ideographicSpace)", "1");
+shouldBe("+('1' + tab + '1')", "NaN");
+shouldBe("+('1' + nbsp + '1')", "NaN");
+shouldBe("+('1' + ff + '1')", "NaN");
+shouldBe("+('1' + vt + '1')", "NaN");
+shouldBe("+('1' + cr + '1')", "NaN");
+shouldBe("+('1' + lf + '1')", "NaN");
+shouldBe("+('1' + ls + '1')", "NaN");
+shouldBe("+('1' + ps + '1')", "NaN");
+shouldBe("+('1' + oghamSpaceMark + '1')", "NaN");
+shouldBe("+('1' + mongolianVowelSeparator + '1')", "NaN");
+shouldBe("+('1' + enQuad + '1')", "NaN");
+shouldBe("+('1' + emQuad + '1')", "NaN");
+shouldBe("+('1' + enSpace + '1')", "NaN");
+shouldBe("+('1' + emSpace + '1')", "NaN");
+shouldBe("+('1' + threePerEmSpace + '1')", "NaN");
+shouldBe("+('1' + fourPerEmSpace + '1')", "NaN");
+shouldBe("+('1' + sixPerEmSpace + '1')", "NaN");
+shouldBe("+('1' + figureSpace + '1')", "NaN");
+shouldBe("+('1' + punctuationSpace + '1')", "NaN");
+shouldBe("+('1' + thinSpace + '1')", "NaN");
+shouldBe("+('1' + hairSpace + '1')", "NaN");
+shouldBe("+('1' + narrowNoBreakSpace + '1')", "NaN");
+shouldBe("+('1' + mediumMathematicalSpace + '1')", "NaN");
+shouldBe("+('1' + ideographicSpace + '1')", "NaN");
+
+var successfullyParsed = true;
diff --git a/LayoutTests/fast/js/script-tests/parseFloat.js b/LayoutTests/fast/js/script-tests/parseFloat.js
new file mode 100644 (file)
index 0000000..c0f1fd3
--- /dev/null
@@ -0,0 +1,76 @@
+description('Tests for the parseFloat function.');
+
+var nonASCIINonSpaceCharacter = String.fromCharCode(0x13A0);
+var illegalUTF16Sequence = String.fromCharCode(0xD800);
+
+var tab = String.fromCharCode(9);
+var nbsp = String.fromCharCode(0xA0);
+var ff = String.fromCharCode(0xC);
+var vt = String.fromCharCode(0xB);
+var cr = String.fromCharCode(0xD);
+var lf = String.fromCharCode(0xA);
+var ls = String.fromCharCode(0x2028);
+var ps = String.fromCharCode(0x2029);
+
+var oghamSpaceMark = String.fromCharCode(0x1680);
+var mongolianVowelSeparator = String.fromCharCode(0x180E);
+var enQuad = String.fromCharCode(0x2000);
+var emQuad = String.fromCharCode(0x2001);
+var enSpace = String.fromCharCode(0x2002);
+var emSpace = String.fromCharCode(0x2003);
+var threePerEmSpace = String.fromCharCode(0x2004);
+var fourPerEmSpace = String.fromCharCode(0x2005);
+var sixPerEmSpace = String.fromCharCode(0x2006);
+var figureSpace = String.fromCharCode(0x2007);
+var punctuationSpace = String.fromCharCode(0x2008);
+var thinSpace = String.fromCharCode(0x2009);
+var hairSpace = String.fromCharCode(0x200A);
+var narrowNoBreakSpace = String.fromCharCode(0x202F);
+var mediumMathematicalSpace = String.fromCharCode(0x205F);
+var ideographicSpace = String.fromCharCode(0x3000);
+
+shouldBe("parseFloat()", "NaN");
+shouldBe("parseFloat('')", "NaN");
+shouldBe("parseFloat(' 0')", "0");
+shouldBe("parseFloat('0 ')", "0");
+shouldBe("parseFloat('x0')", "NaN");
+shouldBe("parseFloat('0x')", "0");
+shouldBe("parseFloat(' 1')", "1");
+shouldBe("parseFloat('1 ')", "1");
+shouldBe("parseFloat('x1')", "NaN");
+shouldBe("parseFloat('1x')", "1");
+shouldBe("parseFloat(' 2.3')", "2.3");
+shouldBe("parseFloat('2.3 ')", "2.3");
+shouldBe("parseFloat('x2.3')", "NaN");
+shouldBe("parseFloat('2.3x')", "2.3");
+shouldBe("parseFloat('0x2')", "0");
+shouldBe("parseFloat('1' + nonASCIINonSpaceCharacter)", "1");
+shouldBe("parseFloat(nonASCIINonSpaceCharacter + '1')", "NaN");
+shouldBe("parseFloat('1' + illegalUTF16Sequence)", "1");
+shouldBe("parseFloat(illegalUTF16Sequence + '1')", "NaN");
+shouldBe("parseFloat(tab + '1')", "1");
+shouldBe("parseFloat(nbsp + '1')", "1");
+shouldBe("parseFloat(ff + '1')", "1");
+shouldBe("parseFloat(vt + '1')", "1");
+shouldBe("parseFloat(cr + '1')", "1");
+shouldBe("parseFloat(lf + '1')", "1");
+shouldBe("parseFloat(ls + '1')", "1");
+shouldBe("parseFloat(ps + '1')", "1");
+shouldBe("parseFloat(oghamSpaceMark + '1')", "1");
+shouldBe("parseFloat(mongolianVowelSeparator + '1')", "1");
+shouldBe("parseFloat(enQuad + '1')", "1");
+shouldBe("parseFloat(emQuad + '1')", "1");
+shouldBe("parseFloat(enSpace + '1')", "1");
+shouldBe("parseFloat(emSpace + '1')", "1");
+shouldBe("parseFloat(threePerEmSpace + '1')", "1");
+shouldBe("parseFloat(fourPerEmSpace + '1')", "1");
+shouldBe("parseFloat(sixPerEmSpace + '1')", "1");
+shouldBe("parseFloat(figureSpace + '1')", "1");
+shouldBe("parseFloat(punctuationSpace + '1')", "1");
+shouldBe("parseFloat(thinSpace + '1')", "1");
+shouldBe("parseFloat(hairSpace + '1')", "1");
+shouldBe("parseFloat(narrowNoBreakSpace + '1')", "1");
+shouldBe("parseFloat(mediumMathematicalSpace + '1')", "1");
+shouldBe("parseFloat(ideographicSpace + '1')", "1");
+
+var successfullyParsed = true;