mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-27 02:05:07 +02:00
LibWeb: Don't construct stylesheet when modifying CSSStyleSheet rules
Previously, `CSSStyleSheet.replace()` and `CSSStyleSheet.replaceSync()` parsed the given CSS text into a temporary stylesheet object, from which a list of rules was extracted. Doing this had the unintended side-effect that a fetch request would be started if the given CSS text referenced any external resources. This fetch request would cause a crash, since the temporary stylesheet object didn't set the constructed flag, or constructor document. We now parse the given CSS text as a list of rules without constructing a temporary stylesheet.
This commit is contained in:
committed by
Sam Atkins
parent
955f6fc9cb
commit
ca200142e9
Notes:
github-actions[bot]
2025-04-16 21:04:15 +00:00
Author: https://github.com/tcl3 Commit: https://github.com/LadybirdBrowser/ladybird/commit/ca200142e97 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4371 Reviewed-by: https://github.com/AtkinsSJ ✅
@@ -0,0 +1,66 @@
|
||||
<!DOCTYPE html>
|
||||
<title>CSSStyleSheet baseURL</title>
|
||||
<link rel="author" title="Erik Nordin" href="mailto:enordin@mozilla.com">
|
||||
<link rel="help" href="https://drafts.csswg.org/cssom-1/#dom-cssstylesheetinit-baseurl">
|
||||
<div id="target"></div>
|
||||
<script src='../../resources/testharness.js'></script>
|
||||
<script src='../../resources/testharnessreport.js'></script>
|
||||
<script>
|
||||
|
||||
function currentLocation() {
|
||||
const sections = location.href.split("/")
|
||||
sections.pop();
|
||||
return sections.join("/");
|
||||
}
|
||||
|
||||
test(() => {
|
||||
const span = document.createElement("span");
|
||||
target.appendChild(span);
|
||||
span.attachShadow({ mode: "open" })
|
||||
const shadowDiv = document.createElement("div");
|
||||
span.shadowRoot.appendChild(shadowDiv);
|
||||
|
||||
const fileName = "example.png"
|
||||
const baseURL = `${location.origin}/custom/path/`;
|
||||
const fullURL = `${baseURL}${fileName}`;
|
||||
|
||||
const sheet = new CSSStyleSheet({ baseURL });
|
||||
span.shadowRoot.adoptedStyleSheets = [sheet];
|
||||
|
||||
sheet.replaceSync(`* { background-image: url("${fileName}"); }`);
|
||||
const styleFromRelative = getComputedStyle(shadowDiv).backgroundImage;
|
||||
|
||||
sheet.replaceSync(`* { background-image: url("${fullURL}"); }`);
|
||||
const styleFromFull = getComputedStyle(shadowDiv).backgroundImage;
|
||||
|
||||
assert_equals(styleFromRelative, styleFromFull);
|
||||
}, "Constructing sheet with custom base URL ueses that URL for CSS rules");
|
||||
|
||||
test(() => {
|
||||
const span = document.createElement("span");
|
||||
target.appendChild(span);
|
||||
span.attachShadow({ mode: "open" })
|
||||
const shadowDiv = document.createElement("div");
|
||||
span.shadowRoot.appendChild(shadowDiv);
|
||||
|
||||
const fileName = "example.png"
|
||||
const baseURL = "custom/path/";
|
||||
const fullURL = `${currentLocation()}/${baseURL}${fileName}`;
|
||||
|
||||
const sheet = new CSSStyleSheet({ baseURL });
|
||||
span.shadowRoot.adoptedStyleSheets = [sheet];
|
||||
|
||||
sheet.replaceSync(`* { background-image: url("${fileName}"); }`);
|
||||
const styleFromRelative = getComputedStyle(shadowDiv).backgroundImage;
|
||||
|
||||
sheet.replaceSync(`* { background-image: url("${fullURL}"); }`);
|
||||
const styleFromFull = getComputedStyle(shadowDiv).backgroundImage;
|
||||
|
||||
assert_equals(styleFromRelative, styleFromFull);
|
||||
}, "Constructing sheet with relative URL adds to the constructor document's base URL");
|
||||
|
||||
test(() => {
|
||||
assert_throws_dom("NotAllowedError", () => { new CSSStyleSheet({ baseURL: "https://test:test/"}) });
|
||||
}, "Constructing sheet with invalid base URL throws a NotAllowedError");
|
||||
|
||||
</script>
|
||||
Reference in New Issue
Block a user