Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: messageResponder.js

Issue 29338734: Issue 3839 - Adapt for Prefs event changes (Closed)
Patch Set: Created March 21, 2016, 4:17 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« background.js ('K') | « background.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: messageResponder.js
===================================================================
--- a/messageResponder.js
+++ b/messageResponder.js
@@ -52,7 +52,9 @@
"downloadStatus", "homepage", "lastDownload", "title", "url"]);
var convertFilter = convertObject.bind(null, ["text"]);
- var changeListeners = null;
+ var changeListeners = new global.ext.PageMap();
+ var filterListenerAdded = false;
+ var listenedPreferences = [];
var messageTypes = {
"app": "app.listen",
"filter": "filters.listen",
@@ -60,13 +62,14 @@
"subscription": "subscriptions.listen"
};
- function sendMessage(type, action, args, page)
+ function sendMessage(type, action, args)
{
- var pages = page ? [page] : changeListeners.keys();
+ var pages = changeListeners.keys();
for (var i = 0; i < pages.length; i++)
{
var filters = changeListeners.get(pages[i]);
- if (filters[type] && filters[type].indexOf(action) >= 0)
+ var actions = filters[type];
+ if (actions && actions.indexOf(action) != -1)
{
pages[i].sendMessage({
type: messageTypes[type],
@@ -110,31 +113,26 @@
sendMessage(type, action, args);
}
- function onPrefChange(name)
+ function getListenerFilters(page, addListener)
{
- sendMessage("pref", name, [Prefs[name]]);
+ if (addListener && !filterListenerAdded)
+ {
+ FilterNotifier.addListener(onFilterChange);
+ filterListenerAdded = true;
+ }
Thomas Greiner 2016/03/21 17:55:55 I guess we could just unconditionally start listen
Sebastian Noack 2016/03/21 19:40:07 I considered it, but I rather avoid running the li
+
+ var listenerFilters = changeListeners.get(page);
+ if (!listenerFilters)
+ {
+ listenerFilters = Object.create(null);
+ changeListeners.set(page, listenerFilters);
+ }
+
+ return listenerFilters;
}
global.ext.onMessage.addListener(function(message, sender, callback)
{
- var listenerFilters = null;
- if (/\.listen$/.test(message.type))
- {
- if (!changeListeners)
- {
- changeListeners = new global.ext.PageMap();
- FilterNotifier.addListener(onFilterChange);
- Prefs.onChanged.addListener(onPrefChange);
- }
-
- listenerFilters = changeListeners.get(sender.page);
- if (!listenerFilters)
- {
- listenerFilters = Object.create(null);
- changeListeners.set(sender.page, listenerFilters);
- }
- }
-
switch (message.type)
{
case "app.get":
@@ -187,6 +185,7 @@
callback(null);
break;
case "app.listen":
+ var listenerFilters = getListenerFilters(sender.page, true);
if (message.filter)
listenerFilters.app = message.filter;
else
@@ -287,6 +286,7 @@
}
break;
case "filters.listen":
+ var listenerFilters = getListenerFilters(sender.page, true);
if (message.filter)
listenerFilters.filter = message.filter;
else
@@ -307,8 +307,22 @@
callback(Prefs[message.key]);
break;
case "prefs.listen":
+ var listenerFilters = getListenerFilters(sender.page);
if (message.filter)
+ {
+ message.filter.forEach(function(preference)
+ {
+ if (listenedPreferences.indexOf(preference) == -1)
Thomas Greiner 2016/03/21 17:55:55 So only the first UI that registers a listener for
Sebastian Noack 2016/03/21 19:40:07 Yes, the first UI that listens for a particular pr
+ {
+ listenedPreferences.push(preference);
+ Prefs.on(preference, function()
+ {
+ sendMessage("pref", preference, [Prefs[preference]]);
+ });
Thomas Greiner 2016/03/21 17:55:55 This listener is never removed. As you pointed ou
Sebastian Noack 2016/03/21 19:40:07 Removing the listeners isn't trivial, since you ca
+ }
+ });
listenerFilters.pref = message.filter;
+ }
else
delete listenerFilters.pref;
break;
@@ -355,6 +369,7 @@
callback(subscriptions.map(convertSubscription));
break;
case "subscriptions.listen":
+ var listenerFilters = getListenerFilters(sender.page, true);
Thomas Greiner 2016/03/21 17:55:55 Nice. No idea why we didn't implement it like this
if (message.filter)
listenerFilters.subscription = message.filter;
else
« background.js ('K') | « background.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld