4 https://bugzilla.mozilla.org/show_bug.cgi?id=185236
7 <title>Test for Bug
185236</title>
8 <script src=
"/tests/SimpleTest/SimpleTest.js"></script>
9 <link rel=
"stylesheet" type=
"text/css" href=
"/tests/SimpleTest/test.css"/>
11 var pendingEventCounter
= 0;
12 SimpleTest
.waitForExplicitFinish();
13 addLoadEvent(function() {
14 is(pendingEventCounter
, 0,
15 "How did onload for the page fire before onload for all the stylesheets?");
18 // Count the link we're about to parse
19 pendingEventCounter
= 1;
21 <link rel=
"stylesheet" href=
"data:text/css,*{}"
22 onload=
"--pendingEventCounter;
23 ok(true, 'Load event firing on basic stylesheet')"
24 onerror=
"--pendingEventCounter;
25 ok(false, 'Error event firing on basic stylesheet')">
28 <a target=
"_blank" href=
"https://bugzilla.mozilla.org/show_bug.cgi?id=185236">Mozilla Bug
185236</a>
30 <div id=
"content" style=
"display: none">
35 /** Test for Bug 185236 **/
37 function checkSheetComplete(sheet
, length
) {
39 is(sheet
.cssRules
.length
, length
, `Should be loaded with ${length} rule(s)`);
41 ok(false, "Sheet has not been loaded completely");
46 // There should be usually 1 pending event but the load event might have fired
47 // if the parser yields between the link and starting the script execution.
48 const pendingEventCounterAtStart
= pendingEventCounter
;
50 ok(pendingEventCounter
<= 1, `There should be at most one pending event, got ${pendingEventCounterAtStart}`);
52 is(document
.styleSheets
.length
, 2, "Should have two stylesheets");
53 checkSheetComplete(document
.styleSheets
[1], 1);
55 // Test sheet that will already be complete when we write it out
56 ++pendingEventCounter
;
57 document
.write('<link rel="stylesheet" href="data:text/css,*{}"\
58 onload="--pendingEventCounter;\
59 ok(true, \'Load event firing on basic stylesheet\')"\
60 onerror="--pendingEventCounter;\
61 ok(false, \'Error event firing on basic stylesheet\')">');
63 // Make sure we have that second stylesheet
64 is(document
.styleSheets
.length
, 3, "Should have three stylesheets");
66 // Make sure that the second stylesheet is all loaded
67 // If we ever switch away from sync loading of already-complete sheets, this
68 // test will need adjusting
69 checkSheetComplete(document
.styleSheets
[2], 1);
71 // Make sure the load event for that stylesheet has not fired yet
72 is(pendingEventCounter
, pendingEventCounterAtStart
+ 1, "After first document write");
73 ++pendingEventCounter
;
75 document
.write('<style\
76 onload="--pendingEventCounter;\
77 ok(true, \'Load event firing on inline stylesheet\')"\
78 onerror="--pendingEventCounter;\
79 ok(false, \'Error event firing on inline stylesheet\')"></style>');
81 // Make sure the load event for that second stylesheet has not fired yet
82 is(pendingEventCounter
, pendingEventCounterAtStart
+ 2, "after second document write");
83 ++pendingEventCounter
;
85 document
.write('<link rel="stylesheet" href="http://www.example.com"\
86 onload="--pendingEventCounter;\
87 ok(false, \'Load event firing on broken stylesheet 1\')"\
88 onerror="--pendingEventCounter;\
89 ok(true, \'Error event firing on broken stylesheet 1\')">');
90 ++pendingEventCounter
;
92 var link
= document
.createElement("link");
93 link
.rel
= "stylesheet";
94 link
.href
= "http://www.example.com";
95 link
.onload = function() { --pendingEventCounter
;
96 ok(false, 'Load event firing on broken stylesheet 2');
98 link
.onerror = function() { --pendingEventCounter
;
99 ok(true, 'Error event firing on broken stylesheet 2');
101 document
.body
.appendChild(link
);
103 ++pendingEventCounter
;
104 link
= document
.createElement("link");
105 link
.rel
= "stylesheet";
106 link
.href
= "data:text/css,*{}";
107 link
.onload = function() { --pendingEventCounter
;
108 ok(true, 'Load event firing on external stylesheet');
110 link
.onerror = function() { --pendingEventCounter
;
111 ok(false, 'Error event firing on external stylesheet');
113 document
.body
.appendChild(link
);
115 // If we ever switch away from sync loading of already-complete sheets, this
116 // test will need adjusting
117 checkSheetComplete(link
.sheet
, 1);
119 ++pendingEventCounter
;
120 link
= document
.createElement("link");
121 link
.rel
= "stylesheet";
122 link
.href
= "data:text/css,@import url('data:text/css,*{}')";
123 link
.onload = function() { --pendingEventCounter
;
124 ok(true, 'Load event firing on external stylesheet');
126 link
.onerror = function() { --pendingEventCounter
;
127 ok(false, 'Error event firing on external stylesheet');
129 document
.body
.appendChild(link
);
131 ++pendingEventCounter
;
132 link
= document
.createElement("link");
133 link
.rel
= "stylesheet";
134 link
.href
= "data:text/css,@import url('http://www.example.com')";
135 link
.onload = function() { --pendingEventCounter
;
136 ok(false, 'Load event firing on broken stylesheet 3');
138 link
.onerror = function() { --pendingEventCounter
;
139 ok(true, 'Error event firing on broken stylesheet 3');
141 document
.body
.appendChild(link
);
143 function absoluteURL(relativeURL
) {
144 return new URL(relativeURL
, location
.href
).href
;
147 ++pendingEventCounter
;
148 link
= document
.createElement("link");
149 link
.rel
= "stylesheet";
150 link
.href
= `data:text/css,@import url('http://www.example.com'); @import url(${absoluteURL('slow_ok_sheet.sjs')});`;
151 link
.onload = function() { --pendingEventCounter
;
152 ok(false, 'Load event firing on broken stylesheet 4');
154 link
.onerror = function() { --pendingEventCounter
;
155 ok(true, 'Error event firing on broken stylesheet 4');
157 document
.body
.appendChild(link
);
159 ++pendingEventCounter
;
160 link
= document
.createElement("link");
161 link
.rel
= "stylesheet";
162 link
.href
= `data:text/css,@import url(${absoluteURL('slow_broken_sheet.sjs')}); @import url('data:text/css,');`;
163 link
.onload = function() { --pendingEventCounter
;
164 ok(false, 'Load event firing on broken stylesheet 5');
166 link
.onerror = function() { --pendingEventCounter
;
167 ok(true, 'Error event firing on broken stylesheet 5');
169 document
.body
.appendChild(link
);
171 // Make sure the load events for all those stylesheets have not fired yet
172 is(pendingEventCounter
, pendingEventCounterAtStart
+ 9, "There should be nine more pending events");