Index: lib/adblockplus.js |
=================================================================== |
deleted file mode 100644 |
--- a/lib/adblockplus.js |
+++ /dev/null |
@@ -1,3457 +0,0 @@ |
-/* |
- * This file is part of the Adblock Plus extension, |
- * Copyright (C) 2006-2012 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/>. |
- */ |
- |
-// |
-// This file has been generated automatically from Adblock Plus for Firefox |
-// source code. DO NOT MODIFY, change the original source code instead. |
-// |
-// Relevant repositories: |
-// * https://hg.adblockplus.org/adblockplus/ |
-// * https://hg.adblockplus.org/jshydra/ |
-// |
- |
-require.scopes["filterNotifier"] = (function() |
-{ |
- var exports = {}; |
- var listeners = []; |
- var FilterNotifier = exports.FilterNotifier = |
- { |
- addListener: function(listener) |
- { |
- if (listeners.indexOf(listener) >= 0) |
- { |
- return; |
- } |
- listeners.push(listener); |
- }, |
- removeListener: function(listener) |
- { |
- var index = listeners.indexOf(listener); |
- if (index >= 0) |
- { |
- listeners.splice(index, 1); |
- } |
- }, |
- triggerListeners: function(action, item, param1, param2, param3) |
- { |
- for (var _loopIndex0 = 0; _loopIndex0 < listeners.length; ++_loopIndex0) |
- { |
- var listener = listeners[_loopIndex0]; |
- listener(action, item, param1, param2, param3); |
- } |
- } |
- }; |
- return exports; |
-})(); |
-require.scopes["filterClasses"] = (function() |
-{ |
- var exports = {}; |
- var FilterNotifier = require("filterNotifier").FilterNotifier; |
- |
- function Filter(text) |
- { |
- this.text = text; |
- this.subscriptions = []; |
- } |
- exports.Filter = Filter; |
- Filter.prototype = |
- { |
- text: null, |
- subscriptions: null, |
- serialize: function(buffer) |
- { |
- buffer.push("[Filter]"); |
- buffer.push("text=" + this.text); |
- }, |
- toString: function() |
- { |
- return this.text; |
- } |
- }; |
- Filter.knownFilters = |
- { |
- __proto__: null |
- }; |
- Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(\@)?(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\))*)|#([^{}]+))$/; |
- Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/; |
- Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)$/; |
- Filter.fromText = function(text) |
- { |
- if (text in Filter.knownFilters) |
- { |
- return Filter.knownFilters[text]; |
- } |
- var ret; |
- var match = text.indexOf("#") >= 0 ? Filter.elemhideRegExp.exec(text) : null; |
- if (match) |
- { |
- ret = ElemHideBase.fromText(text, match[1], match[2], match[3], match[4], match[5]); |
- } |
- else if (text[0] == "!") |
- { |
- ret = new CommentFilter(text); |
- } |
- else |
- { |
- ret = RegExpFilter.fromText(text); |
- } |
- Filter.knownFilters[ret.text] = ret; |
- return ret; |
- }; |
- Filter.fromObject = function(obj) |
- { |
- var ret = Filter.fromText(obj.text); |
- if (ret instanceof ActiveFilter) |
- { |
- if ("disabled" in obj) |
- { |
- ret._disabled = obj.disabled == "true"; |
- } |
- if ("hitCount" in obj) |
- { |
- ret._hitCount = parseInt(obj.hitCount) || 0; |
- } |
- if ("lastHit" in obj) |
- { |
- ret._lastHit = parseInt(obj.lastHit) || 0; |
- } |
- } |
- return ret; |
- }; |
- Filter.normalize = function(text) |
- { |
- if (!text) |
- { |
- return text; |
- } |
- text = text.replace(/[^\S ]/g, ""); |
- if (/^\s*!/.test(text)) |
- { |
- return text.replace(/^\s+/, "").replace(/\s+$/, ""); |
- } |
- else if (Filter.elemhideRegExp.test(text)) |
- { |
- var _tempVar1 = /^(.*?)(#\@?#?)(.*)$/.exec(text); |
- var domain = _tempVar1[1]; |
- var separator = _tempVar1[2]; |
- var selector = _tempVar1[3]; |
- return domain.replace(/\s/g, "") + separator + selector.replace(/^\s+/, "").replace(/\s+$/, ""); |
- } |
- else |
- { |
- return text.replace(/\s/g, ""); |
- } |
- }; |
- |
- function InvalidFilter(text, reason) |
- { |
- Filter.call(this, text); |
- this.reason = reason; |
- } |
- exports.InvalidFilter = InvalidFilter; |
- InvalidFilter.prototype = |
- { |
- __proto__: Filter.prototype, |
- reason: null, |
- serialize: function(buffer){} |
- }; |
- |
- function CommentFilter(text) |
- { |
- Filter.call(this, text); |
- } |
- exports.CommentFilter = CommentFilter; |
- CommentFilter.prototype = |
- { |
- __proto__: Filter.prototype, |
- serialize: function(buffer){} |
- }; |
- |
- function ActiveFilter(text, domains) |
- { |
- Filter.call(this, text); |
- this.domainSource = domains; |
- } |
- exports.ActiveFilter = ActiveFilter; |
- ActiveFilter.prototype = |
- { |
- __proto__: Filter.prototype, |
- _disabled: false, |
- _hitCount: 0, |
- _lastHit: 0, |
- get disabled() |
- { |
- return this._disabled; |
- }, |
- set disabled(value) |
- { |
- if (value != this._disabled) |
- { |
- var oldValue = this._disabled; |
- this._disabled = value; |
- FilterNotifier.triggerListeners("filter.disabled", this, value, oldValue); |
- } |
- return this._disabled; |
- }, |
- get hitCount() |
- { |
- return this._hitCount; |
- }, |
- set hitCount(value) |
- { |
- if (value != this._hitCount) |
- { |
- var oldValue = this._hitCount; |
- this._hitCount = value; |
- FilterNotifier.triggerListeners("filter.hitCount", this, value, oldValue); |
- } |
- return this._hitCount; |
- }, |
- get lastHit() |
- { |
- return this._lastHit; |
- }, |
- set lastHit(value) |
- { |
- if (value != this._lastHit) |
- { |
- var oldValue = this._lastHit; |
- this._lastHit = value; |
- FilterNotifier.triggerListeners("filter.lastHit", this, value, oldValue); |
- } |
- return this._lastHit; |
- }, |
- domainSource: null, |
- domainSeparator: null, |
- ignoreTrailingDot: true, |
- get domains() |
- { |
- var domains = null; |
- if (this.domainSource) |
- { |
- var list = this.domainSource.split(this.domainSeparator); |
- if (list.length == 1 && list[0][0] != "~") |
- { |
- domains = |
- { |
- __proto__: null, |
- "": false |
- }; |
- if (this.ignoreTrailingDot) |
- { |
- list[0] = list[0].replace(/\.+$/, ""); |
- } |
- domains[list[0]] = true; |
- } |
- else |
- { |
- var hasIncludes = false; |
- for (var i = 0; i < list.length; i++) |
- { |
- var domain = list[i]; |
- if (this.ignoreTrailingDot) |
- { |
- domain = domain.replace(/\.+$/, ""); |
- } |
- if (domain == "") |
- { |
- continue; |
- } |
- var include; |
- if (domain[0] == "~") |
- { |
- include = false; |
- domain = domain.substr(1); |
- } |
- else |
- { |
- include = true; |
- hasIncludes = true; |
- } |
- if (!domains) |
- { |
- domains = |
- { |
- __proto__: null |
- }; |
- } |
- domains[domain] = include; |
- } |
- domains[""] = !hasIncludes; |
- } |
- delete this.domainSource; |
- } |
- this.__defineGetter__("domains", function() |
- { |
- return domains; |
- }); |
- return this.domains; |
- }, |
- isActiveOnDomain: function(docDomain) |
- { |
- if (!this.domains) |
- { |
- return true; |
- } |
- if (!docDomain) |
- { |
- return this.domains[""]; |
- } |
- if (this.ignoreTrailingDot) |
- { |
- docDomain = docDomain.replace(/\.+$/, ""); |
- } |
- docDomain = docDomain.toUpperCase(); |
- while (true) |
- { |
- if (docDomain in this.domains) |
- { |
- return this.domains[docDomain]; |
- } |
- var nextDot = docDomain.indexOf("."); |
- if (nextDot < 0) |
- { |
- break; |
- } |
- docDomain = docDomain.substr(nextDot + 1); |
- } |
- return this.domains[""]; |
- }, |
- isActiveOnlyOnDomain: function(docDomain) |
- { |
- if (!docDomain || !this.domains || this.domains[""]) |
- { |
- return false; |
- } |
- if (this.ignoreTrailingDot) |
- { |
- docDomain = docDomain.replace(/\.+$/, ""); |
- } |
- docDomain = docDomain.toUpperCase(); |
- for (var domain in this.domains) |
- { |
- if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.length - 1)) |
- { |
- return false; |
- } |
- } |
- return true; |
- }, |
- serialize: function(buffer) |
- { |
- if (this._disabled || this._hitCount || this._lastHit) |
- { |
- Filter.prototype.serialize.call(this, buffer); |
- if (this._disabled) |
- { |
- buffer.push("disabled=true"); |
- } |
- if (this._hitCount) |
- { |
- buffer.push("hitCount=" + this._hitCount); |
- } |
- if (this._lastHit) |
- { |
- buffer.push("lastHit=" + this._lastHit); |
- } |
- } |
- } |
- }; |
- |
- function RegExpFilter(text, regexpSource, contentType, matchCase, domains, thirdParty) |
- { |
- ActiveFilter.call(this, text, domains); |
- if (contentType != null) |
- { |
- this.contentType = contentType; |
- } |
- if (matchCase) |
- { |
- this.matchCase = matchCase; |
- } |
- if (thirdParty != null) |
- { |
- this.thirdParty = thirdParty; |
- } |
- if (regexpSource.length >= 2 && regexpSource[0] == "/" && regexpSource[regexpSource.length - 1] == "/") |
- { |
- var regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? "" : "i"); |
- this.__defineGetter__("regexp", function() |
- { |
- return regexp; |
- }); |
- } |
- else |
- { |
- this.regexpSource = regexpSource; |
- } |
- } |
- exports.RegExpFilter = RegExpFilter; |
- RegExpFilter.prototype = |
- { |
- __proto__: ActiveFilter.prototype, |
- length: 1, |
- domainSeparator: "|", |
- regexpSource: null, |
- get regexp() |
- { |
- var source = this.regexpSource.replace(/\*+/g, "*"); |
- if (source[0] == "*") |
- { |
- source = source.substr(1); |
- } |
- var pos = source.length - 1; |
- if (pos >= 0 && source[pos] == "*") |
- { |
- source = source.substr(0, pos); |
- } |
- source = source.replace(/\^\|$/, "^").replace(/\W/g, "\\$&").replace(/\\\*/g, ".*").replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x80]|$)").replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^.\\/]+\\.)*?").replace(/^\\\|/, "^").replace(/\\\|$/, "$"); |
- var regexp = new RegExp(source, this.matchCase ? "" : "i"); |
- delete this.regexpSource; |
- this.__defineGetter__("regexp", function() |
- { |
- return regexp; |
- }); |
- return this.regexp; |
- }, |
- contentType: 2147483647, |
- matchCase: false, |
- thirdParty: null, |
- matches: function(location, contentType, docDomain, thirdParty) |
- { |
- if (this.regexp.test(location) && (RegExpFilter.typeMap[contentType] & this.contentType) != 0 && (this.thirdParty == null || this.thirdParty == thirdParty) && this.isActiveOnDomain(docDomain)) |
- { |
- return true; |
- } |
- return false; |
- } |
- }; |
- RegExpFilter.prototype.__defineGetter__("0", function() |
- { |
- return this; |
- }); |
- RegExpFilter.fromText = function(text) |
- { |
- var blocking = true; |
- var origText = text; |
- if (text.indexOf("@@") == 0) |
- { |
- blocking = false; |
- text = text.substr(2); |
- } |
- var contentType = null; |
- var matchCase = null; |
- var domains = null; |
- var siteKeys = null; |
- var thirdParty = null; |
- var collapse = null; |
- var options; |
- var match = text.indexOf("$") >= 0 ? Filter.optionsRegExp.exec(text) : null; |
- if (match) |
- { |
- options = match[1].toUpperCase().split(","); |
- text = match.input.substr(0, match.index); |
- for (var _loopIndex2 = 0; _loopIndex2 < options.length; ++_loopIndex2) |
- { |
- var option = options[_loopIndex2]; |
- var value = null; |
- var separatorIndex = option.indexOf("="); |
- if (separatorIndex >= 0) |
- { |
- value = option.substr(separatorIndex + 1); |
- option = option.substr(0, separatorIndex); |
- } |
- option = option.replace(/-/, "_"); |
- if (option in RegExpFilter.typeMap) |
- { |
- if (contentType == null) |
- { |
- contentType = 0; |
- } |
- contentType |= RegExpFilter.typeMap[option]; |
- } |
- else if (option[0] == "~" && option.substr(1) in RegExpFilter.typeMap) |
- { |
- if (contentType == null) |
- { |
- contentType = RegExpFilter.prototype.contentType; |
- } |
- contentType &= ~RegExpFilter.typeMap[option.substr(1)]; |
- } |
- else if (option == "MATCH_CASE") |
- { |
- matchCase = true; |
- } |
- else if (option == "DOMAIN" && typeof value != "undefined") |
- { |
- domains = value; |
- } |
- else if (option == "THIRD_PARTY") |
- { |
- thirdParty = true; |
- } |
- else if (option == "~THIRD_PARTY") |
- { |
- thirdParty = false; |
- } |
- else if (option == "COLLAPSE") |
- { |
- collapse = true; |
- } |
- else if (option == "~COLLAPSE") |
- { |
- collapse = false; |
- } |
- else if (option == "SITEKEY" && typeof value != "undefined") |
- { |
- siteKeys = value.split(/\|/); |
- } |
- } |
- } |
- if (!blocking && (contentType == null || contentType & RegExpFilter.typeMap.DOCUMENT) && (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.test(text)) |
- { |
- if (contentType == null) |
- { |
- contentType = RegExpFilter.prototype.contentType; |
- } |
- contentType &= ~RegExpFilter.typeMap.DOCUMENT; |
- } |
- if (!blocking && siteKeys) |
- { |
- contentType = RegExpFilter.typeMap.DOCUMENT; |
- } |
- try |
- { |
- if (blocking) |
- { |
- return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, collapse); |
- } |
- else |
- { |
- return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, siteKeys); |
- } |
- } |
- catch (e) |
- { |
- return new InvalidFilter(text, e); |
- } |
- }; |
- RegExpFilter.typeMap = |
- { |
- OTHER: 1, |
- SCRIPT: 2, |
- IMAGE: 4, |
- STYLESHEET: 8, |
- OBJECT: 16, |
- SUBDOCUMENT: 32, |
- DOCUMENT: 64, |
- XBL: 1, |
- PING: 1, |
- XMLHTTPREQUEST: 2048, |
- OBJECT_SUBREQUEST: 4096, |
- DTD: 1, |
- MEDIA: 16384, |
- FONT: 32768, |
- BACKGROUND: 4, |
- POPUP: 268435456, |
- DONOTTRACK: 536870912, |
- ELEMHIDE: 1073741824 |
- }; |
- RegExpFilter.prototype.contentType &= ~ (RegExpFilter.typeMap.ELEMHIDE | RegExpFilter.typeMap.DONOTTRACK | RegExpFilter.typeMap.POPUP); |
- |
- function BlockingFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, collapse) |
- { |
- RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty); |
- this.collapse = collapse; |
- } |
- exports.BlockingFilter = BlockingFilter; |
- BlockingFilter.prototype = |
- { |
- __proto__: RegExpFilter.prototype, |
- collapse: null |
- }; |
- |
- function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, siteKeys) |
- { |
- RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty); |
- if (siteKeys != null) |
- { |
- this.siteKeys = siteKeys; |
- } |
- } |
- exports.WhitelistFilter = WhitelistFilter; |
- WhitelistFilter.prototype = |
- { |
- __proto__: RegExpFilter.prototype, |
- siteKeys: null |
- }; |
- |
- function ElemHideBase(text, domains, selector) |
- { |
- ActiveFilter.call(this, text, domains ? domains.toUpperCase() : null); |
- if (domains) |
- { |
- this.selectorDomain = domains.replace(/,~[^,]+/g, "").replace(/^~[^,]+,?/, "").toLowerCase(); |
- } |
- this.selector = selector; |
- } |
- exports.ElemHideBase = ElemHideBase; |
- ElemHideBase.prototype = |
- { |
- __proto__: ActiveFilter.prototype, |
- domainSeparator: ",", |
- ignoreTrailingDot: false, |
- selectorDomain: null, |
- selector: null |
- }; |
- ElemHideBase.fromText = function(text, domain, isException, tagName, attrRules, selector) |
- { |
- if (!selector) |
- { |
- if (tagName == "*") |
- { |
- tagName = ""; |
- } |
- var id = null; |
- var additional = ""; |
- if (attrRules) |
- { |
- attrRules = attrRules.match(/\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\)/g); |
- for (var _loopIndex3 = 0; _loopIndex3 < attrRules.length; ++_loopIndex3) |
- { |
- var rule = attrRules[_loopIndex3]; |
- rule = rule.substr(1, rule.length - 2); |
- var separatorPos = rule.indexOf("="); |
- if (separatorPos > 0) |
- { |
- rule = rule.replace(/=/, "=\"") + "\""; |
- additional += "[" + rule + "]"; |
- } |
- else |
- { |
- if (id) |
- { |
- var Utils = require("utils").Utils; |
- return new InvalidFilter(text, Utils.getString("filter_elemhide_duplicate_id")); |
- } |
- else |
- { |
- id = rule; |
- } |
- } |
- } |
- } |
- if (id) |
- { |
- selector = tagName + "." + id + additional + "," + tagName + "#" + id + additional; |
- } |
- else if (tagName || additional) |
- { |
- selector = tagName + additional; |
- } |
- else |
- { |
- var Utils = require("utils").Utils; |
- return new InvalidFilter(text, Utils.getString("filter_elemhide_nocriteria")); |
- } |
- } |
- if (isException) |
- { |
- return new ElemHideException(text, domain, selector); |
- } |
- else |
- { |
- return new ElemHideFilter(text, domain, selector); |
- } |
- }; |
- |
- function ElemHideFilter(text, domains, selector) |
- { |
- ElemHideBase.call(this, text, domains, selector); |
- } |
- exports.ElemHideFilter = ElemHideFilter; |
- ElemHideFilter.prototype = |
- { |
- __proto__: ElemHideBase.prototype |
- }; |
- |
- function ElemHideException(text, domains, selector) |
- { |
- ElemHideBase.call(this, text, domains, selector); |
- } |
- exports.ElemHideException = ElemHideException; |
- ElemHideException.prototype = |
- { |
- __proto__: ElemHideBase.prototype |
- }; |
- return exports; |
-})(); |
-require.scopes["subscriptionClasses"] = (function() |
-{ |
- var exports = {}; |
- var _tempVar4 = require("filterClasses"); |
- var ActiveFilter = _tempVar4.ActiveFilter; |
- var BlockingFilter = _tempVar4.BlockingFilter; |
- var WhitelistFilter = _tempVar4.WhitelistFilter; |
- var ElemHideBase = _tempVar4.ElemHideBase; |
- var FilterNotifier = require("filterNotifier").FilterNotifier; |
- |
- function Subscription(url, title) |
- { |
- this.url = url; |
- this.filters = []; |
- if (title) |
- { |
- this._title = title; |
- } |
- else |
- { |
- var Utils = require("utils").Utils; |
- this._title = Utils.getString("newGroup_title"); |
- } |
- Subscription.knownSubscriptions[url] = this; |
- } |
- exports.Subscription = Subscription; |
- Subscription.prototype = |
- { |
- url: null, |
- filters: null, |
- _title: null, |
- _fixedTitle: false, |
- _disabled: false, |
- get title() |
- { |
- return this._title; |
- }, |
- set title(value) |
- { |
- if (value != this._title) |
- { |
- var oldValue = this._title; |
- this._title = value; |
- FilterNotifier.triggerListeners("subscription.title", this, value, oldValue); |
- } |
- return this._title; |
- }, |
- get fixedTitle() |
- { |
- return this._fixedTitle; |
- }, |
- set fixedTitle(value) |
- { |
- if (value != this._fixedTitle) |
- { |
- var oldValue = this._fixedTitle; |
- this._fixedTitle = value; |
- FilterNotifier.triggerListeners("subscription.fixedTitle", this, value, oldValue); |
- } |
- return this._fixedTitle; |
- }, |
- get disabled() |
- { |
- return this._disabled; |
- }, |
- set disabled(value) |
- { |
- if (value != this._disabled) |
- { |
- var oldValue = this._disabled; |
- this._disabled = value; |
- FilterNotifier.triggerListeners("subscription.disabled", this, value, oldValue); |
- } |
- return this._disabled; |
- }, |
- serialize: function(buffer) |
- { |
- buffer.push("[Subscription]"); |
- buffer.push("url=" + this.url); |
- buffer.push("title=" + this._title); |
- if (this._fixedTitle) |
- { |
- buffer.push("fixedTitle=true"); |
- } |
- if (this._disabled) |
- { |
- buffer.push("disabled=true"); |
- } |
- }, |
- serializeFilters: function(buffer) |
- { |
- for (var _loopIndex5 = 0; _loopIndex5 < this.filters.length; ++_loopIndex5) |
- { |
- var filter = this.filters[_loopIndex5]; |
- buffer.push(filter.text.replace(/\[/g, "\\[")); |
- } |
- }, |
- toString: function() |
- { |
- var buffer = []; |
- this.serialize(buffer); |
- return buffer.join("\n"); |
- } |
- }; |
- Subscription.knownSubscriptions = |
- { |
- __proto__: null |
- }; |
- Subscription.fromURL = function(url) |
- { |
- if (url in Subscription.knownSubscriptions) |
- { |
- return Subscription.knownSubscriptions[url]; |
- } |
- try |
- { |
- url = Services.io.newURI(url, null, null).spec; |
- return new DownloadableSubscription(url, null); |
- } |
- catch (e) |
- { |
- return new SpecialSubscription(url); |
- } |
- }; |
- Subscription.fromObject = function(obj) |
- { |
- var result; |
- try |
- { |
- obj.url = Services.io.newURI(obj.url, null, null).spec; |
- result = new DownloadableSubscription(obj.url, obj.title); |
- if ("nextURL" in obj) |
- { |
- result.nextURL = obj.nextURL; |
- } |
- if ("downloadStatus" in obj) |
- { |
- result._downloadStatus = obj.downloadStatus; |
- } |
- if ("lastModified" in obj) |
- { |
- result.lastModified = obj.lastModified; |
- } |
- if ("lastSuccess" in obj) |
- { |
- result.lastSuccess = parseInt(obj.lastSuccess) || 0; |
- } |
- if ("lastCheck" in obj) |
- { |
- result._lastCheck = parseInt(obj.lastCheck) || 0; |
- } |
- if ("expires" in obj) |
- { |
- result.expires = parseInt(obj.expires) || 0; |
- } |
- if ("softExpiration" in obj) |
- { |
- result.softExpiration = parseInt(obj.softExpiration) || 0; |
- } |
- if ("errors" in obj) |
- { |
- result._errors = parseInt(obj.errors) || 0; |
- } |
- if ("requiredVersion" in obj) |
- { |
- var addonVersion = require("info").addonVersion; |
- result.requiredVersion = obj.requiredVersion; |
- if (Services.vc.compare(result.requiredVersion, addonVersion) > 0) |
- { |
- result.upgradeRequired = true; |
- } |
- } |
- if ("alternativeLocations" in obj) |
- { |
- result.alternativeLocations = obj.alternativeLocations; |
- } |
- if ("homepage" in obj) |
- { |
- result._homepage = obj.homepage; |
- } |
- if ("lastDownload" in obj) |
- { |
- result._lastDownload = parseInt(obj.lastDownload) || 0; |
- } |
- } |
- catch (e) |
- { |
- if (!("title" in obj)) |
- { |
- if (obj.url == "~wl~") |
- { |
- obj.defaults = "whitelist"; |
- } |
- else if (obj.url == "~fl~") |
- { |
- obj.defaults = "blocking"; |
- } |
- else if (obj.url == "~eh~") |
- { |
- obj.defaults = "elemhide"; |
- } |
- if ("defaults" in obj) |
- { |
- var Utils = require("utils").Utils; |
- obj.title = Utils.getString(obj.defaults + "Group_title"); |
- } |
- } |
- result = new SpecialSubscription(obj.url, obj.title); |
- if ("defaults" in obj) |
- { |
- result.defaults = obj.defaults.split(" "); |
- } |
- } |
- if ("fixedTitle" in obj) |
- { |
- result._fixedTitle = obj.fixedTitle == "true"; |
- } |
- if ("disabled" in obj) |
- { |
- result._disabled = obj.disabled == "true"; |
- } |
- return result; |
- }; |
- |
- function SpecialSubscription(url, title) |
- { |
- Subscription.call(this, url, title); |
- } |
- exports.SpecialSubscription = SpecialSubscription; |
- SpecialSubscription.prototype = |
- { |
- __proto__: Subscription.prototype, |
- defaults: null, |
- isDefaultFor: function(filter) |
- { |
- if (this.defaults && this.defaults.length) |
- { |
- for (var _loopIndex6 = 0; _loopIndex6 < this.defaults.length; ++_loopIndex6) |
- { |
- var type = this.defaults[_loopIndex6]; |
- if (filter instanceof SpecialSubscription.defaultsMap[type]) |
- { |
- return true; |
- } |
- if (!(filter instanceof ActiveFilter) && type == "blacklist") |
- { |
- return true; |
- } |
- } |
- } |
- return false; |
- }, |
- serialize: function(buffer) |
- { |
- Subscription.prototype.serialize.call(this, buffer); |
- if (this.defaults && this.defaults.length) |
- { |
- buffer.push("defaults=" + this.defaults.filter(function(type) |
- { |
- return type in SpecialSubscription.defaultsMap; |
- }).join(" ")); |
- } |
- if (this._lastDownload) |
- { |
- buffer.push("lastDownload=" + this._lastDownload); |
- } |
- } |
- }; |
- SpecialSubscription.defaultsMap = |
- { |
- __proto__: null, |
- "whitelist": WhitelistFilter, |
- "blocking": BlockingFilter, |
- "elemhide": ElemHideBase |
- }; |
- SpecialSubscription.create = function(title) |
- { |
- var url; |
- do |
- { |
- url = "~user~" + Math.round(Math.random() * 1000000); |
- } |
- while (url in Subscription.knownSubscriptions); |
- return new SpecialSubscription(url, title); |
- }; |
- SpecialSubscription.createForFilter = function(filter) |
- { |
- var subscription = SpecialSubscription.create(); |
- subscription.filters.push(filter); |
- for (var type in SpecialSubscription.defaultsMap) |
- { |
- if (filter instanceof SpecialSubscription.defaultsMap[type]) |
- { |
- subscription.defaults = [type]; |
- } |
- } |
- if (!subscription.defaults) |
- { |
- subscription.defaults = ["blocking"]; |
- } |
- var Utils = require("utils").Utils; |
- subscription.title = Utils.getString(subscription.defaults[0] + "Group_title"); |
- return subscription; |
- }; |
- |
- function RegularSubscription(url, title) |
- { |
- Subscription.call(this, url, title || url); |
- } |
- exports.RegularSubscription = RegularSubscription; |
- RegularSubscription.prototype = |
- { |
- __proto__: Subscription.prototype, |
- _homepage: null, |
- _lastDownload: 0, |
- get homepage() |
- { |
- return this._homepage; |
- }, |
- set homepage(value) |
- { |
- if (value != this._homepage) |
- { |
- var oldValue = this._homepage; |
- this._homepage = value; |
- FilterNotifier.triggerListeners("subscription.homepage", this, value, oldValue); |
- } |
- return this._homepage; |
- }, |
- get lastDownload() |
- { |
- return this._lastDownload; |
- }, |
- set lastDownload(value) |
- { |
- if (value != this._lastDownload) |
- { |
- var oldValue = this._lastDownload; |
- this._lastDownload = value; |
- FilterNotifier.triggerListeners("subscription.lastDownload", this, value, oldValue); |
- } |
- return this._lastDownload; |
- }, |
- serialize: function(buffer) |
- { |
- Subscription.prototype.serialize.call(this, buffer); |
- if (this._homepage) |
- { |
- buffer.push("homepage=" + this._homepage); |
- } |
- if (this._lastDownload) |
- { |
- buffer.push("lastDownload=" + this._lastDownload); |
- } |
- } |
- }; |
- |
- function ExternalSubscription(url, title) |
- { |
- RegularSubscription.call(this, url, title); |
- } |
- exports.ExternalSubscription = ExternalSubscription; |
- ExternalSubscription.prototype = |
- { |
- __proto__: RegularSubscription.prototype, |
- serialize: function(buffer) |
- { |
- throw new Error("Unexpected call, external subscriptions should not be serialized"); |
- } |
- }; |
- |
- function DownloadableSubscription(url, title) |
- { |
- RegularSubscription.call(this, url, title); |
- } |
- exports.DownloadableSubscription = DownloadableSubscription; |
- DownloadableSubscription.prototype = |
- { |
- __proto__: RegularSubscription.prototype, |
- _downloadStatus: null, |
- _lastCheck: 0, |
- _errors: 0, |
- nextURL: null, |
- get downloadStatus() |
- { |
- return this._downloadStatus; |
- }, |
- set downloadStatus(value) |
- { |
- var oldValue = this._downloadStatus; |
- this._downloadStatus = value; |
- FilterNotifier.triggerListeners("subscription.downloadStatus", this, value, oldValue); |
- return this._downloadStatus; |
- }, |
- lastModified: null, |
- lastSuccess: 0, |
- get lastCheck() |
- { |
- return this._lastCheck; |
- }, |
- set lastCheck(value) |
- { |
- if (value != this._lastCheck) |
- { |
- var oldValue = this._lastCheck; |
- this._lastCheck = value; |
- FilterNotifier.triggerListeners("subscription.lastCheck", this, value, oldValue); |
- } |
- return this._lastCheck; |
- }, |
- expires: 0, |
- softExpiration: 0, |
- get errors() |
- { |
- return this._errors; |
- }, |
- set errors(value) |
- { |
- if (value != this._errors) |
- { |
- var oldValue = this._errors; |
- this._errors = value; |
- FilterNotifier.triggerListeners("subscription.errors", this, value, oldValue); |
- } |
- return this._errors; |
- }, |
- requiredVersion: null, |
- upgradeRequired: false, |
- alternativeLocations: null, |
- serialize: function(buffer) |
- { |
- RegularSubscription.prototype.serialize.call(this, buffer); |
- if (this.nextURL) |
- { |
- buffer.push("nextURL=" + this.nextURL); |
- } |
- if (this.downloadStatus) |
- { |
- buffer.push("downloadStatus=" + this.downloadStatus); |
- } |
- if (this.lastModified) |
- { |
- buffer.push("lastModified=" + this.lastModified); |
- } |
- if (this.lastSuccess) |
- { |
- buffer.push("lastSuccess=" + this.lastSuccess); |
- } |
- if (this.lastCheck) |
- { |
- buffer.push("lastCheck=" + this.lastCheck); |
- } |
- if (this.expires) |
- { |
- buffer.push("expires=" + this.expires); |
- } |
- if (this.softExpiration) |
- { |
- buffer.push("softExpiration=" + this.softExpiration); |
- } |
- if (this.errors) |
- { |
- buffer.push("errors=" + this.errors); |
- } |
- if (this.requiredVersion) |
- { |
- buffer.push("requiredVersion=" + this.requiredVersion); |
- } |
- if (this.alternativeLocations) |
- { |
- buffer.push("alternativeLocations=" + this.alternativeLocations); |
- } |
- } |
- }; |
- return exports; |
-})(); |
-require.scopes["filterStorage"] = (function() |
-{ |
- var exports = {}; |
- var IO = require("io").IO; |
- var Prefs = require("prefs").Prefs; |
- var _tempVar7 = require("filterClasses"); |
- var Filter = _tempVar7.Filter; |
- var ActiveFilter = _tempVar7.ActiveFilter; |
- var _tempVar8 = require("subscriptionClasses"); |
- var Subscription = _tempVar8.Subscription; |
- var SpecialSubscription = _tempVar8.SpecialSubscription; |
- var ExternalSubscription = _tempVar8.ExternalSubscription; |
- var FilterNotifier = require("filterNotifier").FilterNotifier; |
- var formatVersion = 4; |
- var FilterStorage = exports.FilterStorage = |
- { |
- get formatVersion() |
- { |
- return formatVersion; |
- }, |
- get sourceFile() |
- { |
- var file = null; |
- if (Prefs.patternsfile) |
- { |
- file = IO.resolveFilePath(Prefs.patternsfile); |
- } |
- if (!file) |
- { |
- file = IO.resolveFilePath(Prefs.data_directory); |
- if (file) |
- { |
- file.append("patterns.ini"); |
- } |
- } |
- if (!file) |
- { |
- try |
- { |
- file = IO.resolveFilePath(Services.prefs.getDefaultBranch("extensions.adblockplus.").getCharPref("data_directory")); |
- if (file) |
- { |
- file.append("patterns.ini"); |
- } |
- } |
- catch (e){} |
- } |
- if (!file) |
- { |
- Cu.reportError("Adblock Plus: Failed to resolve filter file location from extensions.adblockplus.patternsfile preference"); |
- } |
- this.__defineGetter__("sourceFile", function() |
- { |
- return file; |
- }); |
- return this.sourceFile; |
- }, |
- fileProperties: |
- { |
- __proto__: null |
- }, |
- subscriptions: [], |
- knownSubscriptions: |
- { |
- __proto__: null |
- }, |
- getGroupForFilter: function(filter) |
- { |
- var generalSubscription = null; |
- for (var _loopIndex9 = 0; _loopIndex9 < FilterStorage.subscriptions.length; ++_loopIndex9) |
- { |
- var subscription = FilterStorage.subscriptions[_loopIndex9]; |
- if (subscription instanceof SpecialSubscription && !subscription.disabled) |
- { |
- if (subscription.isDefaultFor(filter)) |
- { |
- return subscription; |
- } |
- if (!generalSubscription && (!subscription.defaults || !subscription.defaults.length)) |
- { |
- generalSubscription = subscription; |
- } |
- } |
- } |
- return generalSubscription; |
- }, |
- addSubscription: function(subscription, silent) |
- { |
- if (subscription.url in FilterStorage.knownSubscriptions) |
- { |
- return; |
- } |
- FilterStorage.subscriptions.push(subscription); |
- FilterStorage.knownSubscriptions[subscription.url] = subscription; |
- addSubscriptionFilters(subscription); |
- if (!silent) |
- { |
- FilterNotifier.triggerListeners("subscription.added", subscription); |
- } |
- }, |
- removeSubscription: function(subscription, silent) |
- { |
- for (var i = 0; i < FilterStorage.subscriptions.length; i++) |
- { |
- if (FilterStorage.subscriptions[i].url == subscription.url) |
- { |
- removeSubscriptionFilters(subscription); |
- FilterStorage.subscriptions.splice(i--, 1); |
- delete FilterStorage.knownSubscriptions[subscription.url]; |
- if (!silent) |
- { |
- FilterNotifier.triggerListeners("subscription.removed", subscription); |
- } |
- return; |
- } |
- } |
- }, |
- moveSubscription: function(subscription, insertBefore) |
- { |
- var currentPos = FilterStorage.subscriptions.indexOf(subscription); |
- if (currentPos < 0) |
- { |
- return; |
- } |
- var newPos = insertBefore ? FilterStorage.subscriptions.indexOf(insertBefore) : -1; |
- if (newPos < 0) |
- { |
- newPos = FilterStorage.subscriptions.length; |
- } |
- if (currentPos < newPos) |
- { |
- newPos--; |
- } |
- if (currentPos == newPos) |
- { |
- return; |
- } |
- FilterStorage.subscriptions.splice(currentPos, 1); |
- FilterStorage.subscriptions.splice(newPos, 0, subscription); |
- FilterNotifier.triggerListeners("subscription.moved", subscription); |
- }, |
- updateSubscriptionFilters: function(subscription, filters) |
- { |
- removeSubscriptionFilters(subscription); |
- subscription.oldFilters = subscription.filters; |
- subscription.filters = filters; |
- addSubscriptionFilters(subscription); |
- FilterNotifier.triggerListeners("subscription.updated", subscription); |
- delete subscription.oldFilters; |
- }, |
- addFilter: function(filter, subscription, position, silent) |
- { |
- if (!subscription) |
- { |
- if (filter.subscriptions.some(function(s) |
- { |
- return s instanceof SpecialSubscription && !s.disabled; |
- })) |
- { |
- return; |
- } |
- subscription = FilterStorage.getGroupForFilter(filter); |
- } |
- if (!subscription) |
- { |
- subscription = SpecialSubscription.createForFilter(filter); |
- this.addSubscription(subscription); |
- return; |
- } |
- if (typeof position == "undefined") |
- { |
- position = subscription.filters.length; |
- } |
- if (filter.subscriptions.indexOf(subscription) < 0) |
- { |
- filter.subscriptions.push(subscription); |
- } |
- subscription.filters.splice(position, 0, filter); |
- if (!silent) |
- { |
- FilterNotifier.triggerListeners("filter.added", filter, subscription, position); |
- } |
- }, |
- removeFilter: function(filter, subscription, position) |
- { |
- var subscriptions = subscription ? [subscription] : filter.subscriptions.slice(); |
- for (var i = 0; i < subscriptions.length; i++) |
- { |
- var subscription = subscriptions[i]; |
- if (subscription instanceof SpecialSubscription) |
- { |
- var positions = []; |
- if (typeof position == "undefined") |
- { |
- var index = -1; |
- do |
- { |
- index = subscription.filters.indexOf(filter, index + 1); |
- if (index >= 0) |
- { |
- positions.push(index); |
- } |
- } |
- while (index >= 0); |
- } |
- else |
- { |
- positions.push(position); |
- } |
- for (var j = positions.length - 1; j >= 0; j--) |
- { |
- var position = positions[j]; |
- if (subscription.filters[position] == filter) |
- { |
- subscription.filters.splice(position, 1); |
- if (subscription.filters.indexOf(filter) < 0) |
- { |
- var index = filter.subscriptions.indexOf(subscription); |
- if (index >= 0) |
- { |
- filter.subscriptions.splice(index, 1); |
- } |
- } |
- FilterNotifier.triggerListeners("filter.removed", filter, subscription, position); |
- } |
- } |
- } |
- } |
- }, |
- moveFilter: function(filter, subscription, oldPosition, newPosition) |
- { |
- if (!(subscription instanceof SpecialSubscription) || subscription.filters[oldPosition] != filter) |
- { |
- return; |
- } |
- newPosition = Math.min(Math.max(newPosition, 0), subscription.filters.length - 1); |
- if (oldPosition == newPosition) |
- { |
- return; |
- } |
- subscription.filters.splice(oldPosition, 1); |
- subscription.filters.splice(newPosition, 0, filter); |
- FilterNotifier.triggerListeners("filter.moved", filter, subscription, oldPosition, newPosition); |
- }, |
- increaseHitCount: function(filter) |
- { |
- if (!Prefs.savestats || PrivateBrowsing.enabled || !(filter instanceof ActiveFilter)) |
- { |
- return; |
- } |
- filter.hitCount++; |
- filter.lastHit = Date.now(); |
- }, |
- resetHitCounts: function(filters) |
- { |
- if (!filters) |
- { |
- filters = []; |
- for (var text in Filter.knownFilters) |
- { |
- filters.push(Filter.knownFilters[text]); |
- } |
- } |
- for (var _loopIndex10 = 0; _loopIndex10 < filters.length; ++_loopIndex10) |
- { |
- var filter = filters[_loopIndex10]; |
- filter.hitCount = 0; |
- filter.lastHit = 0; |
- } |
- }, |
- _loading: false, |
- loadFromDisk: function(sourceFile) |
- { |
- if (this._loading) |
- { |
- return; |
- } |
- var readFile = function(sourceFile, backupIndex) |
- { |
- var parser = new INIParser(); |
- IO.readFromFile(sourceFile, true, parser, function(e) |
- { |
- if (!e && parser.subscriptions.length == 0) |
- { |
- e = new Error("No data in the file"); |
- } |
- if (e) |
- { |
- Cu.reportError(e); |
- } |
- if (e && !explicitFile) |
- { |
- sourceFile = this.sourceFile; |
- if (sourceFile) |
- { |
- var _tempVar11 = /^(.*)(\.\w+)$/.exec(sourceFile.leafName) || [null, sourceFile.leafName, ""]; |
- var part1 = _tempVar11[1]; |
- var part2 = _tempVar11[2]; |
- sourceFile = sourceFile.clone(); |
- sourceFile.leafName = part1 + "-backup" + ++backupIndex + part2; |
- IO.statFile(sourceFile, function(e, statData) |
- { |
- if (!e && statData.exists) |
- { |
- readFile(sourceFile, backupIndex); |
- } |
- else |
- { |
- doneReading(parser); |
- } |
- }); |
- return; |
- } |
- } |
- doneReading(parser); |
- }.bind(this), "FilterStorageRead"); |
- }.bind(this); |
- var doneReading = function(parser) |
- { |
- var specialMap = |
- { |
- "~il~": true, |
- "~wl~": true, |
- "~fl~": true, |
- "~eh~": true |
- }; |
- var knownSubscriptions = |
- { |
- __proto__: null |
- }; |
- for (var i = 0; i < parser.subscriptions.length; i++) |
- { |
- var subscription = parser.subscriptions[i]; |
- if (subscription instanceof SpecialSubscription && subscription.filters.length == 0 && subscription.url in specialMap) |
- { |
- parser.subscriptions.splice(i--, 1); |
- } |
- else |
- { |
- knownSubscriptions[subscription.url] = subscription; |
- } |
- } |
- this.fileProperties = parser.fileProperties; |
- this.subscriptions = parser.subscriptions; |
- this.knownSubscriptions = knownSubscriptions; |
- Filter.knownFilters = parser.knownFilters; |
- Subscription.knownSubscriptions = parser.knownSubscriptions; |
- if (parser.userFilters) |
- { |
- for (var i = 0; i < parser.userFilters.length; i++) |
- { |
- var filter = Filter.fromText(parser.userFilters[i]); |
- this.addFilter(filter, null, undefined, true); |
- } |
- } |
- this._loading = false; |
- FilterNotifier.triggerListeners("load"); |
- if (sourceFile != this.sourceFile) |
- { |
- this.saveToDisk(); |
- } |
- }.bind(this); |
- var startRead = function(file) |
- { |
- this._loading = true; |
- readFile(file, 0); |
- }.bind(this); |
- var explicitFile; |
- if (sourceFile) |
- { |
- explicitFile = true; |
- startRead(sourceFile); |
- } |
- else |
- { |
- explicitFile = false; |
- sourceFile = FilterStorage.sourceFile; |
- var callback = function(e, statData) |
- { |
- if (e || !statData.exists) |
- { |
- var addonRoot = require("info").addonRoot; |
- sourceFile = Services.io.newURI(addonRoot + "defaults/patterns.ini", null, null); |
- } |
- startRead(sourceFile); |
- }; |
- if (sourceFile) |
- { |
- IO.statFile(sourceFile, callback); |
- } |
- else |
- { |
- callback(true); |
- } |
- } |
- }, |
- _generateFilterData: function(subscriptions) |
- { |
- var _generatorResult12 = []; |
- _generatorResult12.push("# Adblock Plus preferences"); |
- _generatorResult12.push("version=" + formatVersion); |
- var saved = |
- { |
- __proto__: null |
- }; |
- var buf = []; |
- for (var i = 0; i < subscriptions.length; i++) |
- { |
- var subscription = subscriptions[i]; |
- for (var j = 0; j < subscription.filters.length; j++) |
- { |
- var filter = subscription.filters[j]; |
- if (!(filter.text in saved)) |
- { |
- filter.serialize(buf); |
- saved[filter.text] = filter; |
- for (var k = 0; k < buf.length; k++) |
- { |
- _generatorResult12.push(buf[k]); |
- } |
- buf.splice(0); |
- } |
- } |
- } |
- for (var i = 0; i < subscriptions.length; i++) |
- { |
- var subscription = subscriptions[i]; |
- _generatorResult12.push(""); |
- subscription.serialize(buf); |
- if (subscription.filters.length) |
- { |
- buf.push("", "[Subscription filters]"); |
- subscription.serializeFilters(buf); |
- } |
- for (var k = 0; k < buf.length; k++) |
- { |
- _generatorResult12.push(buf[k]); |
- } |
- buf.splice(0); |
- } |
- return _generatorResult12; |
- }, |
- _saving: false, |
- _needsSave: false, |
- saveToDisk: function(targetFile) |
- { |
- var explicitFile = true; |
- if (!targetFile) |
- { |
- targetFile = FilterStorage.sourceFile; |
- explicitFile = false; |
- } |
- if (!targetFile) |
- { |
- return; |
- } |
- if (!explicitFile && this._saving) |
- { |
- this._needsSave = true; |
- return; |
- } |
- try |
- { |
- targetFile.parent.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY); |
- } |
- catch (e){} |
- var writeFilters = function() |
- { |
- IO.writeToFile(targetFile, true, this._generateFilterData(subscriptions), function(e) |
- { |
- if (!explicitFile) |
- { |
- this._saving = false; |
- } |
- if (e) |
- { |
- Cu.reportError(e); |
- } |
- if (!explicitFile && this._needsSave) |
- { |
- this._needsSave = false; |
- this.saveToDisk(); |
- } |
- else |
- { |
- FilterNotifier.triggerListeners("save"); |
- } |
- }.bind(this), "FilterStorageWrite"); |
- }.bind(this); |
- var checkBackupRequired = function(callbackNotRequired, callbackRequired) |
- { |
- if (explicitFile || Prefs.patternsbackups <= 0) |
- { |
- callbackNotRequired(); |
- } |
- else |
- { |
- IO.statFile(targetFile, function(e, statData) |
- { |
- if (e || !statData.exists) |
- { |
- callbackNotRequired(); |
- } |
- else |
- { |
- var _tempVar13 = /^(.*)(\.\w+)$/.exec(targetFile.leafName) || [null, targetFile.leafName, ""]; |
- var part1 = _tempVar13[1]; |
- var part2 = _tempVar13[2]; |
- var newestBackup = targetFile.clone(); |
- newestBackup.leafName = part1 + "-backup1" + part2; |
- IO.statFile(newestBackup, function(e, statData) |
- { |
- if (!e && (!statData.exists || (Date.now() - statData.lastModified) / 3600000 >= Prefs.patternsbackupinterval)) |
- { |
- callbackRequired(part1, part2); |
- } |
- else |
- { |
- callbackNotRequired(); |
- } |
- }); |
- } |
- }); |
- } |
- }.bind(this); |
- var removeLastBackup = function(part1, part2) |
- { |
- var file = targetFile.clone(); |
- file.leafName = part1 + "-backup" + Prefs.patternsbackups + part2; |
- IO.removeFile(file, function(e) |
- { |
- return renameBackup(part1, part2, Prefs.patternsbackups - 1); |
- }); |
- }.bind(this); |
- var renameBackup = function(part1, part2, index) |
- { |
- if (index > 0) |
- { |
- var fromFile = targetFile.clone(); |
- fromFile.leafName = part1 + "-backup" + index + part2; |
- var toName = part1 + "-backup" + (index + 1) + part2; |
- IO.renameFile(fromFile, toName, function(e) |
- { |
- return renameBackup(part1, part2, index - 1); |
- }); |
- } |
- else |
- { |
- var toFile = targetFile.clone(); |
- toFile.leafName = part1 + "-backup" + (index + 1) + part2; |
- IO.copyFile(targetFile, toFile, writeFilters); |
- } |
- }.bind(this); |
- var subscriptions = this.subscriptions.filter(function(s) |
- { |
- return !(s instanceof ExternalSubscription); |
- }); |
- if (!explicitFile) |
- { |
- this._saving = true; |
- } |
- checkBackupRequired(writeFilters, removeLastBackup); |
- }, |
- getBackupFiles: function() |
- { |
- var result = []; |
- var _tempVar14 = /^(.*)(\.\w+)$/.exec(FilterStorage.sourceFile.leafName) || [null, FilterStorage.sourceFile.leafName, ""]; |
- var part1 = _tempVar14[1]; |
- var part2 = _tempVar14[2]; |
- for (var i = 1;; i++) |
- { |
- var file = FilterStorage.sourceFile.clone(); |
- file.leafName = part1 + "-backup" + i + part2; |
- if (file.exists()) |
- { |
- result.push(file); |
- } |
- else |
- { |
- break; |
- } |
- } |
- return result; |
- } |
- }; |
- |
- function addSubscriptionFilters(subscription) |
- { |
- if (!(subscription.url in FilterStorage.knownSubscriptions)) |
- { |
- return; |
- } |
- for (var _loopIndex15 = 0; _loopIndex15 < subscription.filters.length; ++_loopIndex15) |
- { |
- var filter = subscription.filters[_loopIndex15]; |
- filter.subscriptions.push(subscription); |
- } |
- } |
- |
- function removeSubscriptionFilters(subscription) |
- { |
- if (!(subscription.url in FilterStorage.knownSubscriptions)) |
- { |
- return; |
- } |
- for (var _loopIndex16 = 0; _loopIndex16 < subscription.filters.length; ++_loopIndex16) |
- { |
- var filter = subscription.filters[_loopIndex16]; |
- var i = filter.subscriptions.indexOf(subscription); |
- if (i >= 0) |
- { |
- filter.subscriptions.splice(i, 1); |
- } |
- } |
- } |
- var PrivateBrowsing = exports.PrivateBrowsing = |
- { |
- enabled: false, |
- init: function() |
- { |
- if ("@mozilla.org/privatebrowsing;1" in Cc) |
- { |
- try |
- { |
- this.enabled = Cc["@mozilla.org/privatebrowsing;1"].getService(Ci.nsIPrivateBrowsingService).privateBrowsingEnabled; |
- Services.obs.addObserver(this, "private-browsing", true); |
- onShutdown.add(function() |
- { |
- Services.obs.removeObserver(this, "private-browsing"); |
- }.bind(this)); |
- } |
- catch (e) |
- { |
- Cu.reportError(e); |
- } |
- } |
- }, |
- observe: function(subject, topic, data) |
- { |
- if (topic == "private-browsing") |
- { |
- if (data == "enter") |
- { |
- this.enabled = true; |
- } |
- else if (data == "exit") |
- { |
- this.enabled = false; |
- } |
- } |
- }, |
- QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver]) |
- }; |
- PrivateBrowsing.init(); |
- |
- function INIParser() |
- { |
- this.fileProperties = this.curObj = {}; |
- this.subscriptions = []; |
- this.knownFilters = |
- { |
- __proto__: null |
- }; |
- this.knownSubscriptions = |
- { |
- __proto__: null |
- }; |
- } |
- INIParser.prototype = |
- { |
- subscriptions: null, |
- knownFilters: null, |
- knownSubscrptions: null, |
- wantObj: true, |
- fileProperties: null, |
- curObj: null, |
- curSection: null, |
- userFilters: null, |
- process: function(val) |
- { |
- var origKnownFilters = Filter.knownFilters; |
- Filter.knownFilters = this.knownFilters; |
- var origKnownSubscriptions = Subscription.knownSubscriptions; |
- Subscription.knownSubscriptions = this.knownSubscriptions; |
- var match; |
- try |
- { |
- if (this.wantObj === true && (match = /^(\w+)=(.*)$/.exec(val))) |
- { |
- this.curObj[match[1]] = match[2]; |
- } |
- else if (val === null || (match = /^\s*\[(.+)\]\s*$/.exec(val))) |
- { |
- if (this.curObj) |
- { |
- switch (this.curSection) |
- { |
- case "filter": |
- case "pattern": |
- if ("text" in this.curObj) |
- { |
- Filter.fromObject(this.curObj); |
- } |
- break; |
- case "subscription": |
- var subscription = Subscription.fromObject(this.curObj); |
- if (subscription) |
- { |
- this.subscriptions.push(subscription); |
- } |
- break; |
- case "subscription filters": |
- case "subscription patterns": |
- if (this.subscriptions.length) |
- { |
- var subscription = this.subscriptions[this.subscriptions.length - 1]; |
- for (var _loopIndex17 = 0; _loopIndex17 < this.curObj.length; ++_loopIndex17) |
- { |
- var text = this.curObj[_loopIndex17]; |
- var filter = Filter.fromText(text); |
- subscription.filters.push(filter); |
- filter.subscriptions.push(subscription); |
- } |
- } |
- break; |
- case "user patterns": |
- this.userFilters = this.curObj; |
- break; |
- } |
- } |
- if (val === null) |
- { |
- return; |
- } |
- this.curSection = match[1].toLowerCase(); |
- switch (this.curSection) |
- { |
- case "filter": |
- case "pattern": |
- case "subscription": |
- this.wantObj = true; |
- this.curObj = {}; |
- break; |
- case "subscription filters": |
- case "subscription patterns": |
- case "user patterns": |
- this.wantObj = false; |
- this.curObj = []; |
- break; |
- default: |
- this.wantObj = undefined; |
- this.curObj = null; |
- } |
- } |
- else if (this.wantObj === false && val) |
- { |
- this.curObj.push(val.replace(/\\\[/g, "[")); |
- } |
- } |
- finally |
- { |
- Filter.knownFilters = origKnownFilters; |
- Subscription.knownSubscriptions = origKnownSubscriptions; |
- } |
- } |
- }; |
- return exports; |
-})(); |
-require.scopes["elemHide"] = (function() |
-{ |
- var exports = {}; |
- var Utils = require("utils").Utils; |
- var IO = require("io").IO; |
- var Prefs = require("prefs").Prefs; |
- var ElemHideException = require("filterClasses").ElemHideException; |
- var FilterNotifier = require("filterNotifier").FilterNotifier; |
- var AboutHandler = require("elemHideHitRegistration").AboutHandler; |
- var filterByKey = |
- { |
- __proto__: null |
- }; |
- var keyByFilter = |
- { |
- __proto__: null |
- }; |
- var knownExceptions = |
- { |
- __proto__: null |
- }; |
- var exceptions = |
- { |
- __proto__: null |
- }; |
- var styleURL = null; |
- var ElemHide = exports.ElemHide = |
- { |
- isDirty: false, |
- applied: false, |
- init: function() |
- { |
- Prefs.addListener(function(name) |
- { |
- if (name == "enabled") |
- { |
- ElemHide.apply(); |
- } |
- }); |
- onShutdown.add(function() |
- { |
- ElemHide.unapply(); |
- }); |
- var styleFile = IO.resolveFilePath(Prefs.data_directory); |
- styleFile.append("elemhide.css"); |
- styleURL = Services.io.newFileURI(styleFile).QueryInterface(Ci.nsIFileURL); |
- }, |
- clear: function() |
- { |
- filterByKey = |
- { |
- __proto__: null |
- }; |
- keyByFilter = |
- { |
- __proto__: null |
- }; |
- knownExceptions = |
- { |
- __proto__: null |
- }; |
- exceptions = |
- { |
- __proto__: null |
- }; |
- ElemHide.isDirty = false; |
- ElemHide.unapply(); |
- }, |
- add: function(filter) |
- { |
- if (filter instanceof ElemHideException) |
- { |
- if (filter.text in knownExceptions) |
- { |
- return; |
- } |
- var selector = filter.selector; |
- if (!(selector in exceptions)) |
- { |
- exceptions[selector] = []; |
- } |
- exceptions[selector].push(filter); |
- knownExceptions[filter.text] = true; |
- } |
- else |
- { |
- if (filter.text in keyByFilter) |
- { |
- return; |
- } |
- var key; |
- do |
- { |
- key = Math.random().toFixed(15).substr(5); |
- } |
- while (key in filterByKey); |
- filterByKey[key] = filter; |
- keyByFilter[filter.text] = key; |
- ElemHide.isDirty = true; |
- } |
- }, |
- remove: function(filter) |
- { |
- if (filter instanceof ElemHideException) |
- { |
- if (!(filter.text in knownExceptions)) |
- { |
- return; |
- } |
- var list = exceptions[filter.selector]; |
- var index = list.indexOf(filter); |
- if (index >= 0) |
- { |
- list.splice(index, 1); |
- } |
- delete knownExceptions[filter.text]; |
- } |
- else |
- { |
- if (!(filter.text in keyByFilter)) |
- { |
- return; |
- } |
- var key = keyByFilter[filter.text]; |
- delete filterByKey[key]; |
- delete keyByFilter[filter.text]; |
- ElemHide.isDirty = true; |
- } |
- }, |
- getException: function(filter, docDomain) |
- { |
- var selector = filter.selector; |
- if (!(filter.selector in exceptions)) |
- { |
- return null; |
- } |
- var list = exceptions[filter.selector]; |
- for (var i = list.length - 1; i >= 0; i--) |
- { |
- if (list[i].isActiveOnDomain(docDomain)) |
- { |
- return list[i]; |
- } |
- } |
- return null; |
- }, |
- _applying: false, |
- _needsApply: false, |
- apply: function() |
- { |
- if (this._applying) |
- { |
- this._needsApply = true; |
- return; |
- } |
- if (!ElemHide.isDirty || !Prefs.enabled) |
- { |
- if (Prefs.enabled && !ElemHide.applied) |
- { |
- try |
- { |
- Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); |
- ElemHide.applied = true; |
- } |
- catch (e) |
- { |
- Cu.reportError(e); |
- } |
- } |
- else if (!Prefs.enabled && ElemHide.applied) |
- { |
- ElemHide.unapply(); |
- } |
- return; |
- } |
- IO.writeToFile(styleURL.file, false, this._generateCSSContent(), function(e) |
- { |
- this._applying = false; |
- if (e && e.result == Cr.NS_ERROR_NOT_AVAILABLE) |
- { |
- IO.removeFile(styleURL.file, function(e2){}); |
- } |
- else if (e) |
- { |
- Cu.reportError(e); |
- } |
- if (this._needsApply) |
- { |
- this._needsApply = false; |
- this.apply(); |
- } |
- else if (!e || e.result == Cr.NS_ERROR_NOT_AVAILABLE) |
- { |
- ElemHide.isDirty = false; |
- ElemHide.unapply(); |
- if (!e) |
- { |
- try |
- { |
- Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); |
- ElemHide.applied = true; |
- } |
- catch (e) |
- { |
- Cu.reportError(e); |
- } |
- } |
- FilterNotifier.triggerListeners("elemhideupdate"); |
- } |
- }.bind(this), "ElemHideWrite"); |
- this._applying = true; |
- }, |
- _generateCSSContent: function() |
- { |
- var _generatorResult12 = []; |
- var domains = |
- { |
- __proto__: null |
- }; |
- var hasFilters = false; |
- for (var key in filterByKey) |
- { |
- var filter = filterByKey[key]; |
- var domain = filter.selectorDomain || ""; |
- var list; |
- if (domain in domains) |
- { |
- list = domains[domain]; |
- } |
- else |
- { |
- list = |
- { |
- __proto__: null |
- }; |
- domains[domain] = list; |
- } |
- list[filter.selector] = key; |
- hasFilters = true; |
- } |
- if (!hasFilters) |
- { |
- throw Cr.NS_ERROR_NOT_AVAILABLE; |
- } |
- |
- function escapeChar(match) |
- { |
- return "\\" + match.charCodeAt(0).toString(16) + " "; |
- } |
- var cssTemplate = "-moz-binding: url(about:" + AboutHandler.aboutPrefix + "?%ID%#dummy) !important;"; |
- for (var domain in domains) |
- { |
- var rules = []; |
- var list = domains[domain]; |
- if (domain) |
- { |
- _generatorResult12.push(("@-moz-document domain(\"" + domain.split(",").join("\"),domain(\"") + "\"){").replace(/[^\x01-\x7F]/g, escapeChar)); |
- } |
- else |
- { |
- _generatorResult12.push("@-moz-document url-prefix(\"http://\"),url-prefix(\"https://\")," + "url-prefix(\"mailbox://\"),url-prefix(\"imap://\")," + "url-prefix(\"news://\"),url-prefix(\"snews://\"){"); |
- } |
- for (var selector in list) |
- { |
- _generatorResult12.push(selector.replace(/[^\x01-\x7F]/g, escapeChar) + "{" + cssTemplate.replace("%ID%", list[selector]) + "}"); |
- } |
- _generatorResult12.push("}"); |
- } |
- return _generatorResult12; |
- }, |
- unapply: function() |
- { |
- if (ElemHide.applied) |
- { |
- try |
- { |
- Utils.styleService.unregisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); |
- } |
- catch (e) |
- { |
- Cu.reportError(e); |
- } |
- ElemHide.applied = false; |
- } |
- }, |
- get styleURL() |
- { |
- return ElemHide.applied ? styleURL.spec : null; |
- }, |
- getFilterByKey: function(key) |
- { |
- return key in filterByKey ? filterByKey[key] : null; |
- }, |
- getSelectorsForDomain: function(domain, specificOnly) |
- { |
- var result = []; |
- for (var key in filterByKey) |
- { |
- var filter = filterByKey[key]; |
- if (specificOnly && (!filter.domains || filter.domains[""])) |
- { |
- continue; |
- } |
- if (filter.isActiveOnDomain(domain) && !this.getException(filter, domain)) |
- { |
- result.push(filter.selector); |
- } |
- } |
- return result; |
- } |
- }; |
- return exports; |
-})(); |
-require.scopes["matcher"] = (function() |
-{ |
- var exports = {}; |
- var _tempVar18 = require("filterClasses"); |
- var Filter = _tempVar18.Filter; |
- var RegExpFilter = _tempVar18.RegExpFilter; |
- var WhitelistFilter = _tempVar18.WhitelistFilter; |
- |
- function Matcher() |
- { |
- this.clear(); |
- } |
- exports.Matcher = Matcher; |
- Matcher.prototype = |
- { |
- filterByKeyword: null, |
- keywordByFilter: null, |
- clear: function() |
- { |
- this.filterByKeyword = |
- { |
- __proto__: null |
- }; |
- this.keywordByFilter = |
- { |
- __proto__: null |
- }; |
- }, |
- add: function(filter) |
- { |
- if (filter.text in this.keywordByFilter) |
- { |
- return; |
- } |
- var keyword = this.findKeyword(filter); |
- var oldEntry = this.filterByKeyword[keyword]; |
- if (typeof oldEntry == "undefined") |
- { |
- this.filterByKeyword[keyword] = filter; |
- } |
- else if (oldEntry.length == 1) |
- { |
- this.filterByKeyword[keyword] = [oldEntry, filter]; |
- } |
- else |
- { |
- oldEntry.push(filter); |
- } |
- this.keywordByFilter[filter.text] = keyword; |
- }, |
- remove: function(filter) |
- { |
- if (!(filter.text in this.keywordByFilter)) |
- { |
- return; |
- } |
- var keyword = this.keywordByFilter[filter.text]; |
- var list = this.filterByKeyword[keyword]; |
- if (list.length <= 1) |
- { |
- delete this.filterByKeyword[keyword]; |
- } |
- else |
- { |
- var index = list.indexOf(filter); |
- if (index >= 0) |
- { |
- list.splice(index, 1); |
- if (list.length == 1) |
- { |
- this.filterByKeyword[keyword] = list[0]; |
- } |
- } |
- } |
- delete this.keywordByFilter[filter.text]; |
- }, |
- findKeyword: function(filter) |
- { |
- var defaultResult = filter.contentType & RegExpFilter.typeMap.DONOTTRACK ? "donottrack" : ""; |
- var text = filter.text; |
- if (Filter.regexpRegExp.test(text)) |
- { |
- return defaultResult; |
- } |
- var match = Filter.optionsRegExp.exec(text); |
- if (match) |
- { |
- text = match.input.substr(0, match.index); |
- } |
- if (text.substr(0, 2) == "@@") |
- { |
- text = text.substr(2); |
- } |
- var candidates = text.toLowerCase().match(/[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g); |
- if (!candidates) |
- { |
- return defaultResult; |
- } |
- var hash = this.filterByKeyword; |
- var result = defaultResult; |
- var resultCount = 16777215; |
- var resultLength = 0; |
- for (var i = 0, l = candidates.length; i < l; i++) |
- { |
- var candidate = candidates[i].substr(1); |
- var count = candidate in hash ? hash[candidate].length : 0; |
- if (count < resultCount || count == resultCount && candidate.length > resultLength) |
- { |
- result = candidate; |
- resultCount = count; |
- resultLength = candidate.length; |
- } |
- } |
- return result; |
- }, |
- hasFilter: function(filter) |
- { |
- return filter.text in this.keywordByFilter; |
- }, |
- getKeywordForFilter: function(filter) |
- { |
- if (filter.text in this.keywordByFilter) |
- { |
- return this.keywordByFilter[filter.text]; |
- } |
- else |
- { |
- return null; |
- } |
- }, |
- _checkEntryMatch: function(keyword, location, contentType, docDomain, thirdParty) |
- { |
- var list = this.filterByKeyword[keyword]; |
- for (var i = 0; i < list.length; i++) |
- { |
- var filter = list[i]; |
- if (filter.matches(location, contentType, docDomain, thirdParty)) |
- { |
- return filter; |
- } |
- } |
- return null; |
- }, |
- matchesAny: function(location, contentType, docDomain, thirdParty) |
- { |
- var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); |
- if (candidates === null) |
- { |
- candidates = []; |
- } |
- if (contentType == "DONOTTRACK") |
- { |
- candidates.unshift("donottrack"); |
- } |
- else |
- { |
- candidates.push(""); |
- } |
- for (var i = 0, l = candidates.length; i < l; i++) |
- { |
- var substr = candidates[i]; |
- if (substr in this.filterByKeyword) |
- { |
- var result = this._checkEntryMatch(substr, location, contentType, docDomain, thirdParty); |
- if (result) |
- { |
- return result; |
- } |
- } |
- } |
- return null; |
- } |
- }; |
- |
- function CombinedMatcher() |
- { |
- this.blacklist = new Matcher(); |
- this.whitelist = new Matcher(); |
- this.keys = |
- { |
- __proto__: null |
- }; |
- this.resultCache = |
- { |
- __proto__: null |
- }; |
- } |
- exports.CombinedMatcher = CombinedMatcher; |
- CombinedMatcher.maxCacheEntries = 1000; |
- CombinedMatcher.prototype = |
- { |
- blacklist: null, |
- whitelist: null, |
- keys: null, |
- resultCache: null, |
- cacheEntries: 0, |
- clear: function() |
- { |
- this.blacklist.clear(); |
- this.whitelist.clear(); |
- this.keys = |
- { |
- __proto__: null |
- }; |
- this.resultCache = |
- { |
- __proto__: null |
- }; |
- this.cacheEntries = 0; |
- }, |
- add: function(filter) |
- { |
- if (filter instanceof WhitelistFilter) |
- { |
- if (filter.siteKeys) |
- { |
- for (var i = 0; i < filter.siteKeys.length; i++) |
- { |
- this.keys[filter.siteKeys[i]] = filter.text; |
- } |
- } |
- else |
- { |
- this.whitelist.add(filter); |
- } |
- } |
- else |
- { |
- this.blacklist.add(filter); |
- } |
- if (this.cacheEntries > 0) |
- { |
- this.resultCache = |
- { |
- __proto__: null |
- }; |
- this.cacheEntries = 0; |
- } |
- }, |
- remove: function(filter) |
- { |
- if (filter instanceof WhitelistFilter) |
- { |
- if (filter.siteKeys) |
- { |
- for (var i = 0; i < filter.siteKeys.length; i++) |
- { |
- delete this.keys[filter.siteKeys[i]]; |
- } |
- } |
- else |
- { |
- this.whitelist.remove(filter); |
- } |
- } |
- else |
- { |
- this.blacklist.remove(filter); |
- } |
- if (this.cacheEntries > 0) |
- { |
- this.resultCache = |
- { |
- __proto__: null |
- }; |
- this.cacheEntries = 0; |
- } |
- }, |
- findKeyword: function(filter) |
- { |
- if (filter instanceof WhitelistFilter) |
- { |
- return this.whitelist.findKeyword(filter); |
- } |
- else |
- { |
- return this.blacklist.findKeyword(filter); |
- } |
- }, |
- hasFilter: function(filter) |
- { |
- if (filter instanceof WhitelistFilter) |
- { |
- return this.whitelist.hasFilter(filter); |
- } |
- else |
- { |
- return this.blacklist.hasFilter(filter); |
- } |
- }, |
- getKeywordForFilter: function(filter) |
- { |
- if (filter instanceof WhitelistFilter) |
- { |
- return this.whitelist.getKeywordForFilter(filter); |
- } |
- else |
- { |
- return this.blacklist.getKeywordForFilter(filter); |
- } |
- }, |
- isSlowFilter: function(filter) |
- { |
- var matcher = filter instanceof WhitelistFilter ? this.whitelist : this.blacklist; |
- if (matcher.hasFilter(filter)) |
- { |
- return !matcher.getKeywordForFilter(filter); |
- } |
- else |
- { |
- return !matcher.findKeyword(filter); |
- } |
- }, |
- matchesAnyInternal: function(location, contentType, docDomain, thirdParty) |
- { |
- var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); |
- if (candidates === null) |
- { |
- candidates = []; |
- } |
- if (contentType == "DONOTTRACK") |
- { |
- candidates.unshift("donottrack"); |
- } |
- else |
- { |
- candidates.push(""); |
- } |
- var blacklistHit = null; |
- for (var i = 0, l = candidates.length; i < l; i++) |
- { |
- var substr = candidates[i]; |
- if (substr in this.whitelist.filterByKeyword) |
- { |
- var result = this.whitelist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty); |
- if (result) |
- { |
- return result; |
- } |
- } |
- if (substr in this.blacklist.filterByKeyword && blacklistHit === null) |
- { |
- blacklistHit = this.blacklist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty); |
- } |
- } |
- return blacklistHit; |
- }, |
- matchesAny: function(location, contentType, docDomain, thirdParty) |
- { |
- var key = location + " " + contentType + " " + docDomain + " " + thirdParty; |
- if (key in this.resultCache) |
- { |
- return this.resultCache[key]; |
- } |
- var result = this.matchesAnyInternal(location, contentType, docDomain, thirdParty); |
- if (this.cacheEntries >= CombinedMatcher.maxCacheEntries) |
- { |
- this.resultCache = |
- { |
- __proto__: null |
- }; |
- this.cacheEntries = 0; |
- } |
- this.resultCache[key] = result; |
- this.cacheEntries++; |
- return result; |
- }, |
- matchesByKey: function(location, key, docDomain) |
- { |
- key = key.toUpperCase(); |
- if (key in this.keys) |
- { |
- var filter = Filter.knownFilters[this.keys[key]]; |
- if (filter && filter.matches(location, "DOCUMENT", docDomain, false)) |
- { |
- return filter; |
- } |
- else |
- { |
- return null; |
- } |
- } |
- else |
- { |
- return null; |
- } |
- } |
- }; |
- var defaultMatcher = exports.defaultMatcher = new CombinedMatcher(); |
- return exports; |
-})(); |
-require.scopes["filterListener"] = (function() |
-{ |
- var exports = {}; |
- var FilterStorage = require("filterStorage").FilterStorage; |
- var FilterNotifier = require("filterNotifier").FilterNotifier; |
- var ElemHide = require("elemHide").ElemHide; |
- var defaultMatcher = require("matcher").defaultMatcher; |
- var _tempVar19 = require("filterClasses"); |
- var ActiveFilter = _tempVar19.ActiveFilter; |
- var RegExpFilter = _tempVar19.RegExpFilter; |
- var ElemHideBase = _tempVar19.ElemHideBase; |
- var Prefs = require("prefs").Prefs; |
- var batchMode = false; |
- var isDirty = 0; |
- var FilterListener = exports.FilterListener = |
- { |
- 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) |
- { |
- FilterStorage.saveToDisk(); |
- } |
- } |
- }; |
- var HistoryPurgeObserver = |
- { |
- 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]) |
- }; |
- |
- function init() |
- { |
- FilterNotifier.addListener(function(action, item, newValue, oldValue) |
- { |
- var match = /^(\w+)\.(.*)/.exec(action); |
- if (match && match[1] == "filter") |
- { |
- onFilterChange(match[2], item, newValue, oldValue); |
- } |
- else if (match && match[1] == "subscription") |
- { |
- onSubscriptionChange(match[2], item, newValue, oldValue); |
- } |
- else |
- { |
- onGenericChange(action, item); |
- } |
- }); |
- var application = require("info").application; |
- if (application == "chrome") |
- { |
- flushElemHide = function(){}; |
- } |
- else |
- { |
- ElemHide.init(); |
- } |
- FilterStorage.loadFromDisk(); |
- Services.obs.addObserver(HistoryPurgeObserver, "browser:purge-session-history", true); |
- onShutdown.add(function() |
- { |
- Services.obs.removeObserver(HistoryPurgeObserver, "browser:purge-session-history"); |
- }); |
- } |
- init(); |
- |
- function flushElemHide() |
- { |
- if (!batchMode && ElemHide.isDirty) |
- { |
- ElemHide.apply(); |
- } |
- } |
- |
- 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 ElemHideBase) |
- { |
- 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 ElemHideBase) |
- { |
- ElemHide.remove(filter); |
- } |
- } |
- |
- function onSubscriptionChange(action, subscription, newValue, oldValue) |
- { |
- 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.002); |
- } |
- 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 _loopIndex20 = 0; _loopIndex20 < FilterStorage.subscriptions.length; ++_loopIndex20) |
- { |
- var subscription = FilterStorage.subscriptions[_loopIndex20]; |
- if (!subscription.disabled) |
- { |
- subscription.filters.forEach(addFilter); |
- } |
- } |
- flushElemHide(); |
- } |
- else if (action == "save") |
- { |
- isDirty = 0; |
- } |
- } |
- return exports; |
-})(); |
-require.scopes["synchronizer"] = (function() |
-{ |
- var exports = {}; |
- var Utils = require("utils").Utils; |
- var FilterStorage = require("filterStorage").FilterStorage; |
- var FilterNotifier = require("filterNotifier").FilterNotifier; |
- var Prefs = require("prefs").Prefs; |
- var _tempVar21 = require("filterClasses"); |
- var Filter = _tempVar21.Filter; |
- var CommentFilter = _tempVar21.CommentFilter; |
- var _tempVar22 = require("subscriptionClasses"); |
- var Subscription = _tempVar22.Subscription; |
- var DownloadableSubscription = _tempVar22.DownloadableSubscription; |
- var MILLISECONDS_IN_SECOND = 1000; |
- var SECONDS_IN_MINUTE = 60; |
- var SECONDS_IN_HOUR = 60 * SECONDS_IN_MINUTE; |
- var SECONDS_IN_DAY = 24 * SECONDS_IN_HOUR; |
- var INITIAL_DELAY = 6 * SECONDS_IN_MINUTE; |
- var CHECK_INTERVAL = SECONDS_IN_HOUR; |
- var MIN_EXPIRATION_INTERVAL = 1 * SECONDS_IN_DAY; |
- var MAX_EXPIRATION_INTERVAL = 14 * SECONDS_IN_DAY; |
- var MAX_ABSENSE_INTERVAL = 1 * SECONDS_IN_DAY; |
- var timer = null; |
- var executing = |
- { |
- __proto__: null |
- }; |
- var Synchronizer = exports.Synchronizer = |
- { |
- init: function() |
- { |
- var callback = function() |
- { |
- timer.delay = CHECK_INTERVAL * MILLISECONDS_IN_SECOND; |
- checkSubscriptions(); |
- }; |
- timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); |
- timer.initWithCallback(callback, INITIAL_DELAY * MILLISECONDS_IN_SECOND, Ci.nsITimer.TYPE_REPEATING_SLACK); |
- onShutdown.add(function() |
- { |
- timer.cancel(); |
- }); |
- }, |
- isExecuting: function(url) |
- { |
- return url in executing; |
- }, |
- execute: function(subscription, manual, forceDownload) |
- { |
- Utils.runAsync(this.executeInternal, this, subscription, manual, forceDownload); |
- }, |
- executeInternal: function(subscription, manual, forceDownload) |
- { |
- var url = subscription.url; |
- if (url in executing) |
- { |
- return; |
- } |
- var newURL = subscription.nextURL; |
- var hadTemporaryRedirect = false; |
- subscription.nextURL = null; |
- var loadFrom = newURL; |
- var isBaseLocation = true; |
- if (!loadFrom) |
- { |
- loadFrom = url; |
- } |
- if (loadFrom == url) |
- { |
- if (subscription.alternativeLocations) |
- { |
- var options = [ |
- [1, url] |
- ]; |
- var totalWeight = 1; |
- for (var _loopIndex23 = 0; _loopIndex23 < subscription.alternativeLocations.split(",").length; ++_loopIndex23) |
- { |
- var alternative = subscription.alternativeLocations.split(",")[_loopIndex23]; |
- if (!/^https?:\/\//.test(alternative)) |
- { |
- continue; |
- } |
- var weight = 1; |
- var match = /;q=([\d\.]+)$/.exec(alternative); |
- if (match) |
- { |
- weight = parseFloat(match[1]); |
- if (isNaN(weight) || !isFinite(weight) || weight < 0) |
- { |
- weight = 1; |
- } |
- if (weight > 10) |
- { |
- weight = 10; |
- } |
- alternative = alternative.substr(0, match.index); |
- } |
- options.push([weight, alternative]); |
- totalWeight += weight; |
- } |
- var choice = Math.random() * totalWeight; |
- for (var _loopIndex24 = 0; _loopIndex24 < options.length; ++_loopIndex24) |
- { |
- var _tempVar25 = options[_loopIndex24]; |
- var weight = _tempVar25[0]; |
- var alternative = _tempVar25[1]; |
- choice -= weight; |
- if (choice < 0) |
- { |
- loadFrom = alternative; |
- break; |
- } |
- } |
- isBaseLocation = loadFrom == url; |
- } |
- } |
- else |
- { |
- forceDownload = true; |
- } |
- var addonVersion = require("info").addonVersion; |
- loadFrom = loadFrom.replace(/%VERSION%/, "ABP" + addonVersion); |
- var request = null; |
- |
- function errorCallback(error) |
- { |
- var channelStatus = -1; |
- try |
- { |
- channelStatus = request.channel.status; |
- } |
- catch (e){} |
- var responseStatus = ""; |
- try |
- { |
- responseStatus = request.channel.QueryInterface(Ci.nsIHttpChannel).responseStatus; |
- } |
- catch (e){} |
- setError(subscription, error, channelStatus, responseStatus, loadFrom, isBaseLocation, manual); |
- } |
- try |
- { |
- request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest); |
- request.mozBackgroundRequest = true; |
- request.open("GET", loadFrom); |
- } |
- catch (e) |
- { |
- errorCallback("synchronize_invalid_url"); |
- return; |
- } |
- try |
- { |
- request.overrideMimeType("text/plain"); |
- request.channel.loadFlags = request.channel.loadFlags | request.channel.INHIBIT_CACHING | request.channel.VALIDATE_ALWAYS; |
- if (request.channel instanceof Ci.nsIHttpChannel) |
- { |
- request.channel.redirectionLimit = 5; |
- } |
- var oldNotifications = request.channel.notificationCallbacks; |
- var oldEventSink = null; |
- request.channel.notificationCallbacks = |
- { |
- QueryInterface: XPCOMUtils.generateQI([Ci.nsIInterfaceRequestor, Ci.nsIChannelEventSink]), |
- getInterface: function(iid) |
- { |
- if (iid.equals(Ci.nsIChannelEventSink)) |
- { |
- try |
- { |
- oldEventSink = oldNotifications.QueryInterface(iid); |
- } |
- catch (e){} |
- return this; |
- } |
- if (oldNotifications) |
- { |
- return oldNotifications.QueryInterface(iid); |
- } |
- else |
- { |
- throw Cr.NS_ERROR_NO_INTERFACE; |
- } |
- }, |
- asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback) |
- { |
- if (isBaseLocation && !hadTemporaryRedirect && oldChannel instanceof Ci.nsIHttpChannel) |
- { |
- try |
- { |
- subscription.alternativeLocations = oldChannel.getResponseHeader("X-Alternative-Locations"); |
- } |
- catch (e) |
- { |
- subscription.alternativeLocations = null; |
- } |
- } |
- if (flags & Ci.nsIChannelEventSink.REDIRECT_TEMPORARY) |
- { |
- hadTemporaryRedirect = true; |
- } |
- else if (!hadTemporaryRedirect) |
- { |
- newURL = newChannel.URI.spec; |
- } |
- if (oldEventSink) |
- { |
- oldEventSink.asyncOnChannelRedirect(oldChannel, newChannel, flags, callback); |
- } |
- else |
- { |
- callback.onRedirectVerifyCallback(Cr.NS_OK); |
- } |
- } |
- }; |
- } |
- catch (e) |
- { |
- Cu.reportError(e); |
- } |
- if (subscription.lastModified && !forceDownload) |
- { |
- request.setRequestHeader("If-Modified-Since", subscription.lastModified); |
- } |
- request.addEventListener("error", function(ev) |
- { |
- if (onShutdown.done) |
- { |
- return; |
- } |
- delete executing[url]; |
- try |
- { |
- request.channel.notificationCallbacks = null; |
- } |
- catch (e){} |
- errorCallback("synchronize_connection_error"); |
- }, false); |
- request.addEventListener("load", function(ev) |
- { |
- if (onShutdown.done) |
- { |
- return; |
- } |
- delete executing[url]; |
- try |
- { |
- request.channel.notificationCallbacks = null; |
- } |
- catch (e){} |
- if (request.status && request.status != 200 && request.status != 304) |
- { |
- errorCallback("synchronize_connection_error"); |
- return; |
- } |
- var newFilters = null; |
- if (request.status != 304) |
- { |
- newFilters = readFilters(subscription, request.responseText, errorCallback); |
- if (!newFilters) |
- { |
- return; |
- } |
- subscription.lastModified = request.getResponseHeader("Last-Modified"); |
- } |
- if (isBaseLocation && !hadTemporaryRedirect) |
- { |
- subscription.alternativeLocations = request.getResponseHeader("X-Alternative-Locations"); |
- } |
- subscription.lastSuccess = subscription.lastDownload = Math.round(Date.now() / MILLISECONDS_IN_SECOND); |
- subscription.downloadStatus = "synchronize_ok"; |
- subscription.errors = 0; |
- var now = Math.round(((new Date(request.getResponseHeader("Date"))).getTime() || Date.now()) / MILLISECONDS_IN_SECOND); |
- var expires = Math.round((new Date(request.getResponseHeader("Expires"))).getTime() / MILLISECONDS_IN_SECOND) || 0; |
- var expirationInterval = expires ? expires - now : 0; |
- for (var _loopIndex26 = 0; _loopIndex26 < (newFilters || subscription.filters).length; ++_loopIndex26) |
- { |
- var filter = (newFilters || subscription.filters)[_loopIndex26]; |
- if (!(filter instanceof CommentFilter)) |
- { |
- continue; |
- } |
- var match = /\bExpires\s*(?::|after)\s*(\d+)\s*(h)?/i.exec(filter.text); |
- if (match) |
- { |
- var interval = parseInt(match[1], 10); |
- if (match[2]) |
- { |
- interval *= SECONDS_IN_HOUR; |
- } |
- else |
- { |
- interval *= SECONDS_IN_DAY; |
- } |
- if (interval > expirationInterval) |
- { |
- expirationInterval = interval; |
- } |
- } |
- } |
- expirationInterval = Math.min(Math.max(expirationInterval, MIN_EXPIRATION_INTERVAL), MAX_EXPIRATION_INTERVAL); |
- subscription.expires = subscription.lastDownload + expirationInterval * 2; |
- subscription.softExpiration = subscription.lastDownload + Math.round(expirationInterval * (Math.random() * 0.4 + 0.8)); |
- if (newFilters) |
- { |
- var fixedTitle = false; |
- for (var i = 0; i < newFilters.length; i++) |
- { |
- var filter = newFilters[i]; |
- if (!(filter instanceof CommentFilter)) |
- { |
- continue; |
- } |
- var match = /^!\s*(\w+)\s*:\s*(.*)/.exec(filter.text); |
- if (match) |
- { |
- var keyword = match[1].toLowerCase(); |
- var value = match[2]; |
- var known = true; |
- if (keyword == "redirect") |
- { |
- if (isBaseLocation && value != url) |
- { |
- subscription.nextURL = value; |
- } |
- } |
- else if (keyword == "homepage") |
- { |
- var uri = Utils.makeURI(value); |
- if (uri && (uri.scheme == "http" || uri.scheme == "https")) |
- { |
- subscription.homepage = uri.spec; |
- } |
- } |
- else if (keyword == "title") |
- { |
- if (value) |
- { |
- subscription.title = value; |
- fixedTitle = true; |
- } |
- } |
- else |
- { |
- known = false; |
- } |
- if (known) |
- { |
- newFilters.splice(i--, 1); |
- } |
- } |
- } |
- subscription.fixedTitle = fixedTitle; |
- } |
- if (isBaseLocation && newURL && newURL != url) |
- { |
- var listed = subscription.url in FilterStorage.knownSubscriptions; |
- if (listed) |
- { |
- FilterStorage.removeSubscription(subscription); |
- } |
- url = newURL; |
- var newSubscription = Subscription.fromURL(url); |
- for (var key in newSubscription) |
- { |
- delete newSubscription[key]; |
- } |
- for (var key in subscription) |
- { |
- newSubscription[key] = subscription[key]; |
- } |
- delete Subscription.knownSubscriptions[subscription.url]; |
- newSubscription.oldSubscription = subscription; |
- subscription = newSubscription; |
- subscription.url = url; |
- if (!(subscription.url in FilterStorage.knownSubscriptions) && listed) |
- { |
- FilterStorage.addSubscription(subscription); |
- } |
- } |
- if (newFilters) |
- { |
- FilterStorage.updateSubscriptionFilters(subscription, newFilters); |
- } |
- delete subscription.oldSubscription; |
- }, false); |
- executing[url] = true; |
- FilterNotifier.triggerListeners("subscription.downloadStatus", subscription); |
- try |
- { |
- request.send(null); |
- } |
- catch (e) |
- { |
- delete executing[url]; |
- errorCallback("synchronize_connection_error"); |
- return; |
- } |
- } |
- }; |
- Synchronizer.init(); |
- |
- function checkSubscriptions() |
- { |
- if (!Prefs.subscriptions_autoupdate) |
- { |
- return; |
- } |
- var time = Math.round(Date.now() / MILLISECONDS_IN_SECOND); |
- for (var _loopIndex27 = 0; _loopIndex27 < FilterStorage.subscriptions.length; ++_loopIndex27) |
- { |
- var subscription = FilterStorage.subscriptions[_loopIndex27]; |
- if (!(subscription instanceof DownloadableSubscription)) |
- { |
- continue; |
- } |
- if (subscription.lastCheck && time - subscription.lastCheck > MAX_ABSENSE_INTERVAL) |
- { |
- subscription.softExpiration += time - subscription.lastCheck; |
- } |
- subscription.lastCheck = time; |
- if (subscription.expires - time > MAX_EXPIRATION_INTERVAL) |
- { |
- subscription.expires = time + MAX_EXPIRATION_INTERVAL; |
- } |
- if (subscription.softExpiration - time > MAX_EXPIRATION_INTERVAL) |
- { |
- subscription.softExpiration = time + MAX_EXPIRATION_INTERVAL; |
- } |
- if (subscription.softExpiration > time && subscription.expires > time) |
- { |
- continue; |
- } |
- if (time - subscription.lastDownload >= MIN_EXPIRATION_INTERVAL) |
- { |
- Synchronizer.execute(subscription, false); |
- } |
- } |
- } |
- |
- function readFilters(subscription, text, errorCallback) |
- { |
- var lines = text.split(/[\r\n]+/); |
- var match = /\[Adblock(?:\s*Plus\s*([\d\.]+)?)?\]/i.exec(lines[0]); |
- if (!match) |
- { |
- errorCallback("synchronize_invalid_data"); |
- return null; |
- } |
- var minVersion = match[1]; |
- for (var i = 0; i < lines.length; i++) |
- { |
- var match = /!\s*checksum[\s\-:]+([\w\+\/]+)/i.exec(lines[i]); |
- if (match) |
- { |
- lines.splice(i, 1); |
- var checksum = Utils.generateChecksum(lines); |
- if (checksum && checksum != match[1]) |
- { |
- errorCallback("synchronize_checksum_mismatch"); |
- return null; |
- } |
- break; |
- } |
- } |
- delete subscription.requiredVersion; |
- delete subscription.upgradeRequired; |
- if (minVersion) |
- { |
- var addonVersion = require("info").addonVersion; |
- subscription.requiredVersion = minVersion; |
- if (Services.vc.compare(minVersion, addonVersion) > 0) |
- { |
- subscription.upgradeRequired = true; |
- } |
- } |
- lines.shift(); |
- var result = []; |
- for (var _loopIndex28 = 0; _loopIndex28 < lines.length; ++_loopIndex28) |
- { |
- var line = lines[_loopIndex28]; |
- line = Filter.normalize(line); |
- if (line) |
- { |
- result.push(Filter.fromText(line)); |
- } |
- } |
- return result; |
- } |
- |
- function setError(subscription, error, channelStatus, responseStatus, downloadURL, isBaseLocation, manual) |
- { |
- if (!isBaseLocation) |
- { |
- subscription.alternativeLocations = null; |
- } |
- try |
- { |
- Cu.reportError("Adblock Plus: Downloading filter subscription " + subscription.title + " failed (" + Utils.getString(error) + ")\n" + "Download address: " + downloadURL + "\n" + "Channel status: " + channelStatus + "\n" + "Server response: " + responseStatus); |
- } |
- catch (e){} |
- subscription.lastDownload = Math.round(Date.now() / MILLISECONDS_IN_SECOND); |
- subscription.downloadStatus = error; |
- if (!manual) |
- { |
- if (error == "synchronize_checksum_mismatch") |
- { |
- subscription.errors = 0; |
- } |
- else |
- { |
- subscription.errors++; |
- } |
- if (subscription.errors >= Prefs.subscriptions_fallbackerrors && /^https?:\/\//i.test(subscription.url)) |
- { |
- subscription.errors = 0; |
- var fallbackURL = Prefs.subscriptions_fallbackurl; |
- var addonVersion = require("info").addonVersion; |
- fallbackURL = fallbackURL.replace(/%VERSION%/g, encodeURIComponent(addonVersion)); |
- fallbackURL = fallbackURL.replace(/%SUBSCRIPTION%/g, encodeURIComponent(subscription.url)); |
- fallbackURL = fallbackURL.replace(/%URL%/g, encodeURIComponent(downloadURL)); |
- fallbackURL = fallbackURL.replace(/%ERROR%/g, encodeURIComponent(error)); |
- fallbackURL = fallbackURL.replace(/%CHANNELSTATUS%/g, encodeURIComponent(channelStatus)); |
- fallbackURL = fallbackURL.replace(/%RESPONSESTATUS%/g, encodeURIComponent(responseStatus)); |
- var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest); |
- request.mozBackgroundRequest = true; |
- request.open("GET", fallbackURL); |
- request.overrideMimeType("text/plain"); |
- request.channel.loadFlags = request.channel.loadFlags | request.channel.INHIBIT_CACHING | request.channel.VALIDATE_ALWAYS; |
- request.addEventListener("load", function(ev) |
- { |
- if (onShutdown.done) |
- { |
- return; |
- } |
- if (!(subscription.url in FilterStorage.knownSubscriptions)) |
- { |
- return; |
- } |
- var match = /^(\d+)(?:\s+(\S+))?$/.exec(request.responseText); |
- if (match && match[1] == "301" && match[2]) |
- { |
- subscription.nextURL = match[2]; |
- } |
- else if (match && match[1] == "410") |
- { |
- var data = "[Adblock]\n" + subscription.filters.map(function(f) |
- { |
- return f.text; |
- }).join("\n"); |
- var url = "data:text/plain," + encodeURIComponent(data); |
- var newSubscription = Subscription.fromURL(url); |
- newSubscription.title = subscription.title; |
- newSubscription.disabled = subscription.disabled; |
- FilterStorage.removeSubscription(subscription); |
- FilterStorage.addSubscription(newSubscription); |
- Synchronizer.execute(newSubscription); |
- } |
- }, false); |
- request.send(null); |
- } |
- } |
- } |
- return exports; |
-})(); |