tor-browser

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

browser_css_registered_property.js (2984B)


      1 "use strict";
      2 
      3 add_task(async function test() {
      4  await BrowserTestUtils.withNewTab(
      5    { gBrowser, url: "data:text/html,<meta charset=utf8>" },
      6    async function (browser) {
      7      await SpecialPowers.spawn(browser, [], testRegisterProperty);
      8    }
      9  );
     10 });
     11 
     12 // This function runs entirely in the content process. It doesn't have access
     13 // any free variables in this file.
     14 async function testRegisterProperty() {
     15  let doc = content.document;
     16  doc.styleSheetChangeEventsEnabled = true;
     17 
     18  const EVENT_NAME = "csscustompropertyregistered";
     19 
     20  const unexpectedContentEvent = event =>
     21    ok(false, "Received a " + event.type + " event on content");
     22  doc.addEventListener(EVENT_NAME, unexpectedContentEvent);
     23  doc.defaultView.addEventListener(EVENT_NAME, unexpectedContentEvent);
     24  doc.addEventListener(EVENT_NAME, unexpectedContentEvent);
     25  doc.defaultView.addEventListener(EVENT_NAME, unexpectedContentEvent);
     26 
     27  function waitForCssCustomPropertyRegistered() {
     28    return ContentTaskUtils.waitForEvent(
     29      docShell.chromeEventHandler,
     30      EVENT_NAME,
     31      true
     32    );
     33  }
     34 
     35  function checkCssCustomPropertyRegisteredEvent(
     36    event,
     37    expectedPropertyDefinition
     38  ) {
     39    is(event.type, EVENT_NAME, "event.type has expected value");
     40    is(event.target, doc, "event targets correct document");
     41    Assert.deepEqual(event.propertyDefinition, expectedPropertyDefinition);
     42  }
     43 
     44  let onCustomPropertyRegistered, evt;
     45 
     46  info("Register property and wait for event");
     47  onCustomPropertyRegistered = waitForCssCustomPropertyRegistered();
     48  content.CSS.registerProperty({ name: "--a", syntax: "*", inherits: false });
     49  evt = await onCustomPropertyRegistered;
     50  ok(true, `Received ${EVENT_NAME} event after registering --a`);
     51  checkCssCustomPropertyRegisteredEvent(evt, {
     52    name: "--a",
     53    syntax: "*",
     54    inherits: false,
     55    initialValue: null,
     56    fromJS: true,
     57  });
     58 
     59  info("Register another property and wait for a new event");
     60  onCustomPropertyRegistered = waitForCssCustomPropertyRegistered();
     61  content.CSS.registerProperty({
     62    name: "--b",
     63    syntax: "<color>",
     64    inherits: true,
     65    initialValue: "tomato",
     66  });
     67  evt = await onCustomPropertyRegistered;
     68  ok(true, `Received ${EVENT_NAME} event after registering --b`);
     69  checkCssCustomPropertyRegisteredEvent(evt, {
     70    name: "--b",
     71    syntax: "<color>",
     72    inherits: true,
     73    initialValue: "tomato",
     74    fromJS: true,
     75  });
     76 
     77  info("Register existing property and assert that we don't get an event");
     78  onCustomPropertyRegistered = waitForCssCustomPropertyRegistered();
     79  const timeout = new Promise(resolve =>
     80    content.setTimeout(() => resolve("TIMEOUT"), 500)
     81  );
     82  try {
     83    content.CSS.registerProperty({ name: "--b", syntax: "*", inherits: false });
     84  } catch (e) {
     85    ok(true, "CSS.registerProperty threw");
     86  }
     87  const res = await Promise.race([onCustomPropertyRegistered, timeout]);
     88  is(
     89    res,
     90    "TIMEOUT",
     91    `Did not receive ${EVENT_NAME} event when registration failed`
     92  );
     93 }