LibWeb: Implement the LegacyUnforgeable attribute
Some checks are pending
CI / Lagom (arm64, Sanitizer_CI, false, macos-15, macOS, Clang) (push) Waiting to run
CI / Lagom (x86_64, Fuzzers_CI, false, ubuntu-24.04, Linux, Clang) (push) Waiting to run
CI / Lagom (x86_64, Sanitizer_CI, false, ubuntu-24.04, Linux, GNU) (push) Waiting to run
CI / Lagom (x86_64, Sanitizer_CI, true, ubuntu-24.04, Linux, Clang) (push) Waiting to run
Package the js repl as a binary artifact / build-and-package (macos-14, macOS, macOS-universal2) (push) Waiting to run
Package the js repl as a binary artifact / build-and-package (ubuntu-24.04, Linux, Linux-x86_64) (push) Waiting to run
Run test262 and test-wasm / run_and_update_results (push) Waiting to run
Lint Code / lint (push) Waiting to run
Label PRs with merge conflicts / auto-labeler (push) Waiting to run
Push notes / build (push) Waiting to run

This fixes the frame-ancestors WPT tests from crashing when an iframe
is blocked from loading. This is because it would get an undefined
location.href from the cross-origin iframe, which causes a crash as it
expects it to be there.
This commit is contained in:
Luke Wilde 2024-12-09 17:04:20 +00:00 committed by Tim Ledbetter
commit c7d25301d3
Notes: github-actions[bot] 2025-03-28 00:10:01 +00:00
15 changed files with 511 additions and 76 deletions

View file

@ -0,0 +1,37 @@
<!DOCTYPE html>
<script src="../include.js"></script>
<script>
test(() => {
for (const { location, name } of [{ location: window.location, name: "location" }, { location: document.location, name: "document.location" }]) {
const unforgeableProperties = [
"href",
"origin",
"protocol",
"host",
"hostname",
"port",
"pathname",
"search",
"hash",
"assign",
"replace",
"reload",
// FIXME: "ancestorOrigins",
"toString",
];
const locationPrototype = Object.getPrototypeOf(location);
for (const property of unforgeableProperties) {
println(`${property} exists on ${name} itself: ${Object.hasOwn(location, property)}`);
println(`${property} does not exist on LocationPrototype: ${!Object.hasOwn(locationPrototype, property)}`);
const propertyDescriptor = Object.getOwnPropertyDescriptor(location, property);
println(`${property} descriptor is not undefined: ${propertyDescriptor !== undefined}`);
println(`${property} enumerable: ${propertyDescriptor.enumerable}`);
println(`${property} configurable: ${propertyDescriptor.configurable}`);
println(`${property} writable: ${propertyDescriptor.writable}`);
}
}
});
</script>

View file

@ -0,0 +1,25 @@
<!DOCTYPE html>
<script src="../include.js"></script>
<script>
test(() => {
const unforgeableProperties = [
"window",
"document",
"location",
"top",
];
const windowPrototype = Object.getPrototypeOf(window);
for (const property of unforgeableProperties) {
println(`${property} exists on window itself: ${Object.hasOwn(window, property)}`);
println(`${property} does not exist on LocationPrototype: ${!Object.hasOwn(windowPrototype, property)}`);
const propertyDescriptor = Object.getOwnPropertyDescriptor(window, property);
println(`${property} descriptor is not undefined: ${propertyDescriptor !== undefined}`);
println(`${property} enumerable: ${propertyDescriptor.enumerable}`);
println(`${property} configurable: ${propertyDescriptor.configurable}`);
println(`${property} writable: ${propertyDescriptor.writable}`);
}
});
</script>