Open Bug 1903274 Opened 8 months ago Updated 8 months ago

Firefox issues two requests for a stylesheet when no charset is provided

Categories

(Core :: CSS Parsing and Computation, defect)

defect

Tracking

()

People

(Reporter: jdescottes, Unassigned)

Details

Attachments

(1 file)

Not sure if this is intentional or a bug, but we found a firefox-only behavior when a page loads a stylesheet via link rel=stylesheet and no charset is set (ie, no meta charset in the page, and no charset in the response headers of the request serving the HTML file).

When no charset is set, Firefox will issue two requests to download the stylesheets, whereas Chrome only issues one. And when a charset is set Firefox only issues one request.

Again, need to make sure that the server will NOT return a charset in the response headers. python3 -m http.server works fine for that purpose.
STRs:

  • unzip the files in attachment
  • serve with python3 -m http.server
  • open "no-charset.html" in Firefox

ER:
Only one request to style.css should reach the server (?)
AR:
Two requests are issued (we can either check that with DevTools' netmonitor, or simply by checking the server logs)

Doing the same scenario with the other html file "with-charset.html", only one request will be issued. Only difference between the two files is that "with-charset.html" contains <meta charset="utf-8"/>

Is this behavior expected?

CSSLoader logs for a single load of the no-charset page:

[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::LoadSheet(aURL, aObserver) api call
[Child 24926: Main Thread]: D/nsCSSLoader Non-document sheet uri: 'http://localhost:8000/style.css'
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::CreateSheet(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader Needs parser
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::LoadSheet
[Child 24926: Main Thread]: D/nsCSSLoader Load from: 'http://localhost:8000/style.css'
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader Mapping priority: auto -> PRIORITY_NORMAL
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::LoadStyleLink
[Child 24926: Main Thread]: D/nsCSSLoader Link uri: 'http://localhost:8000/style.css'
[Child 24926: Main Thread]: D/nsCSSLoader Link title: ''
[Child 24926: Main Thread]: D/nsCSSLoader Link media: ''
[Child 24926: Main Thread]: D/nsCSSLoader Link alternate rel: 0
[Child 24926: Main Thread]: D/nsCSSLoader Link sync load: 'false'
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::CreateSheet(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader > Encoding guess mismatch
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader > Encoding guess mismatch
[Child 24926: Main Thread]: D/nsCSSLoader Needs parser
[Child 24926: Main Thread]: D/nsCSSLoader Sheet is alternate: 0
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::LoadSheet
[Child 24926: Main Thread]: D/nsCSSLoader Load from: 'http://localhost:8000/style.css'
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader Mapping priority: auto -> PRIORITY_NORMAL
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader > Encoding guess mismatch
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader > Encoding guess mismatch
[Child 24926: StreamTrans #8]: D/nsCSSLoader SheetLoadData::VerifySheetReadyToParse
[Child 24926: StreamTrans #8]: D/nsCSSLoader css::Loader::ParseSheet
[Child 24926: StreamTrans #8]: D/nsCSSLoader Load succeeded for URI: 'http://localhost:8000/style.css', parsing
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::SheetComplete, status: 0x0
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader SharedStyleSheetCache::InsertIfNeeded
[Child 24926: Main Thread]: D/nsCSSLoader Putting style sheet in shared cache: http://localhost:8000/style.css
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader > Encoding guess mismatch
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader Notifying observer 10c963b40 for data 104ece860. deferred: 0
[Child 24926: Main Thread]: D/nsCSSLoader Notifying global observer 104db2ea0 for data 104ece860. deferred: 0
[Child 24926: StreamTrans #8]: D/nsCSSLoader SheetLoadData::VerifySheetReadyToParse
[Child 24926: StreamTrans #8]: D/nsCSSLoader css::Loader::ParseSheet
[Child 24926: StreamTrans #8]: D/nsCSSLoader Load succeeded for URI: 'http://localhost:8000/style.css', parsing
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::SheetComplete, status: 0x0
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::InsertSheetInTree
[Child 24926: Main Thread]: D/nsCSSLoader Inserting into target (doc: 1) at position 0
[Child 24926: Main Thread]: D/nsCSSLoader SharedStyleSheetCache::InsertIfNeeded
[Child 24926: Main Thread]: D/nsCSSLoader Putting style sheet in shared cache: http://localhost:8000/style.css
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader > Encoding guess mismatch
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader > Encoding guess mismatch
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader > Encoding guess mismatch
[Child 24926: Main Thread]: D/nsCSSLoader Notifying observer 10c966e00 for data 104ece980. deferred: 0
[Child 24926: Main Thread]: D/nsCSSLoader Notifying global observer 104db2ea0 for data 104ece980. deferred: 0

Logs for the with-charset.html load:

Child 24926: Main Thread]: D/nsCSSLoader css::Loader::LoadSheet(aURL, aObserver) api call
[Child 24926: Main Thread]: D/nsCSSLoader Non-document sheet uri: 'http://localhost:8000/style.css'
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::CreateSheet(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader Needs parser
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::LoadSheet
[Child 24926: Main Thread]: D/nsCSSLoader Load from: 'http://localhost:8000/style.css'
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader Mapping priority: auto -> PRIORITY_NORMAL
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::LoadStyleLink
[Child 24926: Main Thread]: D/nsCSSLoader Link uri: 'http://localhost:8000/style.css'
[Child 24926: Main Thread]: D/nsCSSLoader Link title: ''
[Child 24926: Main Thread]: D/nsCSSLoader Link media: ''
[Child 24926: Main Thread]: D/nsCSSLoader Link alternate rel: 0
[Child 24926: Main Thread]: D/nsCSSLoader Link sync load: 'false'
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::CreateSheet(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader Hit cache with state: Loading
[Child 24926: Main Thread]: D/nsCSSLoader Sheet is alternate: 0
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::LoadSheet
[Child 24926: Main Thread]: D/nsCSSLoader Load from: 'http://localhost:8000/style.css'
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: StreamTrans #8]: D/nsCSSLoader SheetLoadData::VerifySheetReadyToParse
[Child 24926: StreamTrans #8]: D/nsCSSLoader css::Loader::ParseSheet
[Child 24926: StreamTrans #8]: D/nsCSSLoader Load succeeded for URI: 'http://localhost:8000/style.css', parsing
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::SheetComplete, status: 0x0
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader css::Loader::InsertSheetInTree
[Child 24926: Main Thread]: D/nsCSSLoader Inserting into target (doc: 1) at position 0
[Child 24926: Main Thread]: D/nsCSSLoader SharedStyleSheetCache::InsertIfNeeded
[Child 24926: Main Thread]: D/nsCSSLoader Putting style sheet in shared cache: http://localhost:8000/style.css
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader > Encoding guess mismatch
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader Notifying observer 10ca32500 for data 104ecf5e0. deferred: 0
[Child 24926: Main Thread]: D/nsCSSLoader Notifying global observer 104db32f0 for data 104ecf5e0. deferred: 0
[Child 24926: Main Thread]: D/nsCSSLoader KeyEquals(http://localhost:8000/style.css)
[Child 24926: Main Thread]: D/nsCSSLoader Notifying observer 10ca3b700 for data 104ecf700. deferred: 0
[Child 24926: Main Thread]: D/nsCSSLoader Notifying global observer 104db32f0 for data 104ecf700. deferred: 0

Seems like we should be able to avoid the second request, yeah.

A few additional observations, from watching the output of the python http server:

  • On a "soft" reload (Ctrl+R) of the page, we don't usually issue any requests for the CSS resource at all. So, we are benefitting from the cache, eventually. So this only affects first load (or hard-reload, Ctrl+Shift+R).
  • I'm not seeing any double-request behavior happening for JS or favicons or <img> elements.
  • ...but I do see this behavior for:
<style>
@import "style.css"
</style>

...so this affects stylesheets in general (both those referenced via <link> and those referenced via @import).

Severity: -- → S3
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: