| Index: messageResponder.js |
| =================================================================== |
| --- a/messageResponder.js |
| +++ b/messageResponder.js |
| @@ -76,7 +76,7 @@ |
| let convertFilter = convertObject.bind(null, ["text"]); |
| - let changeListeners = new ext.PageMap(); |
| + let uiPorts = new Map(); |
| let listenedPreferences = Object.create(null); |
| let listenedFilterChanges = Object.create(null); |
| let messageTypes = new Map([ |
| @@ -88,8 +88,7 @@ |
| function sendMessage(type, action, ...args) |
| { |
| - let pages = changeListeners.keys(); |
| - if (pages.length == 0) |
| + if (uiPorts.size == 0) |
| return; |
| let convertedArgs = []; |
| @@ -103,13 +102,12 @@ |
| convertedArgs.push(arg); |
| } |
| - for (let page of pages) |
| + for (let [uiPort, filters] of uiPorts) |
| { |
| - let filters = changeListeners.get(page); |
| - let actions = filters[type]; |
| + let actions = filters.get(type); |
| if (actions && actions.indexOf(action) != -1) |
| { |
| - page.sendMessage({ |
| + uiPort.postMessage({ |
| type: messageTypes.get(type), |
| action, |
| args: convertedArgs |
| @@ -131,25 +129,14 @@ |
| if (!(name in listenedFilterChanges)) |
| { |
| listenedFilterChanges[name] = null; |
| - FilterNotifier.on(name, (...args) => |
| + FilterNotifier.on(name, (item) => |
| { |
| - sendMessage(type, action, ...args); |
| + sendMessage(type, action, item); |
| }); |
| } |
| } |
| } |
| - function getListenerFilters(page) |
| - { |
| - let listenerFilters = changeListeners.get(page); |
| - if (!listenerFilters) |
| - { |
| - listenerFilters = Object.create(null); |
| - changeListeners.set(page, listenerFilters); |
| - } |
| - return listenerFilters; |
| - } |
| - |
| function addSubscription(subscription, properties) |
| { |
| subscription.disabled = false; |
| @@ -213,11 +200,6 @@ |
| return info[message.what]; |
| }); |
| - port.on("app.listen", (message, sender) => |
| - { |
| - getListenerFilters(sender.page).app = message.filter; |
| - }); |
| - |
| port.on("app.open", (message, sender) => |
| { |
| if (message.what == "options") |
| @@ -304,12 +286,6 @@ |
| return errors; |
| }); |
| - port.on("filters.listen", (message, sender) => |
| - { |
| - getListenerFilters(sender.page).filter = message.filter; |
| - addFilterListeners("filter", message.filter); |
| - }); |
| - |
| port.on("filters.remove", (message, sender) => |
| { |
| let filter = Filter.fromText(message.text); |
| @@ -328,22 +304,6 @@ |
| return Prefs[message.key]; |
| }); |
| - port.on("prefs.listen", (message, sender) => |
| - { |
| - getListenerFilters(sender.page).pref = message.filter; |
| - for (let preference of message.filter) |
| - { |
| - if (!(preference in listenedPreferences)) |
| - { |
| - listenedPreferences[preference] = null; |
| - Prefs.on(preference, () => |
| - { |
| - sendMessage("pref", preference, Prefs[preference]); |
| - }); |
| - } |
| - } |
| - }); |
| - |
| port.on("prefs.set", (message, sender) => |
| { |
| if (message.key == "notifications_ignoredcategories") |
| @@ -421,12 +381,6 @@ |
| }); |
| }); |
| - port.on("subscriptions.listen", (message, sender) => |
| - { |
| - getListenerFilters(sender.page).subscription = message.filter; |
| - addFilterListeners("subscription", message.filter); |
| - }); |
| - |
| port.on("subscriptions.remove", (message, sender) => |
| { |
| let subscription = Subscription.fromURL(message.url); |
| @@ -462,4 +416,64 @@ |
| Synchronizer.execute(subscription, true); |
| } |
| }); |
| + |
| + function listen(type, filters, newFilter) |
| + { |
| + switch (type) |
| + { |
| + case "app": |
| + filters.set("app", newFilter); |
| + break; |
| + case "filters": |
| + filters.set("filter", newFilter); |
| + addFilterListeners("filter", newFilter); |
| + break; |
| + case "prefs": |
| + filters.set("pref", newFilter); |
| + for (let preference of newFilter) |
| + { |
| + if (!(preference in listenedPreferences)) |
| + { |
| + listenedPreferences[preference] = null; |
| + Prefs.on(preference, () => |
| + { |
| + sendMessage("pref", preference, Prefs[preference]); |
| + }); |
| + } |
| + } |
| + break; |
| + case "subscriptions": |
| + filters.set("subscription", newFilter); |
| + addFilterListeners("subscription", newFilter); |
| + break; |
| + } |
| + } |
| + |
| + function onConnect(uiPort) |
| + { |
| + if (uiPort.name != "ui") |
| + return; |
| + |
| + let filters = new Map(); |
| + uiPorts.set(uiPort, filters); |
| + |
| + uiPort.onDisconnect.addListener(() => |
| + { |
| + uiPorts.delete(uiPort); |
| + }); |
| + |
| + uiPort.onMessage.addListener((message) => |
| + { |
| + let [type, action] = message.type.split(".", 2); |
| + |
| + // For now we're only using long-lived connections for handling |
| + // "*.listen" messages to tackle #6440 |
| + if (action == "listen") |
| + { |
| + listen(type, filters, message.filter); |
| + } |
| + }); |
| + } |
| + |
| + browser.runtime.onConnect.addListener(onConnect); |
| })(this); |