|  | <!DOCTYPE html> | 
|  | <meta charset="utf-8"> | 
|  | <title>Dynamic change to style containment</title> | 
|  | <link rel="help" href="https://drafts.csswg.org/css-contain/#contain-property"> | 
|  | <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1765615"> | 
|  | <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> | 
|  | <script src="/resources/testharness.js"></script> | 
|  | <script src="/resources/testharnessreport.js"></script> | 
|  | <meta name="assert" content="Verify style containment is properly updated after dynamic change to the contain property."> | 
|  | <style> | 
|  | /* Selectors for contain */ | 
|  | #none .wrapper { | 
|  | contain: none; | 
|  | } | 
|  | #style .wrapper { | 
|  | contain: style; | 
|  | } | 
|  | #none_to_style .wrapper { | 
|  | contain: none; | 
|  | } | 
|  | #style_to_none .wrapper { | 
|  | contain: style; | 
|  | } | 
|  |  | 
|  | /* Selectors for testing counters */ | 
|  | .set_counter_to_9 { | 
|  | counter-set: testcounter 9; | 
|  | } | 
|  | .increment_counter { | 
|  | counter-increment: testcounter; | 
|  | } | 
|  | .set_counter_to_10 { | 
|  | counter-set: testcounter 10; | 
|  | } | 
|  | span.print_counter::after { | 
|  | font: 25px/1 Ahem; | 
|  | content: counters(testcounter, "."); | 
|  | } | 
|  |  | 
|  | /* Selectors for testing quotes */ | 
|  | .open_quote::after { | 
|  | content: open-quote; | 
|  | } | 
|  | .close_quote::after { | 
|  | content: close-quote; | 
|  | } | 
|  | .no_open_quote::after { | 
|  | content: no-open-quote; | 
|  | } | 
|  | .no_close_quote::after { | 
|  | content: no-close-quote; | 
|  | } | 
|  | span.print_quotes::before, span.print_quotes::after { | 
|  | font: 25px/1 Ahem; | 
|  | quotes: "A" "" "BB" "" "CCC" "" "DDDD" "" "EEEEE" "" "FFFFF" "" "GGGGGG" "" "HHHHHHH" "" "IIIIIIII" "" "JJJJJJJJJ" ""; | 
|  | } | 
|  | span.print_quotes::before { | 
|  | content: open-quote; | 
|  | } | 
|  | span.print_quotes::after { | 
|  | content: no-close-quote; | 
|  | } | 
|  | </style> | 
|  | <body> | 
|  | <div id="log"></div> | 
|  |  | 
|  | <div id="none"> | 
|  | <div class="set_counter_to_9"></div> | 
|  | <span><span class="print_counter"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="increment_counter"></span> | 
|  | </div> | 
|  | <span><span class="print_counter"></span></span> | 
|  |  | 
|  | <div class="set_counter_to_9"></div> | 
|  | <span><span class="print_counter"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="set_counter_to_10"></span> | 
|  | </div> | 
|  | <span><span class="print_counter"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="open_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="close_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="no_open_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="no_close_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  | </div> | 
|  |  | 
|  | <div id="style"> | 
|  | <div class="set_counter_to_9"></div> | 
|  | <span><span class="print_counter"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="increment_counter"></span> | 
|  | </div> | 
|  | <span><span class="print_counter"></span></span> | 
|  |  | 
|  | <div class="set_counter_to_9"></div> | 
|  | <span><span class="print_counter"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="set_counter_to_10"></span> | 
|  | </div> | 
|  | <span><span class="print_counter"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="open_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="close_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="no_open_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="no_close_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  | </div> | 
|  |  | 
|  | <div id="none_to_style"> | 
|  | <div class="set_counter_to_9"></div> | 
|  | <span><span class="print_counter"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="increment_counter"></span> | 
|  | </div> | 
|  | <span><span class="print_counter"></span></span> | 
|  |  | 
|  | <div class="set_counter_to_9"></div> | 
|  | <span><span class="print_counter"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="set_counter_to_10"></span> | 
|  | </div> | 
|  | <span><span class="print_counter"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="open_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="close_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="no_open_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="no_close_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  | </div> | 
|  |  | 
|  | <div id="style_to_none"> | 
|  | <div class="set_counter_to_9"></div> | 
|  | <span><span class="print_counter"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="increment_counter"></span> | 
|  | </div> | 
|  | <span><span class="print_counter"></span></span> | 
|  |  | 
|  | <div class="set_counter_to_9"></div> | 
|  | <span><span class="print_counter"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="set_counter_to_10"></span> | 
|  | </div> | 
|  | <span><span class="print_counter"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="open_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="close_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="no_open_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  |  | 
|  | <span><span class="print_quotes"></span></span> | 
|  | <div class="wrapper"> | 
|  | <span class="no_close_quote"></span> | 
|  | </div> | 
|  | <span><span class="print_quotes"></span></span> | 
|  | </div> | 
|  |  | 
|  | <script> | 
|  | function verifyStyleContainment(id, applied) { | 
|  | let container = document.getElementById(id); | 
|  |  | 
|  | // To verify style containment for counters and quotes, we check whether | 
|  | // the properties in the wrapper affect the string length of generated | 
|  | // content. | 
|  | function haveSameStringLength(box1, box2) { | 
|  | const ahemFontSizePx = 25; | 
|  | return Math.abs(box2.width - box1.width) < ahemFontSizePx / 2; | 
|  | } | 
|  | let counter_box = | 
|  | Array.from(container.getElementsByClassName("print_counter")) | 
|  | .map(e => e.parentNode.getBoundingClientRect()); | 
|  | let quote_box = | 
|  | Array.from(container.getElementsByClassName("print_quotes")) | 
|  | .map(e => e.parentNode.getBoundingClientRect()); | 
|  | assert_equals(haveSameStringLength(counter_box[0], counter_box[1]), applied, "increment-counter"); | 
|  | assert_equals(haveSameStringLength(counter_box[2], counter_box[3]), applied, "set-counter"); | 
|  | assert_equals(haveSameStringLength(quote_box[0], quote_box[1]), applied, "open-quote"); | 
|  | assert_equals(haveSameStringLength(quote_box[2], quote_box[3]), applied, "close-quote"); | 
|  | assert_equals(haveSameStringLength(quote_box[4], quote_box[5]), applied, "no-open-quote"); | 
|  | assert_equals(haveSameStringLength(quote_box[6], quote_box[7]), applied, "no-close-quote"); | 
|  | } | 
|  |  | 
|  | function setContain(id, value) { | 
|  | let container = document.getElementById(id); | 
|  | Array.from(container.getElementsByClassName("wrapper")) | 
|  | .forEach(element => element.style.contain = value); | 
|  | } | 
|  |  | 
|  | promise_test(async () => { | 
|  | await document.fonts.ready; | 
|  | verifyStyleContainment("none", /*applied=*/ false); | 
|  | }, "contain: none"); | 
|  |  | 
|  | promise_test(async () => { | 
|  | await document.fonts.ready; | 
|  | verifyStyleContainment("style", /*applied=*/ true); | 
|  | }, "contain: style"); | 
|  |  | 
|  | promise_test(async () => { | 
|  | await document.fonts.ready; | 
|  | setContain("none_to_style", "style"); | 
|  | verifyStyleContainment("none_to_style", /*applied=*/ true); | 
|  | }, "switching contain from none to style"); | 
|  |  | 
|  | promise_test(async () => { | 
|  | await document.fonts.ready; | 
|  | setContain("style_to_none", "none"); | 
|  | verifyStyleContainment("style_to_none", /*applied=*/ false); | 
|  | }, "switching contain from style to none"); | 
|  | </script> | 
|  | </body> |