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" && ( |
+ parseInt(info.platformVersion, 10) < 6 || // beforeload breaks websites in Safari 5 |
Thomas Greiner
2014/12/19 16:58:23
Since this is only running in the context of the b
Wladimir Palant
2014/12/19 17:45:38
Done.
|
+ info.platformVersion == "6.1" || // extensions are broken in 6.1 and 7.0 |
+ info.platformVersion == "7.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(); |
+ } |
+ 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); |