LibWeb: Skip HTMLLinkElement resource fetching for documents without BC

Fixes crashing after following steps:
1. Open https://github.com/SerenityOS/serenity
2. Click on "Pull requests" tab

The problem was `navigable` null pointer dereferencing in
`decode_favicon()`. But navigable is null because the document was
created by `parseFromString()` DOMParser API.

With this change we skip fetching initiated by HTMLLinkElement if
document does not have a browsing context:
- Favicon is not displayed for such documents so no need to fetch.
- Stylesheets fetching won't affect such document because style or
  layout does not run for them.
This commit is contained in:
Aliaksandr Kalenik 2024-04-24 17:57:18 +00:00 committed by Andreas Kling
parent 4c921e17b7
commit 988c8451d4
Notes: sideshowbarker 2024-07-17 16:23:06 +09:00
4 changed files with 16 additions and 1 deletions

View file

@ -1,3 +1,3 @@
Sheets in old doc: 0
Sheets in new doc: 1
Sheets in new doc: 0
PASS (didn't crash)

View file

@ -0,0 +1 @@
PASS (didn't crash)

View file

@ -0,0 +1,10 @@
<!DOCTYPE html>
<script src="include.js"></script>
<script>
test(() => {
const parser = new DOMParser();
const htmlString = '<head><link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAEElEQVR4nGNgGAWjYBTAAAADEAABPywr7AAAAABJRU5ErkJggg=="></head>';
const doc = parser.parseFromString(htmlString, "text/html");
println("PASS (didn't crash)");
});
</script>

View file

@ -59,6 +59,10 @@ void HTMLLinkElement::inserted()
{
HTMLElement::inserted();
if (!document().browsing_context()) {
return;
}
if (m_relationship & Relationship::Stylesheet) {
// https://html.spec.whatwg.org/multipage/links.html#link-type-stylesheet:fetch-and-process-the-linked-resource
// The appropriate times to fetch and process this type of link are: