Bug 1252215 - [webext] add sendMessage support and mochitest to LegacyExtensionContext. r=aswan,kmag
MozReview-Commit-ID: 4tR6UVGBfQv
--- a/toolkit/components/extensions/LegacyExtensionsUtils.jsm
+++ b/toolkit/components/extensions/LegacyExtensionsUtils.jsm
@@ -67,16 +67,17 @@ var LegacyExtensionContext = class exten
Cu.setSandboxMetadata(cloneScope, {addonId: targetExtension.id});
Object.defineProperty(
this, "cloneScope",
{value: cloneScope, enumerable: true, configurable: true}
);
this.api = {
onConnect: this.messenger.onConnect("runtime.onConnect"),
+ onMessage: this.messenger.onMessage("runtime.onMessage"),
};
}
/**
* This method is called when the extension shuts down or is unloaded,
* and it nukes the cloneScope sandbox, if any.
*/
unload() {
--- a/toolkit/components/extensions/test/mochitest/test_chrome_ext_legacy_extension_context.html
+++ b/toolkit/components/extensions/test/mochitest/test_chrome_ext_legacy_extension_context.html
@@ -39,23 +39,29 @@ add_task(function* test_legacy_extension
bgURL,
// Extract the assigned uuid from the background page url.
uuid: window.location.hostname,
};
browser.test.sendMessage("webextension-ready", extensionInfo);
browser.test.onMessage.addListener(msg => {
- if (msg == "do-connect") {
+ if (msg == "do-send-message") {
+ browser.runtime.sendMessage("webextension -> legacy_extension message", (reply) => {
+ browser.test.assertEq("legacy_extension -> webextension reply", reply,
+ "Got the expected message from the LegacyExtensionContext");
+ browser.test.sendMessage("got-reply-message");
+ });
+ } else if (msg == "do-connect") {
let port = browser.runtime.connect();
port.onMessage.addListener(msg => {
- browser.test.assertEq("legacy_extension -> webextension", msg,
+ browser.test.assertEq("legacy_extension -> webextension port message", msg,
"Got the expected message from the LegacyExtensionContext");
- port.postMessage("webextension -> legacy_extension");
+ port.postMessage("webextension -> legacy_extension port message");
});
}
});
}
let extensionData = {
background: "new " + backgroundScript,
};
@@ -79,16 +85,37 @@ add_task(function* test_legacy_extension
ok(legacyContext, "Got a LegacyExtensionContext instance");
is(legacyContext.type, "legacy_extension",
"LegacyExtensionContext instance has the expected type");
ok(legacyContext.api, "Got the API object");
+ let waitMessage = new Promise(resolve => {
+ legacyContext.api.onMessage.addListener((singleMsg, msgSender, sendReply) => {
+ sendReply("legacy_extension -> webextension reply");
+ resolve({singleMsg, msgSender});
+ });
+ });
+
+ extension.sendMessage("do-send-message");
+
+ let {singleMsg, msgSender} = yield waitMessage;
+ is(singleMsg, "webextension -> legacy_extension message",
+ "Got the expected message");
+ ok(msgSender, "Got a message sender object");
+
+ if (msgSender) {
+ is(msgSender.id, extensionInfo.uuid, "The sender has the expected id property");
+ is(msgSender.url, extensionInfo.bgURL, "The sender has the expected url property");
+ }
+ // Wait confirmation that the reply has been received.
+ yield extension.awaitMessage("got-reply-message");
+
let waitConnectPort = new Promise(resolve => {
legacyContext.api.onConnect.addListener(port => {
resolve(port);
});
});
extension.sendMessage("do-connect");
@@ -105,21 +132,21 @@ add_task(function* test_legacy_extension
}
let waitPortMessage = new Promise(resolve => {
port.onMessage.addListener((msg) => {
resolve(msg);
});
});
- port.postMessage("legacy_extension -> webextension");
+ port.postMessage("legacy_extension -> webextension port message");
let msg = yield waitPortMessage;
- is(msg, "webextension -> legacy_extension",
+ is(msg, "webextension -> legacy_extension port message",
"LegacyExtensionContext received the expected message from the webextension");
let waitForDisconnect = new Promise(resolve => {
port.onDisconnect.addListener(resolve);
});
yield extension.unload();
--- a/toolkit/components/extensions/test/mochitest/test_chrome_ext_legacy_extension_context_contentscript.html
+++ b/toolkit/components/extensions/test/mochitest/test_chrome_ext_legacy_extension_context_contentscript.html
@@ -45,22 +45,28 @@ add_task(function* test_legacy_extension
.catch(() => browser.test.notifyFail("current-tab-closed"));
}
});
browser.test.sendMessage("ready");
}
function contentScript() {
+ browser.runtime.sendMessage("webextension -> legacy_extension message", (reply) => {
+ browser.test.assertEq("legacy_extension -> webextension reply", reply,
+ "Got the expected reply from the LegacyExtensionContext");
+ browser.test.sendMessage("got-reply-message");
+ });
+
let port = browser.runtime.connect();
port.onMessage.addListener(msg => {
- browser.test.assertEq("legacy_extension -> webextension", msg,
+ browser.test.assertEq("legacy_extension -> webextension port message", msg,
"Got the expected message from the LegacyExtensionContext");
- port.postMessage("webextension -> legacy_extension");
+ port.postMessage("webextension -> legacy_extension port message");
});
}
let extensionData = {
background: `new ${backgroundScript}`,
manifest: {
"content_scripts": [
{
@@ -100,22 +106,47 @@ add_task(function* test_legacy_extension
ok(legacyContext.api, "Got the API object");
let waitConnectPort = new Promise(resolve => {
legacyContext.api.onConnect.addListener(port => {
resolve(port);
});
});
+ let waitMessage = new Promise(resolve => {
+ legacyContext.api.onMessage.addListener((singleMsg, msgSender, sendReply) => {
+ sendReply("legacy_extension -> webextension reply");
+ resolve({singleMsg, msgSender});
+ });
+ });
+
yield extension.awaitMessage("ready");
extension.sendMessage("open-test-tab");
let {uuid, tab} = yield extension.awaitMessage("get-expected-sender-info");
+ let {singleMsg, msgSender} = yield waitMessage;
+ is(singleMsg, "webextension -> legacy_extension message",
+ "Got the expected message");
+ ok(msgSender, "Got a message sender object");
+
+ if (msgSender) {
+ is(msgSender.id, uuid, "The sender has the expected id property");
+ is(msgSender.url, "http://example.com/", "The sender has the expected url property");
+ ok(msgSender.tab, "The sender has a tab property");
+
+ if (msgSender.tab) {
+ is(msgSender.tab.id, tab.id, "The port sender has the expected tab.id");
+ }
+ }
+
+ // Wait confirmation that the reply has been received.
+ yield extension.awaitMessage("got-reply-message");
+
let port = yield waitConnectPort;
ok(port, "Got the Port API object");
ok(port.sender, "The port has a sender property");
if (port.sender) {
is(port.sender.id, uuid, "The port sender has an id property");
is(port.sender.url, "http://example.com/", "The port sender has the expected url property");
@@ -127,21 +158,21 @@ add_task(function* test_legacy_extension
}
let waitPortMessage = new Promise(resolve => {
port.onMessage.addListener((msg) => {
resolve(msg);
});
});
- port.postMessage("legacy_extension -> webextension");
+ port.postMessage("legacy_extension -> webextension port message");
let msg = yield waitPortMessage;
- is(msg, "webextension -> legacy_extension",
+ is(msg, "webextension -> legacy_extension port message",
"LegacyExtensionContext received the expected message from the webextension");
let waitForDisconnect = new Promise(resolve => {
port.onDisconnect.addListener(resolve);
});
extension.sendMessage("close-current-tab");