tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

inertness-with-modal-dialogs-and-iframes.html (5489B)


      1 <!DOCTYPE html>
      2 <meta charset="utf-8" />
      3 <title>Inertness with modal dialogs and iframes</title>
      4 <link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
      5 <link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#inert">
      6 <meta name="assert" content="Checks that a modal dialog marks outer nodes as inert,
      7  but only in its document, not in the parent browsing context,
      8  nor in nested browsing contexts.">
      9 <div id="log"></div>
     10 <div id="wrapper">
     11  (main document: outer text)
     12  <iframe id="outerIframe" srcdoc="
     13    <div id='wrapper'>
     14      (outer iframe: outer text)
     15      <dialog id='dialog' style='display: block'>
     16        (outer iframe: dialog)
     17      </dialog>
     18    </div>
     19  "></iframe>
     20  <dialog id="dialog" style="display: block">
     21    (main document: dialog)
     22    <iframe id="innerIframe" srcdoc="
     23      <div id='wrapper'>
     24        (inner iframe: outer text)
     25        <dialog id='dialog' style='display: block'>
     26          (inner iframe: dialog)
     27        </dialog>
     28      </div>
     29    "></iframe>
     30  </dialog>
     31 </div>
     32 <script src="/resources/testharness.js"></script>
     33 <script src="/resources/testharnessreport.js"></script>
     34 <script>
     35 const innerIframeWindow = innerIframe.contentWindow;
     36 const outerIframeWindow = outerIframe.contentWindow;
     37 promise_setup(async () => {
     38  for (let global of [innerIframeWindow, outerIframeWindow]) {
     39    if (global.location.href === "about:blank" ||
     40        global.document.readyState !== "complete") {
     41      await new Promise(resolve => {
     42        global.frameElement.addEventListener("load", resolve, {once: true});
     43      });
     44    }
     45  }
     46 });
     47 add_completion_callback(() => {
     48  for (let global of [window, innerIframeWindow, outerIframeWindow]) {
     49    global.getSelection().removeAllRanges();
     50  }
     51 });
     52 
     53 function checkSelection(global, expectedText) {
     54  const selection = global.getSelection();
     55  selection.selectAllChildren(global.wrapper);
     56 
     57  // Remove whitespace between parentheses since it varies among browsers,
     58  // but that's not relevant to this test.
     59  const actualText = selection.toString().replace(/\)\s*\(/g, ")(").trim();
     60  assert_equals(actualText, expectedText);
     61 }
     62 
     63 function showModals(test, globals) {
     64  for (let global of globals) {
     65    global.dialog.showModal();
     66    test.add_cleanup(() => { global.dialog.close(); });
     67  }
     68 }
     69 
     70 promise_test(async function() {
     71  checkSelection(window, "(main document: outer text)(main document: dialog)");
     72  checkSelection(innerIframeWindow, "(inner iframe: outer text)(inner iframe: dialog)");
     73  checkSelection(outerIframeWindow, "(outer iframe: outer text)(outer iframe: dialog)");
     74 }, "Initially, no node is inert");
     75 
     76 promise_test(async function() {
     77  showModals(this, [outerIframeWindow]);
     78 
     79  checkSelection(window, "(main document: outer text)(main document: dialog)");
     80  checkSelection(innerIframeWindow, "(inner iframe: outer text)(inner iframe: dialog)");
     81  checkSelection(outerIframeWindow, "(outer iframe: dialog)");
     82 }, "Modal dialog in the outer iframe marks outer nodes in that iframe as inert.");
     83 
     84 promise_test(async function() {
     85  showModals(this, [innerIframeWindow]);
     86 
     87  checkSelection(window, "(main document: outer text)(main document: dialog)");
     88  checkSelection(innerIframeWindow, "(inner iframe: dialog)");
     89  checkSelection(outerIframeWindow, "(outer iframe: outer text)(outer iframe: dialog)");
     90 }, "Modal dialog in the inner iframe marks outer nodes in that iframe as inert.");
     91 
     92 promise_test(async function() {
     93  showModals(this, [innerIframeWindow, outerIframeWindow]);
     94 
     95  checkSelection(window, "(main document: outer text)(main document: dialog)");
     96  checkSelection(innerIframeWindow, "(inner iframe: dialog)");
     97  checkSelection(outerIframeWindow, "(outer iframe: dialog)");
     98 }, "Modal dialogs in both iframes mark outer nodes in these iframes as inert.");
     99 
    100 promise_test(async function() {
    101  showModals(this, [window]);
    102 
    103  checkSelection(window, "(main document: dialog)");
    104  checkSelection(innerIframeWindow, "(inner iframe: outer text)(inner iframe: dialog)");
    105  checkSelection(outerIframeWindow, "(outer iframe: outer text)(outer iframe: dialog)");
    106 }, "Modal dialog in the main document marks outer nodes as inert. Contents of the outer iframe aren't marked as inert.");
    107 
    108 promise_test(async function() {
    109  showModals(this, [innerIframeWindow, window]);
    110 
    111  checkSelection(window, "(main document: dialog)");
    112  checkSelection(innerIframeWindow, "(inner iframe: dialog)");
    113  checkSelection(outerIframeWindow, "(outer iframe: outer text)(outer iframe: dialog)");
    114 }, "Modal dialogs in the main document and inner iframe mark outer nodes as inert. Contents of the outer iframe aren't marked as inert.");
    115 
    116 promise_test(async function() {
    117  showModals(this, [outerIframeWindow, window]);
    118 
    119  checkSelection(window, "(main document: dialog)");
    120  checkSelection(innerIframeWindow, "(inner iframe: outer text)(inner iframe: dialog)");
    121  checkSelection(outerIframeWindow, "(outer iframe: dialog)");
    122 }, "Modal dialogs in the main document and outer iframe mark outer nodes as inert. Contents of the outer iframe aren't marked as inert.");
    123 
    124 promise_test(async function() {
    125  showModals(this, [innerIframeWindow, outerIframeWindow, window]);
    126 
    127  checkSelection(window, "(main document: dialog)");
    128  checkSelection(innerIframeWindow, "(inner iframe: dialog)");
    129  checkSelection(outerIframeWindow, "(outer iframe: dialog)");
    130 }, "Modal dialogs in the main document and both iframes mark outer nodes as inert. Contents of the outer iframe aren't marked as inert.");
    131 </script>