summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/test/addons/e10s-remote/utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'addon-sdk/source/test/addons/e10s-remote/utils.js')
-rw-r--r--addon-sdk/source/test/addons/e10s-remote/utils.js110
1 files changed, 110 insertions, 0 deletions
diff --git a/addon-sdk/source/test/addons/e10s-remote/utils.js b/addon-sdk/source/test/addons/e10s-remote/utils.js
new file mode 100644
index 000000000..f30f4f3a4
--- /dev/null
+++ b/addon-sdk/source/test/addons/e10s-remote/utils.js
@@ -0,0 +1,110 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const { Cu } = require('chrome');
+const { Task: { async } } = Cu.import('resource://gre/modules/Task.jsm', {});
+const { getMostRecentBrowserWindow } = require('sdk/window/utils');
+
+const REMOTE_MODULE = "./remote-module";
+
+function promiseEvent(emitter, event) {
+ console.log("Waiting for " + event);
+ return new Promise(resolve => {
+ emitter.once(event, (...args) => {
+ console.log("Saw " + event);
+ resolve(args);
+ });
+ });
+}
+exports.promiseEvent = promiseEvent;
+
+function promiseDOMEvent(target, event, isCapturing = false) {
+ console.log("Waiting for " + event);
+ return new Promise(resolve => {
+ let listener = (event) => {
+ target.removeEventListener(event, listener, isCapturing);
+ resolve(event);
+ };
+ target.addEventListener(event, listener, isCapturing);
+ })
+}
+exports.promiseDOMEvent = promiseDOMEvent;
+
+const promiseEventOnItemAndContainer = async(function*(assert, itemport, container, event, item = itemport) {
+ let itemEvent = promiseEvent(itemport, event);
+ let containerEvent = promiseEvent(container, event);
+
+ let itemArgs = yield itemEvent;
+ let containerArgs = yield containerEvent;
+
+ assert.equal(containerArgs[0], item, "Should have seen a container event for the right item");
+ assert.equal(JSON.stringify(itemArgs), JSON.stringify(containerArgs), "Arguments should have matched");
+
+ // Strip off the item from the returned arguments
+ return itemArgs.slice(1);
+});
+exports.promiseEventOnItemAndContainer = promiseEventOnItemAndContainer;
+
+const waitForProcesses = async(function*(loader) {
+ console.log("Starting remote");
+ let { processes, frames, remoteRequire } = loader.require('sdk/remote/parent');
+ remoteRequire(REMOTE_MODULE, module);
+
+ let events = [];
+
+ // In e10s we should expect to see two processes
+ let expectedCount = isE10S ? 2 : 1;
+
+ yield new Promise(resolve => {
+ let count = 0;
+
+ // Wait for a process to be detected
+ let listener = process => {
+ console.log("Saw a process attach");
+ // Wait for the remote module to load in this process
+ process.port.once('sdk/test/load', () => {
+ console.log("Saw a remote module load");
+ count++;
+ if (count == expectedCount) {
+ processes.off('attach', listener);
+ resolve();
+ }
+ });
+ }
+ processes.on('attach', listener);
+ });
+
+ console.log("Remote ready");
+ return { processes, frames, remoteRequire };
+});
+exports.waitForProcesses = waitForProcesses;
+
+// Counts the frames in all the child processes
+const getChildFrameCount = async(function*(processes) {
+ let frameCount = 0;
+
+ for (let process of processes) {
+ process.port.emit('sdk/test/count');
+ let [p, count] = yield promiseEvent(process.port, 'sdk/test/count');
+ frameCount += count;
+ }
+
+ return frameCount;
+});
+exports.getChildFrameCount = getChildFrameCount;
+
+const mainWindow = getMostRecentBrowserWindow();
+const isE10S = mainWindow.gMultiProcessBrowser;
+exports.isE10S = isE10S;
+
+if (isE10S) {
+ console.log("Testing in E10S mode");
+ // We expect a child process to already be present, make sure that is the case
+ mainWindow.XULBrowserWindow.forceInitialBrowserRemote();
+}
+else {
+ console.log("Testing in non-E10S mode");
+}