summaryrefslogtreecommitdiffstats
path: root/b2g/components/test/mochitest/systemapp_helper.js
diff options
context:
space:
mode:
Diffstat (limited to 'b2g/components/test/mochitest/systemapp_helper.js')
-rw-r--r--b2g/components/test/mochitest/systemapp_helper.js173
1 files changed, 173 insertions, 0 deletions
diff --git a/b2g/components/test/mochitest/systemapp_helper.js b/b2g/components/test/mochitest/systemapp_helper.js
new file mode 100644
index 000000000..768b221fe
--- /dev/null
+++ b/b2g/components/test/mochitest/systemapp_helper.js
@@ -0,0 +1,173 @@
+var Cu = Components.utils;
+
+const { Services } = Cu.import("resource://gre/modules/Services.jsm");
+
+// Load a duplicated copy of the jsm to prevent messing with the currently running one
+var scope = {};
+Services.scriptloader.loadSubScript("resource://gre/modules/SystemAppProxy.jsm", scope);
+const { SystemAppProxy } = scope;
+
+var frame;
+var customEventTarget;
+
+var index = -1;
+function next() {
+ index++;
+ if (index >= steps.length) {
+ assert.ok(false, "Shouldn't get here!");
+ return;
+ }
+ try {
+ steps[index]();
+ } catch(ex) {
+ assert.ok(false, "Caught exception: " + ex);
+ }
+}
+
+// Listen for events received by the system app document
+// to ensure that we receive all of them, in an expected order and time
+var isLoaded = false;
+var isReady = false;
+var n = 0;
+function listener(event) {
+ if (!isLoaded) {
+ assert.ok(false, "Received event before the iframe is loaded");
+ return;
+ }
+ n++;
+ if (n == 1) {
+ assert.equal(event.type, "mozChromeEvent");
+ assert.equal(event.detail.name, "first");
+ } else if (n == 2) {
+ assert.equal(event.type, "custom");
+ assert.equal(event.detail.name, "second");
+
+ next(); // call checkEventPendingBeforeLoad
+ } else if (n == 3) {
+ if (!isReady) {
+ assert.ok(false, "Received event before the iframe is loaded");
+ return;
+ }
+
+ assert.equal(event.type, "custom");
+ assert.equal(event.detail.name, "third");
+ } else if (n == 4) {
+ if (!isReady) {
+ assert.ok(false, "Received event before the iframe is loaded");
+ return;
+ }
+
+ assert.equal(event.type, "mozChromeEvent");
+ assert.equal(event.detail.name, "fourth");
+
+ next(); // call checkEventDispatching
+ } else if (n == 5) {
+ assert.equal(event.type, "custom");
+ assert.equal(event.detail.name, "fifth");
+ } else if (n === 6) {
+ assert.equal(event.type, "mozChromeEvent");
+ assert.equal(event.detail.name, "sixth");
+ } else if (n === 7) {
+ assert.equal(event.type, "custom");
+ assert.equal(event.detail.name, "seventh");
+ assert.equal(event.target, customEventTarget);
+
+ next(); // call checkEventListening();
+ } else {
+ assert.ok(false, "Unexpected event of type " + event.type);
+ }
+}
+
+
+var steps = [
+ function earlyEvents() {
+ // Immediately try to send events
+ SystemAppProxy._sendCustomEvent("mozChromeEvent", { name: "first" }, true);
+ SystemAppProxy._sendCustomEvent("custom", { name: "second" }, true);
+ next();
+ },
+
+ function createFrame() {
+ // Create a fake system app frame
+ let win = Services.wm.getMostRecentWindow("navigator:browser");
+ let doc = win.document;
+ frame = doc.createElement("iframe");
+ doc.documentElement.appendChild(frame);
+
+ customEventTarget = frame.contentDocument.body;
+
+ // Ensure that events are correctly sent to the frame.
+ // `listener` is going to call next()
+ frame.contentWindow.addEventListener("mozChromeEvent", listener);
+ frame.contentWindow.addEventListener("custom", listener);
+
+ // Ensure that listener being registered before the system app is ready
+ // are correctly removed from the pending list
+ function removedListener() {
+ assert.ok(false, "Listener isn't correctly removed from the pending list");
+ }
+ SystemAppProxy.addEventListener("mozChromeEvent", removedListener);
+ SystemAppProxy.removeEventListener("mozChromeEvent", removedListener);
+
+ // Register it to the JSM
+ SystemAppProxy.registerFrame(frame);
+ assert.ok(true, "Frame created and registered");
+
+ frame.contentWindow.addEventListener("load", function onload() {
+ frame.contentWindow.removeEventListener("load", onload);
+ assert.ok(true, "Frame document loaded");
+
+ // Declare that the iframe is now loaded.
+ // That should dispatch early events
+ isLoaded = true;
+ SystemAppProxy.setIsLoaded();
+ assert.ok(true, "Frame declared as loaded");
+
+ let gotFrame = SystemAppProxy.getFrame();
+ assert.equal(gotFrame, frame, "getFrame returns the frame we passed");
+
+ // Once pending events are received,
+ // we will run checkEventDispatching from `listener` function
+ });
+
+ frame.setAttribute("src", "data:text/html,system app");
+ },
+
+ function checkEventPendingBeforeLoad() {
+ // Frame is loaded but not ready,
+ // these events should queue before the System app is ready.
+ SystemAppProxy._sendCustomEvent("custom", { name: "third" });
+ SystemAppProxy.dispatchEvent({ name: "fourth" });
+
+ isReady = true;
+ SystemAppProxy.setIsReady();
+ // Once this 4th event is received, we will run checkEventDispatching
+ },
+
+ function checkEventDispatching() {
+ // Send events after the iframe is ready,
+ // they should be dispatched right away
+ SystemAppProxy._sendCustomEvent("custom", { name: "fifth" });
+ SystemAppProxy.dispatchEvent({ name: "sixth" });
+ SystemAppProxy._sendCustomEvent("custom", { name: "seventh" }, false, customEventTarget);
+ // Once this 7th event is received, we will run checkEventListening
+ },
+
+ function checkEventListening() {
+ SystemAppProxy.addEventListener("mozContentEvent", function onContentEvent(event) {
+ assert.equal(event.detail.name, "first-content", "received a system app event");
+ SystemAppProxy.removeEventListener("mozContentEvent", onContentEvent);
+
+ next();
+ });
+ let win = frame.contentWindow;
+ win.dispatchEvent(new win.CustomEvent("mozContentEvent", { detail: {name: "first-content"} }));
+ },
+
+ function endOfTest() {
+ frame.remove();
+ sendAsyncMessage("finish");
+ }
+];
+
+next();