Bug 1252215 - [webext] add sendMessage support and mochitest to LegacyExtensionContext. r=aswan,kmag draft
authorLuca Greco <lgreco@mozilla.com>
Tue, 17 May 2016 14:24:52 +0200
changeset 391336 f50155656029c4d15456b960803c426733f95ed9
parent 391335 2ea5e7190cc65dd7dcf266d32f05b5fb4df75a03
child 391337 24609f2d05c48dd96aab6b497e4b9d044be6cbab
child 391354 8c230dfee45790c9fc51bde7f2d505bba4ed1a3d
push id23878
push userluca.greco@alcacoop.it
push dateFri, 22 Jul 2016 14:12:17 +0000
reviewersaswan, kmag
bugs1252215
milestone50.0a1
Bug 1252215 - [webext] add sendMessage support and mochitest to LegacyExtensionContext. r=aswan,kmag MozReview-Commit-ID: 4tR6UVGBfQv
toolkit/components/extensions/LegacyExtensionsUtils.jsm
toolkit/components/extensions/test/mochitest/test_chrome_ext_legacy_extension_context.html
toolkit/components/extensions/test/mochitest/test_chrome_ext_legacy_extension_context_contentscript.html
--- 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");