addSubscriptionToList: function(subscription) { FilterStorage.addSubscription(subscription); if (!subscription.lastDownload) Synchronizer.execute(subscription); },
port.on("subscriptions.add", (message, sender) => { let subscription = Subscription.fromURL(message.url); if ("title" in message) subscription.title = message.title; if ("homepage" in message) subscription.homepage = message.homepage; if (message.confirm) { ext.showOptions(() => { sendMessage("app", "addSubscription", subscription); }); } else { subscription.disabled = false; FilterStorage.addSubscription(subscription); if (subscription instanceof DownloadableSubscription && !subscription.lastDownload) Synchronizer.execute(subscription); } });
function convertSubscription(subscription) { var obj = convertObject(["disabled", "downloadStatus", "homepage", "lastDownload", "title", "url"], subscription); obj.isDownloading = Synchronizer.isExecuting(subscription.url); return obj; }
function convertSubscription(subscription) { let obj = convertObject(["disabled", "downloadStatus", "homepage", "lastDownload", "title", "url"], subscription); if (subscription instanceof SpecialSubscription) obj.filters = subscription.filters.map(convertFilter); obj.isDownloading = Synchronizer.isExecuting(subscription.url); return obj; }
filterNotifier.on("load", () => { let {FilterStorage} = require("filterStorage"); if (FilterStorage.firstRun) { // No data, must be a new user or someone with corrupted data - initialize // with default settings const {Subscription, DownloadableSubscription} = require("subscriptionClasses"); const {Synchronizer} = require("synchronizer"); const {Utils} = require("utils"); if (Prefs.first_run_subscription_auto_select) { let subscriptions = require("subscriptions.xml"); let node = Utils.chooseFilterSubscription(subscriptions); if (node) { let subscription = Subscription.fromURL(node.url); subscription.disabled = false; subscription.title = node.title; subscription.homepage = node.homepage; FilterStorage.addSubscription(subscription); if (subscription instanceof DownloadableSubscription && !subscription.lastDownload) Synchronizer.execute(subscription); } let aaSubscription = Subscription.fromURL(Prefs.subscriptions_exceptionsurl); aaSubscription.disabled = false; FilterStorage.addSubscription(aaSubscription); if (aaSubscription instanceof DownloadableSubscription && !aaSubscription.lastDownload) Synchronizer.execute(aaSubscription); } } filtersInitDone = true; checkInitialized(); });
port.on("subscriptions.update", (message, sender) => { let {subscriptions} = FilterStorage; if (message.url) subscriptions = [Subscription.fromURL(message.url)]; for (let subscription of subscriptions) { if (subscription instanceof DownloadableSubscription) Synchronizer.execute(subscription, true); } });
port.on("subscriptions.toggle", (message, sender) => { let subscription = Subscription.fromURL(message.url); if (subscription.url in FilterStorage.knownSubscriptions) { if (subscription.disabled || message.keepInstalled) subscription.disabled = !subscription.disabled; else FilterStorage.removeSubscription(subscription); } else { subscription.disabled = false; subscription.title = message.title; subscription.homepage = message.homepage; FilterStorage.addSubscription(subscription); if (!subscription.lastDownload) Synchronizer.execute(subscription); } });
update: function(record) { if (record.id != filtersRecordID) return; this._log.trace("Merging in remote data"); let data = record.cleartext.subscriptions; // First make sure we have the same subscriptions on both sides let seenSubscription = Object.create(null); for (let remoteSubscription of data) { seenSubscription[remoteSubscription.url] = true; if (remoteSubscription.url in FilterStorage.knownSubscriptions) { let subscription = FilterStorage.knownSubscriptions[remoteSubscription.url]; if (!trackerInstance.didSubscriptionChange(remoteSubscription)) { // Only change local subscription if there were no changes, otherwise dismiss remote changes subscription.disabled = remoteSubscription.disabled; if (subscription instanceof DownloadableSubscription) subscription.title = remoteSubscription.title; } } else if (!trackerInstance.didSubscriptionChange(remoteSubscription)) { // Subscription was added remotely, add it locally as well let subscription = Subscription.fromURL(remoteSubscription.url); if (!subscription) continue; subscription.disabled = remoteSubscription.disabled; if (subscription instanceof DownloadableSubscription) { subscription.title = remoteSubscription.title; FilterStorage.addSubscription(subscription); Synchronizer.execute(subscription); } } } for (let subscription of FilterStorage.subscriptions.slice()) { if (!(subscription.url in seenSubscription) && subscription instanceof DownloadableSubscription && !trackerInstance.didSubscriptionChange(subscription)) { // Subscription was removed remotely, remove it locally as well FilterStorage.removeSubscription(subscription); } } // Now sync the custom filters let seenFilter = Object.create(null); for (let remoteSubscription of data) { if (!("filters" in remoteSubscription)) continue; for (let remoteFilter of remoteSubscription.filters) { seenFilter[remoteFilter.text] = true; let filter = Filter.fromText(remoteFilter.text); if (trackerInstance.didFilterChange(filter)) continue; if (filter.subscriptions.some((subscription) => subscription instanceof SpecialSubscription)) { // Filter might have been changed remotely if (filter instanceof ActiveFilter) filter.disabled = remoteFilter.disabled; } else { // Filter was added remotely, add it locally as well FilterStorage.addFilter(filter); } } } for (let subscription of FilterStorage.subscriptions) { if (!(subscription instanceof SpecialSubscription)) continue; for (let filter of subscription.filters.slice()) { if (!(filter.text in seenFilter) && !trackerInstance.didFilterChange(filter)) { // Filter was removed remotely, remove it locally as well FilterStorage.removeFilter(filter); } } } // Merge done, forget about local changes now trackerInstance.clearPrivateChanges() },
global.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 if (message.what == "localeInfo") { var bidiDir; if ("chromeRegistry" in Utils) bidiDir = Utils.chromeRegistry.isLocaleRTL("adblockplus") ? "rtl" : "ltr"; else bidiDir = ext.i18n.getMessage("@@bidi_dir"); callback({locale: Utils.appLocale, bidiDir: bidiDir}); } else callback(null); break; case "app.open": if (message.what == "options") ext.showOptions(); 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; } });
global.ext.onMessage.addListener(function(message, sender, callback) { var listenerFilters = null; switch (message.type) { case "app.listen": case "filters.listen": case "subscriptions.listen": if (!changeListeners) { changeListeners = new global.ext.PageMap(); FilterNotifier.addListener(onFilterChange); } listenerFilters = changeListeners.get(sender.page); if (!listenerFilters) { listenerFilters = Object.create(null); changeListeners.set(sender.page, listenerFilters); } break; } switch (message.type) { case "add-subscription": ext.showOptions(function() { var subscription = Subscription.fromURL(message.url); subscription.title = message.title; onFilterChange("addSubscription", subscription); }); break; 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 if (message.what == "localeInfo") { var bidiDir; if ("chromeRegistry" in Utils) bidiDir = Utils.chromeRegistry.isLocaleRTL("adblockplus") ? "rtl" : "ltr"; else bidiDir = ext.i18n.getMessage("@@bidi_dir"); callback({locale: Utils.appLocale, bidiDir: bidiDir}); } else if (message.what == "addonVersion") { callback(require("info").addonVersion); } else callback(null); break; case "app.listen": if (message.filter) listenerFilters.app = message.filter; else delete listenerFilters.app; break; case "app.open": if (message.what == "options") ext.showOptions(); break; case "filters.add": var filter = Filter.fromText(message.text); var result = require("filterValidation").parseFilter(message.text); if (result.error) sendMessage("app", "error", [result.error.toString()], sender.page); else if (result.filter) FilterStorage.addFilter(result.filter); break; case "filters.blocked": var filter = defaultMatcher.matchesAny(message.url, message.requestType, message.docDomain, message.thirdParty); callback(filter instanceof BlockingFilter); break; case "filters.get": if (message.what == "cssproperties") { var filters = []; var checkWhitelisted = require("whitelisting").checkWhitelisted; if (!checkWhitelisted(sender.page, sender.frame, RegExpFilter.typeMap.DOCUMENT | RegExpFilter.typeMap.ELEMHIDE)) { filters = CSSRules.getRulesForDomain(sender.frame.url.hostname); filters = filters.map(function(filter) { return { prefix: filter.selectorPrefix, suffix: filter.selectorSuffix, regexp: filter.regexpString }; }); } callback(filters); break; } var subscription = Subscription.fromURL(message.subscriptionUrl); if (!subscription) { callback([]); break; } callback(subscription.filters.map(convertFilter)); break; case "filters.importRaw": var result = require("filterValidation").parseFilters(message.text); var errors = []; for (var i = 0; i < result.errors.length; i++) { var error = result.errors[i]; if (error.type != "unexpected-filter-list-header") errors.push(error.toString()); } if (errors.length > 0) { sendMessage("app", "error", errors, sender.page); return; } var seenFilter = Object.create(null); for (var i = 0; i < result.filters.length; i++) { var filter = result.filters[i]; FilterStorage.addFilter(filter); seenFilter[filter.text] = null; } for (var i = 0; i < FilterStorage.subscriptions.length; i++) { var subscription = FilterStorage.subscriptions[i]; if (!(subscription instanceof SpecialSubscription)) continue; for (var j = subscription.filters.length - 1; j >= 0; j--) { var filter = subscription.filters[j]; if (/^@@\|\|([^\/:]+)\^\$document$/.test(filter.text)) continue; if (!(filter.text in seenFilter)) FilterStorage.removeFilter(filter); } } break; case "filters.listen": if (message.filter) listenerFilters.filter = message.filter; else delete listenerFilters.filter; break; case "filters.remove": var filter = Filter.fromText(message.text); var subscription = null; if (message.subscriptionUrl) subscription = Subscription.fromURL(message.subscriptionUrl); if (!subscription) FilterStorage.removeFilter(filter); else FilterStorage.removeFilter(filter, subscription, message.index); break; case "prefs.get": callback(Prefs[message.key]); break; case "subscriptions.add": if (message.url in FilterStorage.knownSubscriptions) return; var subscription = Subscription.fromURL(message.url); if (!subscription) return; subscription.disabled = false; if ("title" in message) subscription.title = message.title; if ("homepage" in message) subscription.homepage = message.homepage; FilterStorage.addSubscription(subscription); if (subscription instanceof DownloadableSubscription && !subscription.lastDownload) Synchronizer.execute(subscription); 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 "subscriptions.listen": if (message.filter) listenerFilters.subscription = message.filter; else delete listenerFilters.subscription; break; case "subscriptions.remove": var subscription = Subscription.fromURL(message.url); if (subscription.url in FilterStorage.knownSubscriptions) FilterStorage.removeSubscription(subscription); 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; } });
isSubscriptionUpdating: function(subscription) { return Synchronizer.isExecuting(subscription.url); },
updateSubscription: function(subscription) { Synchronizer.execute(subscription); },
global.ext.onMessage.addListener(function(message, sender, callback) { switch (message.type) { case "app.get": if (message.what == "issues") { var subscriptionInit = tryRequire("subscriptionInit"); callback({ filterlistsReinitialized: subscriptionInit ? subscriptionInit.reinitialized : 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 if (message.what == "localeInfo") { var bidiDir; if ("chromeRegistry" in Utils) bidiDir = Utils.chromeRegistry.isLocaleRTL("stopallads") ? "rtl" : "ltr"; else bidiDir = ext.i18n.getMessage("@@bidi_dir"); callback({locale: Utils.appLocale, bidiDir: bidiDir}); } else if (message.what == "features") { callback({ devToolsPanel: info.platform == "chromium", safariContentBlocker: "safari" in global && "extension" in global.safari && "setContentBlocker" in global.safari.extension }); } else callback(info[message.what]); break; case "app.listen": getListenerFilters(sender.page).app = message.filter; break; case "app.open": if (message.what == "options") ext.showOptions(); break; case "filters.add": var result = require("filterValidation").parseFilter(message.text); var errors = []; if (result.error) errors.push(result.error.toString()); else if (result.filter) FilterStorage.addFilter(result.filter); callback(errors); break; case "filters.blocked": var filter = defaultMatcher.matchesAny(message.url, RegExpFilter.typeMap[message.requestType], message.docDomain, message.thirdParty); callback(filter instanceof BlockingFilter); break; case "filters.get": if (message.what == "cssproperties") { var filters = []; var checkWhitelisted = require("whitelisting").checkWhitelisted; if (!checkWhitelisted(sender.page, sender.frame, RegExpFilter.typeMap.DOCUMENT | RegExpFilter.typeMap.ELEMHIDE)) { filters = CSSRules.getRulesForDomain(sender.frame.url.hostname); filters = filters.map(function(filter) { return { prefix: filter.selectorPrefix, suffix: filter.selectorSuffix, regexp: filter.regexpString, text: filter.text }; }); } callback(filters); break; } var subscription = Subscription.fromURL(message.subscriptionUrl); if (!subscription) { callback([]); break; } callback(subscription.filters.map(convertFilter)); break; case "filters.importRaw": var result = require("filterValidation").parseFilters(message.text); var errors = []; for (var i = 0; i < result.errors.length; i++) { var error = result.errors[i]; if (error.type != "unexpected-filter-list-header") errors.push(error.toString()); } callback(errors); if (errors.length > 0) return; var seenFilter = Object.create(null); for (var i = 0; i < result.filters.length; i++) { var filter = result.filters[i]; FilterStorage.addFilter(filter); seenFilter[filter.text] = null; } if (!message.removeExisting) return; for (var i = 0; i < FilterStorage.subscriptions.length; i++) { var subscription = FilterStorage.subscriptions[i]; if (!(subscription instanceof SpecialSubscription)) continue; for (var j = subscription.filters.length - 1; j >= 0; j--) { var filter = subscription.filters[j]; if (/^@@\|\|([^\/:]+)\^\$document$/.test(filter.text)) continue; if (!(filter.text in seenFilter)) FilterStorage.removeFilter(filter); } } break; case "filters.listen": getListenerFilters(sender.page).filter = message.filter; addFilterListeners("filter", message.filter); break; case "filters.remove": var filter = Filter.fromText(message.text); var subscription = null; if (message.subscriptionUrl) subscription = Subscription.fromURL(message.subscriptionUrl); if (!subscription) FilterStorage.removeFilter(filter); else FilterStorage.removeFilter(filter, subscription, message.index); break; case "prefs.get": callback(Prefs[message.key]); break; case "prefs.listen": getListenerFilters(sender.page).pref = message.filter; message.filter.forEach(function(preference) { if (!(preference in listenedPreferences)) { listenedPreferences[preference] = null; Prefs.on(preference, function() { sendMessage("pref", preference, Prefs[preference]); }); } }); break; case "prefs.toggle": if (message.key == "notifications_ignoredcategories") NotificationStorage.toggleIgnoreCategory("*"); else Prefs[message.key] = !Prefs[message.key]; break; case "subscriptions.add": var subscription = Subscription.fromURL(message.url); if ("title" in message) subscription.title = message.title; if ("homepage" in message) subscription.homepage = message.homepage; if (message.confirm) { ext.showOptions(function() { sendMessage("app", "addSubscription", subscription); }); } else { subscription.disabled = false; FilterStorage.addSubscription(subscription); if (subscription instanceof DownloadableSubscription && !subscription.lastDownload) Synchronizer.execute(subscription); } 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 "subscriptions.listen": getListenerFilters(sender.page).subscription = message.filter; addFilterListeners("subscription", message.filter); break; case "subscriptions.remove": var subscription = Subscription.fromURL(message.url); if (subscription.url in FilterStorage.knownSubscriptions) FilterStorage.removeSubscription(subscription); break; case "subscriptions.toggle": var subscription = Subscription.fromURL(message.url); if (subscription.url in FilterStorage.knownSubscriptions) { if (subscription.disabled || message.keepInstalled) subscription.disabled = !subscription.disabled; else 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.update": var subscriptions = message.url ? [Subscription.fromURL(message.url)] : FilterStorage.subscriptions; for (var i = 0; i < subscriptions.length; i++) { var subscription = subscriptions[i]; if (subscription instanceof DownloadableSubscription) Synchronizer.execute(subscription, true); } break; } });