summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/test/addons/embedded-webextension
diff options
context:
space:
mode:
Diffstat (limited to 'addon-sdk/source/test/addons/embedded-webextension')
-rw-r--r--addon-sdk/source/test/addons/embedded-webextension/main.js159
-rw-r--r--addon-sdk/source/test/addons/embedded-webextension/package.json6
-rw-r--r--addon-sdk/source/test/addons/embedded-webextension/webextension/background-page.js10
-rw-r--r--addon-sdk/source/test/addons/embedded-webextension/webextension/content-script.js10
-rw-r--r--addon-sdk/source/test/addons/embedded-webextension/webextension/manifest.json18
5 files changed, 203 insertions, 0 deletions
diff --git a/addon-sdk/source/test/addons/embedded-webextension/main.js b/addon-sdk/source/test/addons/embedded-webextension/main.js
new file mode 100644
index 000000000..11249c504
--- /dev/null
+++ b/addon-sdk/source/test/addons/embedded-webextension/main.js
@@ -0,0 +1,159 @@
+const tabs = require("sdk/tabs");
+const webExtension = require('sdk/webextension');
+
+exports.testEmbeddedWebExtensionModuleInitializedException = function (assert) {
+ let actualErr;
+
+ assert.throws(
+ () => webExtension.initFromBootstrapAddonParam({webExtension: null}),
+ /'sdk\/webextension' module has been already initialized/,
+ "Got the expected exception if the module is initialized twice"
+ );
+};
+
+exports.testEmbeddedWebExtensionBackgroungPage = function* (assert) {
+ try {
+ const api = yield webExtension.startup();
+ assert.ok(api, `webextension waitForStartup promise successfully resolved`);
+
+ const apiSecondStartup = yield webExtension.startup();
+ assert.equal(api, apiSecondStartup, "Got the same API object from the second startup call");
+
+ const {browser} = api;
+
+ let messageListener;
+ let waitForBackgroundPageMessage = new Promise((resolve, reject) => {
+ let numExpectedMessage = 2;
+ messageListener = (msg, sender, sendReply) => {
+ numExpectedMessage -= 1;
+ if (numExpectedMessage == 1) {
+ assert.equal(msg, "bg->sdk message",
+ "Got the expected message from the background page");
+ sendReply("sdk reply");
+ } else if (numExpectedMessage == 0) {
+ assert.equal(msg, "sdk reply",
+ "The background page received the expected reply message");
+ resolve();
+ } else {
+ console.error("Unexpected message received", {msg,sender, numExpectedMessage});
+ assert.ok(false, `unexpected message received`);
+ reject();
+ }
+ };
+ browser.runtime.onMessage.addListener(messageListener);
+ });
+
+ let portListener;
+ let waitForBackgroundPagePort = new Promise((resolve, reject) => {
+ portListener = (port) => {
+ let numExpectedMessages = 2;
+ port.onMessage.addListener((msg) => {
+ numExpectedMessages -= 1;
+
+ if (numExpectedMessages == 1) {
+ // Check that the legacy context has been able to receive the first port message
+ // and reply with a port message to the background page.
+ assert.equal(msg, "bg->sdk port message",
+ "Got the expected port message from the background page");
+ port.postMessage("sdk->bg port message");
+ } else if (numExpectedMessages == 0) {
+ // Check that the background page has received the above port message.
+ assert.equal(msg, "bg received sdk->bg port message",
+ "The background page received the expected port message");
+ }
+ });
+
+ port.onDisconnect.addListener(() => {
+ assert.equal(numExpectedMessages, 0, "Got the expected number of port messages");
+ resolve();
+ });
+ };
+ browser.runtime.onConnect.addListener(portListener);
+ });
+
+ yield Promise.all([
+ waitForBackgroundPageMessage,
+ waitForBackgroundPagePort,
+ ]).then(() => {
+ browser.runtime.onMessage.removeListener(messageListener);
+ browser.runtime.onConnect.removeListener(portListener);
+ });
+
+ } catch (err) {
+ assert.fail(`Unexpected webextension startup exception: ${err} - ${err.stack}`);
+ }
+};
+
+exports.testEmbeddedWebExtensionContentScript = function* (assert, done) {
+ try {
+ const {browser} = yield webExtension.startup();
+ assert.ok(browser, `webextension startup promise resolved successfully to the API object`);
+
+ let messageListener;
+ let waitForContentScriptMessage = new Promise((resolve, reject) => {
+ let numExpectedMessage = 2;
+ messageListener = (msg, sender, sendReply) => {
+ numExpectedMessage -= 1;
+ if (numExpectedMessage == 1) {
+ assert.equal(msg, "content script->sdk message",
+ "Got the expected message from the content script");
+ sendReply("sdk reply");
+ } else if (numExpectedMessage == 0) {
+ assert.equal(msg, "sdk reply",
+ "The content script received the expected reply message");
+ resolve();
+ } else {
+ console.error("Unexpected message received", {msg,sender, numExpectedMessage});
+ assert.ok(false, `unexpected message received`);
+ reject();
+ }
+ };
+ browser.runtime.onMessage.addListener(messageListener);
+ });
+
+ let portListener;
+ let waitForContentScriptPort = new Promise((resolve, reject) => {
+ portListener = (port) => {
+ let numExpectedMessages = 2;
+ port.onMessage.addListener((msg) => {
+ numExpectedMessages -= 1;
+
+ if (numExpectedMessages == 1) {
+ assert.equal(msg, "content script->sdk port message",
+ "Got the expected message from the content script port");
+ port.postMessage("sdk->content script port message");
+ } else if (numExpectedMessages == 0) {
+ assert.equal(msg, "content script received sdk->content script port message",
+ "The content script received the expected port message");
+ }
+ });
+ port.onDisconnect.addListener(() => {
+ assert.equal(numExpectedMessages, 0, "Got the epected number of port messages");
+ resolve();
+ });
+ };
+ browser.runtime.onConnect.addListener(portListener);
+ });
+
+ let url = "http://example.org/";
+
+ var openedTab;
+ tabs.once('open', function onOpen(tab) {
+ openedTab = tab;
+ });
+ tabs.open(url);
+
+ yield Promise.all([
+ waitForContentScriptMessage,
+ waitForContentScriptPort,
+ ]).then(() => {
+ browser.runtime.onMessage.removeListener(messageListener);
+ browser.runtime.onConnect.removeListener(portListener);
+ openedTab.close();
+ });
+ } catch (err) {
+ assert.fail(`Unexpected webextension startup exception: ${err} - ${err.stack}`);
+ }
+};
+
+require("sdk/test/runner").runTestsFromModule(module);
diff --git a/addon-sdk/source/test/addons/embedded-webextension/package.json b/addon-sdk/source/test/addons/embedded-webextension/package.json
new file mode 100644
index 000000000..25dec41c3
--- /dev/null
+++ b/addon-sdk/source/test/addons/embedded-webextension/package.json
@@ -0,0 +1,6 @@
+{
+ "id": "embedded-webextension@jetpack",
+ "version": "0.1.0",
+ "main": "./main.js",
+ "hasEmbeddedWebExtension": true
+}
diff --git a/addon-sdk/source/test/addons/embedded-webextension/webextension/background-page.js b/addon-sdk/source/test/addons/embedded-webextension/webextension/background-page.js
new file mode 100644
index 000000000..05e7a613b
--- /dev/null
+++ b/addon-sdk/source/test/addons/embedded-webextension/webextension/background-page.js
@@ -0,0 +1,10 @@
+browser.runtime.sendMessage("bg->sdk message", (reply) => {
+ browser.runtime.sendMessage(reply);
+});
+
+let port = browser.runtime.connect();
+port.onMessage.addListener((msg) => {
+ port.postMessage(`bg received ${msg}`);
+ port.disconnect();
+});
+port.postMessage("bg->sdk port message");
diff --git a/addon-sdk/source/test/addons/embedded-webextension/webextension/content-script.js b/addon-sdk/source/test/addons/embedded-webextension/webextension/content-script.js
new file mode 100644
index 000000000..a8770e623
--- /dev/null
+++ b/addon-sdk/source/test/addons/embedded-webextension/webextension/content-script.js
@@ -0,0 +1,10 @@
+browser.runtime.sendMessage("content script->sdk message", (reply) => {
+ browser.runtime.sendMessage(reply);
+});
+
+let port = browser.runtime.connect();
+port.onMessage.addListener((msg) => {
+ port.postMessage(`content script received ${msg}`);
+ port.disconnect();
+});
+port.postMessage("content script->sdk port message");
diff --git a/addon-sdk/source/test/addons/embedded-webextension/webextension/manifest.json b/addon-sdk/source/test/addons/embedded-webextension/webextension/manifest.json
new file mode 100644
index 000000000..d2188e7ba
--- /dev/null
+++ b/addon-sdk/source/test/addons/embedded-webextension/webextension/manifest.json
@@ -0,0 +1,18 @@
+{
+ "name": "Test SDK Embedded WebExtension",
+ "description": "",
+ "version": "0.1.0",
+ "applications": {
+ "gecko": {
+ "id": "embedded-webextension@jetpack"
+ }
+ },
+ "manifest_version": 2,
+ "permissions": ["tabs"],
+ "background": {
+ "scripts": ["background-page.js"]
+ },
+ "content_scripts": [
+ {"matches": ["<all_urls>"], "js": ["content-script.js"]}
+ ]
+}