summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/css/cssom/selectorSerialize.html
blob: ab4855181617a47e96d3d685504b300513b89fb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<!DOCTYPE html>
<html>
    <head>
        <title>CSSOM Test: test serialized selector which is only one simple selector in the sequence of simple selectors</title>
        <link rel="author" title="T.Nishitani" href="mailto:lequinharay@gmail.com">
        <link rel="reviewer" title="L. David Baron" href="https://dbaron.org/">
        <link rel="help" href="https://drafts.csswg.org/cssom-1/#serializing-selectors">
        <meta name="flags" content="dom">
        <meta charset="utf-8">
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <style id="teststyles">
        </style>
    </head>
    <body>
        <div id="log"></div>
        <script>
            function assert_selector_serializes_to(source, expected_result) {
              var style_element = document.getElementById("teststyles");
              style_element.firstChild.data = source + "{ font-size: 1em; }";
              var sheet = style_element.sheet;
              assert_equals(sheet.cssRules[sheet.cssRules.length - 1].selectorText, expected_result);
            }

            function run_tests_on_anplusb_selector(source) {
                assert_selector_serializes_to(source + '( even   )', source + '(2n)');
                assert_selector_serializes_to(source + '(   odd )', source + '(2n+1)');
                assert_selector_serializes_to(source + '( +10  )', source + '(10)');
                assert_selector_serializes_to(source + '(   -10 )', source + '(-10)');
                assert_selector_serializes_to(source + '( +4n  )', source + '(4n)');
                assert_selector_serializes_to(source + '( -3n   )', source + '(-3n)');
                assert_selector_serializes_to(source + '( 1n + 5  )', source + '(n+5)');
                assert_selector_serializes_to(source + '( -1n +     5 )', source + '(-n+5)');
                assert_selector_serializes_to(source + '( -1n     - 5 )', source + '(-n-5)');
            }

            test(function() {
              assert_selector_serializes_to(":nth-child(  3n - 0)", ":nth-child(3n)");
              assert_selector_serializes_to(":nth-child(  1n - 0)", ":nth-child(n)");
            }, ":nth-child serialization produces canonical form");


            /* for universal selecter with default namespace */
            test(function(){
                /* this is single universal selector */
                assert_selector_serializes_to('*', '*');
                assert_selector_serializes_to(' * ', '*');
            }, 'single universal selector shows \'*\' when serialized.')

            test(function(){
                assert_selector_serializes_to('div', 'div');
                assert_selector_serializes_to(' div ', 'div');
            }, 'single type (simple) selector in the sequence of simple selectors that is not a universal selector')

            test(function(){
                assert_selector_serializes_to('.class', '.class');
                assert_selector_serializes_to(' .class    ', '.class');
            }, 'single class (simple) selector in the sequence of simple selectors that is not a universal selector')

            test(function(){
                assert_selector_serializes_to('#id', '#id');
                assert_selector_serializes_to('     #id ', '#id');
            }, 'single id (simple) selector in the sequence of simple selectors that is not a universal selector')

            test(function(){
                assert_selector_serializes_to(':hover', ':hover');
                assert_selector_serializes_to('    :hover    ', ':hover');
            }, 'single pseudo (simple) selector which does not accept arguments in the sequence of simple selectors that is not a universal selector')

            test(function(){
                assert_selector_serializes_to(':lang(ja)', ':lang(ja)');
                assert_selector_serializes_to(':lang( ja )', ':lang(ja)');
                assert_selector_serializes_to(':lang( j\\ a )', ':lang(j\\ a)');
            }, 'single pseudo (simple) selector "lang" which accepts arguments in the sequence of simple selectors that is not a universal selector')


            test(function(){
                run_tests_on_anplusb_selector(':nth-child');
            }, 'single pseudo (simple) selector "nth-child" which accepts arguments in the sequence of simple selectors that is not a universal selector')

            test(function(){
                run_tests_on_anplusb_selector(':nth-last-child');
            }, 'single pseudo (simple) selector "nth-last-child" which accepts arguments in the sequence of simple selectors that is not a universal selector')

            test(function(){
                run_tests_on_anplusb_selector(':nth-of-type');
            }, 'single pseudo (simple) selector "nth-of-child" which accepts arguments in the sequence of simple selectors that is not a universal selector')

            test(function(){
                run_tests_on_anplusb_selector(':nth-last-of-type');
            }, 'single pseudo (simple) selector ":nth-last-of-type" which accepts arguments in the sequence of simple selectors that is not a universal selector')

            test(function(){
                assert_selector_serializes_to(' :not( abc ) ', ':not(abc)');
                assert_selector_serializes_to(' :not(  .head ) ', ':not(.head)');
                assert_selector_serializes_to(' :not(  #head   ) ', ':not(#head)');
                assert_selector_serializes_to(' :not(  :hover   ) ', ':not(:hover)');
            }, 'single pseudo (simple) selector ":not" which accepts arguments in the sequence of simple selectors that is not a universal selector')

            const escaped_ns_rule = "@namespace ns\\:odd url(ns);";
            test(function() {
                assert_selector_serializes_to("[ns\\:foo]", "[ns\\:foo]");
            }, "escaped character in attribute name");
            test(function() {
                assert_selector_serializes_to("[\\30zonk]", "[\\30 zonk]");
            }, "escaped character as code point in attribute name");
            test(function() {
                assert_selector_serializes_to("[\\@]", "[\\@]");
            }, "escaped character (@) in attribute name");
            test(function() {
                assert_selector_serializes_to("[*|ns\\:foo]", "[*|ns\\:foo]");
            }, "escaped character in attribute name with any namespace");
            test(function() {
                assert_selector_serializes_to(escaped_ns_rule + "[ns\\:odd|foo]", "[ns\\:odd|foo]");
            }, "escaped character in attribute prefix");
            test(function() {
                assert_selector_serializes_to(escaped_ns_rule + "[ns\\:odd|odd\\:name]", "[ns\\:odd|odd\\:name]");
            }, "escaped character in both attribute prefix and name");

            test(() => {
              assert_selector_serializes_to("\\\\", "\\\\");
            }, "escaped character (\\) in element name");
            test(() => {
              assert_selector_serializes_to("*|\\\\", "\\\\");
            }, "escaped character (\\) in element name with any namespace without default");
            test(() => {
              assert_selector_serializes_to("@namespace 'blah'; *|\\\\", "*|\\\\");
            }, "escaped character (\\) in element name with any namespace with default");
            test(() => {
              assert_selector_serializes_to("|\\\\", "|\\\\");
            }, "escaped character (\\) in element name with no namespace");

            const element_escaped_ns_rule = "@namespace x\\* 'blah';";
            test(() => {
              assert_selector_serializes_to(element_escaped_ns_rule + "x\\*|test", "x\\*|test");
            }, "escaped character (*) in element prefix");

            // TODO: https://github.com/w3c/csswg-drafts/issues/8911
        </script>
    </body>
</html>