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

Side by Side Diff: messageResponder.js

Issue 29715759: Issue 6440 - Use long-lived connections to listen to extension events (Closed)
Patch Set: Added message passing mock for ports Created March 7, 2018, 7:10 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>, 2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-present eyeo GmbH 3 * Copyright (C) 2006-present eyeo GmbH
4 * 4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify 5 * Adblock Plus is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as 6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Adblock Plus is distributed in the hope that it will be useful, 9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 "softExpiration", "expires", "title", 69 "softExpiration", "expires", "title",
70 "url"], subscription); 70 "url"], subscription);
71 if (subscription instanceof SpecialSubscription) 71 if (subscription instanceof SpecialSubscription)
72 obj.filters = subscription.filters.map(convertFilter); 72 obj.filters = subscription.filters.map(convertFilter);
73 obj.isDownloading = Synchronizer.isExecuting(subscription.url); 73 obj.isDownloading = Synchronizer.isExecuting(subscription.url);
74 return obj; 74 return obj;
75 } 75 }
76 76
77 let convertFilter = convertObject.bind(null, ["text"]); 77 let convertFilter = convertObject.bind(null, ["text"]);
78 78
79 let changeListeners = new ext.PageMap(); 79 let uiPorts = new Map();
80 let listenedPreferences = Object.create(null); 80 let listenedPreferences = Object.create(null);
81 let listenedFilterChanges = Object.create(null); 81 let listenedFilterChanges = Object.create(null);
82 let messageTypes = new Map([ 82 let messageTypes = new Map([
83 ["app", "app.respond"], 83 ["app", "app.respond"],
84 ["filter", "filters.respond"], 84 ["filter", "filters.respond"],
85 ["pref", "prefs.respond"], 85 ["pref", "prefs.respond"],
86 ["subscription", "subscriptions.respond"] 86 ["subscription", "subscriptions.respond"]
87 ]); 87 ]);
88 88
89 function sendMessage(type, action, ...args) 89 function sendMessage(type, action, ...args)
90 { 90 {
91 let pages = changeListeners.keys(); 91 if (uiPorts.size == 0)
92 if (pages.length == 0)
93 return; 92 return;
94 93
95 let convertedArgs = []; 94 let convertedArgs = [];
96 for (let arg of args) 95 for (let arg of args)
97 { 96 {
98 if (arg instanceof Subscription) 97 if (arg instanceof Subscription)
99 convertedArgs.push(convertSubscription(arg)); 98 convertedArgs.push(convertSubscription(arg));
100 else if (arg instanceof Filter) 99 else if (arg instanceof Filter)
101 convertedArgs.push(convertFilter(arg)); 100 convertedArgs.push(convertFilter(arg));
102 else 101 else
103 convertedArgs.push(arg); 102 convertedArgs.push(arg);
104 } 103 }
105 104
106 for (let page of pages) 105 for (let [uiPort, filters] of uiPorts)
107 { 106 {
108 let filters = changeListeners.get(page); 107 let actions = filters.get(type);
109 let actions = filters[type];
110 if (actions && actions.indexOf(action) != -1) 108 if (actions && actions.indexOf(action) != -1)
111 { 109 {
112 page.sendMessage({ 110 uiPort.postMessage({
113 type: messageTypes.get(type), 111 type: messageTypes.get(type),
114 action, 112 action,
115 args: convertedArgs 113 args: convertedArgs
116 }); 114 });
117 } 115 }
118 } 116 }
119 } 117 }
120 118
121 function addFilterListeners(type, actions) 119 function addFilterListeners(type, actions)
122 { 120 {
123 for (let action of actions) 121 for (let action of actions)
124 { 122 {
125 let name; 123 let name;
126 if (type == "filter" && action == "loaded") 124 if (type == "filter" && action == "loaded")
127 name = "load"; 125 name = "load";
128 else 126 else
129 name = type + "." + action; 127 name = type + "." + action;
130 128
131 if (!(name in listenedFilterChanges)) 129 if (!(name in listenedFilterChanges))
132 { 130 {
133 listenedFilterChanges[name] = null; 131 listenedFilterChanges[name] = null;
134 FilterNotifier.on(name, (...args) => 132 FilterNotifier.on(name, (item) =>
135 { 133 {
136 sendMessage(type, action, ...args); 134 sendMessage(type, action, item);
137 }); 135 });
138 } 136 }
139 } 137 }
140 } 138 }
141 139
142 function getListenerFilters(page)
143 {
144 let listenerFilters = changeListeners.get(page);
145 if (!listenerFilters)
146 {
147 listenerFilters = Object.create(null);
148 changeListeners.set(page, listenerFilters);
149 }
150 return listenerFilters;
151 }
152
153 function addSubscription(subscription, properties) 140 function addSubscription(subscription, properties)
154 { 141 {
155 subscription.disabled = false; 142 subscription.disabled = false;
156 if ("title" in properties) 143 if ("title" in properties)
157 subscription.title = properties.title; 144 subscription.title = properties.title;
158 if ("homepage" in properties) 145 if ("homepage" in properties)
159 subscription.homepage = properties.homepage; 146 subscription.homepage = properties.homepage;
160 147
161 FilterStorage.addSubscription(subscription); 148 FilterStorage.addSubscription(subscription);
162 if (subscription instanceof DownloadableSubscription && 149 if (subscription instanceof DownloadableSubscription &&
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 parseInt(info.applicationVersion, 10) >= 54 193 parseInt(info.applicationVersion, 10) >= 54
207 }; 194 };
208 } 195 }
209 196
210 if (message.what == "senderId") 197 if (message.what == "senderId")
211 return sender.page.id; 198 return sender.page.id;
212 199
213 return info[message.what]; 200 return info[message.what];
214 }); 201 });
215 202
216 port.on("app.listen", (message, sender) =>
217 {
218 getListenerFilters(sender.page).app = message.filter;
219 });
220
221 port.on("app.open", (message, sender) => 203 port.on("app.open", (message, sender) =>
222 { 204 {
223 if (message.what == "options") 205 if (message.what == "options")
224 { 206 {
225 showOptions(() => 207 showOptions(() =>
226 { 208 {
227 if (!message.action) 209 if (!message.action)
228 return; 210 return;
229 211
230 sendMessage("app", message.action, ...message.args); 212 sendMessage("app", message.action, ...message.args);
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 continue; 279 continue;
298 280
299 if (!(filter.text in seenFilter)) 281 if (!(filter.text in seenFilter))
300 FilterStorage.removeFilter(filter); 282 FilterStorage.removeFilter(filter);
301 } 283 }
302 } 284 }
303 285
304 return errors; 286 return errors;
305 }); 287 });
306 288
307 port.on("filters.listen", (message, sender) =>
308 {
309 getListenerFilters(sender.page).filter = message.filter;
310 addFilterListeners("filter", message.filter);
311 });
312
313 port.on("filters.remove", (message, sender) => 289 port.on("filters.remove", (message, sender) =>
314 { 290 {
315 let filter = Filter.fromText(message.text); 291 let filter = Filter.fromText(message.text);
316 let subscription = null; 292 let subscription = null;
317 if (message.subscriptionUrl) 293 if (message.subscriptionUrl)
318 subscription = Subscription.fromURL(message.subscriptionUrl); 294 subscription = Subscription.fromURL(message.subscriptionUrl);
319 295
320 if (!subscription) 296 if (!subscription)
321 FilterStorage.removeFilter(filter); 297 FilterStorage.removeFilter(filter);
322 else 298 else
323 FilterStorage.removeFilter(filter, subscription, message.index); 299 FilterStorage.removeFilter(filter, subscription, message.index);
324 }); 300 });
325 301
326 port.on("prefs.get", (message, sender) => 302 port.on("prefs.get", (message, sender) =>
327 { 303 {
328 return Prefs[message.key]; 304 return Prefs[message.key];
329 }); 305 });
330 306
331 port.on("prefs.listen", (message, sender) =>
332 {
333 getListenerFilters(sender.page).pref = message.filter;
334 for (let preference of message.filter)
335 {
336 if (!(preference in listenedPreferences))
337 {
338 listenedPreferences[preference] = null;
339 Prefs.on(preference, () =>
340 {
341 sendMessage("pref", preference, Prefs[preference]);
342 });
343 }
344 }
345 });
346
347 port.on("prefs.set", (message, sender) => 307 port.on("prefs.set", (message, sender) =>
348 { 308 {
349 if (message.key == "notifications_ignoredcategories") 309 if (message.key == "notifications_ignoredcategories")
350 return NotificationStorage.toggleIgnoreCategory("*", !!message.value); 310 return NotificationStorage.toggleIgnoreCategory("*", !!message.value);
351 311
352 return Prefs[message.key] = message.value; 312 return Prefs[message.key] = message.value;
353 }); 313 });
354 314
355 port.on("prefs.toggle", (message, sender) => 315 port.on("prefs.toggle", (message, sender) =>
356 { 316 {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 if (message.disabledFilters) 374 if (message.disabledFilters)
415 { 375 {
416 result.disabledFilters = s.filters 376 result.disabledFilters = s.filters
417 .filter((f) => f instanceof ActiveFilter && f.disabled) 377 .filter((f) => f instanceof ActiveFilter && f.disabled)
418 .map((f) => f.text); 378 .map((f) => f.text);
419 } 379 }
420 return result; 380 return result;
421 }); 381 });
422 }); 382 });
423 383
424 port.on("subscriptions.listen", (message, sender) =>
425 {
426 getListenerFilters(sender.page).subscription = message.filter;
427 addFilterListeners("subscription", message.filter);
428 });
429
430 port.on("subscriptions.remove", (message, sender) => 384 port.on("subscriptions.remove", (message, sender) =>
431 { 385 {
432 let subscription = Subscription.fromURL(message.url); 386 let subscription = Subscription.fromURL(message.url);
433 if (subscription.url in FilterStorage.knownSubscriptions) 387 if (subscription.url in FilterStorage.knownSubscriptions)
434 FilterStorage.removeSubscription(subscription); 388 FilterStorage.removeSubscription(subscription);
435 }); 389 });
436 390
437 port.on("subscriptions.toggle", (message, sender) => 391 port.on("subscriptions.toggle", (message, sender) =>
438 { 392 {
439 let subscription = Subscription.fromURL(message.url); 393 let subscription = Subscription.fromURL(message.url);
(...skipping 15 matching lines...) Expand all
455 let {subscriptions} = FilterStorage; 409 let {subscriptions} = FilterStorage;
456 if (message.url) 410 if (message.url)
457 subscriptions = [Subscription.fromURL(message.url)]; 411 subscriptions = [Subscription.fromURL(message.url)];
458 412
459 for (let subscription of subscriptions) 413 for (let subscription of subscriptions)
460 { 414 {
461 if (subscription instanceof DownloadableSubscription) 415 if (subscription instanceof DownloadableSubscription)
462 Synchronizer.execute(subscription, true); 416 Synchronizer.execute(subscription, true);
463 } 417 }
464 }); 418 });
419
420 function listen(type, filters, newFilter)
421 {
422 switch (type)
423 {
424 case "app":
425 filters.set("app", newFilter);
426 break;
427 case "filters":
428 filters.set("filter", newFilter);
429 addFilterListeners("filter", newFilter);
430 break;
431 case "prefs":
432 filters.set("pref", newFilter);
433 for (let preference of newFilter)
434 {
435 if (!(preference in listenedPreferences))
436 {
437 listenedPreferences[preference] = null;
438 Prefs.on(preference, () =>
439 {
440 sendMessage("pref", preference, Prefs[preference]);
441 });
442 }
443 }
444 break;
445 case "subscriptions":
446 filters.set("subscription", newFilter);
447 addFilterListeners("subscription", newFilter);
448 break;
449 }
450 }
451
452 function onConnect(uiPort)
453 {
454 if (uiPort.name != "ui")
455 return;
456
457 let filters = new Map();
458 uiPorts.set(uiPort, filters);
459
460 uiPort.onDisconnect.addListener(() =>
461 {
462 uiPorts.delete(uiPort);
463 });
464
465 uiPort.onMessage.addListener((message) =>
466 {
467 let [type, action] = message.type.split(".", 2);
468
469 // For now we're only using long-lived connections for handling
470 // "*.listen" messages to tackle #6440
471 if (action == "listen")
472 {
473 listen(type, filters, message.filter);
474 }
475 });
476 }
477
478 browser.runtime.onConnect.addListener(onConnect);
465 })(this); 479 })(this);
OLDNEW
« ext/common.js ('K') | « js/desktop-options.js ('k') | mobile-options.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld