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 }