browser_observer_notification.js (4017B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 "use strict"; 4 5 /* eslint-disable no-unused-vars */ 6 declTest("test observer triggering actor creation", { 7 observers: ["test-js-window-actor-child-observer"], 8 9 async test(browser) { 10 await SpecialPowers.spawn(browser, [], async function () { 11 const TOPIC = "test-js-window-actor-child-observer"; 12 Services.obs.notifyObservers(content.window, TOPIC, "dataString"); 13 14 let child = content.windowGlobalChild; 15 let actorChild = child.getActor("TestWindow"); 16 ok(actorChild, "JSWindowActorChild should have value."); 17 let { subject, topic, data } = actorChild.lastObserved; 18 19 is( 20 subject.windowGlobalChild.getActor("TestWindow"), 21 actorChild, 22 "Should have been recieved on the right actor" 23 ); 24 is(topic, TOPIC, "Topic matches"); 25 is(data, "dataString", "Data matches"); 26 }); 27 }, 28 }); 29 30 declTest("test observers with null data", { 31 observers: ["test-js-window-actor-child-observer"], 32 33 async test(browser) { 34 await SpecialPowers.spawn(browser, [], async function () { 35 const TOPIC = "test-js-window-actor-child-observer"; 36 Services.obs.notifyObservers(content.window, TOPIC); 37 38 let child = content.windowGlobalChild; 39 let actorChild = child.getActor("TestWindow"); 40 ok(actorChild, "JSWindowActorChild should have value."); 41 let { subject, topic, data } = actorChild.lastObserved; 42 43 is( 44 subject.windowGlobalChild.getActor("TestWindow"), 45 actorChild, 46 "Should have been recieved on the right actor" 47 ); 48 is(topic, TOPIC, "Topic matches"); 49 is(data, null, "Data matches"); 50 }); 51 }, 52 }); 53 54 declTest("observers don't notify with wrong window", { 55 observers: ["test-js-window-actor-child-observer"], 56 57 async test(browser) { 58 const MSG_RE = 59 /JSWindowActor TestWindow: expected window subject for topic 'test-js-window-actor-child-observer'/; 60 let expectMessage = new Promise(resolve => { 61 Services.console.registerListener(function consoleListener(msg) { 62 // Run everything async in order to avoid logging messages from the 63 // console listener. 64 Cu.dispatch(() => { 65 if (!MSG_RE.test(msg.message)) { 66 info("ignoring non-matching console message: " + msg.message); 67 return; 68 } 69 info("received console message: " + msg.message); 70 is(msg.logLevel, Ci.nsIConsoleMessage.error, "should be an error"); 71 72 Services.console.unregisterListener(consoleListener); 73 resolve(); 74 }); 75 }); 76 }); 77 78 await SpecialPowers.spawn(browser, [], async function () { 79 const TOPIC = "test-js-window-actor-child-observer"; 80 Services.obs.notifyObservers(null, TOPIC); 81 let child = content.windowGlobalChild; 82 let actorChild = child.getActor("TestWindow"); 83 ok(actorChild, "JSWindowActorChild should have value."); 84 is( 85 actorChild.lastObserved, 86 undefined, 87 "Should not receive wrong window's observer notification!" 88 ); 89 }); 90 91 await expectMessage; 92 }, 93 }); 94 95 declTest("observers notify with audio-playback", { 96 observers: ["audio-playback"], 97 url: "http://example.com/browser/dom/ipc/tests/JSWindowActor/file_mediaPlayback.html", 98 99 async test(browser) { 100 await SpecialPowers.spawn(browser, [], async function () { 101 let audio = content.document.querySelector("audio"); 102 audio.play(); 103 104 let child = content.windowGlobalChild; 105 let actorChild = child.getActor("TestWindow"); 106 ok(actorChild, "JSWindowActorChild should have value."); 107 108 let observePromise = new Promise(resolve => { 109 actorChild.done = ({ subject, topic, data }) => 110 resolve({ subject, topic, data }); 111 }); 112 113 let { subject, topic, data } = await observePromise; 114 is(topic, "audio-playback", "Topic matches"); 115 is(data, "active", "Data matches"); 116 }); 117 }, 118 });