summaryrefslogtreecommitdiffstats
path: root/layout/style/test/test_css_parse_error_smoketest.html
diff options
context:
space:
mode:
Diffstat (limited to 'layout/style/test/test_css_parse_error_smoketest.html')
-rw-r--r--layout/style/test/test_css_parse_error_smoketest.html160
1 files changed, 160 insertions, 0 deletions
diff --git a/layout/style/test/test_css_parse_error_smoketest.html b/layout/style/test/test_css_parse_error_smoketest.html
new file mode 100644
index 0000000000..96d8edce3a
--- /dev/null
+++ b/layout/style/test/test_css_parse_error_smoketest.html
@@ -0,0 +1,160 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Test for CSS parser reporting parsing errors with expected precision</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" href="/tests/SimpleTest/test.css">
+</head>
+<body>
+<style id="testbench"></style>
+<script>
+ SpecialPowers.wrap(window).docShell.cssErrorReportingEnabled = true;
+ // Tests that apply to all types of style sheets
+ var tests = [
+ {
+ css: "@unknown {}",
+ error: "Unrecognized at-rule or error parsing at-rule ‘@unknown’.",
+ }, {
+ css: "x { color: invalid; }",
+ error: "Expected color but found ‘invalid’. Error in parsing value for ‘color’. Declaration dropped.",
+ cssSelectors: "x",
+ }, {
+ css: "x { filter: alpha(foo); }",
+ error: "Expected ‘none’, URL, or filter function but found ‘alpha(’. Error in parsing value for ‘filter’. Declaration dropped.",
+ cssSelectors: "x",
+ }, {
+ css: "x { color: red; abc; }",
+ error: "Unknown property ‘abc;’. Declaration dropped.",
+ cssSelectors: "x",
+ }, {
+ css: "x { filter: 5; }",
+ error: "Expected ‘none’, URL, or filter function but found ‘5’. Error in parsing value for ‘filter’. Declaration dropped.",
+ cssSelectors: "x",
+ }, {
+ css: "::unknown {}",
+ error: "Unknown pseudo-class or pseudo-element ‘unknown’. Ruleset ignored due to bad selector.",
+ }, {
+ css: ":unknown {}",
+ error: "Unknown pseudo-class or pseudo-element ‘unknown’. Ruleset ignored due to bad selector.",
+ }, {
+ css: "::5 {}",
+ error: "Expected identifier for pseudo-class or pseudo-element but found ‘5’. Ruleset ignored due to bad selector.",
+ }, {
+ css: ": {}",
+ error: "Expected identifier for pseudo-class or pseudo-element but found ‘ ’. Ruleset ignored due to bad selector.",
+ }, {
+ css: "x[a.]{}",
+ error: "Unexpected token in attribute selector: ‘.’. Ruleset ignored due to bad selector.",
+ }, {
+ css: "x[*a]{}",
+ error: "Expected ‘|’ but found ‘a’. Ruleset ignored due to bad selector.",
+ }, {
+ css: "x[a=5]{}",
+ error: "Expected identifier or string for value in attribute selector but found ‘5’. Ruleset ignored due to bad selector.",
+ }, {
+ css: "x[$] {}",
+ error: "Expected attribute name or namespace but found ‘$’. Ruleset ignored due to bad selector.",
+ }, {
+ css: "a[|5] {}",
+ error: "Expected identifier for attribute name but found ‘5’. Ruleset ignored due to bad selector.",
+ }, {
+ css: "a[x|] {}",
+ error: "Unknown namespace prefix ‘x’. Ruleset ignored due to bad selector.",
+ }, {
+ css: "x| {}",
+ error: "Unknown namespace prefix ‘x’. Ruleset ignored due to bad selector.",
+ }, {
+ css: "a> {}",
+ error: "Dangling combinator. Ruleset ignored due to bad selector.",
+ }, {
+ css: "~ {}",
+ error: "Selector expected. Ruleset ignored due to bad selector.",
+ }, {
+ css: "| {}",
+ error: "Expected element name or ‘*’ but found ‘ ’. Ruleset ignored due to bad selector.",
+ }, {
+ css: ". {}",
+ error: "Expected identifier for class selector but found ‘ ’. Ruleset ignored due to bad selector.",
+ }, {
+ css: ":not() {}",
+ error: "Selector expected. Ruleset ignored due to bad selector.",
+ }, {
+ css: "* { -webkit-text-size-adjust: 100% }",
+ error: "Error in parsing value for ‘-webkit-text-size-adjust’. Declaration dropped.",
+ cssSelectors: "*",
+ }, {
+ css: "@media (totally-unknown-feature) {}",
+ error: "Expected media feature name but found ‘totally-unknown-feature’.",
+ }, {
+ css: "@media \"foo\" {}",
+ error: "Unexpected token ‘\"foo\"’ in media list.",
+ }, {
+ css: "@media (min-width) {}",
+ error: "Media features with min- or max- must have a value.",
+ }, {
+ css: "@media (min-width >= 3px) {}",
+ error: "Unexpected operator in media list.",
+ }, {
+ css: "@media (device-height: three) {}",
+ error: "Found invalid value for media feature.",
+ }, {
+ css: "@media (min-width: foo) {}",
+ error: "Found invalid value for media feature.",
+ }, {
+ css: "@media (min-resolution: 2) {}",
+ error: "Found invalid value for media feature.",
+ }, {
+ css: "@media (min-monochrome: 1.1) {}",
+ error: "Found invalid value for media feature.",
+ }, {
+ css: "@media (min-aspect-ratio: 1 invalid) {}",
+ error: "Unexpected token ‘invalid’ in media list.",
+ }, {
+ css: "@media (min-aspect-ratio: 1 / invalid) {}",
+ error: "Found invalid value for media feature.",
+ }, {
+ css: "@media (orientation: invalid-orientation-value) {}",
+ error: "Found invalid value for media feature.",
+ }, {
+ css: "a, .b, #c { unknown: invalid; }",
+ error: "Unknown property ‘unknown’. Declaration dropped.",
+ cssSelectors: "a, .b, #c"
+ },
+ {
+ css: ":host:hover { color: red; }",
+ error: ":host selector in ‘:host:hover’ is not featureless and will never match. Maybe you intended to use :host()?"
+ },
+ ];
+
+ // Tests that apply only to constructed style sheets
+ var constructedSheetTests = [
+ {
+ css: '@import url("sheet.css");',
+ error: "@import rules are not yet valid in constructed stylesheets."
+ }
+ ];
+
+ function assertMessages(messages, action) {
+ return new Promise(resolve => {
+ SimpleTest.expectConsoleMessages(action, messages, resolve);
+ });
+ }
+
+ async function runTests() {
+ for (let {css, cssSelectors = "", error} of tests) {
+ let messages = [ { cssSelectors, errorMessage: error } ];
+ await assertMessages(messages, () => { testbench.innerHTML = css });
+ await assertMessages(messages, () => { new CSSStyleSheet().replaceSync(css) });
+ await assertMessages(messages, async () => { await new CSSStyleSheet().replace(css) });
+ }
+ for (let {css, cssSelectors = "", error} of constructedSheetTests) {
+ let messages = [ { cssSelectors, errorMessage: error } ];
+ await assertMessages(messages, () => { new CSSStyleSheet().replaceSync(css) });
+ await assertMessages(messages, async () => { await new CSSStyleSheet().replace(css) });
+ }
+ }
+
+ add_task(runTests);
+
+</script>