123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
- function test_lexer(domutils, cssText, tokenTypes) {
- let lexer = domutils.getCSSLexer(cssText);
- let reconstructed = '';
- let lastTokenEnd = 0;
- let i = 0;
- while (true) {
- let token = lexer.nextToken();
- if (!token) {
- break;
- }
- let combined = token.tokenType;
- if (token.text)
- combined += ":" + token.text;
- equal(combined, tokenTypes[i]);
- ok(token.endOffset > token.startOffset);
- equal(token.startOffset, lastTokenEnd);
- lastTokenEnd = token.endOffset;
- reconstructed += cssText.substring(token.startOffset, token.endOffset);
- ++i;
- }
- // Ensure that we saw the correct number of tokens.
- equal(i, tokenTypes.length);
- // Ensure that the reported offsets cover all the text.
- equal(reconstructed, cssText);
- }
- var LEX_TESTS = [
- ["simple", ["ident:simple"]],
- ["simple: { hi; }",
- ["ident:simple", "symbol::",
- "whitespace", "symbol:{",
- "whitespace", "ident:hi",
- "symbol:;", "whitespace",
- "symbol:}"]],
- ["/* whatever */", ["comment"]],
- ["'string'", ["string:string"]],
- ['"string"', ["string:string"]],
- ["rgb(1,2,3)", ["function:rgb", "number",
- "symbol:,", "number",
- "symbol:,", "number",
- "symbol:)"]],
- ["@media", ["at:media"]],
- ["#hibob", ["id:hibob"]],
- ["#123", ["hash:123"]],
- ["23px", ["dimension:px"]],
- ["23%", ["percentage"]],
- ["url(http://example.com)", ["url:http://example.com"]],
- ["url('http://example.com')", ["url:http://example.com"]],
- ["url( 'http://example.com' )",
- ["url:http://example.com"]],
- // In CSS Level 3, this is an ordinary URL, not a BAD_URL.
- ["url(http://example.com", ["url:http://example.com"]],
- ["url(http://example.com @", ["bad_url:http://example.com"]],
- ["quo\\ting", ["ident:quoting"]],
- ["'bad string\n", ["bad_string:bad string", "whitespace"]],
- ["~=", ["includes"]],
- ["|=", ["dashmatch"]],
- ["^=", ["beginsmatch"]],
- ["$=", ["endsmatch"]],
- ["*=", ["containsmatch"]],
- // URANGE may be on the way out, and it isn't used by devutils, so
- // let's skip it.
- ["<!-- html comment -->", ["htmlcomment", "whitespace", "ident:html",
- "whitespace", "ident:comment", "whitespace",
- "htmlcomment"]],
- // earlier versions of CSS had "bad comment" tokens, but in level 3,
- // unterminated comments are just comments.
- ["/* bad comment", ["comment"]]
- ];
- function test_lexer_linecol(domutils, cssText, locations) {
- let lexer = domutils.getCSSLexer(cssText);
- let i = 0;
- while (true) {
- let token = lexer.nextToken();
- let startLine = lexer.lineNumber;
- let startColumn = lexer.columnNumber;
- // We do this in a bit of a funny way so that we can also test the
- // location of the EOF.
- let combined = ":" + startLine + ":" + startColumn;
- if (token)
- combined = token.tokenType + combined;
- equal(combined, locations[i]);
- ++i;
- if (!token) {
- break;
- }
- }
- // Ensure that we saw the correct number of tokens.
- equal(i, locations.length);
- }
- function test_lexer_eofchar(domutils, cssText, argText, expectedAppend,
- expectedNoAppend) {
- let lexer = domutils.getCSSLexer(cssText);
- while (lexer.nextToken()) {
- // Nothing.
- }
- do_print("EOF char test, input = " + cssText);
- let result = lexer.performEOFFixup(argText, true);
- equal(result, expectedAppend);
- result = lexer.performEOFFixup(argText, false);
- equal(result, expectedNoAppend);
- }
- var LINECOL_TESTS = [
- ["simple", ["ident:0:0", ":0:6"]],
- ["\n stuff", ["whitespace:0:0", "ident:1:4", ":1:9"]],
- ['"string with \\\nnewline" \r\n', ["string:0:0", "whitespace:1:8",
- ":2:0"]]
- ];
- var EOFCHAR_TESTS = [
- ["hello", "hello"],
- ["hello \\", "hello \\\\", "hello \\\uFFFD"],
- ["'hello", "'hello'"],
- ["\"hello", "\"hello\""],
- ["'hello\\", "'hello\\\\'", "'hello'"],
- ["\"hello\\", "\"hello\\\\\"", "\"hello\""],
- ["/*hello", "/*hello*/"],
- ["/*hello*", "/*hello*/"],
- ["/*hello\\", "/*hello\\*/"],
- ["url(hello", "url(hello)"],
- ["url('hello", "url('hello')"],
- ["url(\"hello", "url(\"hello\")"],
- ["url(hello\\", "url(hello\\\\)", "url(hello\\\uFFFD)"],
- ["url('hello\\", "url('hello\\\\')", "url('hello')"],
- ["url(\"hello\\", "url(\"hello\\\\\")", "url(\"hello\")"],
- ];
- function run_test()
- {
- let domutils = Components.classes["@mozilla.org/inspector/dom-utils;1"]
- .getService(Components.interfaces.inIDOMUtils);
- let text, result;
- for ([text, result] of LEX_TESTS) {
- test_lexer(domutils, text, result);
- }
- for ([text, result] of LINECOL_TESTS) {
- test_lexer_linecol(domutils, text, result);
- }
- for ([text, expectedAppend, expectedNoAppend] of EOFCHAR_TESTS) {
- if (!expectedNoAppend) {
- expectedNoAppend = expectedAppend;
- }
- test_lexer_eofchar(domutils, text, text, expectedAppend, expectedNoAppend);
- }
- // Ensure that passing a different inputString to performEOFFixup
- // doesn't cause an assertion trying to strip a backslash from the
- // end of an empty string.
- test_lexer_eofchar(domutils, "'\\", "", "\\'", "'");
- }
|