Closed Bug 111765 Opened 23 years ago Closed 23 years ago

alternate style sheet not correctly inserted in document.styleSheets collection

Categories

(Core :: DOM: CSS Object Model, defect)

defect
Not set
normal

Tracking

()

RESOLVED DUPLICATE of bug 47734

People

(Reporter: martin.honnen, Assigned: jst)

Details

Attachments

(2 files)

When I include an alternate style sheet with <link rel="alternate stylesheet" and then document.write(document.styleSheets.length) it shows 0 instead of 1. Also document.styleSheets[0] is null while the page load. If I check back after the page is loaded then the length is still 0 but suddenly the document.styleSheets[0] is a style sheet which is scriptable (can be enabled and disabled). I would expect alternate style sheets to show up in document.styleSheets while the page load and the length property should be correct. Here is a test page <html> <head> <title> style sheet test </title> <link rel="alternate stylesheet" title="green" type="text/css" href="test20011121.css" /> <script type="text/javascript"> function output (text) { document.body.appendChild(document.createTextNode(text)); document.body.appendChild(document.createElement('br')); } function checkStyleSheets() { output('Loaded:'); output('document.styleSheets.length: ' + document.styleSheets.length); output('document.styleSheets[0]: ' + document.styleSheets[0]); output('document.styleSheets[0].disabled: ' + document.styleSheets[0].disabled); } </script> </head> <body onload="checkStyleSheets();"> <input type="button" value="toggle style sheet" onclick="document.styleSheets[0].disabled = !document.styleSheets[0].disabled; checkStyleSheets();" /> <br /> <script type="text/javascript"> document.write('Loading: <br \/>'); document.write('document.styleSheets.length: ' + document.styleSheets.length + '<br \/>'); document.write('document.styleSheets[0]: ' + document.styleSheets[0] + '<br \/>'); document.write('document.styleSheets[0].disabled: ' + document.styleSheets[0].disabled + '<br \/>'); </script> </body> </html> where the css simply contains body { color: green; }
Happens on Linux too...
OS: Windows XP → All
Hardware: PC → All
As far as I can tell, the problem is the following: 1) We defer alternate sheet loads. So when we create the nsDOMStyleSheetList and it calls GetNumberOfStyleSheets the first time it gets 0. 2) The stylesheet list caches the 0 and only updates it if the StyleSheetAdded callback is called. This callback is never called if all the pending sheets are alternate sheets. Worse, yet, if the remaining sheets are not all alternates there will be only _one_ call to StyleSheetAdded, since the CSS loader will only set notification to true on the last pending sheet. See http://lxr.mozilla.org/seamonkey/source/content/html/style/src/nsCSSLoader.cpp#798 There is no real explanation for why we do it that way and I'm not sure what the performance (or correctness) impact would be of notifying on all sheets here. ccing pierre.
Anyone wanna fix this, or should I Future this bug?
Marking as dup of the original bug. Will attach a link to the testcase in that bug. *** This bug has been marked as a duplicate of 47734 ***
Status: NEW → RESOLVED
Closed: 23 years ago
Resolution: --- → DUPLICATE
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: