OLD | NEW |
| (Empty) |
1 /* | |
2 * This file is part of Adblock Plus <http://adblockplus.org/>, | |
3 * Copyright (C) 2006-2014 Eyeo GmbH | |
4 * | |
5 * Adblock Plus is free software: you can redistribute it and/or modify | |
6 * it under the terms of the GNU General Public License version 3 as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * Adblock Plus is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License | |
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | |
16 */ | |
17 | |
18 | |
19 // | |
20 // This file has been generated automatically from Adblock Plus source code | |
21 // | |
22 | |
23 (function (_patchFunc2) { | |
24 function Filter(text) { | |
25 this.text = text; | |
26 this.subscriptions = []; | |
27 } | |
28 Filter.prototype = { | |
29 text: null, | |
30 subscriptions: null, | |
31 serialize: function (buffer) { | |
32 buffer.push("[Filter]"); | |
33 buffer.push("text=" + this.text); | |
34 } | |
35 , | |
36 toString: function () { | |
37 return this.text; | |
38 } | |
39 | |
40 }; | |
41 Filter.knownFilters = { | |
42 __proto__: null | |
43 }; | |
44 Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^
*]?=[^\(\)"]*)?\))*)|#([^{}]+))$/; | |
45 Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:
=[^,\s]+)?)*)?$/; | |
46 Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)
$/; | |
47 Filter.fromText = (function (text) { | |
48 if (text in Filter.knownFilters) | |
49 return Filter.knownFilters[text]; | |
50 if (!/\S/.test(text)) | |
51 return null; | |
52 var ret; | |
53 if (Filter.elemhideRegExp.test(text)) | |
54 ret = ElemHideFilter.fromText(text, RegExp["$1"], RegExp["$2"], RegExp["$3
"], RegExp["$4"]); | |
55 else | |
56 if (text[0] == "!") | |
57 ret = new CommentFilter(text); | |
58 else | |
59 ret = RegExpFilter.fromText(text); | |
60 Filter.knownFilters[ret.text] = ret; | |
61 return ret; | |
62 } | |
63 ); | |
64 Filter.fromObject = (function (obj) { | |
65 var ret = Filter.fromText(obj.text); | |
66 if (ret instanceof ActiveFilter) { | |
67 if ("disabled" in obj) | |
68 ret._disabled = (obj.disabled == "true"); | |
69 if ("hitCount" in obj) | |
70 ret._hitCount = parseInt(obj.hitCount) || 0; | |
71 if ("lastHit" in obj) | |
72 ret._lastHit = parseInt(obj.lastHit) || 0; | |
73 } | |
74 return ret; | |
75 } | |
76 ); | |
77 Filter.normalize = (function (text) { | |
78 if (!text) | |
79 return text; | |
80 text = text.replace(/[^\S ]/g, ""); | |
81 if (/^\s*!/.test(text)) { | |
82 return text.replace(/^\s+/, "").replace(/\s+$/, ""); | |
83 } | |
84 else | |
85 if (Filter.elemhideRegExp.test(text)) { | |
86 /^(.*?)(#+)(.*)$/.test(text); | |
87 var domain = RegExp["$1"]; | |
88 var separator = RegExp["$2"]; | |
89 var selector = RegExp["$3"]; | |
90 return domain.replace(/\s/g, "") + separator + selector.replace(/^\s+/,
"").replace(/\s+$/, ""); | |
91 } | |
92 else | |
93 return text.replace(/\s/g, ""); | |
94 } | |
95 ); | |
96 function InvalidFilter(text, reason) { | |
97 Filter.call(this, text); | |
98 this.reason = reason; | |
99 } | |
100 InvalidFilter.prototype = { | |
101 __proto__: Filter.prototype, | |
102 reason: null, | |
103 serialize: function (buffer) {} | |
104 }; | |
105 function CommentFilter(text) { | |
106 Filter.call(this, text); | |
107 } | |
108 CommentFilter.prototype = { | |
109 __proto__: Filter.prototype, | |
110 serialize: function (buffer) {} | |
111 }; | |
112 function ActiveFilter(text, domains) { | |
113 Filter.call(this, text); | |
114 if (domains) { | |
115 this.domainSource = domains; | |
116 this.__defineGetter__("domains", this._getDomains); | |
117 } | |
118 } | |
119 ActiveFilter.prototype = { | |
120 __proto__: Filter.prototype, | |
121 _disabled: false, | |
122 _hitCount: 0, | |
123 _lastHit: 0, | |
124 get disabled() { | |
125 return this._disabled; | |
126 }, | |
127 set disabled(value) { | |
128 if (value != this._disabled) { | |
129 var oldValue = this._disabled; | |
130 this._disabled = value; | |
131 FilterNotifier.triggerListeners("filter.disabled", this, value, oldValue
); | |
132 } | |
133 return this._disabled; | |
134 } | |
135 , | |
136 get hitCount() { | |
137 return this._hitCount; | |
138 }, | |
139 set hitCount(value) { | |
140 if (value != this._hitCount) { | |
141 var oldValue = this._hitCount; | |
142 this._hitCount = value; | |
143 FilterNotifier.triggerListeners("filter.hitCount", this, value, oldValue
); | |
144 } | |
145 return this._hitCount; | |
146 } | |
147 , | |
148 get lastHit() { | |
149 return this._lastHit; | |
150 }, | |
151 set lastHit(value) { | |
152 if (value != this._lastHit) { | |
153 var oldValue = this._lastHit; | |
154 this._lastHit = value; | |
155 FilterNotifier.triggerListeners("filter.lastHit", this, value, oldValue)
; | |
156 } | |
157 return this._lastHit; | |
158 } | |
159 , | |
160 domainSource: null, | |
161 domainSeparator: null, | |
162 domains: null, | |
163 _getDomains: function () { | |
164 this._generateDomains(); | |
165 return this.domains; | |
166 } | |
167 , | |
168 _generateDomains: function () { | |
169 var domains = this.domainSource.split(this.domainSeparator); | |
170 delete this.domainSource; | |
171 delete this.domains; | |
172 if (domains.length == 1 && domains[0][0] != "~") { | |
173 this.domains = { | |
174 __proto__: null, | |
175 "": false | |
176 }; | |
177 this.domains[domains[0]] = true; | |
178 } | |
179 else { | |
180 var hasIncludes = false; | |
181 for (var i = 0; | |
182 i < domains.length; i++) { | |
183 var domain = domains[i]; | |
184 if (domain == "") | |
185 continue; | |
186 var include; | |
187 if (domain[0] == "~") { | |
188 include = false; | |
189 domain = domain.substr(1); | |
190 } | |
191 else { | |
192 include = true; | |
193 hasIncludes = true; | |
194 } | |
195 if (!this.domains) | |
196 this.domains = { | |
197 __proto__: null | |
198 }; | |
199 this.domains[domain] = include; | |
200 } | |
201 this.domains[""] = !hasIncludes; | |
202 } | |
203 } | |
204 , | |
205 isActiveOnDomain: function (docDomain) { | |
206 if (!this.domains) | |
207 return true; | |
208 if (!docDomain) | |
209 return this.domains[""]; | |
210 docDomain = docDomain.replace(/\.+$/, "").toUpperCase(); | |
211 while (true) { | |
212 if (docDomain in this.domains) | |
213 return this.domains[docDomain]; | |
214 var nextDot = docDomain.indexOf("."); | |
215 if (nextDot < 0) | |
216 break; | |
217 docDomain = docDomain.substr(nextDot + 1); | |
218 } | |
219 return this.domains[""]; | |
220 } | |
221 , | |
222 isActiveOnlyOnDomain: function (docDomain) { | |
223 if (!docDomain || !this.domains || this.domains[""]) | |
224 return false; | |
225 docDomain = docDomain.replace(/\.+$/, "").toUpperCase(); | |
226 for (var domain in this.domains) | |
227 if (this.domains[domain] && domain != docDomain && (domain.length <= doc
Domain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.le
ngth - 1)) | |
228 return false; | |
229 return true; | |
230 } | |
231 , | |
232 serialize: function (buffer) { | |
233 if (this._disabled || this._hitCount || this._lastHit) { | |
234 Filter.prototype.serialize.call(this, buffer); | |
235 if (this._disabled) | |
236 buffer.push("disabled=true"); | |
237 if (this._hitCount) | |
238 buffer.push("hitCount=" + this._hitCount); | |
239 if (this._lastHit) | |
240 buffer.push("lastHit=" + this._lastHit); | |
241 } | |
242 } | |
243 | |
244 }; | |
245 function RegExpFilter(text, regexpSource, contentType, matchCase, domains, thi
rdParty) { | |
246 ActiveFilter.call(this, text, domains); | |
247 if (contentType != null) | |
248 this.contentType = contentType; | |
249 if (matchCase) | |
250 this.matchCase = matchCase; | |
251 if (thirdParty != null) | |
252 this.thirdParty = thirdParty; | |
253 if (regexpSource.length >= 2 && regexpSource[0] == "/" && regexpSource[regex
pSource.length - 1] == "/") { | |
254 this.regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2),
this.matchCase ? "" : "i"); | |
255 } | |
256 else { | |
257 this.regexpSource = regexpSource; | |
258 this.__defineGetter__("regexp", this._generateRegExp); | |
259 } | |
260 } | |
261 RegExpFilter.prototype = { | |
262 __proto__: ActiveFilter.prototype, | |
263 domainSeparator: "|", | |
264 regexpSource: null, | |
265 regexp: null, | |
266 contentType: 2147483647, | |
267 matchCase: false, | |
268 thirdParty: null, | |
269 _generateRegExp: function () { | |
270 var source = this.regexpSource.replace(/\*+/g, "*"); | |
271 if (source[0] == "*") | |
272 source = source.substr(1); | |
273 var pos = source.length - 1; | |
274 if (pos >= 0 && source[pos] == "*") | |
275 source = source.substr(0, pos); | |
276 source = source.replace(/\^\|$/, "^").replace(/\W/g, "\\$&").replace(/\\\*
/g, ".*").replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5
E\\x60\\x7B-\\x80]|$)").replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^.\\/]+\
\.)*?").replace(/^\\\|/, "^").replace(/\\\|$/, "$"); | |
277 var regexp = new RegExp(source, this.matchCase ? "" : "i"); | |
278 delete this.regexp; | |
279 delete this.regexpSource; | |
280 return (this.regexp = regexp); | |
281 } | |
282 , | |
283 matches: function (location, contentType, docDomain, thirdParty) { | |
284 if (this.regexp.test(location) && (RegExpFilter.typeMap[contentType] & thi
s.contentType) != 0 && (this.thirdParty == null || this.thirdParty == thirdParty
) && this.isActiveOnDomain(docDomain)) { | |
285 return true; | |
286 } | |
287 return false; | |
288 } | |
289 | |
290 }; | |
291 RegExpFilter.fromText = (function (text) { | |
292 var blocking = true; | |
293 var origText = text; | |
294 if (text.indexOf("@@") == 0) { | |
295 blocking = false; | |
296 text = text.substr(2); | |
297 } | |
298 var contentType = null; | |
299 var matchCase = null; | |
300 var domains = null; | |
301 var siteKeys = null; | |
302 var thirdParty = null; | |
303 var collapse = null; | |
304 var options; | |
305 if (Filter.optionsRegExp.test(text)) { | |
306 options = RegExp["$1"].toUpperCase().split(","); | |
307 text = RegExp.leftContext; | |
308 for (var _loopIndex0 = 0; | |
309 _loopIndex0 < options.length; ++ _loopIndex0) { | |
310 var option = options[_loopIndex0]; | |
311 var value = null; | |
312 var separatorIndex = option.indexOf("="); | |
313 if (separatorIndex >= 0) { | |
314 value = option.substr(separatorIndex + 1); | |
315 option = option.substr(0, separatorIndex); | |
316 } | |
317 option = option.replace(/-/, "_"); | |
318 if (option in RegExpFilter.typeMap) { | |
319 if (contentType == null) | |
320 contentType = 0; | |
321 contentType |= RegExpFilter.typeMap[option]; | |
322 } | |
323 else | |
324 if (option[0] == "~" && option.substr(1) in RegExpFilter.typeMap) { | |
325 if (contentType == null) | |
326 contentType = RegExpFilter.prototype.contentType; | |
327 contentType &= ~RegExpFilter.typeMap[option.substr(1)]; | |
328 } | |
329 else | |
330 if (option == "MATCH_CASE") | |
331 matchCase = true; | |
332 else | |
333 if (option == "DOMAIN" && typeof value != "undefined") | |
334 domains = value; | |
335 else | |
336 if (option == "THIRD_PARTY") | |
337 thirdParty = true; | |
338 else | |
339 if (option == "~THIRD_PARTY") | |
340 thirdParty = false; | |
341 else | |
342 if (option == "COLLAPSE") | |
343 collapse = true; | |
344 else | |
345 if (option == "~COLLAPSE") | |
346 collapse = false; | |
347 else | |
348 if (option == "SITEKEY" && typeof value != "undefined") | |
349 siteKeys = value.split(/\|/); | |
350 } | |
351 } | |
352 if (!blocking && (contentType == null || (contentType & RegExpFilter.typeMap
.DOCUMENT)) && (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.
test(text)) { | |
353 if (contentType == null) | |
354 contentType = RegExpFilter.prototype.contentType; | |
355 contentType &= ~RegExpFilter.typeMap.DOCUMENT; | |
356 } | |
357 if (!blocking && siteKeys) | |
358 contentType = RegExpFilter.typeMap.DOCUMENT; | |
359 try { | |
360 if (blocking) | |
361 return new BlockingFilter(origText, text, contentType, matchCase, domain
s, thirdParty, collapse); | |
362 else | |
363 return new WhitelistFilter(origText, text, contentType, matchCase, domai
ns, thirdParty, siteKeys); | |
364 } | |
365 catch (e){ | |
366 return new InvalidFilter(text, e); | |
367 } | |
368 } | |
369 ); | |
370 RegExpFilter.typeMap = { | |
371 OTHER: 1, | |
372 SCRIPT: 2, | |
373 IMAGE: 4, | |
374 STYLESHEET: 8, | |
375 OBJECT: 16, | |
376 SUBDOCUMENT: 32, | |
377 DOCUMENT: 64, | |
378 XBL: 1, | |
379 PING: 1, | |
380 XMLHTTPREQUEST: 2048, | |
381 OBJECT_SUBREQUEST: 4096, | |
382 DTD: 1, | |
383 MEDIA: 16384, | |
384 FONT: 32768, | |
385 BACKGROUND: 4, | |
386 POPUP: 268435456, | |
387 DONOTTRACK: 536870912, | |
388 ELEMHIDE: 1073741824 | |
389 }; | |
390 RegExpFilter.prototype.contentType &= ~(RegExpFilter.typeMap.ELEMHIDE | RegExp
Filter.typeMap.DONOTTRACK | RegExpFilter.typeMap.POPUP); | |
391 function BlockingFilter(text, regexpSource, contentType, matchCase, domains, t
hirdParty, collapse) { | |
392 RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains,
thirdParty); | |
393 this.collapse = collapse; | |
394 } | |
395 BlockingFilter.prototype = { | |
396 __proto__: RegExpFilter.prototype, | |
397 collapse: null | |
398 }; | |
399 function WhitelistFilter(text, regexpSource, contentType, matchCase, domains,
thirdParty, siteKeys) { | |
400 RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains,
thirdParty); | |
401 if (siteKeys != null) | |
402 this.siteKeys = siteKeys; | |
403 } | |
404 WhitelistFilter.prototype = { | |
405 __proto__: RegExpFilter.prototype, | |
406 siteKeys: null | |
407 }; | |
408 function ElemHideFilter(text, domains, selector) { | |
409 ActiveFilter.call(this, text, domains ? domains.toUpperCase() : null); | |
410 if (domains) | |
411 this.selectorDomain = domains.replace(/,~[^,]+/g, "").replace(/^~[^,]+,?/,
"").toLowerCase(); | |
412 this.selector = selector; | |
413 } | |
414 ElemHideFilter.prototype = { | |
415 __proto__: ActiveFilter.prototype, | |
416 domainSeparator: ",", | |
417 selectorDomain: null, | |
418 selector: null | |
419 }; | |
420 ElemHideFilter.fromText = (function (text, domain, tagName, attrRules, selecto
r) { | |
421 if (!selector) { | |
422 if (tagName == "*") | |
423 tagName = ""; | |
424 var id = null; | |
425 var additional = ""; | |
426 if (attrRules) { | |
427 attrRules = attrRules.match(/\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\)/g); | |
428 for (var _loopIndex1 = 0; | |
429 _loopIndex1 < attrRules.length; ++ _loopIndex1) { | |
430 var rule = attrRules[_loopIndex1]; | |
431 rule = rule.substr(1, rule.length - 2); | |
432 var separatorPos = rule.indexOf("="); | |
433 if (separatorPos > 0) { | |
434 rule = rule.replace(/=/, "=\"") + "\""; | |
435 additional += "[" + rule + "]"; | |
436 } | |
437 else { | |
438 if (id) | |
439 return new InvalidFilter(text, Utils.getString("filter_elemhide_du
plicate_id")); | |
440 else | |
441 id = rule; | |
442 } | |
443 } | |
444 } | |
445 if (id) | |
446 selector = tagName + "." + id + additional + "," + tagName + "#" + id +
additional; | |
447 else | |
448 if (tagName || additional) | |
449 selector = tagName + additional; | |
450 else | |
451 return new InvalidFilter(text, Utils.getString("filter_elemhide_nocrit
eria")); | |
452 } | |
453 return new ElemHideFilter(text, domain, selector); | |
454 } | |
455 ); | |
456 if (typeof _patchFunc2 != "undefined") | |
457 eval("(" + _patchFunc2.toString() + ")()"); | |
458 window.Filter = Filter; | |
459 window.InvalidFilter = InvalidFilter; | |
460 window.CommentFilter = CommentFilter; | |
461 window.ActiveFilter = ActiveFilter; | |
462 window.RegExpFilter = RegExpFilter; | |
463 window.BlockingFilter = BlockingFilter; | |
464 window.WhitelistFilter = WhitelistFilter; | |
465 window.ElemHideFilter = ElemHideFilter; | |
466 } | |
467 )(window.FilterClassesPatch); | |
OLD | NEW |