| Index: assets/js/FilterListener.jsm |
| =================================================================== |
| new file mode 100755 |
| --- /dev/null |
| +++ b/assets/js/FilterListener.jsm |
| @@ -0,0 +1,268 @@ |
| +/* |
| + * This Source Code is subject to the terms of the Mozilla Public License |
| + * version 2.0 (the "License"). You can obtain a copy of the License at |
| + * http://mozilla.org/MPL/2.0/. |
| + */ |
| + |
| +// |
| +// This file has been generated automatically from Adblock Plus source code |
| +// |
| + |
| +(function (_patchFunc2) { |
| + const cacheVersion = 3; |
| + var batchMode = false; |
| + var isDirty = 0; |
| + var FilterListener = { |
| + startup: function () { |
| + FilterNotifier.addListener(function (action, item, newValue, oldValue) { |
| + if (/^filter\.(.*)/.test(action)) |
| + onFilterChange(RegExp["$1"], item, newValue, oldValue); |
| + else |
| + if (/^subscription\.(.*)/.test(action)) |
| + onSubscriptionChange(RegExp["$1"], item, newValue, oldValue); |
| + else |
| + onGenericChange(action, item); |
| + } |
| + ); |
| + ElemHide.init(); |
| + var initialized = false; |
| + var cacheFile = Utils.resolveFilePath(Prefs.data_directory); |
| + cacheFile.append("cache.js"); |
| + if (cacheFile.exists()) { |
| + try { |
| + var stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); |
| + stream.init(cacheFile, 1, 292, 0); |
| + var json = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON); |
| + var cache = json.decodeFromStream(stream, "UTF-8"); |
| + stream.close(); |
| + if (cache.version == cacheVersion && cache.patternsTimestamp == FilterStorage.sourceFile.clone().lastModifiedTime) { |
| + defaultMatcher.fromCache(cache); |
| + ElemHide.fromCache(cache); |
| + var loadDone = false; |
| + function trapProperty(obj, prop) { |
| + var origValue = obj[prop]; |
| + delete obj[prop]; |
| + obj.__defineGetter__(prop, function () { |
| + delete obj[prop]; |
| + obj[prop] = origValue; |
| + if (!loadDone) { |
| + loadDone = true; |
| + FilterStorage.loadFromDisk(null, true); |
| + } |
| + return obj[prop]; |
| + } |
| + ); |
| + obj.__defineSetter__(prop, function (value) { |
| + delete obj[prop]; |
| + return obj[prop] = value; |
| + } |
| + ); |
| + } |
| + for (var _loopIndex0 = 0; |
| + _loopIndex0 < ["fileProperties", "subscriptions", "knownSubscriptions", "addSubscription", "removeSubscription", "updateSubscriptionFilters", "addFilter", "removeFilter", "increaseHitCount", "resetHitCounts"].length; ++ _loopIndex0) { |
| + var prop = ["fileProperties", "subscriptions", "knownSubscriptions", "addSubscription", "removeSubscription", "updateSubscriptionFilters", "addFilter", "removeFilter", "increaseHitCount", "resetHitCounts"][_loopIndex0]; |
| + trapProperty(FilterStorage, prop); |
| + } |
| + trapProperty(Filter, "fromText"); |
| + trapProperty(Filter, "knownFilters"); |
| + trapProperty(Subscription, "fromURL"); |
| + trapProperty(Subscription, "knownSubscriptions"); |
| + initialized = true; |
| + ElemHide.apply(); |
| + } |
| + } |
| + catch (e){ |
| + Cu.reportError(e); |
| + } |
| + } |
| + if (!initialized) |
| + FilterStorage.loadFromDisk(); |
| + Utils.observerService.addObserver(FilterListenerPrivate, "browser:purge-session-history", true); |
| + } |
| + , |
| + shutdown: function () { |
| + if (isDirty > 0) |
| + FilterStorage.saveToDisk(); |
| + } |
| + , |
| + get batchMode() { |
| + return batchMode; |
| + } |
| + , |
| + set batchMode(value) { |
| + batchMode = value; |
| + flushElemHide(); |
| + } |
| + , |
| + setDirty: function (factor) { |
| + if (factor == 0 && isDirty > 0) |
| + isDirty = 1; |
| + else |
| + isDirty += factor; |
| + if (isDirty >= 1 && !filtersFlushScheduled) { |
| + Utils.runAsync(flushFiltersInternal); |
| + filtersFlushScheduled = true; |
| + } |
| + } |
| + |
| + }; |
| + var FilterListenerPrivate = { |
| + observe: function (subject, topic, data) { |
| + if (topic == "browser:purge-session-history" && Prefs.clearStatsOnHistoryPurge) { |
| + FilterStorage.resetHitCounts(); |
| + FilterListener.setDirty(0); |
| + Prefs.recentReports = "[]"; |
| + } |
| + } |
| + , |
| + QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver]) |
| + }; |
| + var elemhideFlushScheduled = false; |
| + function flushElemHide() { |
| + if (elemhideFlushScheduled) |
| + return ; |
| + Utils.runAsync(flushElemHideInternal); |
| + elemhideFlushScheduled = true; |
| + } |
| + function flushElemHideInternal() { |
| + elemhideFlushScheduled = false; |
| + if (!batchMode && ElemHide.isDirty) |
| + ElemHide.apply(); |
| + } |
| + var filtersFlushScheduled = false; |
| + function flushFiltersInternal() { |
| + filtersFlushScheduled = false; |
| + FilterStorage.saveToDisk(); |
| + } |
| + function addFilter(filter) { |
| + if (!(filter instanceof ActiveFilter) || filter.disabled) |
| + return ; |
| + var hasEnabled = false; |
| + for (var i = 0; |
| + i < filter.subscriptions.length; i++) |
| + if (!filter.subscriptions[i].disabled) |
| + hasEnabled = true; |
| + if (!hasEnabled) |
| + return ; |
| + if (filter instanceof RegExpFilter) |
| + defaultMatcher.add(filter); |
| + else |
| + if (filter instanceof ElemHideFilter) |
| + ElemHide.add(filter); |
| + } |
| + function removeFilter(filter) { |
| + if (!(filter instanceof ActiveFilter)) |
| + return ; |
| + if (!filter.disabled) { |
| + var hasEnabled = false; |
| + for (var i = 0; |
| + i < filter.subscriptions.length; i++) |
| + if (!filter.subscriptions[i].disabled) |
| + hasEnabled = true; |
| + if (hasEnabled) |
| + return ; |
| + } |
| + if (filter instanceof RegExpFilter) |
| + defaultMatcher.remove(filter); |
| + else |
| + if (filter instanceof ElemHideFilter) |
| + ElemHide.remove(filter); |
| + } |
| + function onSubscriptionChange(action, subscription, newValue, oldValue) { |
| + if (action == "homepage" || action == "downloadStatus" || action == "lastDownload") |
| + FilterListener.setDirty(0.2); |
| + else |
| + FilterListener.setDirty(1); |
| + if (action != "added" && action != "removed" && action != "disabled" && action != "updated") |
| + return ; |
| + if (action != "removed" && !(subscription.url in FilterStorage.knownSubscriptions)) { |
| + return ; |
| + } |
| + if ((action == "added" || action == "removed" || action == "updated") && subscription.disabled) { |
| + return ; |
| + } |
| + if (action == "added" || action == "removed" || action == "disabled") { |
| + var method = (action == "added" || (action == "disabled" && newValue == false) ? addFilter : removeFilter); |
| + if (subscription.filters) |
| + subscription.filters.forEach(method); |
| + } |
| + else |
| + if (action == "updated") { |
| + subscription.oldFilters.forEach(removeFilter); |
| + subscription.filters.forEach(addFilter); |
| + } |
| + flushElemHide(); |
| + } |
| + function onFilterChange(action, filter, newValue, oldValue) { |
| + if (action == "hitCount" || action == "lastHit") |
| + FilterListener.setDirty(0.0001); |
| + else |
| + if (action == "disabled" || action == "moved") |
| + FilterListener.setDirty(0.2); |
| + else |
| + FilterListener.setDirty(1); |
| + if (action != "added" && action != "removed" && action != "disabled") |
| + return ; |
| + if ((action == "added" || action == "removed") && filter.disabled) { |
| + return ; |
| + } |
| + if (action == "added" || (action == "disabled" && newValue == false)) |
| + addFilter(filter); |
| + else |
| + removeFilter(filter); |
| + flushElemHide(); |
| + } |
| + function onGenericChange(action) { |
| + if (action == "load") { |
| + isDirty = 0; |
| + defaultMatcher.clear(); |
| + ElemHide.clear(); |
| + for (var _loopIndex1 = 0; |
| + _loopIndex1 < FilterStorage.subscriptions.length; ++ _loopIndex1) { |
| + var subscription = FilterStorage.subscriptions[_loopIndex1]; |
| + if (!subscription.disabled) |
| + subscription.filters.forEach(addFilter); |
| + } |
| + flushElemHide(); |
| + } |
| + else |
| + if (action == "save") { |
| + isDirty = 0; |
| + var cache = { |
| + version: cacheVersion, |
| + patternsTimestamp: FilterStorage.sourceFile.clone().lastModifiedTime |
| + }; |
| + defaultMatcher.toCache(cache); |
| + ElemHide.toCache(cache); |
| + var cacheFile = Utils.resolveFilePath(Prefs.data_directory); |
| + cacheFile.append("cache.js"); |
| + try { |
| + cacheFile.parent.create(Ci.nsIFile.DIRECTORY_TYPE, 493); |
| + } |
| + catch (e){} |
| + try { |
| + var fileStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); |
| + fileStream.init(cacheFile, 2 | 8 | 32, 420, 0); |
| + var json = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON); |
| + if (Utils.versionComparator.compare(Utils.platformVersion, "5.0") >= 0) { |
| + json.encodeToStream(fileStream, "UTF-8", false, cache); |
| + fileStream.close(); |
| + } |
| + else { |
| + var stream = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream); |
| + stream.init(fileStream, "UTF-8", 16384, Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER); |
| + stream.writeString(json.encode(cache)); |
| + stream.close(); |
| + } |
| + } |
| + catch (e){ |
| + delete FilterStorage.fileProperties.cacheTimestamp; |
| + Cu.reportError(e); |
| + } |
| + } |
| + } |
| + if (typeof _patchFunc2 != "undefined") |
| + eval("(" + _patchFunc2.toString() + ")()"); |
| + window.FilterListener = FilterListener; |
| +} |
| +)(window.FilterListenerPatch); |