From 091edfd4c7fd21c9c34338de7e4a716c28a99af5 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Tue, 11 Nov 2008 22:36:20 -0500 Subject: [PATCH] Bug 462458. Update @charset detection to spec changes. r+sr=dbaron, a=beltzner --- layout/reftests/css-charset/pass.html | 7 +++++ layout/reftests/css-charset/reftest.list | 10 ++++++++ .../reftests/css-charset/test-attribute.css | Bin 0 -> 44 bytes .../reftests/css-charset/test-attribute.html | 14 ++++++++++ .../test-charset-leading-space.css | Bin 0 -> 84 bytes .../test-charset-leading-space.html | 14 ++++++++++ .../css-charset/test-charset-quotes.css | Bin 0 -> 82 bytes .../css-charset/test-charset-quotes.html | 14 ++++++++++ .../test-charset-trailing-space.css | Bin 0 -> 84 bytes .../test-charset-trailing-space.html | 14 ++++++++++ .../test-charset-utf-16-be-bom.css | Bin 0 -> 84 bytes .../test-charset-utf-16-be-bom.html | 14 ++++++++++ .../test-charset-utf-16-be-no-bom.css | Bin 0 -> 86 bytes .../test-charset-utf-16-be-no-bom.html | 14 ++++++++++ .../test-charset-utf-16-bom-be.css | Bin 0 -> 84 bytes .../test-charset-utf-16-bom-be.html | 14 ++++++++++ .../test-charset-utf-16-bom-le.css | Bin 0 -> 84 bytes .../test-charset-utf-16-bom-le.html | 14 ++++++++++ .../test-charset-utf-16-le-bom.css | Bin 0 -> 84 bytes .../test-charset-utf-16-le-bom.html | 14 ++++++++++ .../test-charset-utf-16-le-no-bom.css | Bin 0 -> 86 bytes .../test-charset-utf-16-le-no-bom.html | 14 ++++++++++ layout/reftests/reftest.list | 3 +++ layout/style/nsCSSLoader.cpp | 24 ++---------------- 24 files changed, 162 insertions(+), 22 deletions(-) create mode 100644 layout/reftests/css-charset/pass.html create mode 100644 layout/reftests/css-charset/reftest.list create mode 100644 layout/reftests/css-charset/test-attribute.css create mode 100644 layout/reftests/css-charset/test-attribute.html create mode 100644 layout/reftests/css-charset/test-charset-leading-space.css create mode 100644 layout/reftests/css-charset/test-charset-leading-space.html create mode 100644 layout/reftests/css-charset/test-charset-quotes.css create mode 100644 layout/reftests/css-charset/test-charset-quotes.html create mode 100644 layout/reftests/css-charset/test-charset-trailing-space.css create mode 100644 layout/reftests/css-charset/test-charset-trailing-space.html create mode 100644 layout/reftests/css-charset/test-charset-utf-16-be-bom.css create mode 100644 layout/reftests/css-charset/test-charset-utf-16-be-bom.html create mode 100644 layout/reftests/css-charset/test-charset-utf-16-be-no-bom.css create mode 100644 layout/reftests/css-charset/test-charset-utf-16-be-no-bom.html create mode 100644 layout/reftests/css-charset/test-charset-utf-16-bom-be.css create mode 100644 layout/reftests/css-charset/test-charset-utf-16-bom-be.html create mode 100644 layout/reftests/css-charset/test-charset-utf-16-bom-le.css create mode 100644 layout/reftests/css-charset/test-charset-utf-16-bom-le.html create mode 100644 layout/reftests/css-charset/test-charset-utf-16-le-bom.css create mode 100644 layout/reftests/css-charset/test-charset-utf-16-le-bom.html create mode 100644 layout/reftests/css-charset/test-charset-utf-16-le-no-bom.css create mode 100644 layout/reftests/css-charset/test-charset-utf-16-le-no-bom.html diff --git a/layout/reftests/css-charset/pass.html b/layout/reftests/css-charset/pass.html new file mode 100644 index 00000000000..9b8d0e95bbd --- /dev/null +++ b/layout/reftests/css-charset/pass.html @@ -0,0 +1,7 @@ + + + + This should be green + + + diff --git a/layout/reftests/css-charset/reftest.list b/layout/reftests/css-charset/reftest.list new file mode 100644 index 00000000000..ef6505576ae --- /dev/null +++ b/layout/reftests/css-charset/reftest.list @@ -0,0 +1,10 @@ +== test-attribute.html pass.html +== test-charset-quotes.html pass.html +== test-charset-leading-space.html pass.html +== test-charset-trailing-space.html pass.html +== test-charset-utf-16-le-no-bom.html pass.html +fails == test-charset-utf-16-le-bom.html pass.html +== test-charset-utf-16-bom-le.html pass.html +== test-charset-utf-16-be-no-bom.html pass.html +fails == test-charset-utf-16-be-bom.html pass.html +== test-charset-utf-16-bom-be.html pass.html diff --git a/layout/reftests/css-charset/test-attribute.css b/layout/reftests/css-charset/test-attribute.css new file mode 100644 index 0000000000000000000000000000000000000000..8fcd96f5d42eca00f1726afbacc763659099977a GIT binary patch literal 44 pcmZQbV#sGmVW?zKV5kP-WFRjGh>IAkfV^}doeG3`4AwwiEdZ}G2h0Ef literal 0 HcmV?d00001 diff --git a/layout/reftests/css-charset/test-attribute.html b/layout/reftests/css-charset/test-attribute.html new file mode 100644 index 00000000000..23ba888b21f --- /dev/null +++ b/layout/reftests/css-charset/test-attribute.html @@ -0,0 +1,14 @@ + + + + + + + + This should be green + + + diff --git a/layout/reftests/css-charset/test-charset-leading-space.css b/layout/reftests/css-charset/test-charset-leading-space.css new file mode 100644 index 0000000000000000000000000000000000000000..69b4324aaff4f567b7657f6cd4ee2be1255f3430 GIT binary patch literal 84 zcmZQ@U`S@jU`S*rVkl-vWhh}#074~(P=*i&HwIk>Lk2SjCk9ubh&2NjLlQ$iLkdGB cP(?KmCj)soKwQLN1>_Y0b*BJTDKOLm02rhU^8f$< literal 0 HcmV?d00001 diff --git a/layout/reftests/css-charset/test-charset-leading-space.html b/layout/reftests/css-charset/test-charset-leading-space.html new file mode 100644 index 00000000000..4f441d7b877 --- /dev/null +++ b/layout/reftests/css-charset/test-charset-leading-space.html @@ -0,0 +1,14 @@ + + + + + + + + This should be green + + + diff --git a/layout/reftests/css-charset/test-charset-quotes.css b/layout/reftests/css-charset/test-charset-quotes.css new file mode 100644 index 0000000000000000000000000000000000000000..67f9f21f45d4c8b96d66bf548e68b086739cb43f GIT binary patch literal 82 zcmZQ@U`S@jU`S*rVkl-vWhh}#U{GfWWe8z#W6)(VWH4iJVsHhDSTk@jBr)VOq%c$h bRa66UGLV-8#6=8NKwc40ZwgSA0z)kT3 + + + + + + + This should be green + + + diff --git a/layout/reftests/css-charset/test-charset-trailing-space.css b/layout/reftests/css-charset/test-charset-trailing-space.css new file mode 100644 index 0000000000000000000000000000000000000000..c1f9d451e271d400e21f1ad8a8631936311e71af GIT binary patch literal 84 zcmWNIF$#b%5Co_86-Rmt8w=BjpfAt|#6++VgwsaEzq`d0v&_MH bp=DsyVnixdP706g6 + + + + + + + This should be green + + + diff --git a/layout/reftests/css-charset/test-charset-utf-16-be-bom.css b/layout/reftests/css-charset/test-charset-utf-16-be-bom.css new file mode 100644 index 0000000000000000000000000000000000000000..a5d0914b4963dc36a906b1406e53c6bc7f30e18e GIT binary patch literal 84 zcmezOpTU74nIVHAk)ep8m?4#+gh7Epi6N9Bgu#tLm%)(1jKPV)6)0lOz{QZnkk639 dPzh8~4aCVnUJei!F<1e4ML@kNKvfD1wE(a64$uGq literal 0 HcmV?d00001 diff --git a/layout/reftests/css-charset/test-charset-utf-16-be-bom.html b/layout/reftests/css-charset/test-charset-utf-16-be-bom.html new file mode 100644 index 00000000000..a9e6c86cc7b --- /dev/null +++ b/layout/reftests/css-charset/test-charset-utf-16-be-bom.html @@ -0,0 +1,14 @@ + + + + + + + + This should be green + + + diff --git a/layout/reftests/css-charset/test-charset-utf-16-be-no-bom.css b/layout/reftests/css-charset/test-charset-utf-16-be-no-bom.css new file mode 100644 index 0000000000000000000000000000000000000000..7218603e6a30694772d53f1ca4e1410ffa06d05c GIT binary patch literal 86 zcmZQ@U`S@jU`S*rVkl-vWhh}#U{GQRWe8z#W6)(VWH4iJVsHhDSTk@jBr)VOq%c$h dRa66UGLV-8#6=8NKwdhKP6fg|ph^XXS^z+J4XFSC literal 0 HcmV?d00001 diff --git a/layout/reftests/css-charset/test-charset-utf-16-be-no-bom.html b/layout/reftests/css-charset/test-charset-utf-16-be-no-bom.html new file mode 100644 index 00000000000..c2cbff25645 --- /dev/null +++ b/layout/reftests/css-charset/test-charset-utf-16-be-no-bom.html @@ -0,0 +1,14 @@ + + + + + + + + This should be green + + + diff --git a/layout/reftests/css-charset/test-charset-utf-16-bom-be.css b/layout/reftests/css-charset/test-charset-utf-16-bom-be.css new file mode 100644 index 0000000000000000000000000000000000000000..21e4206f72601da4acc514a816cdaacf03c285f7 GIT binary patch literal 84 zcmezOpTU74nIVHAk)ep8m?4#+gh7Epi6N9Bgu#tLm%)(149K%);9^K($Y)4ls07MZ b1938tmjlE_3|2s1I*?8U!aSf#1%_Gxw^k1y literal 0 HcmV?d00001 diff --git a/layout/reftests/css-charset/test-charset-utf-16-bom-be.html b/layout/reftests/css-charset/test-charset-utf-16-bom-be.html new file mode 100644 index 00000000000..3d05acc4260 --- /dev/null +++ b/layout/reftests/css-charset/test-charset-utf-16-bom-be.html @@ -0,0 +1,14 @@ + + + + + + + + This should be green + + + diff --git a/layout/reftests/css-charset/test-charset-utf-16-bom-le.css b/layout/reftests/css-charset/test-charset-utf-16-bom-le.css new file mode 100644 index 0000000000000000000000000000000000000000..ddf7fd00ae5f617392eb77d3d4b1e315d6192e6a GIT binary patch literal 84 zcmezW&w(MCA%h{2p@^ZFA(f$oL4iSuA(SD6!Hq$e!H~fW$g^hPVn|}hXGmeF1j<$e baWasX1H?rPRzO}lkWK}{JfKPihFS&y#CQ)M literal 0 HcmV?d00001 diff --git a/layout/reftests/css-charset/test-charset-utf-16-bom-le.html b/layout/reftests/css-charset/test-charset-utf-16-bom-le.html new file mode 100644 index 00000000000..aec7c495815 --- /dev/null +++ b/layout/reftests/css-charset/test-charset-utf-16-bom-le.html @@ -0,0 +1,14 @@ + + + + + + + + This should be green + + + diff --git a/layout/reftests/css-charset/test-charset-utf-16-le-bom.css b/layout/reftests/css-charset/test-charset-utf-16-le-bom.css new file mode 100644 index 0000000000000000000000000000000000000000..3aab85e0b2b3fd88980b9cadb78f3364d023a6d6 GIT binary patch literal 84 zcmezW&w(MCA%h{2p@^ZFA(f$oL4iSuA(SD6!Hq$e!H~g>!H2;WC}PdP#gN31&yd1U d2~<%H#K}Nj4iFbHSOIxOK)oqIRSFEX3;@2o4%z?! literal 0 HcmV?d00001 diff --git a/layout/reftests/css-charset/test-charset-utf-16-le-bom.html b/layout/reftests/css-charset/test-charset-utf-16-le-bom.html new file mode 100644 index 00000000000..8b03930e99f --- /dev/null +++ b/layout/reftests/css-charset/test-charset-utf-16-le-bom.html @@ -0,0 +1,14 @@ + + + + + + + + This should be green + + + diff --git a/layout/reftests/css-charset/test-charset-utf-16-le-no-bom.css b/layout/reftests/css-charset/test-charset-utf-16-le-no-bom.css new file mode 100644 index 0000000000000000000000000000000000000000..0da429cfd5a5dbf1da8e7c00b3c8740ca4f03489 GIT binary patch literal 86 zcmZ=@NM^`jNMtBtC}v1yC}B`wP+|yW2w`wz&}A@WFk|pxa0QB3GjK5^G2}C(FjN9n dR0DA`ke36*MGRIzUOJFY1;RX_N(F{m1^`ez4YL3M literal 0 HcmV?d00001 diff --git a/layout/reftests/css-charset/test-charset-utf-16-le-no-bom.html b/layout/reftests/css-charset/test-charset-utf-16-le-no-bom.html new file mode 100644 index 00000000000..9f7e7b79a10 --- /dev/null +++ b/layout/reftests/css-charset/test-charset-utf-16-le-no-bom.html @@ -0,0 +1,14 @@ + + + + + + + + This should be green + + + diff --git a/layout/reftests/reftest.list b/layout/reftests/reftest.list index 190455b7687..074da139b17 100644 --- a/layout/reftests/reftest.list +++ b/layout/reftests/reftest.list @@ -35,6 +35,9 @@ include canvas/reftest.list # css @import tests include css-import/reftest.list +# css character encoding tests +include css-charset/reftest.list + # columns/ include columns/reftest.list diff --git a/layout/style/nsCSSLoader.cpp b/layout/style/nsCSSLoader.cpp index 40f85ff22d4..4deb9445f8e 100644 --- a/layout/style/nsCSSLoader.cpp +++ b/layout/style/nsCSSLoader.cpp @@ -445,7 +445,7 @@ CSSLoaderImpl::RecycleParser(nsICSSParser* aParser) return NS_OK; } -static const char kCharsetSym[] = "@charset"; +static const char kCharsetSym[] = "@charset \""; static nsresult GetCharsetFromData(const unsigned char* aStyleSheetData, PRUint32 aDataLength, @@ -576,25 +576,9 @@ static nsresult GetCharsetFromData(const unsigned char* aStyleSheetData, pos += step; } - while (pos < aDataLength && nsCRT::IsAsciiSpace(aStyleSheetData[pos])) { - pos += step; - } - - if (pos >= aDataLength || - (aStyleSheetData[pos] != '"' && aStyleSheetData[pos] != '\'')) { - return aCharset.IsEmpty() ? NS_ERROR_NOT_AVAILABLE : NS_OK; - } - - char quote = aStyleSheetData[pos]; - pos += step; nsCAutoString charset; while (pos < aDataLength) { - if (aStyleSheetData[pos] == '\\') { - pos += step; - if (pos >= aDataLength) { - break; - } - } else if (aStyleSheetData[pos] == quote) { + if (aStyleSheetData[pos] == '"') { break; } @@ -605,10 +589,6 @@ static nsresult GetCharsetFromData(const unsigned char* aStyleSheetData, // Check for the ending ';' pos += step; - while (pos < aDataLength && nsCRT::IsAsciiSpace(aStyleSheetData[pos])) { - pos += step; - } - if (pos >= aDataLength || aStyleSheetData[pos] != ';') { return aCharset.IsEmpty() ? NS_ERROR_NOT_AVAILABLE : NS_OK; }