Bug 1354337 - Add frameId to ExtensionPageChild message sender, r?mixedpuppy
MozReview-Commit-ID: 8C074ACnsHS
--- a/toolkit/components/extensions/ExtensionPageChild.jsm
+++ b/toolkit/components/extensions/ExtensionPageChild.jsm
@@ -20,16 +20,18 @@ const Cr = Components.results;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "ExtensionManagement",
"resource://gre/modules/ExtensionManagement.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Schemas",
"resource://gre/modules/Schemas.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "WebNavigationFrames",
+ "resource://gre/modules/WebNavigationFrames.jsm");
const CATEGORY_EXTENSION_SCRIPTS_ADDON = "webextension-scripts-addon";
const CATEGORY_EXTENSION_SCRIPTS_DEVTOOLS = "webextension-scripts-devtools";
Cu.import("resource://gre/modules/ExtensionCommon.jsm");
Cu.import("resource://gre/modules/ExtensionChild.jsm");
Cu.import("resource://gre/modules/ExtensionUtils.jsm");
@@ -105,19 +107,19 @@ class ExtensionBaseContextChild extends
super(params.envType, extension);
let {viewType, uri, contentWindow, tabId} = params;
this.viewType = viewType;
this.uri = uri || extension.baseURI;
this.setContentWindow(contentWindow);
// This is the MessageSender property passed to extension.
- // It can be augmented by the "page-open" hook.
let sender = {id: extension.id};
if (viewType == "tab") {
+ sender.frameId = WebNavigationFrames.getFrameId(contentWindow);
sender.tabId = tabId;
this.tabId = tabId;
}
if (uri) {
sender.url = uri.spec;
}
this.sender = sender;
--- a/toolkit/components/extensions/test/mochitest/mochitest-common.ini
+++ b/toolkit/components/extensions/test/mochitest/mochitest-common.ini
@@ -77,20 +77,21 @@ skip-if = os == 'android' # Android supp
[test_ext_permission_xhr.html]
[test_ext_proxy.html]
[test_ext_runtime_connect.html]
[test_ext_runtime_connect_twoway.html]
[test_ext_runtime_connect2.html]
[test_ext_runtime_disconnect.html]
[test_ext_runtime_id.html]
[test_ext_sandbox_var.html]
+[test_ext_sendmessage_doublereply.html]
+[test_ext_sendmessage_frameId.html]
+[test_ext_sendmessage_no_receiver.html]
[test_ext_sendmessage_reply.html]
[test_ext_sendmessage_reply2.html]
-[test_ext_sendmessage_doublereply.html]
-[test_ext_sendmessage_no_receiver.html]
[test_ext_storage_content.html]
[test_ext_storage_tab.html]
[test_ext_storage_manager_capabilities.html]
scheme=https
[test_ext_test.html]
[test_ext_cookies.html]
[test_ext_background_api_injection.html]
[test_ext_background_generated_url.html]
new file mode 100644
--- /dev/null
+++ b/toolkit/components/extensions/test/mochitest/test_ext_sendmessage_frameId.html
@@ -0,0 +1,46 @@
+<!doctype html>
+<head>
+ <title>Test sendMessage frameId</title>
+ <script src="/tests/SimpleTest/SpawnTask.js"></script>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+ <script src="head.js"></script>
+ <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+</head>
+<script>
+"use strict";
+
+add_task(async function test_sendMessage_frameId() {
+ const html = `<!doctype html><meta charset="utf-8"><script src="script.js"><\/script>`;
+
+ const extension = ExtensionTestUtils.loadExtension({
+ background() {
+ browser.runtime.onMessage.addListener((msg, sender) => {
+ browser.test.sendMessage(msg, sender);
+ });
+ browser.tabs.create({url: "tab.html"});
+ },
+ files: {
+ "iframe.html": html,
+ "tab.html": `${html}<iframe src="iframe.html"></iframe>`,
+ "script.js": () => {
+ browser.runtime.sendMessage(window.top === window ? "tab" : "iframe");
+ },
+ },
+ });
+
+ await extension.startup();
+
+ const tab = await extension.awaitMessage("tab");
+ ok(tab.url.endsWith("tab.html"), "Got the message from the tab");
+ is(tab.frameId, 0, "And sender.frameId is zero");
+
+ const iframe = await extension.awaitMessage("iframe");
+ ok(iframe.url.endsWith("iframe.html"), "Got the message from the iframe");
+ is(typeof iframe.frameId, "number", "With sender.frameId of type number");
+ ok(iframe.frameId > 0, "And sender.frameId greater than zero");
+
+ await extension.unload();
+});
+
+</script>