"use strict"; add_task(async function test() { await BrowserTestUtils.withNewTab( { gBrowser, url: "data:text/html," }, async function (browser) { await SpecialPowers.spawn(browser, [], testRegisterProperty); } ); }); // This function runs entirely in the content process. It doesn't have access // any free variables in this file. async function testRegisterProperty() { let doc = content.document; doc.styleSheetChangeEventsEnabled = true; const EVENT_NAME = "csscustompropertyregistered"; const unexpectedContentEvent = event => ok(false, "Received a " + event.type + " event on content"); doc.addEventListener(EVENT_NAME, unexpectedContentEvent); doc.defaultView.addEventListener(EVENT_NAME, unexpectedContentEvent); doc.addEventListener(EVENT_NAME, unexpectedContentEvent); doc.defaultView.addEventListener(EVENT_NAME, unexpectedContentEvent); function waitForCssCustomPropertyRegistered() { return ContentTaskUtils.waitForEvent( docShell.chromeEventHandler, EVENT_NAME, true ); } function checkCssCustomPropertyRegisteredEvent( event, expectedPropertyDefinition ) { is(event.type, EVENT_NAME, "event.type has expected value"); is(event.target, doc, "event targets correct document"); Assert.deepEqual(event.propertyDefinition, expectedPropertyDefinition); } let onCustomPropertyRegistered, evt; info("Register property and wait for event"); onCustomPropertyRegistered = waitForCssCustomPropertyRegistered(); content.CSS.registerProperty({ name: "--a", syntax: "*", inherits: false }); evt = await onCustomPropertyRegistered; ok(true, `Received ${EVENT_NAME} event after registering --a`); checkCssCustomPropertyRegisteredEvent(evt, { name: "--a", syntax: "*", inherits: false, initialValue: null, fromJS: true, }); info("Register another property and wait for a new event"); onCustomPropertyRegistered = waitForCssCustomPropertyRegistered(); content.CSS.registerProperty({ name: "--b", syntax: "", inherits: true, initialValue: "tomato", }); evt = await onCustomPropertyRegistered; ok(true, `Received ${EVENT_NAME} event after registering --b`); checkCssCustomPropertyRegisteredEvent(evt, { name: "--b", syntax: "", inherits: true, initialValue: "tomato", fromJS: true, }); info("Register existing property and assert that we don't get an event"); onCustomPropertyRegistered = waitForCssCustomPropertyRegistered(); const timeout = new Promise(resolve => content.setTimeout(() => resolve("TIMEOUT"), 500) ); try { content.CSS.registerProperty({ name: "--b", syntax: "*", inherits: false }); } catch (e) { ok(true, "CSS.registerProperty threw"); } const res = await Promise.race([onCustomPropertyRegistered, timeout]); is( res, "TIMEOUT", `Did not receive ${EVENT_NAME} event when registration failed` ); }