Index: lib/synchronizer.js |
=================================================================== |
--- a/lib/synchronizer.js |
+++ b/lib/synchronizer.js |
@@ -19,17 +19,16 @@ |
/** |
* @fileOverview Manages synchronization of filter subscriptions. |
*/ |
const {Downloader, Downloadable, |
MILLIS_IN_SECOND, MILLIS_IN_MINUTE, |
MILLIS_IN_HOUR, MILLIS_IN_DAY} = require("downloader"); |
-const {Filter} = require("filterClasses"); |
const {FilterStorage} = require("filterStorage"); |
const {FilterNotifier} = require("filterNotifier"); |
const {Prefs} = require("prefs"); |
const {Subscription, DownloadableSubscription} = require("subscriptionClasses"); |
const {Utils} = require("utils"); |
const INITIAL_DELAY = 1 * MILLIS_IN_MINUTE; |
const CHECK_INTERVAL = 1 * MILLIS_IN_HOUR; |
@@ -148,50 +147,48 @@ |
redirectCallback) |
{ |
let lines = responseText.split(/[\r\n]+/); |
let headerMatch = /\[Adblock(?:\s*Plus\s*([\d.]+)?)?\]/i.exec(lines[0]); |
if (!headerMatch) |
return errorCallback("synchronize_invalid_data"); |
let minVersion = headerMatch[1]; |
+ let parser = subscription.parseDownload(); |
+ |
// Don't remove parameter comments immediately but add them to a list first, |
// they need to be considered in the checksum calculation. |
- let remove = []; |
- let params = { |
- redirect: null, |
- homepage: null, |
- title: null, |
- version: null, |
- expires: null |
- }; |
for (let i = 0; i < lines.length; i++) |
{ |
let match = /^\s*!\s*(\w+)\s*:\s*(.*)/.exec(lines[i]); |
if (match) |
{ |
let keyword = match[1].toLowerCase(); |
let value = match[2]; |
- if (keyword in params) |
- { |
- params[keyword] = value; |
- remove.push(i); |
- } |
- else if (keyword == "checksum") |
+ if (keyword == "checksum") |
{ |
lines.splice(i--, 1); |
let checksum = Utils.generateChecksum(lines); |
if (checksum && checksum != value.replace(/=+$/, "")) |
return errorCallback("synchronize_checksum_mismatch"); |
} |
} |
} |
- if (params.redirect) |
- return redirectCallback(params.redirect); |
+ // Process filters |
+ lines.shift(); |
+ for (let line of lines) |
+ parser.process(line); |
+ |
+ if (parser.redirect) |
+ { |
+ let {redirect} = parser; |
+ parser.delete(); |
+ return redirectCallback(redirect); |
+ } |
// Handle redirects |
let subscription = Subscription.fromURL(downloadable.redirectURL || |
downloadable.url); |
if (downloadable.redirectURL && |
downloadable.redirectURL != downloadable.url) |
{ |
let oldSubscription = Subscription.fromURL(downloadable.url); |
@@ -212,84 +209,51 @@ |
// The download actually succeeded |
subscription.lastSuccess = subscription.lastDownload = Math.round( |
Date.now() / MILLIS_IN_SECOND |
); |
subscription.downloadStatus = "synchronize_ok"; |
subscription.downloadCount = downloadable.downloadCount; |
subscription.errors = 0; |
- // Remove lines containing parameters |
- for (let i = remove.length - 1; i >= 0; i--) |
- lines.splice(remove[i], 1); |
- |
// Process parameters |
- if (params.homepage) |
+ if (parser.homepage) |
{ |
let url; |
try |
{ |
- url = new URL(params.homepage); |
+ url = new URL(parser.homepage); |
} |
catch (e) |
{ |
url = null; |
} |
if (url && (url.protocol == "http:" || url.protocol == "https:")) |
subscription.homepage = url.href; |
} |
- if (params.title) |
- { |
- subscription.title = params.title; |
- subscription.fixedTitle = true; |
- } |
+ if (minVersion) |
+ subscription.requiredVersion = minVersion; |
else |
- subscription.fixedTitle = false; |
- |
- subscription.version = (params.version ? parseInt(params.version, 10) : 0); |
+ delete subscription.requiredVersion; |
let expirationInterval = DEFAULT_EXPIRATION_INTERVAL; |
- if (params.expires) |
- { |
- let match = /^(\d+)\s*(h)?/.exec(params.expires); |
- if (match) |
- { |
- let interval = parseInt(match[1], 10); |
- if (match[2]) |
- expirationInterval = interval * MILLIS_IN_HOUR; |
- else |
- expirationInterval = interval * MILLIS_IN_DAY; |
- } |
- } |
+ let expiration = parser.finalize(); |
+ if (expiration != 0) |
+ expirationInterval = expiration; |
let [ |
softExpiration, |
hardExpiration |
] = downloader.processExpirationInterval(expirationInterval); |
subscription.softExpiration = Math.round(softExpiration / MILLIS_IN_SECOND); |
subscription.expires = Math.round(hardExpiration / MILLIS_IN_SECOND); |
- if (minVersion) |
- subscription.requiredVersion = minVersion; |
- else |
- delete subscription.requiredVersion; |
- |
- // Process filters |
- lines.shift(); |
- let filters = []; |
- for (let line of lines) |
- { |
- line = Filter.normalize(line); |
- if (line) |
- filters.push(Filter.fromText(line)); |
- } |
- |
- FilterStorage.updateSubscriptionFilters(subscription, filters); |
+ parser.delete(); |
return undefined; |
}, |
_onDownloadError(downloadable, downloadURL, error, channelStatus, |
responseStatus, redirectCallback) |
{ |
let subscription = Subscription.fromURL(downloadable.url); |