Index: assets/js/start.js |
diff --git a/assets/js/start.js b/assets/js/start.js |
deleted file mode 100755 |
index 5408979828c8fcb4d4cb217bba6fa4cd958bcfcf..0000000000000000000000000000000000000000 |
--- a/assets/js/start.js |
+++ /dev/null |
@@ -1,603 +0,0 @@ |
-/* |
- * This file is part of Adblock Plus <http://adblockplus.org/>, |
- * Copyright (C) 2006-2014 Eyeo GmbH |
- * |
- * Adblock Plus is free software: you can redistribute it and/or modify |
- * it under the terms of the GNU General Public License version 3 as |
- * published by the Free Software Foundation. |
- * |
- * Adblock Plus is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
- * GNU General Public License for more details. |
- * |
- * You should have received a copy of the GNU General Public License |
- * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
- */ |
- |
-function removeTrailingDots(string) |
-{ |
- return string.replace(/\.+$/, ""); |
-} |
- |
-/** |
- * Checks whether a request is third party for the given document, uses |
- * information from the public suffix list to determine the effective domain |
- * name for the document. |
- */ |
-function isThirdParty(requestHost, documentHost) |
-{ |
- requestHost = removeTrailingDots(requestHost); |
- documentHost = removeTrailingDots(documentHost); |
- |
- // Extract domain name - leave IP addresses unchanged, otherwise leave only base domain |
- var documentDomain = getBaseDomain(documentHost); |
- if (requestHost.length > documentDomain.length) |
- return (requestHost.substr(requestHost.length - documentDomain.length - 1) != "." + documentDomain); |
- else |
- return (requestHost != documentDomain); |
-} |
- |
-function reportError(exp) |
-{ |
- Android.print("Error: " + exp); |
- if (typeof exp == "string") |
- { |
- Android.showToast(exp); |
- } |
- Android.print(exp.stack); |
-} |
- |
-function MatcherPatch() |
-{ |
- // Very ugly - we need to rewrite _checkEntryMatch() function to make sure |
- // it calls Filter.fromText() instead of assuming that the filter exists. |
- var origFunction = Matcher.prototype._checkEntryMatch.toString(); |
- var newFunction = origFunction.replace(/\bFilter\.knownFilters\[(.*?)\];/g, "Filter.fromText($1);"); |
- eval("Matcher.prototype._checkEntryMatch = " + newFunction); |
-} |
- |
-var window = this; |
- |
-var Components = |
-{ |
- interfaces: |
- { |
- nsIFile: {DIRECTORY_TYPE: 0}, |
- nsIFileURL: function() {}, |
- nsIFileInputStream: null, |
- nsIFileOutputStream: null, |
- nsIHttpChannel: function() {}, |
- nsIConverterInputStream: {DEFAULT_REPLACEMENT_CHARACTER: null}, |
- nsIConverterOutputStream: null, |
- nsIUnicharLineInputStream: null, |
- nsISafeOutputStream: null, |
- nsITimer: {TYPE_REPEATING_SLACK: 0}, |
- nsIInterfaceRequestor: null, |
- nsIChannelEventSink: null |
- }, |
- classes: |
- { |
- "@mozilla.org/network/file-input-stream;1": |
- { |
- createInstance: function() |
- { |
- return new FakeInputStream(); |
- } |
- }, |
- "@mozilla.org/network/file-output-stream;1": |
- { |
- createInstance: function() |
- { |
- return new FakeOutputStream(); |
- } |
- }, |
- "@mozilla.org/dom/json;1": |
- { |
- createInstance: function() { |
- return { |
- decodeFromStream: function(stream, encoding) |
- { |
- var line = {}; |
- var haveMore = true; |
- var s = new String(); |
- while (true) |
- { |
- if (haveMore) |
- haveMore = stream.readLine(line); |
- else |
- break; |
- s += line.value; |
- } |
- return JSON.parse(s); |
- }, |
- encodeToStream: function(stream, encoding, something, obj) |
- { |
- var s = JSON.stringify(obj); |
- stream.writeString(s); |
- } |
- } |
- } |
- }, |
- "@mozilla.org/timer;1": |
- { |
- createInstance: function() |
- { |
- return new FakeTimer(); |
- } |
- } |
- }, |
- results: {}, |
- utils: { |
- reportError: reportError |
- }, |
- manager: null, |
- ID: function() |
- { |
- return null; |
- }, |
- Constructor: function() |
- { |
- // This method is only used to get XMLHttpRequest constructor |
- return XMLHttpRequest; |
- } |
-}; |
-const Cc = Components.classes; |
-const Ci = Components.interfaces; |
-const Cr = Components.results; |
-const Cu = Components.utils; |
- |
-Cc["@mozilla.org/intl/converter-input-stream;1"] = Cc["@mozilla.org/network/file-input-stream;1"]; |
-Cc["@mozilla.org/network/safe-file-output-stream;1"] = Cc["@mozilla.org/intl/converter-output-stream;1"] = Cc["@mozilla.org/network/file-output-stream;1"]; |
- |
-var Prefs = |
-{ |
- patternsbackups: 5, |
- patternsbackupinterval: 24, |
- data_directory: _datapath, |
- savestats: false, |
- privateBrowsing: false, |
- get subscriptions_autoupdate() { return Android.canAutoupdate() }, |
- subscriptions_fallbackerrors: 5, |
- subscriptions_fallbackurl: "https://adblockplus.org/getSubscription?version=%VERSION%&url=%SUBSCRIPTION%&downloadURL=%URL%&error=%ERROR%&channelStatus=%CHANNELSTATUS%&responseStatus=%RESPONSESTATUS%", |
- addListener: function() {} |
-}; |
- |
-var Utils = |
-{ |
- systemPrincipal: null, |
- getString: function(id) |
- { |
- return id; |
- }, |
- getLineBreak: function() |
- { |
- return "\n"; |
- }, |
- resolveFilePath: function(path) |
- { |
- return new FakeFile(path); |
- }, |
- ioService: |
- { |
- newURI: function(uri) |
- { |
- if (!uri.length || uri[0] == "~") |
- throw new Error("Invalid URI"); |
- |
- /^([^:\/]*)/.test(uri); |
- var scheme = RegExp.$1.toLowerCase(); |
- |
- return {scheme: scheme, spec: uri}; |
- } |
- }, |
- observerService: |
- { |
- addObserver: function() {}, |
- removeObserver: function() {} |
- }, |
- chromeRegistry: |
- { |
- convertChromeURL: function() {} |
- }, |
- runAsync: function(callback, thisPtr) |
- { |
- var params = Array.prototype.slice.call(arguments, 2); |
- Android.setTimeout(function() |
- { |
- callback.apply(thisPtr, params); |
- }, 0); |
- }, |
- addonVersion: _version, |
- platformVersion: "10.0", |
- get appLocale() |
- { |
- Android.getLocale(); |
- }, |
- generateChecksum: function(lines) |
- { |
- // We cannot calculate MD5 checksums yet :-( |
- return null; |
- }, |
- makeURI: function(url) |
- { |
- return Utils.ioService.newURI(url); |
- }, |
- checkLocalePrefixMatch: function(prefixes) |
- { |
- if (!prefixes) |
- return null; |
- |
- var list = prefixes.split(","); |
- for (var i = 0; i < list.length; i++) |
- if (new RegExp("^" + list[i] + "\\b").test(Utils.appLocale)) |
- return list[i]; |
- |
- return null; |
- }, |
- versionComparator: |
- { |
- compare: function(v1, v2) |
- { |
- var parts1 = v1.split("."); |
- var parts2 = v2.split("."); |
- for (var i = 0; i < Math.max(parts1.length, parts2.length); i++) |
- { |
- // TODO: Handle non-integer version parts properly |
- var part1 = parseInt(i < parts1.length ? parts1[i] : "0"); |
- var part2 = parseInt(i < parts2.length ? parts2[i] : "0"); |
- if (part1 != part2) |
- return part1 - part2; |
- } |
- return 0; |
- } |
- } |
-}; |
- |
-var XPCOMUtils = |
-{ |
- generateQI: function() {} |
-}; |
- |
-function FakeFile(path) |
-{ |
- this.path = path; |
-} |
-FakeFile.prototype = |
-{ |
- get leafName() |
- { |
- return this.path; |
- }, |
- set leafName(value) |
- { |
- this.path = value; |
- }, |
- append: function(path) |
- { |
- this.path += _separator + path; |
- }, |
- clone: function() |
- { |
- return new FakeFile(this.path); |
- }, |
- exists: function() |
- { |
- return Android.fileExists(this.path); |
- }, |
- remove: function() |
- { |
- Android.fileRemove(this.path); |
- }, |
- moveTo: function(parent, newPath) |
- { |
- Android.fileRename(this.path, newPath); |
- }, |
- get lastModifiedTime() |
- { |
- return Android.fileLastModified(this.path); |
- }, |
- get parent() |
- { |
- return {create: function() {}}; |
- }, |
- normalize: function() {} |
-}; |
- |
-function FakeInputStream() |
-{ |
-} |
-FakeInputStream.prototype = |
-{ |
- lines: null, |
- currentIndex: 0, |
- |
- init: function(file) |
- { |
- if (file instanceof FakeInputStream) |
- this.lines = file.lines; |
- else |
- this.lines = Android.fileRead(file.path).split(/\n/); |
- }, |
- readLine: function(line) |
- { |
- if (this.currentIndex < this.lines.length) |
- line.value = this.lines[this.currentIndex]; |
- this.currentIndex++; |
- return (this.currentIndex < this.lines.length); |
- }, |
- close: function() {}, |
- QueryInterface: function() |
- { |
- return this; |
- } |
-}; |
- |
-function FakeOutputStream() |
-{ |
-} |
-FakeOutputStream.prototype = |
-{ |
- file: null, |
- buffer: null, |
- |
- init: function(file) |
- { |
- if (file instanceof FakeOutputStream) |
- { |
- this.file = file.file; |
- this.buffer = file.buffer; |
- } |
- else |
- { |
- this.file = file; |
- this.buffer = []; |
- } |
- }, |
- writeString: function(string) |
- { |
- this.buffer.push(string); |
- }, |
- close: function() |
- { |
- Android.fileWrite(this.file.path, this.buffer.join("")); |
- }, |
- finish: function() |
- { |
- this.close(); |
- }, |
- flush: function() {}, |
- QueryInterface: function() |
- { |
- return this; |
- } |
-}; |
- |
-function FakeTimer() |
-{ |
-} |
-FakeTimer.prototype = |
-{ |
- delay: 0, |
- callback: null, |
- initWithCallback: function(callback, delay) |
- { |
- this.callback = callback; |
- this.delay = delay; |
- this.scheduleTimeout(); |
- }, |
- scheduleTimeout: function() |
- { |
- var me = this; |
- Android.setTimeout(function() |
- { |
- try |
- { |
- me.callback(); |
- } |
- catch(e) |
- { |
- reportError(e); |
- } |
- me.scheduleTimeout(); |
- }, this.delay); |
- } |
-}; |
- |
-function ElemHidePatch() |
-{ |
- /** |
- * Returns a list of selectors to be applied on a particular domain. With |
- * specificOnly parameter set to true only the rules listing specific domains |
- * will be considered. |
- */ |
- ElemHide.getSelectorsForDomain = function(/**String*/ domain, /**Boolean*/ specificOnly) |
- { |
- var result = []; |
- for (var key in filterByKey) |
- { |
- var filter = Filter.knownFilters[filterByKey[key]]; |
- if (specificOnly && (!filter.domains || filter.domains[""])) |
- continue; |
- |
- if (filter.isActiveOnDomain(domain)) |
- result.push(filter.selector); |
- } |
- if (result.length) |
- return "<style type=\"text/css\">" + result.join(',\r\n') + " { display: none !important }</style>"; |
- else |
- return null; |
- }; |
- |
- ElemHide.init = function() {}; |
-} |
- |
-/** |
- * Removes all subscriptions from storage. |
- */ |
-function clearSubscriptions() |
-{ |
- while (FilterStorage.subscriptions.length) |
- FilterStorage.removeSubscription(FilterStorage.subscriptions[0]); |
-} |
- |
-/** |
- * Adds selected subscription to storage. |
- */ |
-function addSubscription(jsonSub) |
-{ |
- var newSub = JSON.parse(jsonSub); |
- |
- var subscription = Subscription.fromURL(newSub["url"]); |
- if (subscription) |
- { |
- subscription.disabled = false; |
- subscription.title = newSub["title"]; |
- subscription.homepage = newSub["homepage"]; |
- if (subscription instanceof DownloadableSubscription && !subscription.lastDownload) |
- { |
- Synchronizer.execute(subscription); |
- } |
- FilterStorage.addSubscription(subscription); |
- FilterStorage.saveToDisk(); |
- } |
-} |
- |
-/** |
- * Forces subscriptions refresh. |
- */ |
-function refreshSubscriptions() |
-{ |
- for (var i = 0; i < FilterStorage.subscriptions.length; i++) |
- { |
- var subscription = FilterStorage.subscriptions[i]; |
- if (subscription instanceof DownloadableSubscription) |
- Synchronizer.execute(subscription, true, true); |
- } |
-} |
- |
-/** |
- * Verifies that subscriptions are loaded and returns flag of subscription presence. |
- */ |
-function verifySubscriptions() |
-{ |
- var hasSubscriptions = false; |
- for (var i = 0; i < FilterStorage.subscriptions.length; i++) |
- { |
- var subscription = FilterStorage.subscriptions[i]; |
- if (subscription instanceof DownloadableSubscription) |
- { |
- hasSubscriptions = true; |
- updateSubscriptionStatus(subscription); |
- if (!subscription.lastDownload) |
- { |
- Synchronizer.execute(subscription); |
- } |
- } |
- } |
- return hasSubscriptions; |
-} |
- |
-/** |
- * Callback for subscription status updates. |
- */ |
-function updateSubscriptionStatus(subscription) |
-{ |
- var status = ""; |
- var time = 0; |
- if (Synchronizer.isExecuting(subscription.url)) |
- status = "synchronize_in_progress"; |
- else if (subscription.downloadStatus && subscription.downloadStatus != "synchronize_ok") |
- status = subscription.downloadStatus; |
- else if (subscription.lastDownload > 0) |
- { |
- time = subscription.lastDownload * 1000; |
- status = "synchronize_last_at"; |
- } |
- else |
- status = "synchronize_never"; |
- |
- Android.setStatus(status, time); |
-} |
- |
-function onFilterChange(action, subscription, param1, param2) |
-{ |
- switch (action) |
- { |
- case "subscription.lastDownload": |
- case "subscription.downloadStatus": |
- updateSubscriptionStatus(subscription); |
- break; |
- } |
-} |
- |
-function startInteractive() |
-{ |
- FilterNotifier.addListener(onFilterChange); |
-} |
- |
-function stopInteractive() |
-{ |
- FilterNotifier.removeListener(onFilterChange); |
-} |
- |
-function matchesAny(url, query, reqHost, refHost, accept) |
-{ |
- var contentType = null; |
- var thirdParty = true; |
- |
- if (accept != "") |
- { |
- if (accept.indexOf("text/css") != -1) |
- contentType = "STYLESHEET"; |
- else if (accept.indexOf("image/*" != -1)) |
- contentType = "IMAGE"; |
- } |
- |
- if (contentType == null) |
- { |
- var lurl = url.toLowerCase(); |
- if (/\.js$/.test(lurl)) |
- contentType = "SCRIPT"; |
- else if (/\.css$/.test(lurl)) |
- contentType = "STYLESHEET"; |
- else if (/\.(?:gif|png|jpe?g|bmp|ico)$/.test(lurl)) |
- contentType = "IMAGE"; |
- else if (/\.(?:ttf|woff)$/.test(lurl)) |
- contentType = "FONT"; |
- } |
- if (contentType == null) |
- contentType = "OTHER"; |
- |
- if (refHost != "") |
- thirdParty = isThirdParty(reqHost, refHost); |
- |
- if (query != "") |
- url = url + "?" + query; |
- |
- var filter = defaultMatcher.matchesAny(url, contentType, null, thirdParty); |
- |
- // hack: if there is no referrer block only if filter is domain-specific |
- // (to re-enable in-app ads blocking, proposed on 12.11.2012 Monday meeting) |
- if (filter != null && refHost == "" && filter.text.indexOf("||") != 0) |
- filter = null; |
- |
- return (filter != null && !(filter instanceof WhitelistFilter)); |
-} |
- |
-Android.load("XMLHttpRequest.jsm"); |
-Android.load("FilterNotifier.jsm"); |
-Android.load("FilterClasses.jsm"); |
-Android.load("SubscriptionClasses.jsm"); |
-Android.load("FilterStorage.jsm"); |
-Android.load("FilterListener.jsm"); |
-Android.load("Matcher.jsm"); |
-Android.load("ElemHide.jsm"); |
-Android.load("Synchronizer.jsm"); |
- |
-FilterListener.startup(); |
-Synchronizer.startup(); |
- |
-Android.load("publicSuffixList.js"); |
-Android.load("punycode.js"); |
-Android.load("basedomain.js"); |