Bug 820909. Make LowerCaseEqualsASCII and LowerCaseEqualsLiteral actually do ASCII-case-insensitive matching instead of doing odd things with KELVIN SIGN and LATIN CAPITAL LETTER I WITH DOT ABOVE. r=bsmedberg, sr=dbaron
authorBoris Zbarsky <bzbarsky@mit.edu>
Wed, 26 Dec 2012 13:42:39 -0800
changeset 126173 e364512a658fe9dd20e711bd9b93893aee2045d1
parent 126172 f5638aa67e2330897e40e4cdf25ddf1a7eb55ec8
child 126174 a836a0d544dafe562c042cb7172a606200a826b1
push id2151
push userlsblakk@mozilla.com
push dateTue, 19 Feb 2013 18:06:57 +0000
treeherdermozilla-beta@4952e88741ec [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbsmedberg, dbaron
bugs820909
milestone20.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 820909. Make LowerCaseEqualsASCII and LowerCaseEqualsLiteral actually do ASCII-case-insensitive matching instead of doing odd things with KELVIN SIGN and LATIN CAPITAL LETTER I WITH DOT ABOVE. r=bsmedberg, sr=dbaron
content/base/test/Makefile.in
content/base/test/test_bug820909.html
xpcom/string/public/nsCharTraits.h
xpcom/string/public/nsTSubstring.h
--- a/content/base/test/Makefile.in
+++ b/content/base/test/Makefile.in
@@ -265,16 +265,17 @@ MOCHITEST_FILES_A = \
 		test_bug744830.html \
 		file_bug782342.txt \
 		test_bug782342.html \
 		test_bug282547.html \
 		bug282547.sjs \
 		test_domparser_null_char.html \
 		test_bug811701.html \
 		test_bug811701.xhtml \
+		test_bug820909.html \
 		$(NULL)
 
 MOCHITEST_FILES_B = \
 		test_bug459424.html \
 		bug461735-redirect1.sjs \
 		bug461735-redirect2.sjs \
 		bug461735-post-redirect.js \
 		test_bug513194.html \
new file mode 100644
--- /dev/null
+++ b/content/base/test/test_bug820909.html
@@ -0,0 +1,87 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=820909
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test for Bug 820909</title>
+  <script type="application/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=820909">Mozilla Bug 820909</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+  <span dİsabled="CAPS"></span>
+</div>
+<pre id="test">
+<script>
+  var bogusScriptRan = false;
+</script>
+<script type="applİcation/javascript">
+  bogusScriptRan = true;
+</script>
+<script type="application/javascript">
+
+/** Test for Bug 820909 **/
+// Test for https://bugzilla.mozilla.org/show_bug.cgi?id=820909#c7 item 1
+ok(!bogusScriptRan, "Script types should be ASCII case-insensitive");
+
+// Test for https://bugzilla.mozilla.org/show_bug.cgi?id=820909#c7 item 2
+var input = document.createElement("input");
+input.type = "radİo";
+is(input.type, "text", "Input types should be ASCII case-insensitive");
+
+// XXX Not sure how to test items 3, 4, 5
+
+// Test for https://bugzilla.mozilla.org/show_bug.cgi?id=820909#c7 item 6
+is(document.querySelector("[dİsabled='caps']"), null,
+   "Checking whether an attribute is case-sensitive for selector-matching " +
+   "purposes should be ASCII case-insensitive on the attr name");
+
+// Test for https://bugzilla.mozilla.org/show_bug.cgi?id=820909#c7 item 7
+$("content").style.width = "0";
+$("content").style.width = "1İn";
+is($("content").style.width, "0px",
+   "CSS unit names should be ASCII case-insensitive");
+
+// Test for https://bugzilla.mozilla.org/show_bug.cgi?id=820909#c7 item 8
+$("content").style.setProperty("animation-name", "a");
+$("content").style.setProperty("-moz-anİmation-name", "b");
+is($("content").style.animationName, "a",
+   "CSS property aliases should be ASCII case-insensitive");
+
+// XXXbz don't know how to test item 9
+
+// Test for https://bugzilla.mozilla.org/show_bug.cgi?id=820909#c7 item 10
+$("content").innerHTML = "<table><input type='hİdden'></table>";
+is($("content").querySelector("input").parentNode, $("content"),
+   "Inputs that aren't actually type='hidden' should not be allowed as " +
+   "table kids");
+
+// XXXbz add test for item 11?
+
+// XXXbz add test for item 12?
+
+// Test for https://bugzilla.mozilla.org/show_bug.cgi?id=820909#c7 item 13
+$("content").style.setProperty("animation-name", "a");
+$("content").style.setProperty("anİmation-name", "b");
+is($("content").style.animationName, "a",
+   "CSS property names should be ASCII case-insensitive");
+
+$("content").style.setProperty("display", "none");
+$("content").style.setProperty("display", "İnline");
+is($("content").style.display, "none",
+   "CSS keywords should be ASCII case-insensitive");
+
+$("content").style.setProperty("color", "white");
+$("content").style.setProperty("color", "İndigo");
+is($("content").style.color, "white",
+   "CSS color names should be ASCII case-insensitive");
+
+
+</script>
+</pre>
+</body>
+</html>
--- a/xpcom/string/public/nsCharTraits.h
+++ b/xpcom/string/public/nsCharTraits.h
@@ -234,42 +234,27 @@ struct nsCharTraits<PRUnichar>
 
         if ( *s2 )
           return -1;
 
         return 0;
       }
 
     /**
-     * Convert c to its lower-case form, but only if the lower-case form is
-     * ASCII. Otherwise leave it alone.
-     *
-     * There are only two non-ASCII Unicode characters whose lowercase
-     * equivalents are ASCII: KELVIN SIGN and LATIN CAPITAL LETTER I WITH
-     * DOT ABOVE. So it's a simple matter to handle those explicitly.
+     * Convert c to its lower-case form, but only if c is in the ASCII
+     * range. Otherwise leave it alone.
      */
     static
     char_type
     ASCIIToLower( char_type c )
       {
-        if (c < 0x100)
-          {
-            if (c >= 'A' && c <= 'Z')
-              return char_type(c + ('a' - 'A'));
+        if (c >= 'A' && c <= 'Z')
+          return char_type(c + ('a' - 'A'));
           
-            return c;
-          }
-        else
-          {
-            if (c == 0x212A) // KELVIN SIGN
-              return 'k';
-            if (c == 0x0130) // LATIN CAPITAL LETTER I WITH DOT ABOVE
-              return 'i';
-            return c;
-          }
+        return c;
       }
 
     static
     int
     compareLowerCaseToASCII( const char_type* s1, const char* s2, size_t n )
       {
         for ( ; n--; ++s1, ++s2 )
           {
--- a/xpcom/string/public/nsTSubstring.h
+++ b/xpcom/string/public/nsTSubstring.h
@@ -294,21 +294,22 @@ class nsTSubstring_CharT
       template<int N>
       inline bool EqualsLiteral( char (&str)[N] ) const
         {
           const char* s = str;
           return EqualsASCII(s, N-1);
         }
 #endif
 
-    // The LowerCaseEquals methods compare the lower case version of
-    // this string to some ASCII/Literal string. The ASCII string is
-    // *not* lowercased for you. If you compare to an ASCII or literal
-    // string that contains an uppercase character, it is guaranteed to
-    // return false. We will throw assertions too.
+    // The LowerCaseEquals methods compare the ASCII-lowercase version of
+    // this string (lowercasing only ASCII uppercase characters) to some
+    // ASCII/Literal string. The ASCII string is *not* lowercased for
+    // you. If you compare to an ASCII or literal string that contains an
+    // uppercase character, it is guaranteed to return false. We will
+    // throw assertions too.
       bool NS_FASTCALL LowerCaseEqualsASCII( const char* data, size_type len ) const;
       bool NS_FASTCALL LowerCaseEqualsASCII( const char* data ) const;
 
     // LowerCaseEqualsLiteral must ONLY be applied to an actual
     // literal string.  Do not attempt to use it with a regular char*
     // pointer, or with a char array variable. Use
     // LowerCaseEqualsASCII for them.
 #ifdef NS_DISABLE_LITERAL_TEMPLATE