Bug 1269347 - Part3 Add SDK with embedded webextension test addon. r=krizsa

This commit introduces a new SDK test addon, which tests the behavior of the
new SDK module "sdk/webextension", and ensures that the provided API can be used
to exchange messages between an SDK module and the WebExtension background page,
and between an SDK module and a WebExtension content script.

MozReview-Commit-ID: jJWfpF3HQM

--HG--
extra : rebase_source : 92c8b02cb2c84dbde3d9e96fe3e48416f382f79d
This commit is contained in:
Luca Greco 2016-09-14 17:09:22 +02:00
Родитель 4af7171c4f
Коммит b5b320854e
7 изменённых файлов: 205 добавлений и 0 удалений

Просмотреть файл

@ -32,6 +32,7 @@ addons = [
'e10s-remote',
'e10s-tabs',
'e10s',
'embedded-webextension',
'l10n-properties',
'l10n',
'layout-change',

Просмотреть файл

@ -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 = "data:text/html;charset=utf-8,<h1>Test Page</h1>";
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);

Просмотреть файл

@ -0,0 +1,6 @@
{
"id": "embedded-webextension@jetpack",
"version": "0.1.0",
"main": "./main.js",
"hasEmbeddedWebExtension": true
}

Просмотреть файл

@ -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");

Просмотреть файл

@ -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");

Просмотреть файл

@ -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"]}
]
}

Просмотреть файл

@ -17,6 +17,7 @@ skip-if = true
skip-if = true
[e10s-tabs.xpi]
skip-if = true
[embedded-webextension.xpi]
[l10n.xpi]
[l10n-properties.xpi]
[layout-change.xpi]