зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
4af7171c4f
Коммит
b5b320854e
|
@ -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]
|
||||
|
|
Загрузка…
Ссылка в новой задаче