| <!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> |