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