blob: 88e6ce09a52d1373e13f96d785af50944a59d74d [file] [edit]
<!doctype html>
<title>CSSStyleSheet replace()/replaceSync() should detach old rules</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="help" href="https://drafts.csswg.org/cssom/#dom-cssstylesheet-replace">
<link rel="help" href="https://drafts.csswg.org/cssom/#dom-cssstylesheet-replacesync">
<script>
"use strict";
// replaceSync() tests
test(() => {
const sheet = new CSSStyleSheet();
sheet.replaceSync("p { color: red; }");
const oldRule = sheet.cssRules[0];
assert_equals(oldRule.parentStyleSheet, sheet, "setup: old rule should reference the sheet");
sheet.replaceSync("div { color: blue; }");
assert_equals(oldRule.parentStyleSheet, null, "old rule's parentStyleSheet should be null after replacement");
assert_equals(oldRule.parentRule, null, "old rule's parentRule should be null after replacement");
}, "replaceSync() nullifies parentStyleSheet on old rules");
test(() => {
const sheet = new CSSStyleSheet();
sheet.replaceSync("@media all { p { color: red; } }");
const oldMediaRule = sheet.cssRules[0];
const oldNestedRule = oldMediaRule.cssRules[0];
assert_equals(oldMediaRule.parentStyleSheet, sheet, "setup: old media rule should reference the sheet");
assert_equals(oldNestedRule.parentStyleSheet, sheet, "setup: old nested rule should reference the sheet");
sheet.replaceSync("div { color: blue; }");
assert_equals(oldMediaRule.parentStyleSheet, null, "old media rule's parentStyleSheet should be null");
assert_equals(oldNestedRule.parentStyleSheet, null, "old nested rule's parentStyleSheet should be null");
}, "replaceSync() nullifies parentStyleSheet on old nested rules");
// replace() tests
promise_test(async () => {
const sheet = new CSSStyleSheet();
await sheet.replace("p { color: red; }");
const oldRule = sheet.cssRules[0];
assert_equals(oldRule.parentStyleSheet, sheet, "setup: old rule should reference the sheet");
const promise = sheet.replace("div { color: blue; }");
await promise;
assert_equals(oldRule.parentStyleSheet, null, "old rule's parentStyleSheet should be null after replacement");
assert_equals(oldRule.parentRule, null, "old rule's parentRule should be null after replacement");
}, "replace() nullifies parentStyleSheet on old rules after replacement");
promise_test(async () => {
const sheet = new CSSStyleSheet();
await sheet.replace("@media all { p { color: red; } }");
const oldMediaRule = sheet.cssRules[0];
const oldNestedRule = oldMediaRule.cssRules[0];
assert_equals(oldMediaRule.parentStyleSheet, sheet, "setup: old media rule should reference the sheet");
assert_equals(oldNestedRule.parentStyleSheet, sheet, "setup: old nested rule should reference the sheet");
const promise = sheet.replace("div { color: blue; }");
await promise;
assert_equals(oldMediaRule.parentStyleSheet, null, "old media rule's parentStyleSheet should be null");
assert_equals(oldNestedRule.parentStyleSheet, null, "old nested rule's parentStyleSheet should be null");
}, "replace() nullifies parentStyleSheet on old nested rules after replacement");
</script>