 Issue 4731979438227456:
  Issue 1663 - Emulate background page and implement proper message responder  (Closed)
    
  
    Issue 4731979438227456:
  Issue 1663 - Emulate background page and implement proper message responder  (Closed) 
  | Index: messageResponder.js | 
| =================================================================== | 
| new file mode 100644 | 
| --- /dev/null | 
| +++ b/messageResponder.js | 
| @@ -0,0 +1,160 @@ | 
| +/* | 
| + * This file is part of Adblock Plus <http://adblockplus.org/>, | 
| + * Copyright (C) 2006-2014 Eyeo GmbH | 
| + * | 
| + * Adblock Plus is free software: you can redistribute it and/or modify | 
| + * it under the terms of the GNU General Public License version 3 as | 
| + * published by the Free Software Foundation. | 
| + * | 
| + * Adblock Plus is distributed in the hope that it will be useful, | 
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| + * GNU General Public License for more details. | 
| + * | 
| + * You should have received a copy of the GNU General Public License | 
| + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 
| + */ | 
| + | 
| +(function(global) | 
| +{ | 
| + var subscriptionKeys = ["disabled", "homepage", "lastSuccess", "title", "url", "downloadStatus"]; | 
| + function convertSubscription(subscription) | 
| + { | 
| + var result = {}; | 
| + for (var i = 0; i < subscriptionKeys.length; i++) | 
| + result[subscriptionKeys[i]] = subscription[subscriptionKeys[i]] | 
| + return result; | 
| + } | 
| + | 
| + var changeListeners = null; | 
| + var messageTypes = { | 
| + "app": "app.listen", | 
| + "filter": "filters.listen", | 
| + "subscription": "subscriptions.listen" | 
| + }; | 
| + | 
| + function onFilterChange(action) | 
| + { | 
| + var parts = action.split(".", 2); | 
| + var type; | 
| + if (parts.length == 1) | 
| + { | 
| + type = "app"; | 
| + action = parts[0]; | 
| + } | 
| + else | 
| + { | 
| + type = parts[0]; | 
| + action = parts[1]; | 
| + } | 
| + | 
| + if (!messageTypes.hasOwnProperty(type)) | 
| + return; | 
| + | 
| + var args = Array.prototype.slice.call(arguments, 1).map(function(arg) | 
| + { | 
| + if (arg instanceof Subscription) | 
| + return convertSubscription(arg); | 
| + else | 
| + return arg; | 
| + }); | 
| + | 
| + 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) | 
| + { | 
| + pages[i].sendMessage({ | 
| + type: messageTypes[type], | 
| + action: action, | 
| + args: args | 
| + }); | 
| + } | 
| + } | 
| + }; | 
| + | 
| + ext.onMessage.addListener(function(message, sender, callback) | 
| + { | 
| + switch (message.type) | 
| + { | 
| + case "app.get": | 
| + if (message.what == "issues") | 
| + { | 
| + var info = require("info"); | 
| + callback({ | 
| + seenDataCorruption: "seenDataCorruption" in global ? global.seenDataCorruption : false, | 
| + filterlistsReinitialized: "filterlistsReinitialized" in global ? global.filterlistsReinitialized : false, | 
| + legacySafariVersion: (info.platform == "safari" && ( | 
| + Services.vc.compare(info.platformVersion, "6.0") < 0 || // beforeload breaks websites in Safari 5 | 
| + Services.vc.compare(info.platformVersion, "6.1") == 0 || // extensions are broken in 6.1 and 7.0 | 
| + Services.vc.compare(info.platformVersion, "7.0") == 0)) | 
| + }); | 
| + } | 
| + else if (message.what == "doclink") | 
| + callback(Utils.getDocLink(message.link)); | 
| + else | 
| + callback(null); | 
| + break; | 
| + case "app.open": | 
| + if (message.what == "options") | 
| + { | 
| + if (typeof UI != "undefined") | 
| + UI.openFiltersDialog(); | 
| + else | 
| + global.openOptions(); | 
| 
Sebastian Noack
2014/12/22 09:56:17
window.openOptions() is deprecated. Please use ext
 
Wladimir Palant
2015/01/15 13:03:22
I filed #1813 and #1814 on that.
 | 
| + } | 
| + break; | 
| + case "subscriptions.get": | 
| + var subscriptions = FilterStorage.subscriptions.filter(function(s) | 
| + { | 
| + if (message.ignoreDisabled && s.disabled) | 
| + return false; | 
| + if (s instanceof DownloadableSubscription && message.downloadable) | 
| + return true; | 
| + if (s instanceof SpecialSubscription && message.special) | 
| + return true; | 
| + return false; | 
| + }); | 
| + callback(subscriptions.map(convertSubscription)); | 
| + break; | 
| + case "filters.blocked": | 
| + var filter = defaultMatcher.matchesAny(message.url, message.requestType, message.docDomain, message.thirdParty); | 
| + callback(filter instanceof BlockingFilter); | 
| + break; | 
| + case "subscriptions.toggle": | 
| + var subscription = Subscription.fromURL(message.url); | 
| + if (subscription.url in FilterStorage.knownSubscriptions && !subscription.disabled) | 
| + FilterStorage.removeSubscription(subscription); | 
| + else | 
| + { | 
| + subscription.disabled = false; | 
| + subscription.title = message.title; | 
| + subscription.homepage = message.homepage; | 
| + FilterStorage.addSubscription(subscription); | 
| + if (!subscription.lastDownload) | 
| + Synchronizer.execute(subscription); | 
| + } | 
| + break; | 
| + case "subscriptions.listen": | 
| + if (!changeListeners) | 
| + { | 
| + changeListeners = new global.ext.PageMap(); | 
| + FilterNotifier.addListener(onFilterChange); | 
| + } | 
| + | 
| + var filters = changeListeners.get(sender.page); | 
| + if (!filters) | 
| + { | 
| + filters = Object.create(null); | 
| + changeListeners.set(sender.page, filters); | 
| + } | 
| + | 
| + if (message.filter) | 
| + filters.subscription = message.filter; | 
| + else | 
| + delete filters.subscription; | 
| + break; | 
| + } | 
| + }); | 
| +})(this); |