Bug 1380290: Use correct message manager when communicating with inline options browsers. r=aswan

MozReview-Commit-ID: HpxXG3S2zgp

--HG--
extra : rebase_source : fea9712e94676ea0d8c71a59788a6df51780ec2a
This commit is contained in:
Kris Maglione 2017-07-12 17:41:12 -07:00
Родитель 3e7eb9ef7b
Коммит a97f59bd1b
3 изменённых файлов: 85 добавлений и 2 удалений

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

@ -35,8 +35,29 @@ async function loadExtension(options) {
browser.runtime.onMessage.addListener((msg, sender, respond) => {
if (msg == "ping") {
respond("pong");
} else if (msg == "connect") {
let port = browser.runtime.connect();
port.postMessage("ping-from-options-html");
port.onMessage.addListener(msg => {
if (msg == "ping-from-bg") {
browser.test.log("Got outbound options.html pong");
browser.test.sendMessage("options-html-outbound-pong");
}
});
}
});
browser.runtime.onConnect.addListener(port => {
browser.test.log("Got inbound options.html port");
port.postMessage("ping-from-options-html");
port.onMessage.addListener(msg => {
if (msg == "ping-from-bg") {
browser.test.log("Got inbound options.html pong");
browser.test.sendMessage("options-html-inbound-pong");
}
});
});
},
},
@ -120,6 +141,39 @@ add_tasks(async function test_inline_options(extraOptions) {
let pong = await browser.runtime.sendMessage("ping");
browser.test.assertEq("pong", pong, "Got pong.");
let done = new Promise(resolve => {
browser.test.onMessage.addListener(msg => {
if (msg == "ports-done") {
resolve();
}
});
});
browser.runtime.onConnect.addListener(port => {
browser.test.log("Got inbound background port");
port.postMessage("ping-from-bg");
port.onMessage.addListener(msg => {
if (msg == "ping-from-options-html") {
browser.test.log("Got inbound background pong");
browser.test.sendMessage("bg-inbound-pong");
}
});
});
browser.runtime.sendMessage("connect");
let port = browser.runtime.connect();
port.postMessage("ping-from-bg");
port.onMessage.addListener(msg => {
if (msg == "ping-from-options-html") {
browser.test.log("Got outbound background pong");
browser.test.sendMessage("bg-outbound-pong");
}
});
await done;
browser.test.log("Remove options tab.");
await browser.tabs.remove(optionsTab.id);
@ -142,7 +196,17 @@ add_tasks(async function test_inline_options(extraOptions) {
},
}));
await Promise.all([
extension.awaitMessage("options-html-inbound-pong"),
extension.awaitMessage("options-html-outbound-pong"),
extension.awaitMessage("bg-inbound-pong"),
extension.awaitMessage("bg-outbound-pong"),
]);
extension.sendMessage("ports-done");
await extension.awaitFinish("options-ui");
await extension.unload();
await BrowserTestUtils.removeTab(tab);

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

@ -272,7 +272,24 @@ ProxyMessenger = {
// `tabId` being set implies that the tabs API is supported, so we don't
// need to check whether `tabTracker` exists.
let tab = apiManager.global.tabTracker.getTab(tabId, null);
return tab && (tab.linkedBrowser || tab.browser).messageManager;
if (!tab) {
return null;
}
let browser = tab.linkedBrowser || tab.browser;
// Options panels in the add-on manager currently require
// special-casing, since their message managers aren't currently
// connected to the tab's top-level message manager. To deal with
// this, we find the options <browser> for the tab, and use that
// directly, insteead.
if (browser.currentURI.cloneIgnoringRef().spec === "about:addons") {
let optionsBrowser = browser.contentDocument.querySelector(".inline-options-browser");
if (optionsBrowser) {
browser = optionsBrowser;
}
}
return browser.messageManager;
}
// runtime.sendMessage / runtime.connect

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

@ -215,7 +215,9 @@ class FilteringMessageManager {
* The handler object to unregister.
*/
removeHandler(messageName, handler) {
this.handlers.get(messageName).delete(handler);
if (this.handlers.has(messageName)) {
this.handlers.get(messageName).delete(handler);
}
}
}