tor-browser

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

browser_markup_display_node_02.js (5619B)


      1 /* Any copyright is dedicated to the Public Domain.
      2 http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 // Tests that markup display node are updated when their display changes.
      7 
      8 const TEST_URI = `
      9  <style type="text/css">
     10    #grid {
     11      display: grid;
     12    }
     13    #flex {
     14      display: flex;
     15    }
     16    #flex[hidden] {
     17      display: none;
     18    }
     19    #block {
     20      display: block;
     21    }
     22    #flex
     23  </style>
     24  <div id="grid">Grid</div>
     25  <div id="flex" hidden="">Flex</div>
     26  <div id="block">Block</div>
     27 `;
     28 
     29 const TEST_DATA = [
     30  {
     31    desc: "Hiding the #grid display node by changing its style property",
     32    selector: "#grid",
     33    before: {
     34      textContent: "grid",
     35      visible: true,
     36      interactive: true,
     37    },
     38    async changeStyle() {
     39      await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
     40        const node = content.document.getElementById("grid");
     41        node.style.display = "block";
     42      });
     43    },
     44    after: {
     45      visible: false,
     46    },
     47  },
     48  {
     49    desc: "Reusing the 'grid' node, updating the display to 'grid again",
     50    selector: "#grid",
     51    before: {
     52      visible: false,
     53    },
     54    async changeStyle() {
     55      await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
     56        const node = content.document.getElementById("grid");
     57        node.style.display = "grid";
     58      });
     59    },
     60    after: {
     61      textContent: "grid",
     62      visible: true,
     63      interactive: true,
     64    },
     65  },
     66  {
     67    desc: "Showing a 'contents' node by changing its style property",
     68    selector: "#grid",
     69    before: {
     70      textContent: "grid",
     71      visible: true,
     72      interactive: true,
     73    },
     74    async changeStyle() {
     75      await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
     76        const node = content.document.getElementById("grid");
     77        node.style.display = "contents";
     78      });
     79    },
     80    after: {
     81      textContent: "contents",
     82      visible: true,
     83      interactive: false,
     84    },
     85  },
     86  {
     87    desc: "Showing a 'grid' node by changing its style property",
     88    selector: "#block",
     89    before: {
     90      visible: false,
     91    },
     92    async changeStyle() {
     93      await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
     94        const node = content.document.getElementById("block");
     95        node.style.display = "grid";
     96      });
     97    },
     98    after: {
     99      textContent: "grid",
    100      visible: true,
    101      interactive: true,
    102    },
    103  },
    104  {
    105    desc: "Showing a 'flex' node by removing its hidden attribute",
    106    selector: "#flex",
    107    before: {
    108      visible: false,
    109    },
    110    async changeStyle() {
    111      await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () =>
    112        content.document.getElementById("flex").removeAttribute("hidden")
    113      );
    114    },
    115    after: {
    116      textContent: "flex",
    117      visible: true,
    118      interactive: true,
    119    },
    120  },
    121 ];
    122 
    123 add_task(async function () {
    124  const { inspector } = await openInspectorForURL(
    125    "data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI)
    126  );
    127 
    128  for (const data of TEST_DATA) {
    129    info("Running test case: " + data.desc);
    130    await runTestData(inspector, data);
    131  }
    132 });
    133 
    134 async function runTestData(
    135  inspector,
    136  { selector, before, changeStyle, after }
    137 ) {
    138  await selectNode(selector, inspector);
    139  const container = await getContainerForSelector(selector, inspector);
    140 
    141  const beforeBadge = container.elt.querySelector(
    142    ".inspector-badge[data-display]"
    143  );
    144  is(
    145    !!beforeBadge,
    146    before.visible,
    147    `Display badge is visible as expected for ${selector}: ${before.visible}`
    148  );
    149  if (before.visible) {
    150    is(
    151      beforeBadge.textContent,
    152      before.textContent,
    153      `Got the correct before display type for ${selector}: ${beforeBadge.textContent}`
    154    );
    155    checkBadgeInteractiveState(beforeBadge, before.interactive, selector);
    156  }
    157 
    158  info("Listening for the display-change event");
    159  const onDisplayChanged = inspector.markup.walker.once("display-change");
    160  info("Making style changes");
    161  await changeStyle();
    162  const nodes = await onDisplayChanged;
    163 
    164  info("Verifying that the list of changed nodes include our container");
    165  ok(nodes.length, "The display-change event was received with a nodes");
    166  let foundContainer = false;
    167  for (const node of nodes) {
    168    if (getContainerForNodeFront(node, inspector) === container) {
    169      foundContainer = true;
    170      break;
    171    }
    172  }
    173  ok(foundContainer, "Container is part of the list of changed nodes");
    174 
    175  const afterBadge = container.elt.querySelector(
    176    ".inspector-badge[data-display]"
    177  );
    178  is(
    179    !!afterBadge,
    180    after.visible,
    181    `Display badge is visible as expected for ${selector}: ${after.visible}`
    182  );
    183  if (after.visible) {
    184    is(
    185      afterBadge.textContent,
    186      after.textContent,
    187      `Got the correct after display type for ${selector}: ${afterBadge.textContent}`
    188    );
    189 
    190    checkBadgeInteractiveState(afterBadge, after.interactive, selector);
    191  }
    192 }
    193 
    194 function checkBadgeInteractiveState(badgeEl, interactive, selector) {
    195  if (interactive) {
    196    ok(
    197      !badgeEl.hasAttribute("role"),
    198      `${badgeEl.textContent} badge for ${selector} does not override the default role`
    199    );
    200    is(
    201      badgeEl.getAttribute("aria-pressed"),
    202      "false",
    203      `${badgeEl.textContent} badge for ${selector} has the expected aria-pressed attribute`
    204    );
    205  } else {
    206    is(
    207      badgeEl.getAttribute("role"),
    208      "presentation",
    209      `${badgeEl.textContent} badge for ${selector} is not interactive`
    210    );
    211    ok(
    212      !badgeEl.hasAttribute("aria-pressed"),
    213      `${badgeEl.textContent} badge for ${selector} does not have an aria-pressed attribute`
    214    );
    215  }
    216 }