| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * This file is part of the Adblock Plus extension, | |
| 3 * Copyright (C) 2006-2012 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 // This file has been generated automatically from Adblock Plus for Firefox | |
| 20 // source code. DO NOT MODIFY, change the original source code instead. | |
| 21 // | |
| 22 // Relevant repositories: | |
| 23 // * https://hg.adblockplus.org/adblockplustests/ | |
| 24 // * https://hg.adblockplus.org/jshydra/ | |
| 25 // | |
| 26 | |
| 27 (function() | |
| 28 { | |
| 29 module("Domain restrictions", | |
| 30 { | |
| 31 setup: prepareFilterComponents, | |
| 32 teardown: restoreFilterComponents | |
| 33 }); | |
| 34 | |
| 35 function testActive(text, domain, expectedActive, expectedOnlyDomain) | |
| 36 { | |
| 37 var filter = Filter.fromText(text); | |
| 38 equal(filter.isActiveOnDomain(domain), expectedActive, text + " active on "
+ domain); | |
| 39 equal(filter.isActiveOnlyOnDomain(domain), expectedOnlyDomain, text + " only
active on " + domain); | |
| 40 } | |
| 41 test("Unrestricted blocking filters", function() | |
| 42 { | |
| 43 testActive("foo", null, true, false); | |
| 44 testActive("foo", "com", true, false); | |
| 45 testActive("foo", "example.com", true, false); | |
| 46 testActive("foo", "example.com.", true, false); | |
| 47 testActive("foo", "foo.example.com", true, false); | |
| 48 testActive("foo", "mple.com", true, false); | |
| 49 }); | |
| 50 test("Unrestricted hiding rules", function() | |
| 51 { | |
| 52 testActive("#foo", null, true, false); | |
| 53 testActive("#foo", "com", true, false); | |
| 54 testActive("#foo", "example.com", true, false); | |
| 55 testActive("#foo", "example.com.", true, false); | |
| 56 testActive("#foo", "foo.example.com", true, false); | |
| 57 testActive("#foo", "mple.com", true, false); | |
| 58 }); | |
| 59 test("Domain-restricted blocking filters", function() | |
| 60 { | |
| 61 testActive("foo$domain=example.com", null, false, false); | |
| 62 testActive("foo$domain=example.com", "com", false, true); | |
| 63 testActive("foo$domain=example.com", "example.com", true, true); | |
| 64 testActive("foo$domain=example.com", "example.com.", true, true); | |
| 65 testActive("foo$domain=example.com.", "example.com", true, true); | |
| 66 testActive("foo$domain=example.com.", "example.com.", true, true); | |
| 67 testActive("foo$domain=example.com", "foo.example.com", true, false); | |
| 68 testActive("foo$domain=example.com", "mple.com", false, false); | |
| 69 }); | |
| 70 test("Domain-restricted hiding rules", function() | |
| 71 { | |
| 72 testActive("example.com#foo", null, false, false); | |
| 73 testActive("example.com#foo", "com", false, true); | |
| 74 testActive("example.com#foo", "example.com", true, true); | |
| 75 testActive("example.com#foo", "example.com.", false, false); | |
| 76 testActive("example.com.#foo", "example.com", false, false); | |
| 77 testActive("example.com.#foo", "example.com.", true, true); | |
| 78 testActive("example.com#foo", "foo.example.com", true, false); | |
| 79 testActive("example.com#foo", "mple.com", false, false); | |
| 80 }); | |
| 81 test("Blocking filters restricted to domain and its subdomain", function() | |
| 82 { | |
| 83 testActive("foo$domain=example.com|foo.example.com", null, false, false); | |
| 84 testActive("foo$domain=example.com|foo.example.com", "com", false, true); | |
| 85 testActive("foo$domain=example.com|foo.example.com", "example.com", true, tr
ue); | |
| 86 testActive("foo$domain=example.com|foo.example.com", "example.com.", true, t
rue); | |
| 87 testActive("foo$domain=example.com|foo.example.com", "foo.example.com", true
, false); | |
| 88 testActive("foo$domain=example.com|foo.example.com", "mple.com", false, fals
e); | |
| 89 }); | |
| 90 test("Hiding rules restricted to domain and its subdomain", function() | |
| 91 { | |
| 92 testActive("example.com,foo.example.com#foo", null, false, false); | |
| 93 testActive("example.com,foo.example.com#foo", "com", false, true); | |
| 94 testActive("example.com,foo.example.com#foo", "example.com", true, true); | |
| 95 testActive("example.com,foo.example.com#foo", "example.com.", false, false); | |
| 96 testActive("example.com,foo.example.com#foo", "foo.example.com", true, false
); | |
| 97 testActive("example.com,foo.example.com#foo", "mple.com", false, false); | |
| 98 }); | |
| 99 test("Blocking filters with exception for a subdomain", function() | |
| 100 { | |
| 101 testActive("foo$domain=~foo.example.com", null, true, false); | |
| 102 testActive("foo$domain=~foo.example.com", "com", true, false); | |
| 103 testActive("foo$domain=~foo.example.com", "example.com", true, false); | |
| 104 testActive("foo$domain=~foo.example.com", "example.com.", true, false); | |
| 105 testActive("foo$domain=~foo.example.com", "foo.example.com", false, false); | |
| 106 testActive("foo$domain=~foo.example.com", "mple.com", true, false); | |
| 107 }); | |
| 108 test("Hiding rules with exception for a subdomain", function() | |
| 109 { | |
| 110 testActive("~foo.example.com#foo", null, true, false); | |
| 111 testActive("~foo.example.com#foo", "com", true, false); | |
| 112 testActive("~foo.example.com#foo", "example.com", true, false); | |
| 113 testActive("~foo.example.com#foo", "example.com.", true, false); | |
| 114 testActive("~foo.example.com#foo", "foo.example.com", false, false); | |
| 115 testActive("~foo.example.com#foo", "mple.com", true, false); | |
| 116 }); | |
| 117 test("Blocking filters for domain but not its subdomain", function() | |
| 118 { | |
| 119 testActive("foo$domain=example.com|~foo.example.com", null, false, false); | |
| 120 testActive("foo$domain=example.com|~foo.example.com", "com", false, true); | |
| 121 testActive("foo$domain=example.com|~foo.example.com", "example.com", true, t
rue); | |
| 122 testActive("foo$domain=example.com|~foo.example.com", "example.com.", true,
true); | |
| 123 testActive("foo$domain=example.com|~foo.example.com", "foo.example.com", fal
se, false); | |
| 124 testActive("foo$domain=example.com|~foo.example.com", "mple.com", false, fal
se); | |
| 125 }); | |
| 126 test("Hiding rules for domain but not its subdomain", function() | |
| 127 { | |
| 128 testActive("example.com,~foo.example.com#foo", null, false, false); | |
| 129 testActive("example.com,~foo.example.com#foo", "com", false, true); | |
| 130 testActive("example.com,~foo.example.com#foo", "example.com", true, true); | |
| 131 testActive("example.com,~foo.example.com#foo", "example.com.", false, false)
; | |
| 132 testActive("example.com,~foo.example.com#foo", "foo.example.com", false, fal
se); | |
| 133 testActive("example.com,~foo.example.com#foo", "mple.com", false, false); | |
| 134 }); | |
| 135 test("Blocking filters for domain but not its TLD", function() | |
| 136 { | |
| 137 testActive("foo$domain=example.com|~com", null, false, false); | |
| 138 testActive("foo$domain=example.com|~com", "com", false, true); | |
| 139 testActive("foo$domain=example.com|~com", "example.com", true, true); | |
| 140 testActive("foo$domain=example.com|~com", "example.com.", true, true); | |
| 141 testActive("foo$domain=example.com|~com", "foo.example.com", true, false); | |
| 142 testActive("foo$domain=example.com|~com", "mple.com", false, false); | |
| 143 }); | |
| 144 test("Hiding rules for domain but not its TLD", function() | |
| 145 { | |
| 146 testActive("example.com,~com#foo", null, false, false); | |
| 147 testActive("example.com,~com#foo", "com", false, true); | |
| 148 testActive("example.com,~com#foo", "example.com", true, true); | |
| 149 testActive("example.com,~com#foo", "example.com.", false, false); | |
| 150 testActive("example.com,~com#foo", "foo.example.com", true, false); | |
| 151 testActive("example.com,~com#foo", "mple.com", false, false); | |
| 152 }); | |
| 153 test("Blocking filters restricted to an unrelated domain", function() | |
| 154 { | |
| 155 testActive("foo$domain=nnnnnnn.nnn", null, false, false); | |
| 156 testActive("foo$domain=nnnnnnn.nnn", "com", false, false); | |
| 157 testActive("foo$domain=nnnnnnn.nnn", "example.com", false, false); | |
| 158 testActive("foo$domain=nnnnnnn.nnn", "example.com.", false, false); | |
| 159 testActive("foo$domain=nnnnnnn.nnn", "foo.example.com", false, false); | |
| 160 testActive("foo$domain=nnnnnnn.nnn", "mple.com", false, false); | |
| 161 }); | |
| 162 test("Hiding rules restricted to an unrelated domain", function() | |
| 163 { | |
| 164 testActive("nnnnnnn.nnn#foo", null, false, false); | |
| 165 testActive("nnnnnnn.nnn#foo", "com", false, false); | |
| 166 testActive("nnnnnnn.nnn#foo", "example.com", false, false); | |
| 167 testActive("nnnnnnn.nnn#foo", "example.com.", false, false); | |
| 168 testActive("nnnnnnn.nnn#foo", "foo.example.com", false, false); | |
| 169 testActive("nnnnnnn.nnn#foo", "mple.com", false, false); | |
| 170 }); | |
| 171 })(); | |
| 172 (function() | |
| 173 { | |
| 174 module("Filter classes", | |
| 175 { | |
| 176 setup: prepareFilterComponents, | |
| 177 teardown: restoreFilterComponents | |
| 178 }); | |
| 179 | |
| 180 function serializeFilter(filter) | |
| 181 { | |
| 182 var result = []; | |
| 183 result.push("text=" + filter.text); | |
| 184 if (filter instanceof InvalidFilter) | |
| 185 { | |
| 186 result.push("type=invalid"); | |
| 187 if (filter.reason) | |
| 188 { | |
| 189 result.push("hasReason"); | |
| 190 } | |
| 191 } | |
| 192 else if (filter instanceof CommentFilter) | |
| 193 { | |
| 194 result.push("type=comment"); | |
| 195 } | |
| 196 else if (filter instanceof ActiveFilter) | |
| 197 { | |
| 198 result.push("disabled=" + filter.disabled); | |
| 199 result.push("lastHit=" + filter.lastHit); | |
| 200 result.push("hitCount=" + filter.hitCount); | |
| 201 var domains = []; | |
| 202 if (filter.domains) | |
| 203 { | |
| 204 for (var domain in filter.domains) | |
| 205 { | |
| 206 if (domain != "") | |
| 207 { | |
| 208 domains.push(filter.domains[domain] ? domain : "~" + domain); | |
| 209 } | |
| 210 } | |
| 211 } | |
| 212 result.push("domains=" + domains.sort().join("|")); | |
| 213 if (filter instanceof RegExpFilter) | |
| 214 { | |
| 215 result.push("regexp=" + filter.regexp.source); | |
| 216 result.push("contentType=" + filter.contentType); | |
| 217 result.push("matchCase=" + filter.matchCase); | |
| 218 result.push("thirdParty=" + filter.thirdParty); | |
| 219 if (filter instanceof BlockingFilter) | |
| 220 { | |
| 221 result.push("type=filterlist"); | |
| 222 result.push("collapse=" + filter.collapse); | |
| 223 } | |
| 224 else if (filter instanceof WhitelistFilter) | |
| 225 { | |
| 226 result.push("type=whitelist"); | |
| 227 } | |
| 228 } | |
| 229 else if (filter instanceof ElemHideBase) | |
| 230 { | |
| 231 if (filter instanceof ElemHideFilter) | |
| 232 { | |
| 233 result.push("type=elemhide"); | |
| 234 } | |
| 235 else if (filter instanceof ElemHideException) | |
| 236 { | |
| 237 result.push("type=elemhideexception"); | |
| 238 } | |
| 239 result.push("selectorDomain=" + (filter.selectorDomain || "")); | |
| 240 result.push("selector=" + filter.selector); | |
| 241 } | |
| 242 } | |
| 243 return result; | |
| 244 } | |
| 245 | |
| 246 function addDefaults(expected) | |
| 247 { | |
| 248 var type = null; | |
| 249 var hasProperty = {}; | |
| 250 for (var _loopIndex0 = 0; _loopIndex0 < expected.length; ++_loopIndex0) | |
| 251 { | |
| 252 var entry = expected[_loopIndex0]; | |
| 253 if (/^type=(.*)/.test(entry)) | |
| 254 { | |
| 255 type = RegExp.$1; | |
| 256 } | |
| 257 else if (/^(\w+)/.test(entry)) | |
| 258 { | |
| 259 hasProperty[RegExp.$1] = true; | |
| 260 } | |
| 261 } | |
| 262 | |
| 263 function addProperty(prop, value) | |
| 264 { | |
| 265 if (!(prop in hasProperty)) | |
| 266 { | |
| 267 expected.push(prop + "=" + value); | |
| 268 } | |
| 269 } | |
| 270 if (type == "whitelist" || type == "filterlist" || type == "elemhide" || typ
e == "elemhideexception") | |
| 271 { | |
| 272 addProperty("disabled", "false"); | |
| 273 addProperty("lastHit", "0"); | |
| 274 addProperty("hitCount", "0"); | |
| 275 } | |
| 276 if (type == "whitelist" || type == "filterlist") | |
| 277 { | |
| 278 addProperty("contentType", 2147483647 & ~ (RegExpFilter.typeMap.ELEMHIDE |
RegExpFilter.typeMap.DONOTTRACK | RegExpFilter.typeMap.POPUP)); | |
| 279 addProperty("matchCase", "false"); | |
| 280 addProperty("thirdParty", "null"); | |
| 281 addProperty("domains", ""); | |
| 282 } | |
| 283 if (type == "filterlist") | |
| 284 { | |
| 285 addProperty("collapse", "null"); | |
| 286 } | |
| 287 if (type == "elemhide" || type == "elemhideexception") | |
| 288 { | |
| 289 addProperty("selectorDomain", ""); | |
| 290 addProperty("domains", ""); | |
| 291 } | |
| 292 } | |
| 293 | |
| 294 function compareFilter(text, expected, postInit) | |
| 295 { | |
| 296 addDefaults(expected); | |
| 297 var filter = Filter.fromText(text); | |
| 298 if (postInit) | |
| 299 { | |
| 300 postInit(filter); | |
| 301 } | |
| 302 var result = serializeFilter(filter); | |
| 303 equal(result.sort().join("\n"), expected.sort().join("\n"), text); | |
| 304 var filter2; | |
| 305 var buffer = []; | |
| 306 filter.serialize(buffer); | |
| 307 if (buffer.length) | |
| 308 { | |
| 309 var map = | |
| 310 { | |
| 311 __proto__: null | |
| 312 }; | |
| 313 for (var _loopIndex1 = 0; _loopIndex1 < buffer.slice(1).length; ++_loopInd
ex1) | |
| 314 { | |
| 315 var line = buffer.slice(1)[_loopIndex1]; | |
| 316 if (/(.*?)=(.*)/.test(line)) | |
| 317 { | |
| 318 map[RegExp.$1] = RegExp.$2; | |
| 319 } | |
| 320 } | |
| 321 filter2 = Filter.fromObject(map); | |
| 322 } | |
| 323 else | |
| 324 { | |
| 325 filter2 = Filter.fromText(filter.text); | |
| 326 } | |
| 327 equal(serializeFilter(filter).join("\n"), serializeFilter(filter2).join("\n"
), text + " deserialization"); | |
| 328 } | |
| 329 test("Filter class definitions", function() | |
| 330 { | |
| 331 equal(typeof Filter, "function", "typeof Filter"); | |
| 332 equal(typeof InvalidFilter, "function", "typeof InvalidFilter"); | |
| 333 equal(typeof CommentFilter, "function", "typeof CommentFilter"); | |
| 334 equal(typeof ActiveFilter, "function", "typeof ActiveFilter"); | |
| 335 equal(typeof RegExpFilter, "function", "typeof RegExpFilter"); | |
| 336 equal(typeof BlockingFilter, "function", "typeof BlockingFilter"); | |
| 337 equal(typeof WhitelistFilter, "function", "typeof WhitelistFilter"); | |
| 338 equal(typeof ElemHideBase, "function", "typeof ElemHideBase"); | |
| 339 equal(typeof ElemHideFilter, "function", "typeof ElemHideFilter"); | |
| 340 equal(typeof ElemHideException, "function", "typeof ElemHideException"); | |
| 341 }); | |
| 342 test("Comments", function() | |
| 343 { | |
| 344 compareFilter("!asdf", ["type=comment", "text=!asdf"]); | |
| 345 compareFilter("!foo#bar", ["type=comment", "text=!foo#bar"]); | |
| 346 compareFilter("!foo##bar", ["type=comment", "text=!foo##bar"]); | |
| 347 }); | |
| 348 test("Invalid filters", function() | |
| 349 { | |
| 350 compareFilter("/??/", ["type=invalid", "text=/??/", "hasReason"]); | |
| 351 compareFilter("#dd(asd)(ddd)", ["type=invalid", "text=#dd(asd)(ddd)", "hasRe
ason"]); | |
| 352 { | |
| 353 var result = Filter.fromText("#dd(asd)(ddd)").reason; | |
| 354 equal(result, Utils.getString("filter_elemhide_duplicate_id"), "#dd(asd)(d
dd).reason"); | |
| 355 } | |
| 356 compareFilter("#*", ["type=invalid", "text=#*", "hasReason"]); | |
| 357 { | |
| 358 var result = Filter.fromText("#*").reason; | |
| 359 equal(result, Utils.getString("filter_elemhide_nocriteria"), "#*.reason"); | |
| 360 } | |
| 361 }); | |
| 362 test("Filters with state", function() | |
| 363 { | |
| 364 compareFilter("blabla", ["type=filterlist", "text=blabla", "regexp=blabla"])
; | |
| 365 compareFilter("blabla_default", ["type=filterlist", "text=blabla_default", "
regexp=blabla_default"], function(filter) | |
| 366 { | |
| 367 filter.disabled = false; | |
| 368 filter.hitCount = 0; | |
| 369 filter.lastHit = 0; | |
| 370 }); | |
| 371 compareFilter("blabla_non_default", ["type=filterlist", "text=blabla_non_def
ault", "regexp=blabla_non_default", "disabled=true", "hitCount=12", "lastHit=20"
], function(filter) | |
| 372 { | |
| 373 filter.disabled = true; | |
| 374 filter.hitCount = 12; | |
| 375 filter.lastHit = 20; | |
| 376 }); | |
| 377 }); | |
| 378 var t = RegExpFilter.typeMap; | |
| 379 var defaultTypes = 2147483647 & ~ (t.ELEMHIDE | t.DONOTTRACK | t.DOCUMENT | t.
POPUP); | |
| 380 test("Special characters", function() | |
| 381 { | |
| 382 compareFilter("/ddd|f?a[s]d/", ["type=filterlist", "text=/ddd|f?a[s]d/", "re
gexp=ddd|f?a[s]d"]); | |
| 383 compareFilter("*asdf*d**dd*", ["type=filterlist", "text=*asdf*d**dd*", "rege
xp=asdf.*d.*dd"]); | |
| 384 compareFilter("|*asd|f*d**dd*|", ["type=filterlist", "text=|*asd|f*d**dd*|",
"regexp=^.*asd\\|f.*d.*dd.*$"]); | |
| 385 compareFilter("dd[]{}$%<>&()d", ["type=filterlist", "text=dd[]{}$%<>&()d", "
regexp=dd\\[\\]\\{\\}\\$\\%\\<\\>\\&\\(\\)d"]); | |
| 386 compareFilter("@@/ddd|f?a[s]d/", ["type=whitelist", "text=@@/ddd|f?a[s]d/",
"regexp=ddd|f?a[s]d", "contentType=" + defaultTypes]); | |
| 387 compareFilter("@@*asdf*d**dd*", ["type=whitelist", "text=@@*asdf*d**dd*", "r
egexp=asdf.*d.*dd", "contentType=" + defaultTypes]); | |
| 388 compareFilter("@@|*asd|f*d**dd*|", ["type=whitelist", "text=@@|*asd|f*d**dd*
|", "regexp=^.*asd\\|f.*d.*dd.*$", "contentType=" + defaultTypes]); | |
| 389 compareFilter("@@dd[]{}$%<>&()d", ["type=whitelist", "text=@@dd[]{}$%<>&()d"
, "regexp=dd\\[\\]\\{\\}\\$\\%\\<\\>\\&\\(\\)d", "contentType=" + defaultTypes])
; | |
| 390 }); | |
| 391 test("Filter options", function() | |
| 392 { | |
| 393 compareFilter("bla$match-case,script,other,third-party,domain=foo.com", ["ty
pe=filterlist", "text=bla$match-case,script,other,third-party,domain=foo.com", "
regexp=bla", "matchCase=true", "contentType=" + (t.SCRIPT | t.OTHER), "thirdPart
y=true", "domains=FOO.COM"]); | |
| 394 compareFilter("bla$~match-case,~script,~other,~third-party,domain=~bar.com",
["type=filterlist", "text=bla$~match-case,~script,~other,~third-party,domain=~b
ar.com", "regexp=bla", "contentType=" + (defaultTypes & ~ (t.SCRIPT | t.OTHER) |
t.DOCUMENT), "thirdParty=false", "domains=~BAR.COM"]); | |
| 395 compareFilter("@@bla$match-case,script,other,third-party,domain=foo.com|bar.
com|~bar.foo.com|~foo.bar.com", ["type=whitelist", "text=@@bla$match-case,script
,other,third-party,domain=foo.com|bar.com|~bar.foo.com|~foo.bar.com", "regexp=bl
a", "matchCase=true", "contentType=" + (t.SCRIPT | t.OTHER), "thirdParty=true",
"domains=BAR.COM|FOO.COM|~BAR.FOO.COM|~FOO.BAR.COM"]); | |
| 396 compareFilter("bla$image", ["type=filterlist", "text=bla$image", "regexp=bla
", "contentType=" + t.IMAGE]); | |
| 397 compareFilter("bla$background", ["type=filterlist", "text=bla$background", "
regexp=bla", "contentType=" + t.IMAGE]); | |
| 398 compareFilter("bla$~image", ["type=filterlist", "text=bla$~image", "regexp=b
la", "contentType=" + (defaultTypes & ~t.IMAGE | t.DOCUMENT)]); | |
| 399 compareFilter("bla$~background", ["type=filterlist", "text=bla$~background",
"regexp=bla", "contentType=" + (defaultTypes & ~t.IMAGE | t.DOCUMENT)]); | |
| 400 compareFilter("@@bla$~script,~other", ["type=whitelist", "text=@@bla$~script
,~other", "regexp=bla", "contentType=" + (defaultTypes & ~ (t.SCRIPT | t.OTHER))
]); | |
| 401 compareFilter("@@http://bla$~script,~other", ["type=whitelist", "text=@@http
://bla$~script,~other", "regexp=http\\:\\/\\/bla", "contentType=" + (defaultType
s & ~ (t.SCRIPT | t.OTHER) | t.DOCUMENT)]); | |
| 402 compareFilter("@@|ftp://bla$~script,~other", ["type=whitelist", "text=@@|ftp
://bla$~script,~other", "regexp=^ftp\\:\\/\\/bla", "contentType=" + (defaultType
s & ~ (t.SCRIPT | t.OTHER) | t.DOCUMENT)]); | |
| 403 compareFilter("@@bla$~script,~other,document", ["type=whitelist", "text=@@bl
a$~script,~other,document", "regexp=bla", "contentType=" + (defaultTypes & ~ (t.
SCRIPT | t.OTHER) | t.DOCUMENT)]); | |
| 404 compareFilter("@@bla$~script,~other,~document", ["type=whitelist", "text=@@b
la$~script,~other,~document", "regexp=bla", "contentType=" + (defaultTypes & ~ (
t.SCRIPT | t.OTHER))]); | |
| 405 compareFilter("@@bla$document", ["type=whitelist", "text=@@bla$document", "r
egexp=bla", "contentType=" + t.DOCUMENT]); | |
| 406 compareFilter("@@bla$~script,~other,elemhide", ["type=whitelist", "text=@@bl
a$~script,~other,elemhide", "regexp=bla", "contentType=" + (defaultTypes & ~ (t.
SCRIPT | t.OTHER) | t.ELEMHIDE)]); | |
| 407 compareFilter("@@bla$~script,~other,~elemhide", ["type=whitelist", "text=@@b
la$~script,~other,~elemhide", "regexp=bla", "contentType=" + (defaultTypes & ~ (
t.SCRIPT | t.OTHER))]); | |
| 408 compareFilter("@@bla$elemhide", ["type=whitelist", "text=@@bla$elemhide", "r
egexp=bla", "contentType=" + t.ELEMHIDE]); | |
| 409 compareFilter("@@bla$~script,~other,donottrack", ["type=whitelist", "text=@@
bla$~script,~other,donottrack", "regexp=bla", "contentType=" + (defaultTypes & ~
(t.SCRIPT | t.OTHER) | t.DONOTTRACK)]); | |
| 410 compareFilter("@@bla$~script,~other,~donottrack", ["type=whitelist", "text=@
@bla$~script,~other,~donottrack", "regexp=bla", "contentType=" + (defaultTypes &
~ (t.SCRIPT | t.OTHER))]); | |
| 411 compareFilter("@@bla$donottrack", ["type=whitelist", "text=@@bla$donottrack"
, "regexp=bla", "contentType=" + t.DONOTTRACK]); | |
| 412 }); | |
| 413 test("Element hiding rules", function() | |
| 414 { | |
| 415 compareFilter("#ddd", ["type=elemhide", "text=#ddd", "selector=ddd"]); | |
| 416 compareFilter("#ddd(fff)", ["type=elemhide", "text=#ddd(fff)", "selector=ddd
.fff,ddd#fff"]); | |
| 417 compareFilter("#ddd(foo=bar)(foo2^=bar2)(foo3*=bar3)(foo4$=bar4)", ["type=el
emhide", "text=#ddd(foo=bar)(foo2^=bar2)(foo3*=bar3)(foo4$=bar4)", "selector=ddd
[foo=\"bar\"][foo2^=\"bar2\"][foo3*=\"bar3\"][foo4$=\"bar4\"]"]); | |
| 418 compareFilter("#ddd(fff)(foo=bar)", ["type=elemhide", "text=#ddd(fff)(foo=ba
r)", "selector=ddd.fff[foo=\"bar\"],ddd#fff[foo=\"bar\"]"]); | |
| 419 compareFilter("#*(fff)", ["type=elemhide", "text=#*(fff)", "selector=.fff,#f
ff"]); | |
| 420 compareFilter("#*(foo=bar)", ["type=elemhide", "text=#*(foo=bar)", "selector
=[foo=\"bar\"]"]); | |
| 421 compareFilter("##body > div:first-child", ["type=elemhide", "text=##body > d
iv:first-child", "selector=body > div:first-child"]); | |
| 422 compareFilter("foo#ddd", ["type=elemhide", "text=foo#ddd", "selectorDomain=f
oo", "selector=ddd", "domains=FOO"]); | |
| 423 compareFilter("foo,bar#ddd", ["type=elemhide", "text=foo,bar#ddd", "selector
Domain=foo,bar", "selector=ddd", "domains=BAR|FOO"]); | |
| 424 compareFilter("foo,~bar#ddd", ["type=elemhide", "text=foo,~bar#ddd", "select
orDomain=foo", "selector=ddd", "domains=FOO|~BAR"]); | |
| 425 compareFilter("foo,~baz,bar#ddd", ["type=elemhide", "text=foo,~baz,bar#ddd",
"selectorDomain=foo,bar", "selector=ddd", "domains=BAR|FOO|~BAZ"]); | |
| 426 }); | |
| 427 test("Element hiding exceptions", function() | |
| 428 { | |
| 429 compareFilter("#@ddd", ["type=elemhideexception", "text=#@ddd", "selector=dd
d"]); | |
| 430 compareFilter("#@ddd(fff)", ["type=elemhideexception", "text=#@ddd(fff)", "s
elector=ddd.fff,ddd#fff"]); | |
| 431 compareFilter("#@ddd(foo=bar)(foo2^=bar2)(foo3*=bar3)(foo4$=bar4)", ["type=e
lemhideexception", "text=#@ddd(foo=bar)(foo2^=bar2)(foo3*=bar3)(foo4$=bar4)", "s
elector=ddd[foo=\"bar\"][foo2^=\"bar2\"][foo3*=\"bar3\"][foo4$=\"bar4\"]"]); | |
| 432 compareFilter("#@ddd(fff)(foo=bar)", ["type=elemhideexception", "text=#@ddd(
fff)(foo=bar)", "selector=ddd.fff[foo=\"bar\"],ddd#fff[foo=\"bar\"]"]); | |
| 433 compareFilter("#@*(fff)", ["type=elemhideexception", "text=#@*(fff)", "selec
tor=.fff,#fff"]); | |
| 434 compareFilter("#@*(foo=bar)", ["type=elemhideexception", "text=#@*(foo=bar)"
, "selector=[foo=\"bar\"]"]); | |
| 435 compareFilter("#@#body > div:first-child", ["type=elemhideexception", "text=
#@#body > div:first-child", "selector=body > div:first-child"]); | |
| 436 compareFilter("foo#@ddd", ["type=elemhideexception", "text=foo#@ddd", "selec
torDomain=foo", "selector=ddd", "domains=FOO"]); | |
| 437 compareFilter("foo,bar#@ddd", ["type=elemhideexception", "text=foo,bar#@ddd"
, "selectorDomain=foo,bar", "selector=ddd", "domains=BAR|FOO"]); | |
| 438 compareFilter("foo,~bar#@ddd", ["type=elemhideexception", "text=foo,~bar#@dd
d", "selectorDomain=foo", "selector=ddd", "domains=FOO|~BAR"]); | |
| 439 compareFilter("foo,~baz,bar#@ddd", ["type=elemhideexception", "text=foo,~baz
,bar#@ddd", "selectorDomain=foo,bar", "selector=ddd", "domains=BAR|FOO|~BAZ"]); | |
| 440 }); | |
| 441 })(); | |
| 442 (function() | |
| 443 { | |
| 444 module("Filter notifier", | |
| 445 { | |
| 446 setup: prepareFilterComponents, | |
| 447 teardown: restoreFilterComponents | |
| 448 }); | |
| 449 var triggeredListeners = []; | |
| 450 var listeners = [function(action, item) | |
| 451 { | |
| 452 return triggeredListeners.push(["listener1", action, item]); | |
| 453 }, function(action, item) | |
| 454 { | |
| 455 return triggeredListeners.push(["listener2", action, item]); | |
| 456 }, function(action, item) | |
| 457 { | |
| 458 return triggeredListeners.push(["listener3", action, item]); | |
| 459 }]; | |
| 460 | |
| 461 function compareListeners(test, list) | |
| 462 { | |
| 463 var result1 = triggeredListeners = []; | |
| 464 FilterNotifier.triggerListeners("foo", | |
| 465 { | |
| 466 bar: true | |
| 467 }); | |
| 468 var result2 = triggeredListeners = []; | |
| 469 for (var _loopIndex2 = 0; _loopIndex2 < list.length; ++_loopIndex2) | |
| 470 { | |
| 471 var observer = list[_loopIndex2]; | |
| 472 observer("foo", | |
| 473 { | |
| 474 bar: true | |
| 475 }); | |
| 476 } | |
| 477 deepEqual(result1, result2, test); | |
| 478 } | |
| 479 test("Adding/removing listeners", function() | |
| 480 { | |
| 481 var _tempVar3 = listeners; | |
| 482 var listener1 = _tempVar3[0]; | |
| 483 var listener2 = _tempVar3[1]; | |
| 484 var listener3 = _tempVar3[2]; | |
| 485 compareListeners("No listeners", []); | |
| 486 FilterNotifier.addListener(listener1); | |
| 487 compareListeners("addListener(listener1)", [listener1]); | |
| 488 FilterNotifier.addListener(listener1); | |
| 489 compareListeners("addListener(listener1) again", [listener1]); | |
| 490 FilterNotifier.addListener(listener2); | |
| 491 compareListeners("addListener(listener2)", [listener1, listener2]); | |
| 492 FilterNotifier.removeListener(listener1); | |
| 493 compareListeners("removeListener(listener1)", [listener2]); | |
| 494 FilterNotifier.removeListener(listener1); | |
| 495 compareListeners("removeListener(listener1) again", [listener2]); | |
| 496 FilterNotifier.addListener(listener3); | |
| 497 compareListeners("addListener(listener3)", [listener2, listener3]); | |
| 498 FilterNotifier.addListener(listener1); | |
| 499 compareListeners("addListener(listener1)", [listener2, listener3, listener1]
); | |
| 500 FilterNotifier.removeListener(listener3); | |
| 501 compareListeners("removeListener(listener3)", [listener2, listener1]); | |
| 502 FilterNotifier.removeListener(listener1); | |
| 503 compareListeners("removeListener(listener1)", [listener2]); | |
| 504 FilterNotifier.removeListener(listener2); | |
| 505 compareListeners("removeListener(listener2)", []); | |
| 506 }); | |
| 507 })(); | |
| 508 (function() | |
| 509 { | |
| 510 module("Filter storage", | |
| 511 { | |
| 512 setup: function() | |
| 513 { | |
| 514 prepareFilterComponents.call(this); | |
| 515 preparePrefs.call(this); | |
| 516 Prefs.savestats = true; | |
| 517 }, | |
| 518 teardown: function() | |
| 519 { | |
| 520 restoreFilterComponents.call(this); | |
| 521 restorePrefs.call(this); | |
| 522 } | |
| 523 }); | |
| 524 | |
| 525 function compareSubscriptionList(test, list) | |
| 526 { | |
| 527 var result = FilterStorage.subscriptions.map(function(subscription) | |
| 528 { | |
| 529 return subscription.url; | |
| 530 }); | |
| 531 var expected = list.map(function(subscription) | |
| 532 { | |
| 533 return subscription.url; | |
| 534 }); | |
| 535 deepEqual(result, expected, test); | |
| 536 } | |
| 537 | |
| 538 function compareFiltersList(test, list) | |
| 539 { | |
| 540 var result = FilterStorage.subscriptions.map(function(subscription) | |
| 541 { | |
| 542 return subscription.filters.map(function(filter) | |
| 543 { | |
| 544 return filter.text; | |
| 545 }); | |
| 546 }); | |
| 547 deepEqual(result, list, test); | |
| 548 } | |
| 549 | |
| 550 function compareFilterSubscriptions(test, filter, list) | |
| 551 { | |
| 552 var result = filter.subscriptions.map(function(subscription) | |
| 553 { | |
| 554 return subscription.url; | |
| 555 }); | |
| 556 var expected = list.map(function(subscription) | |
| 557 { | |
| 558 return subscription.url; | |
| 559 }); | |
| 560 deepEqual(result, expected, test); | |
| 561 } | |
| 562 test("Adding subscriptions", function() | |
| 563 { | |
| 564 var subscription1 = Subscription.fromURL("http://test1/"); | |
| 565 var subscription2 = Subscription.fromURL("http://test2/"); | |
| 566 var changes = []; | |
| 567 | |
| 568 function listener(action, subscription) | |
| 569 { | |
| 570 changes.push(action + " " + subscription.url); | |
| 571 } | |
| 572 FilterNotifier.addListener(listener); | |
| 573 compareSubscriptionList("Initial state", []); | |
| 574 deepEqual(changes, [], "Received changes"); | |
| 575 changes = []; | |
| 576 FilterStorage.addSubscription(subscription1); | |
| 577 compareSubscriptionList("Regular add", [subscription1]); | |
| 578 deepEqual(changes, ["subscription.added http://test1/"], "Received changes")
; | |
| 579 changes = []; | |
| 580 FilterStorage.addSubscription(subscription1); | |
| 581 compareSubscriptionList("Adding already added subscription", [subscription1]
); | |
| 582 deepEqual(changes, [], "Received changes"); | |
| 583 changes = []; | |
| 584 FilterStorage.addSubscription(subscription2, true); | |
| 585 compareSubscriptionList("Silent add", [subscription1, subscription2]); | |
| 586 deepEqual(changes, [], "Received changes"); | |
| 587 FilterStorage.removeSubscription(subscription1); | |
| 588 compareSubscriptionList("Remove", [subscription2]); | |
| 589 changes = []; | |
| 590 FilterStorage.addSubscription(subscription1); | |
| 591 compareSubscriptionList("Re-adding previously removed subscription", [subscr
iption2, subscription1]); | |
| 592 deepEqual(changes, ["subscription.added http://test1/"], "Received changes")
; | |
| 593 }); | |
| 594 test("Removing subscriptions", function() | |
| 595 { | |
| 596 var subscription1 = Subscription.fromURL("http://test1/"); | |
| 597 var subscription2 = Subscription.fromURL("http://test2/"); | |
| 598 FilterStorage.addSubscription(subscription1); | |
| 599 FilterStorage.addSubscription(subscription2); | |
| 600 var changes = []; | |
| 601 | |
| 602 function listener(action, subscription) | |
| 603 { | |
| 604 changes.push(action + " " + subscription.url); | |
| 605 } | |
| 606 FilterNotifier.addListener(listener); | |
| 607 compareSubscriptionList("Initial state", [subscription1, subscription2]); | |
| 608 deepEqual(changes, [], "Received changes"); | |
| 609 changes = []; | |
| 610 FilterStorage.removeSubscription(subscription1); | |
| 611 compareSubscriptionList("Regular remove", [subscription2]); | |
| 612 deepEqual(changes, ["subscription.removed http://test1/"], "Received changes
"); | |
| 613 changes = []; | |
| 614 FilterStorage.removeSubscription(subscription1); | |
| 615 compareSubscriptionList("Removing already removed subscription", [subscripti
on2]); | |
| 616 deepEqual(changes, [], "Received changes"); | |
| 617 changes = []; | |
| 618 FilterStorage.removeSubscription(subscription2, true); | |
| 619 compareSubscriptionList("Silent remove", []); | |
| 620 deepEqual(changes, [], "Received changes"); | |
| 621 FilterStorage.addSubscription(subscription1); | |
| 622 compareSubscriptionList("Add", [subscription1]); | |
| 623 changes = []; | |
| 624 FilterStorage.removeSubscription(subscription1); | |
| 625 compareSubscriptionList("Re-removing previously added subscription", []); | |
| 626 deepEqual(changes, ["subscription.removed http://test1/"], "Received changes
"); | |
| 627 }); | |
| 628 test("Moving subscriptions", function() | |
| 629 { | |
| 630 var subscription1 = Subscription.fromURL("http://test1/"); | |
| 631 var subscription2 = Subscription.fromURL("http://test2/"); | |
| 632 var subscription3 = Subscription.fromURL("http://test3/"); | |
| 633 FilterStorage.addSubscription(subscription1); | |
| 634 FilterStorage.addSubscription(subscription2); | |
| 635 FilterStorage.addSubscription(subscription3); | |
| 636 var changes = []; | |
| 637 | |
| 638 function listener(action, subscription) | |
| 639 { | |
| 640 changes.push(action + " " + subscription.url); | |
| 641 } | |
| 642 FilterNotifier.addListener(listener); | |
| 643 compareSubscriptionList("Initial state", [subscription1, subscription2, subs
cription3]); | |
| 644 deepEqual(changes, [], "Received changes"); | |
| 645 changes = []; | |
| 646 FilterStorage.moveSubscription(subscription1); | |
| 647 compareSubscriptionList("Move without explicit position", [subscription2, su
bscription3, subscription1]); | |
| 648 deepEqual(changes, ["subscription.moved http://test1/"], "Received changes")
; | |
| 649 changes = []; | |
| 650 FilterStorage.moveSubscription(subscription1); | |
| 651 compareSubscriptionList("Move without explicit position (subscription alread
y last)", [subscription2, subscription3, subscription1]); | |
| 652 deepEqual(changes, [], "Received changes"); | |
| 653 changes = []; | |
| 654 FilterStorage.moveSubscription(subscription2, subscription1); | |
| 655 compareSubscriptionList("Move with explicit position", [subscription3, subsc
ription2, subscription1]); | |
| 656 deepEqual(changes, ["subscription.moved http://test2/"], "Received changes")
; | |
| 657 changes = []; | |
| 658 FilterStorage.moveSubscription(subscription3, subscription2); | |
| 659 compareSubscriptionList("Move without explicit position (subscription alread
y at position)", [subscription3, subscription2, subscription1]); | |
| 660 deepEqual(changes, [], "Received changes"); | |
| 661 FilterStorage.removeSubscription(subscription2); | |
| 662 compareSubscriptionList("Remove", [subscription3, subscription1]); | |
| 663 changes = []; | |
| 664 FilterStorage.moveSubscription(subscription3, subscription2); | |
| 665 compareSubscriptionList("Move before removed subscription", [subscription1,
subscription3]); | |
| 666 deepEqual(changes, ["subscription.moved http://test3/"], "Received changes")
; | |
| 667 changes = []; | |
| 668 FilterStorage.moveSubscription(subscription2); | |
| 669 compareSubscriptionList("Move of removed subscription", [subscription1, subs
cription3]); | |
| 670 deepEqual(changes, [], "Received changes"); | |
| 671 }); | |
| 672 test("Adding filters", function() | |
| 673 { | |
| 674 var subscription1 = Subscription.fromURL("~blocking"); | |
| 675 subscription1.defaults = ["blocking"]; | |
| 676 var subscription2 = Subscription.fromURL("~exceptions"); | |
| 677 subscription2.defaults = ["whitelist", "elemhide"]; | |
| 678 var subscription3 = Subscription.fromURL("~other"); | |
| 679 FilterStorage.addSubscription(subscription1); | |
| 680 FilterStorage.addSubscription(subscription2); | |
| 681 FilterStorage.addSubscription(subscription3); | |
| 682 var changes = []; | |
| 683 | |
| 684 function listener(action, filter) | |
| 685 { | |
| 686 changes.push(action + " " + filter.text); | |
| 687 } | |
| 688 FilterNotifier.addListener(listener); | |
| 689 compareFiltersList("Initial state", [ | |
| 690 [], | |
| 691 [], | |
| 692 [] | |
| 693 ]); | |
| 694 deepEqual(changes, [], "Received changes"); | |
| 695 changes = []; | |
| 696 FilterStorage.addFilter(Filter.fromText("foo")); | |
| 697 compareFiltersList("Adding blocking filter", [ | |
| 698 ["foo"], | |
| 699 [], | |
| 700 [] | |
| 701 ]); | |
| 702 deepEqual(changes, ["filter.added foo"], "Received changes"); | |
| 703 changes = []; | |
| 704 FilterStorage.addFilter(Filter.fromText("@@bar")); | |
| 705 compareFiltersList("Adding exception rule", [ | |
| 706 ["foo"], | |
| 707 ["@@bar"], | |
| 708 [] | |
| 709 ]); | |
| 710 deepEqual(changes, ["filter.added @@bar"], "Received changes"); | |
| 711 changes = []; | |
| 712 FilterStorage.addFilter(Filter.fromText("foo#bar")); | |
| 713 compareFiltersList("Adding hiding rule", [ | |
| 714 ["foo"], | |
| 715 ["@@bar", "foo#bar"], | |
| 716 [] | |
| 717 ]); | |
| 718 deepEqual(changes, ["filter.added foo#bar"], "Received changes"); | |
| 719 changes = []; | |
| 720 FilterStorage.addFilter(Filter.fromText("foo#@#bar")); | |
| 721 compareFiltersList("Adding hiding exception", [ | |
| 722 ["foo"], | |
| 723 ["@@bar", "foo#bar", "foo#@#bar"], | |
| 724 [] | |
| 725 ]); | |
| 726 deepEqual(changes, ["filter.added foo#@#bar"], "Received changes"); | |
| 727 changes = []; | |
| 728 FilterStorage.addFilter(Filter.fromText("!foobar"), undefined, undefined, tr
ue); | |
| 729 compareFiltersList("Adding comment silent", [ | |
| 730 ["foo"], | |
| 731 ["@@bar", "foo#bar", "foo#@#bar"], | |
| 732 ["!foobar"] | |
| 733 ]); | |
| 734 deepEqual(changes, [], "Received changes"); | |
| 735 changes = []; | |
| 736 FilterStorage.addFilter(Filter.fromText("foo")); | |
| 737 compareFiltersList("Adding already added filter", [ | |
| 738 ["foo"], | |
| 739 ["@@bar", "foo#bar", "foo#@#bar"], | |
| 740 ["!foobar"] | |
| 741 ]); | |
| 742 deepEqual(changes, [], "Received changes"); | |
| 743 subscription1.disabled = true; | |
| 744 changes = []; | |
| 745 FilterStorage.addFilter(Filter.fromText("foo")); | |
| 746 compareFiltersList("Adding filter already in a disabled subscription", [ | |
| 747 ["foo"], | |
| 748 ["@@bar", "foo#bar", "foo#@#bar"], | |
| 749 ["!foobar", "foo"] | |
| 750 ]); | |
| 751 deepEqual(changes, ["filter.added foo"], "Received changes"); | |
| 752 changes = []; | |
| 753 FilterStorage.addFilter(Filter.fromText("foo"), subscription1); | |
| 754 compareFiltersList("Adding filter to an explicit subscription", [ | |
| 755 ["foo", "foo"], | |
| 756 ["@@bar", "foo#bar", "foo#@#bar"], | |
| 757 ["!foobar", "foo"] | |
| 758 ]); | |
| 759 deepEqual(changes, ["filter.added foo"], "Received changes"); | |
| 760 changes = []; | |
| 761 FilterStorage.addFilter(Filter.fromText("!foobar"), subscription2, 0); | |
| 762 compareFiltersList("Adding filter to an explicit subscription with position"
, [ | |
| 763 ["foo", "foo"], | |
| 764 ["!foobar", "@@bar", "foo#bar", "foo#@#bar"], | |
| 765 ["!foobar", "foo"] | |
| 766 ]); | |
| 767 deepEqual(changes, ["filter.added !foobar"], "Received changes"); | |
| 768 }); | |
| 769 test("Removing filters", function() | |
| 770 { | |
| 771 var subscription1 = Subscription.fromURL("~foo"); | |
| 772 subscription1.filters = [Filter.fromText("foo"), Filter.fromText("foo"), Fil
ter.fromText("bar")]; | |
| 773 var subscription2 = Subscription.fromURL("~bar"); | |
| 774 subscription2.filters = [Filter.fromText("foo"), Filter.fromText("bar"), Fil
ter.fromText("foo")]; | |
| 775 var subscription3 = Subscription.fromURL("http://test/"); | |
| 776 subscription3.filters = [Filter.fromText("foo"), Filter.fromText("bar")]; | |
| 777 FilterStorage.addSubscription(subscription1); | |
| 778 FilterStorage.addSubscription(subscription2); | |
| 779 FilterStorage.addSubscription(subscription3); | |
| 780 var changes = []; | |
| 781 | |
| 782 function listener(action, filter) | |
| 783 { | |
| 784 changes.push(action + " " + filter.text); | |
| 785 } | |
| 786 FilterNotifier.addListener(listener); | |
| 787 compareFiltersList("Initial state", [ | |
| 788 ["foo", "foo", "bar"], | |
| 789 ["foo", "bar", "foo"], | |
| 790 ["foo", "bar"] | |
| 791 ]); | |
| 792 deepEqual(changes, [], "Received changes"); | |
| 793 changes = []; | |
| 794 FilterStorage.removeFilter(Filter.fromText("foo"), subscription2, 0); | |
| 795 compareFiltersList("Remove with explicit subscription and position", [ | |
| 796 ["foo", "foo", "bar"], | |
| 797 ["bar", "foo"], | |
| 798 ["foo", "bar"] | |
| 799 ]); | |
| 800 deepEqual(changes, ["filter.removed foo"], "Received changes"); | |
| 801 changes = []; | |
| 802 FilterStorage.removeFilter(Filter.fromText("foo"), subscription2, 0); | |
| 803 compareFiltersList("Remove with explicit subscription and wrong position", [ | |
| 804 ["foo", "foo", "bar"], | |
| 805 ["bar", "foo"], | |
| 806 ["foo", "bar"] | |
| 807 ]); | |
| 808 deepEqual(changes, [], "Received changes"); | |
| 809 changes = []; | |
| 810 FilterStorage.removeFilter(Filter.fromText("foo"), subscription1); | |
| 811 compareFiltersList("Remove with explicit subscription", [ | |
| 812 ["bar"], | |
| 813 ["bar", "foo"], | |
| 814 ["foo", "bar"] | |
| 815 ]); | |
| 816 deepEqual(changes, ["filter.removed foo", "filter.removed foo"], "Received c
hanges"); | |
| 817 changes = []; | |
| 818 FilterStorage.removeFilter(Filter.fromText("foo"), subscription1); | |
| 819 compareFiltersList("Remove from subscription not having the filter", [ | |
| 820 ["bar"], | |
| 821 ["bar", "foo"], | |
| 822 ["foo", "bar"] | |
| 823 ]); | |
| 824 deepEqual(changes, [], "Received changes"); | |
| 825 changes = []; | |
| 826 FilterStorage.removeFilter(Filter.fromText("bar")); | |
| 827 compareFiltersList("Remove everywhere", [ | |
| 828 [], | |
| 829 ["foo"], | |
| 830 ["foo", "bar"] | |
| 831 ]); | |
| 832 deepEqual(changes, ["filter.removed bar", "filter.removed bar"], "Received c
hanges"); | |
| 833 changes = []; | |
| 834 FilterStorage.removeFilter(Filter.fromText("bar")); | |
| 835 compareFiltersList("Remove of unknown filter", [ | |
| 836 [], | |
| 837 ["foo"], | |
| 838 ["foo", "bar"] | |
| 839 ]); | |
| 840 deepEqual(changes, [], "Received changes"); | |
| 841 }); | |
| 842 test("Moving filters", function() | |
| 843 { | |
| 844 var subscription1 = Subscription.fromURL("~foo"); | |
| 845 subscription1.filters = [Filter.fromText("foo"), Filter.fromText("bar"), Fil
ter.fromText("bas"), Filter.fromText("foo")]; | |
| 846 var subscription2 = Subscription.fromURL("http://test/"); | |
| 847 subscription2.filters = [Filter.fromText("foo"), Filter.fromText("bar")]; | |
| 848 FilterStorage.addSubscription(subscription1); | |
| 849 FilterStorage.addSubscription(subscription2); | |
| 850 var changes = []; | |
| 851 | |
| 852 function listener(action, filter) | |
| 853 { | |
| 854 changes.push(action + " " + filter.text); | |
| 855 } | |
| 856 FilterNotifier.addListener(listener); | |
| 857 compareFiltersList("Initial state", [ | |
| 858 ["foo", "bar", "bas", "foo"], | |
| 859 ["foo", "bar"] | |
| 860 ]); | |
| 861 deepEqual(changes, [], "Received changes"); | |
| 862 changes = []; | |
| 863 FilterStorage.moveFilter(Filter.fromText("foo"), subscription1, 0, 1); | |
| 864 compareFiltersList("Regular move", [ | |
| 865 ["bar", "foo", "bas", "foo"], | |
| 866 ["foo", "bar"] | |
| 867 ]); | |
| 868 deepEqual(changes, ["filter.moved foo"], "Received changes"); | |
| 869 changes = []; | |
| 870 FilterStorage.moveFilter(Filter.fromText("foo"), subscription1, 0, 3); | |
| 871 compareFiltersList("Invalid move", [ | |
| 872 ["bar", "foo", "bas", "foo"], | |
| 873 ["foo", "bar"] | |
| 874 ]); | |
| 875 deepEqual(changes, [], "Received changes"); | |
| 876 changes = []; | |
| 877 FilterStorage.moveFilter(Filter.fromText("foo"), subscription2, 0, 1); | |
| 878 compareFiltersList("Invalid subscription", [ | |
| 879 ["bar", "foo", "bas", "foo"], | |
| 880 ["foo", "bar"] | |
| 881 ]); | |
| 882 deepEqual(changes, [], "Received changes"); | |
| 883 changes = []; | |
| 884 FilterStorage.moveFilter(Filter.fromText("foo"), subscription1, 1, 1); | |
| 885 compareFiltersList("Move to current position", [ | |
| 886 ["bar", "foo", "bas", "foo"], | |
| 887 ["foo", "bar"] | |
| 888 ]); | |
| 889 deepEqual(changes, [], "Received changes"); | |
| 890 changes = []; | |
| 891 FilterStorage.moveFilter(Filter.fromText("bar"), subscription1, 0, 1); | |
| 892 compareFiltersList("Regular move", [ | |
| 893 ["foo", "bar", "bas", "foo"], | |
| 894 ["foo", "bar"] | |
| 895 ]); | |
| 896 deepEqual(changes, ["filter.moved bar"], "Received changes"); | |
| 897 }); | |
| 898 test("Hit counts", function() | |
| 899 { | |
| 900 var changes = []; | |
| 901 | |
| 902 function listener(action, filter) | |
| 903 { | |
| 904 changes.push(action + " " + filter.text); | |
| 905 } | |
| 906 FilterNotifier.addListener(listener); | |
| 907 var filter1 = Filter.fromText("filter1"); | |
| 908 var filter2 = Filter.fromText("filter2"); | |
| 909 FilterStorage.addFilter(filter1); | |
| 910 equal(filter1.hitCount, 0, "filter1 initial hit count"); | |
| 911 equal(filter2.hitCount, 0, "filter2 initial hit count"); | |
| 912 equal(filter1.lastHit, 0, "filter1 initial last hit"); | |
| 913 equal(filter2.lastHit, 0, "filter2 initial last hit"); | |
| 914 var changes = []; | |
| 915 FilterStorage.increaseHitCount(filter1); | |
| 916 equal(filter1.hitCount, 1, "Hit count after increase (filter in list)"); | |
| 917 ok(filter1.lastHit > 0, "Last hit changed after increase"); | |
| 918 deepEqual(changes, ["filter.hitCount filter1", "filter.lastHit filter1"], "R
eceived changes"); | |
| 919 var changes = []; | |
| 920 FilterStorage.increaseHitCount(filter2); | |
| 921 equal(filter2.hitCount, 1, "Hit count after increase (filter not in list)"); | |
| 922 ok(filter2.lastHit > 0, "Last hit changed after increase"); | |
| 923 deepEqual(changes, ["filter.hitCount filter2", "filter.lastHit filter2"], "R
eceived changes"); | |
| 924 var changes = []; | |
| 925 FilterStorage.resetHitCounts([filter1]); | |
| 926 equal(filter1.hitCount, 0, "Hit count after reset"); | |
| 927 equal(filter1.lastHit, 0, "Last hit after reset"); | |
| 928 deepEqual(changes, ["filter.hitCount filter1", "filter.lastHit filter1"], "R
eceived changes"); | |
| 929 var changes = []; | |
| 930 FilterStorage.resetHitCounts(null); | |
| 931 equal(filter2.hitCount, 0, "Hit count after complete reset"); | |
| 932 equal(filter2.lastHit, 0, "Last hit after complete reset"); | |
| 933 deepEqual(changes, ["filter.hitCount filter2", "filter.lastHit filter2"], "R
eceived changes"); | |
| 934 }); | |
| 935 test("Filter/subscription relationship", function() | |
| 936 { | |
| 937 var filter1 = Filter.fromText("filter1"); | |
| 938 var filter2 = Filter.fromText("filter2"); | |
| 939 var filter3 = Filter.fromText("filter3"); | |
| 940 var subscription1 = Subscription.fromURL("http://test1/"); | |
| 941 subscription1.filters = [filter1, filter2]; | |
| 942 var subscription2 = Subscription.fromURL("http://test2/"); | |
| 943 subscription2.filters = [filter2, filter3]; | |
| 944 var subscription3 = Subscription.fromURL("http://test3/"); | |
| 945 subscription3.filters = [filter1, filter2, filter3]; | |
| 946 compareFilterSubscriptions("Initial filter1 subscriptions", filter1, []); | |
| 947 compareFilterSubscriptions("Initial filter2 subscriptions", filter2, []); | |
| 948 compareFilterSubscriptions("Initial filter3 subscriptions", filter3, []); | |
| 949 FilterStorage.addSubscription(subscription1); | |
| 950 compareFilterSubscriptions("filter1 subscriptions after adding http://test1/
", filter1, [subscription1]); | |
| 951 compareFilterSubscriptions("filter2 subscriptions after adding http://test1/
", filter2, [subscription1]); | |
| 952 compareFilterSubscriptions("filter3 subscriptions after adding http://test1/
", filter3, []); | |
| 953 FilterStorage.addSubscription(subscription2); | |
| 954 compareFilterSubscriptions("filter1 subscriptions after adding http://test2/
", filter1, [subscription1]); | |
| 955 compareFilterSubscriptions("filter2 subscriptions after adding http://test2/
", filter2, [subscription1, subscription2]); | |
| 956 compareFilterSubscriptions("filter3 subscriptions after adding http://test2/
", filter3, [subscription2]); | |
| 957 FilterStorage.removeSubscription(subscription1); | |
| 958 compareFilterSubscriptions("filter1 subscriptions after removing http://test
1/", filter1, []); | |
| 959 compareFilterSubscriptions("filter2 subscriptions after removing http://test
1/", filter2, [subscription2]); | |
| 960 compareFilterSubscriptions("filter3 subscriptions after removing http://test
1/", filter3, [subscription2]); | |
| 961 FilterStorage.updateSubscriptionFilters(subscription3, [filter3]); | |
| 962 compareFilterSubscriptions("filter1 subscriptions after updating http://test
3/ filters", filter1, []); | |
| 963 compareFilterSubscriptions("filter2 subscriptions after updating http://test
3/ filters", filter2, [subscription2]); | |
| 964 compareFilterSubscriptions("filter3 subscriptions after updating http://test
3/ filters", filter3, [subscription2]); | |
| 965 FilterStorage.addSubscription(subscription3); | |
| 966 compareFilterSubscriptions("filter1 subscriptions after adding http://test3/
", filter1, []); | |
| 967 compareFilterSubscriptions("filter2 subscriptions after adding http://test3/
", filter2, [subscription2]); | |
| 968 compareFilterSubscriptions("filter3 subscriptions after adding http://test3/
", filter3, [subscription2, subscription3]); | |
| 969 FilterStorage.updateSubscriptionFilters(subscription3, [filter1, filter2]); | |
| 970 compareFilterSubscriptions("filter1 subscriptions after updating http://test
3/ filters", filter1, [subscription3]); | |
| 971 compareFilterSubscriptions("filter2 subscriptions after updating http://test
3/ filters", filter2, [subscription2, subscription3]); | |
| 972 compareFilterSubscriptions("filter3 subscriptions after updating http://test
3/ filters", filter3, [subscription2]); | |
| 973 FilterStorage.removeSubscription(subscription3); | |
| 974 compareFilterSubscriptions("filter1 subscriptions after removing http://test
3/", filter1, []); | |
| 975 compareFilterSubscriptions("filter2 subscriptions after removing http://test
3/", filter2, [subscription2]); | |
| 976 compareFilterSubscriptions("filter3 subscriptions after removing http://test
3/", filter3, [subscription2]); | |
| 977 }); | |
| 978 })(); | |
| 979 (function() | |
| 980 { | |
| 981 module("Filter matcher", | |
| 982 { | |
| 983 setup: prepareFilterComponents, | |
| 984 teardown: restoreFilterComponents | |
| 985 }); | |
| 986 | |
| 987 function compareKeywords(text, expected) | |
| 988 { | |
| 989 for (var _loopIndex4 = 0; _loopIndex4 < [Filter.fromText(text), Filter.fromT
ext("@@" + text)].length; ++_loopIndex4) | |
| 990 { | |
| 991 var filter = [Filter.fromText(text), Filter.fromText("@@" + text)][_loopIn
dex4]; | |
| 992 var matcher = new Matcher(); | |
| 993 var result = []; | |
| 994 for (var _loopIndex5 = 0; _loopIndex5 < expected.length; ++_loopIndex5) | |
| 995 { | |
| 996 var dummy = expected[_loopIndex5]; | |
| 997 keyword = matcher.findKeyword(filter); | |
| 998 result.push(keyword); | |
| 999 if (keyword) | |
| 1000 { | |
| 1001 var dummyFilter = Filter.fromText("^" + keyword + "^"); | |
| 1002 dummyFilter.filterCount = Infinity; | |
| 1003 matcher.add(dummyFilter); | |
| 1004 } | |
| 1005 } | |
| 1006 equal(result.join(", "), expected.join(", "), "Keyword candidates for " +
filter.text); | |
| 1007 } | |
| 1008 } | |
| 1009 | |
| 1010 function checkMatch(filters, location, contentType, docDomain, thirdParty, exp
ected) | |
| 1011 { | |
| 1012 var matcher = new Matcher(); | |
| 1013 for (var _loopIndex6 = 0; _loopIndex6 < filters.length; ++_loopIndex6) | |
| 1014 { | |
| 1015 var filter = filters[_loopIndex6]; | |
| 1016 matcher.add(Filter.fromText(filter)); | |
| 1017 } | |
| 1018 var result = matcher.matchesAny(location, contentType, docDomain, thirdParty
); | |
| 1019 if (result) | |
| 1020 { | |
| 1021 result = result.text; | |
| 1022 } | |
| 1023 equal(result, expected, "match(" + location + ", " + contentType + ", " + do
cDomain + ", " + (thirdParty ? "third-party" : "first-party") + ") with:\n" + fi
lters.join("\n")); | |
| 1024 var combinedMatcher = new CombinedMatcher(); | |
| 1025 for (var i = 0; i < 2; i++) | |
| 1026 { | |
| 1027 for (var _loopIndex7 = 0; _loopIndex7 < filters.length; ++_loopIndex7) | |
| 1028 { | |
| 1029 var filter = filters[_loopIndex7]; | |
| 1030 combinedMatcher.add(Filter.fromText(filter)); | |
| 1031 } | |
| 1032 var result = combinedMatcher.matchesAny(location, contentType, docDomain,
thirdParty); | |
| 1033 if (result) | |
| 1034 { | |
| 1035 result = result.text; | |
| 1036 } | |
| 1037 equal(result, expected, "combinedMatch(" + location + ", " + contentType +
", " + docDomain + ", " + (thirdParty ? "third-party" : "first-party") + ") wit
h:\n" + filters.join("\n")); | |
| 1038 filters = filters.map(function(text) | |
| 1039 { | |
| 1040 return "@@" + text; | |
| 1041 }); | |
| 1042 if (expected) | |
| 1043 { | |
| 1044 expected = "@@" + expected; | |
| 1045 } | |
| 1046 } | |
| 1047 } | |
| 1048 | |
| 1049 function cacheCheck(matcher, location, contentType, docDomain, thirdParty, exp
ected) | |
| 1050 { | |
| 1051 var result = matcher.matchesAny(location, contentType, docDomain, thirdParty
); | |
| 1052 if (result) | |
| 1053 { | |
| 1054 result = result.text; | |
| 1055 } | |
| 1056 equal(result, expected, "match(" + location + ", " + contentType + ", " + do
cDomain + ", " + (thirdParty ? "third-party" : "first-party") + ") with static f
ilters"); | |
| 1057 } | |
| 1058 test("Matcher class definitions", function() | |
| 1059 { | |
| 1060 equal(typeof Matcher, "function", "typeof Matcher"); | |
| 1061 equal(typeof CombinedMatcher, "function", "typeof CombinedMatcher"); | |
| 1062 equal(typeof defaultMatcher, "object", "typeof defaultMatcher"); | |
| 1063 ok(defaultMatcher instanceof CombinedMatcher, "defaultMatcher is a CombinedM
atcher instance"); | |
| 1064 }); | |
| 1065 test("Keyword extraction", function() | |
| 1066 { | |
| 1067 compareKeywords("*", []); | |
| 1068 compareKeywords("asdf", []); | |
| 1069 compareKeywords("/asdf/", []); | |
| 1070 compareKeywords("/asdf1234", []); | |
| 1071 compareKeywords("/asdf/1234", ["asdf"]); | |
| 1072 compareKeywords("/asdf/1234^", ["asdf", "1234"]); | |
| 1073 compareKeywords("/asdf/123456^", ["123456", "asdf"]); | |
| 1074 compareKeywords("^asdf^1234^56as^", ["asdf", "1234", "56as"]); | |
| 1075 compareKeywords("*asdf/1234^", ["1234"]); | |
| 1076 compareKeywords("|asdf,1234*", ["asdf"]); | |
| 1077 compareKeywords("||domain.example^", ["example", "domain"]); | |
| 1078 compareKeywords("&asdf=1234|", ["asdf", "1234"]); | |
| 1079 compareKeywords("^foo%2Ebar^", ["foo%2ebar"]); | |
| 1080 compareKeywords("^aSdF^1234", ["asdf"]); | |
| 1081 compareKeywords("_asdf_1234_", ["asdf", "1234"]); | |
| 1082 compareKeywords("+asdf-1234=", ["asdf", "1234"]); | |
| 1083 compareKeywords("/123^ad2&ad&", ["123", "ad2"]); | |
| 1084 compareKeywords("/123^ad2&ad$script,domain=example.com", ["123", "ad2"]); | |
| 1085 compareKeywords("^foobar^$donottrack", ["foobar"]); | |
| 1086 compareKeywords("*$donottrack", ["donottrack"]); | |
| 1087 }); | |
| 1088 test("Filter matching", function() | |
| 1089 { | |
| 1090 checkMatch([], "http://abc/def", "IMAGE", null, false, null); | |
| 1091 checkMatch(["abc"], "http://abc/def", "IMAGE", null, false, "abc"); | |
| 1092 checkMatch(["abc", "ddd"], "http://abc/def", "IMAGE", null, false, "abc"); | |
| 1093 checkMatch(["ddd", "abc"], "http://abc/def", "IMAGE", null, false, "abc"); | |
| 1094 checkMatch(["ddd", "abd"], "http://abc/def", "IMAGE", null, false, null); | |
| 1095 checkMatch(["abc", "://abc/d"], "http://abc/def", "IMAGE", null, false, "://
abc/d"); | |
| 1096 checkMatch(["://abc/d", "abc"], "http://abc/def", "IMAGE", null, false, "://
abc/d"); | |
| 1097 checkMatch(["|http://"], "http://abc/def", "IMAGE", null, false, "|http://")
; | |
| 1098 checkMatch(["|http://abc"], "http://abc/def", "IMAGE", null, false, "|http:/
/abc"); | |
| 1099 checkMatch(["|abc"], "http://abc/def", "IMAGE", null, false, null); | |
| 1100 checkMatch(["|/abc/def"], "http://abc/def", "IMAGE", null, false, null); | |
| 1101 checkMatch(["/def|"], "http://abc/def", "IMAGE", null, false, "/def|"); | |
| 1102 checkMatch(["/abc/def|"], "http://abc/def", "IMAGE", null, false, "/abc/def|
"); | |
| 1103 checkMatch(["/abc/|"], "http://abc/def", "IMAGE", null, false, null); | |
| 1104 checkMatch(["http://abc/|"], "http://abc/def", "IMAGE", null, false, null); | |
| 1105 checkMatch(["|http://abc/def|"], "http://abc/def", "IMAGE", null, false, "|h
ttp://abc/def|"); | |
| 1106 checkMatch(["|/abc/def|"], "http://abc/def", "IMAGE", null, false, null); | |
| 1107 checkMatch(["|http://abc/|"], "http://abc/def", "IMAGE", null, false, null); | |
| 1108 checkMatch(["|/abc/|"], "http://abc/def", "IMAGE", null, false, null); | |
| 1109 checkMatch(["||example.com/abc"], "http://example.com/abc/def", "IMAGE", nul
l, false, "||example.com/abc"); | |
| 1110 checkMatch(["||com/abc/def"], "http://example.com/abc/def", "IMAGE", null, f
alse, "||com/abc/def"); | |
| 1111 checkMatch(["||com/abc"], "http://example.com/abc/def", "IMAGE", null, false
, "||com/abc"); | |
| 1112 checkMatch(["||mple.com/abc"], "http://example.com/abc/def", "IMAGE", null,
false, null); | |
| 1113 checkMatch(["||.com/abc/def"], "http://example.com/abc/def", "IMAGE", null,
false, null); | |
| 1114 checkMatch(["||http://example.com/"], "http://example.com/abc/def", "IMAGE",
null, false, null); | |
| 1115 checkMatch(["||example.com/abc/def|"], "http://example.com/abc/def", "IMAGE"
, null, false, "||example.com/abc/def|"); | |
| 1116 checkMatch(["||com/abc/def|"], "http://example.com/abc/def", "IMAGE", null,
false, "||com/abc/def|"); | |
| 1117 checkMatch(["||example.com/abc|"], "http://example.com/abc/def", "IMAGE", nu
ll, false, null); | |
| 1118 checkMatch(["abc", "://abc/d", "asdf1234"], "http://abc/def", "IMAGE", null,
false, "://abc/d"); | |
| 1119 checkMatch(["foo*://abc/d", "foo*//abc/de", "://abc/de", "asdf1234"], "http:
//abc/def", "IMAGE", null, false, "://abc/de"); | |
| 1120 checkMatch(["abc$third-party", "abc$~third-party", "ddd"], "http://abc/def",
"IMAGE", null, false, "abc$~third-party"); | |
| 1121 checkMatch(["abc$third-party", "abc$~third-party", "ddd"], "http://abc/def",
"IMAGE", null, true, "abc$third-party"); | |
| 1122 checkMatch(["//abc/def$third-party", "//abc/def$~third-party", "//abc_def"],
"http://abc/def", "IMAGE", null, false, "//abc/def$~third-party"); | |
| 1123 checkMatch(["//abc/def$third-party", "//abc/def$~third-party", "//abc_def"],
"http://abc/def", "IMAGE", null, true, "//abc/def$third-party"); | |
| 1124 checkMatch(["abc$third-party", "abc$~third-party", "//abc/def"], "http://abc
/def", "IMAGE", null, true, "//abc/def"); | |
| 1125 checkMatch(["//abc/def", "abc$third-party", "abc$~third-party"], "http://abc
/def", "IMAGE", null, true, "//abc/def"); | |
| 1126 checkMatch(["abc$third-party", "abc$~third-party", "//abc/def$third-party"],
"http://abc/def", "IMAGE", null, true, "//abc/def$third-party"); | |
| 1127 checkMatch(["abc$third-party", "abc$~third-party", "//abc/def$third-party"],
"http://abc/def", "IMAGE", null, false, "abc$~third-party"); | |
| 1128 checkMatch(["abc$third-party", "abc$~third-party", "//abc/def$~third-party"]
, "http://abc/def", "IMAGE", null, true, "abc$third-party"); | |
| 1129 checkMatch(["abc$image", "abc$script", "abc$~image"], "http://abc/def", "IMA
GE", null, false, "abc$image"); | |
| 1130 checkMatch(["abc$image", "abc$script", "abc$~script"], "http://abc/def", "SC
RIPT", null, false, "abc$script"); | |
| 1131 checkMatch(["abc$image", "abc$script", "abc$~image"], "http://abc/def", "OTH
ER", null, false, "abc$~image"); | |
| 1132 checkMatch(["//abc/def$image", "//abc/def$script", "//abc/def$~image"], "htt
p://abc/def", "IMAGE", null, false, "//abc/def$image"); | |
| 1133 checkMatch(["//abc/def$image", "//abc/def$script", "//abc/def$~script"], "ht
tp://abc/def", "SCRIPT", null, false, "//abc/def$script"); | |
| 1134 checkMatch(["//abc/def$image", "//abc/def$script", "//abc/def$~image"], "htt
p://abc/def", "OTHER", null, false, "//abc/def$~image"); | |
| 1135 checkMatch(["abc$image", "abc$~image", "//abc/def"], "http://abc/def", "IMAG
E", null, false, "//abc/def"); | |
| 1136 checkMatch(["//abc/def", "abc$image", "abc$~image"], "http://abc/def", "IMAG
E", null, false, "//abc/def"); | |
| 1137 checkMatch(["abc$image", "abc$~image", "//abc/def$image"], "http://abc/def",
"IMAGE", null, false, "//abc/def$image"); | |
| 1138 checkMatch(["abc$image", "abc$~image", "//abc/def$script"], "http://abc/def"
, "IMAGE", null, false, "abc$image"); | |
| 1139 checkMatch(["abc$domain=foo.com", "abc$domain=bar.com", "abc$domain=~foo.com
|~bar.com"], "http://abc/def", "IMAGE", "foo.com", false, "abc$domain=foo.com"); | |
| 1140 checkMatch(["abc$domain=foo.com", "abc$domain=bar.com", "abc$domain=~foo.com
|~bar.com"], "http://abc/def", "IMAGE", "bar.com", false, "abc$domain=bar.com"); | |
| 1141 checkMatch(["abc$domain=foo.com", "abc$domain=bar.com", "abc$domain=~foo.com
|~bar.com"], "http://abc/def", "IMAGE", "baz.com", false, "abc$domain=~foo.com|~
bar.com"); | |
| 1142 checkMatch(["abc$domain=foo.com", "cba$domain=bar.com", "ccc$domain=~foo.com
|~bar.com"], "http://abc/def", "IMAGE", "foo.com", false, "abc$domain=foo.com"); | |
| 1143 checkMatch(["abc$domain=foo.com", "cba$domain=bar.com", "ccc$domain=~foo.com
|~bar.com"], "http://abc/def", "IMAGE", "bar.com", false, null); | |
| 1144 checkMatch(["abc$domain=foo.com", "cba$domain=bar.com", "ccc$domain=~foo.com
|~bar.com"], "http://abc/def", "IMAGE", "baz.com", false, null); | |
| 1145 checkMatch(["abc$domain=foo.com", "cba$domain=bar.com", "ccc$domain=~foo.com
|~bar.com"], "http://ccc/def", "IMAGE", "baz.com", false, "ccc$domain=~foo.com|~
bar.com"); | |
| 1146 checkMatch(["*$image"], "http://ccc/def", "DONOTTRACK", "example.com", false
, null); | |
| 1147 checkMatch(["*$donottrack"], "http://ccc/def", "DONOTTRACK", "example.com",
false, "*$donottrack"); | |
| 1148 checkMatch(["*$donottrack"], "http://ccc/def", "DONOTTRACK", "example.com",
false, "*$donottrack"); | |
| 1149 checkMatch(["*$donottrack"], "http://ccc/def", "IMAGE", "example.com", false
, null); | |
| 1150 checkMatch(["*$donottrack,third-party"], "http://ccc/def", "DONOTTRACK", "ex
ample.com", true, "*$donottrack,third-party"); | |
| 1151 checkMatch(["*$donottrack,third-party"], "http://ccc/def", "DONOTTRACK", "ex
ample.com", false, null); | |
| 1152 }); | |
| 1153 test("Result cache checks", function() | |
| 1154 { | |
| 1155 var matcher = new CombinedMatcher(); | |
| 1156 matcher.add(Filter.fromText("abc$image")); | |
| 1157 matcher.add(Filter.fromText("abc$script")); | |
| 1158 matcher.add(Filter.fromText("abc$~image,~script,~document")); | |
| 1159 matcher.add(Filter.fromText("cba$third-party")); | |
| 1160 matcher.add(Filter.fromText("cba$~third-party,~script")); | |
| 1161 matcher.add(Filter.fromText("http://def$image")); | |
| 1162 matcher.add(Filter.fromText("http://def$script")); | |
| 1163 matcher.add(Filter.fromText("http://def$~image,~script,~document")); | |
| 1164 matcher.add(Filter.fromText("http://fed$third-party")); | |
| 1165 matcher.add(Filter.fromText("http://fed$~third-party,~script")); | |
| 1166 cacheCheck(matcher, "http://abc", "IMAGE", null, false, "abc$image"); | |
| 1167 cacheCheck(matcher, "http://abc", "SCRIPT", null, false, "abc$script"); | |
| 1168 cacheCheck(matcher, "http://abc", "OTHER", null, false, "abc$~image,~script,
~document"); | |
| 1169 cacheCheck(matcher, "http://cba", "IMAGE", null, false, "cba$~third-party,~s
cript"); | |
| 1170 cacheCheck(matcher, "http://cba", "IMAGE", null, true, "cba$third-party"); | |
| 1171 cacheCheck(matcher, "http://def", "IMAGE", null, false, "http://def$image"); | |
| 1172 cacheCheck(matcher, "http://def", "SCRIPT", null, false, "http://def$script"
); | |
| 1173 cacheCheck(matcher, "http://def", "OTHER", null, false, "http://def$~image,~
script,~document"); | |
| 1174 cacheCheck(matcher, "http://fed", "IMAGE", null, false, "http://fed$~third-p
arty,~script"); | |
| 1175 cacheCheck(matcher, "http://fed", "IMAGE", null, true, "http://fed$third-par
ty"); | |
| 1176 cacheCheck(matcher, "http://abc_cba", "DOCUMENT", null, false, "cba$~third-p
arty,~script"); | |
| 1177 cacheCheck(matcher, "http://abc_cba", "DOCUMENT", null, true, "cba$third-par
ty"); | |
| 1178 cacheCheck(matcher, "http://abc_cba", "SCRIPT", null, false, "abc$script"); | |
| 1179 cacheCheck(matcher, "http://def?http://fed", "DOCUMENT", null, false, "http:
//fed$~third-party,~script"); | |
| 1180 cacheCheck(matcher, "http://def?http://fed", "DOCUMENT", null, true, "http:/
/fed$third-party"); | |
| 1181 cacheCheck(matcher, "http://def?http://fed", "SCRIPT", null, false, "http://
def$script"); | |
| 1182 }); | |
| 1183 })(); | |
| 1184 (function() | |
| 1185 { | |
| 1186 module("Matching of blocking filters", | |
| 1187 { | |
| 1188 setup: prepareFilterComponents, | |
| 1189 teardown: restoreFilterComponents | |
| 1190 }); | |
| 1191 | |
| 1192 function testMatch(text, location, contentType, docDomain, thirdParty, expecte
d) | |
| 1193 { | |
| 1194 function testMatch_internal(text, location, contentType, docDomain, thirdPar
ty, expected) | |
| 1195 { | |
| 1196 var filter = Filter.fromText(text); | |
| 1197 var result = filter.matches(location, contentType, docDomain, thirdParty); | |
| 1198 equal(!!result, expected, "\"" + text + "\".matches(" + location + ", " +
contentType + ", " + docDomain + ", " + (thirdParty ? "third-party" : "first-par
ty") + ")"); | |
| 1199 } | |
| 1200 testMatch_internal(text, location, contentType, docDomain, thirdParty, expec
ted); | |
| 1201 if (!/^@@/.test(text)) | |
| 1202 { | |
| 1203 testMatch_internal("@@" + text, location, contentType, docDomain, thirdPar
ty, expected); | |
| 1204 } | |
| 1205 } | |
| 1206 test("Basic filters", function() | |
| 1207 { | |
| 1208 testMatch("abc", "http://abc/adf", "IMAGE", null, false, true); | |
| 1209 testMatch("abc", "http://ABC/adf", "IMAGE", null, false, true); | |
| 1210 testMatch("abc", "http://abd/adf", "IMAGE", null, false, false); | |
| 1211 testMatch("|abc", "http://abc/adf", "IMAGE", null, false, false); | |
| 1212 testMatch("|http://abc", "http://abc/adf", "IMAGE", null, false, true); | |
| 1213 testMatch("abc|", "http://abc/adf", "IMAGE", null, false, false); | |
| 1214 testMatch("abc/adf|", "http://abc/adf", "IMAGE", null, false, true); | |
| 1215 testMatch("||example.com/foo", "http://example.com/foo/bar", "IMAGE", null,
false, true); | |
| 1216 testMatch("||com/foo", "http://example.com/foo/bar", "IMAGE", null, false, t
rue); | |
| 1217 testMatch("||mple.com/foo", "http://example.com/foo/bar", "IMAGE", null, fal
se, false); | |
| 1218 testMatch("||/example.com/foo", "http://example.com/foo/bar", "IMAGE", null,
false, false); | |
| 1219 testMatch("||example.com/foo/bar|", "http://example.com/foo/bar", "IMAGE", n
ull, false, true); | |
| 1220 testMatch("||example.com/foo", "http://foo.com/http://example.com/foo/bar",
"IMAGE", null, false, false); | |
| 1221 testMatch("||example.com/foo|", "http://example.com/foo/bar", "IMAGE", null,
false, false); | |
| 1222 }); | |
| 1223 test("Separator placeholders", function() | |
| 1224 { | |
| 1225 testMatch("abc^d", "http://abc/def", "IMAGE", null, false, true); | |
| 1226 testMatch("abc^e", "http://abc/def", "IMAGE", null, false, false); | |
| 1227 testMatch("def^", "http://abc/def", "IMAGE", null, false, true); | |
| 1228 testMatch("http://abc/d^f", "http://abc/def", "IMAGE", null, false, false); | |
| 1229 testMatch("http://abc/def^", "http://abc/def", "IMAGE", null, false, true); | |
| 1230 testMatch("^foo=bar^", "http://abc/?foo=bar", "IMAGE", null, false, true); | |
| 1231 testMatch("^foo=bar^", "http://abc/?a=b&foo=bar", "IMAGE", null, false, true
); | |
| 1232 testMatch("^foo=bar^", "http://abc/?foo=bar&a=b", "IMAGE", null, false, true
); | |
| 1233 testMatch("^foo=bar^", "http://abc/?notfoo=bar", "IMAGE", null, false, false
); | |
| 1234 testMatch("^foo=bar^", "http://abc/?foo=barnot", "IMAGE", null, false, false
); | |
| 1235 testMatch("^foo=bar^", "http://abc/?foo=bar%2Enot", "IMAGE", null, false, fa
lse); | |
| 1236 testMatch("||example.com^", "http://example.com/foo/bar", "IMAGE", null, fal
se, true); | |
| 1237 testMatch("||example.com^", "http://example.company.com/foo/bar", "IMAGE", n
ull, false, false); | |
| 1238 testMatch("||example.com^", "http://example.com:1234/foo/bar", "IMAGE", null
, false, true); | |
| 1239 testMatch("||example.com^", "http://example.com.com/foo/bar", "IMAGE", null,
false, false); | |
| 1240 testMatch("||example.com^", "http://example.com-company.com/foo/bar", "IMAGE
", null, false, false); | |
| 1241 testMatch("||example.com^foo", "http://example.com/foo/bar", "IMAGE", null,
false, true); | |
| 1242 testMatch("||пример.ру^", "http://пример.ру/foo/bar", "IMAGE", null, false,
true); | |
| 1243 testMatch("||пример.ру^", "http://пример.руководитель.ру/foo/bar", "IMAGE",
null, false, false); | |
| 1244 testMatch("||пример.ру^", "http://пример.ру:1234/foo/bar", "IMAGE", null, fa
lse, true); | |
| 1245 testMatch("||пример.ру^", "http://пример.ру.ру/foo/bar", "IMAGE", null, fals
e, false); | |
| 1246 testMatch("||пример.ру^", "http://пример.ру-ководитель.ру/foo/bar", "IMAGE",
null, false, false); | |
| 1247 testMatch("||пример.ру^foo", "http://пример.ру/foo/bar", "IMAGE", null, fals
e, true); | |
| 1248 }); | |
| 1249 test("Wildcard matching", function() | |
| 1250 { | |
| 1251 testMatch("abc*d", "http://abc/adf", "IMAGE", null, false, true); | |
| 1252 testMatch("abc*d", "http://abcd/af", "IMAGE", null, false, true); | |
| 1253 testMatch("abc*d", "http://abc/d/af", "IMAGE", null, false, true); | |
| 1254 testMatch("abc*d", "http://dabc/af", "IMAGE", null, false, false); | |
| 1255 testMatch("*abc", "http://abc/adf", "IMAGE", null, false, true); | |
| 1256 testMatch("abc*", "http://abc/adf", "IMAGE", null, false, true); | |
| 1257 testMatch("|*abc", "http://abc/adf", "IMAGE", null, false, true); | |
| 1258 testMatch("abc*|", "http://abc/adf", "IMAGE", null, false, true); | |
| 1259 testMatch("abc***d", "http://abc/adf", "IMAGE", null, false, true); | |
| 1260 }); | |
| 1261 test("Type options", function() | |
| 1262 { | |
| 1263 testMatch("abc$image", "http://abc/adf", "IMAGE", null, false, true); | |
| 1264 testMatch("abc$other", "http://abc/adf", "IMAGE", null, false, false); | |
| 1265 testMatch("abc$other", "http://abc/adf", "OTHER", null, false, true); | |
| 1266 testMatch("abc$~other", "http://abc/adf", "OTHER", null, false, false); | |
| 1267 testMatch("abc$script", "http://abc/adf", "IMAGE", null, false, false); | |
| 1268 testMatch("abc$script", "http://abc/adf", "SCRIPT", null, false, true); | |
| 1269 testMatch("abc$~script", "http://abc/adf", "SCRIPT", null, false, false); | |
| 1270 testMatch("abc$stylesheet", "http://abc/adf", "IMAGE", null, false, false); | |
| 1271 testMatch("abc$stylesheet", "http://abc/adf", "STYLESHEET", null, false, tru
e); | |
| 1272 testMatch("abc$~stylesheet", "http://abc/adf", "STYLESHEET", null, false, fa
lse); | |
| 1273 testMatch("abc$object", "http://abc/adf", "IMAGE", null, false, false); | |
| 1274 testMatch("abc$object", "http://abc/adf", "OBJECT", null, false, true); | |
| 1275 testMatch("abc$~object", "http://abc/adf", "OBJECT", null, false, false); | |
| 1276 testMatch("abc$document", "http://abc/adf", "IMAGE", null, false, false); | |
| 1277 testMatch("abc$document", "http://abc/adf", "DOCUMENT", null, false, true); | |
| 1278 testMatch("abc$~document", "http://abc/adf", "DOCUMENT", null, false, false)
; | |
| 1279 testMatch("abc$subdocument", "http://abc/adf", "IMAGE", null, false, false); | |
| 1280 testMatch("abc$subdocument", "http://abc/adf", "SUBDOCUMENT", null, false, t
rue); | |
| 1281 testMatch("abc$~subdocument", "http://abc/adf", "SUBDOCUMENT", null, false,
false); | |
| 1282 testMatch("abc$background", "http://abc/adf", "OBJECT", null, false, false); | |
| 1283 testMatch("abc$background", "http://abc/adf", "IMAGE", null, false, true); | |
| 1284 testMatch("abc$~background", "http://abc/adf", "IMAGE", null, false, false); | |
| 1285 testMatch("abc$xbl", "http://abc/adf", "IMAGE", null, false, false); | |
| 1286 testMatch("abc$xbl", "http://abc/adf", "XBL", null, false, true); | |
| 1287 testMatch("abc$~xbl", "http://abc/adf", "XBL", null, false, false); | |
| 1288 testMatch("abc$ping", "http://abc/adf", "IMAGE", null, false, false); | |
| 1289 testMatch("abc$ping", "http://abc/adf", "PING", null, false, true); | |
| 1290 testMatch("abc$~ping", "http://abc/adf", "PING", null, false, false); | |
| 1291 testMatch("abc$xmlhttprequest", "http://abc/adf", "IMAGE", null, false, fals
e); | |
| 1292 testMatch("abc$xmlhttprequest", "http://abc/adf", "XMLHTTPREQUEST", null, fa
lse, true); | |
| 1293 testMatch("abc$~xmlhttprequest", "http://abc/adf", "XMLHTTPREQUEST", null, f
alse, false); | |
| 1294 testMatch("abc$object-subrequest", "http://abc/adf", "IMAGE", null, false, f
alse); | |
| 1295 testMatch("abc$object-subrequest", "http://abc/adf", "OBJECT_SUBREQUEST", nu
ll, false, true); | |
| 1296 testMatch("abc$~object-subrequest", "http://abc/adf", "OBJECT_SUBREQUEST", n
ull, false, false); | |
| 1297 testMatch("abc$dtd", "http://abc/adf", "IMAGE", null, false, false); | |
| 1298 testMatch("abc$dtd", "http://abc/adf", "DTD", null, false, true); | |
| 1299 testMatch("abc$~dtd", "http://abc/adf", "DTD", null, false, false); | |
| 1300 testMatch("abc$media", "http://abc/adf", "IMAGE", null, false, false); | |
| 1301 testMatch("abc$media", "http://abc/adf", "MEDIA", null, false, true); | |
| 1302 testMatch("abc$~media", "http://abc/adf", "MEDIA", null, false, false); | |
| 1303 testMatch("abc$font", "http://abc/adf", "IMAGE", null, false, false); | |
| 1304 testMatch("abc$font", "http://abc/adf", "FONT", null, false, true); | |
| 1305 testMatch("abc$~font", "http://abc/adf", "FONT", null, false, false); | |
| 1306 testMatch("abc$image,script", "http://abc/adf", "IMAGE", null, false, true); | |
| 1307 testMatch("abc$~image", "http://abc/adf", "IMAGE", null, false, false); | |
| 1308 testMatch("abc$~script", "http://abc/adf", "IMAGE", null, false, true); | |
| 1309 testMatch("abc$~image,~script", "http://abc/adf", "IMAGE", null, false, fals
e); | |
| 1310 testMatch("abc$~script,~image", "http://abc/adf", "IMAGE", null, false, fals
e); | |
| 1311 testMatch("abc$~document,~script,~other", "http://abc/adf", "IMAGE", null, f
alse, true); | |
| 1312 testMatch("abc$~image,image", "http://abc/adf", "IMAGE", null, false, true); | |
| 1313 testMatch("abc$image,~image", "http://abc/adf", "IMAGE", null, false, false)
; | |
| 1314 testMatch("abc$~image,image", "http://abc/adf", "SCRIPT", null, false, true)
; | |
| 1315 testMatch("abc$image,~image", "http://abc/adf", "SCRIPT", null, false, false
); | |
| 1316 testMatch("abc$match-case", "http://abc/adf", "IMAGE", null, false, true); | |
| 1317 testMatch("abc$match-case", "http://ABC/adf", "IMAGE", null, false, false); | |
| 1318 testMatch("abc$~match-case", "http://abc/adf", "IMAGE", null, false, true); | |
| 1319 testMatch("abc$~match-case", "http://ABC/adf", "IMAGE", null, false, true); | |
| 1320 testMatch("abc$match-case,image", "http://abc/adf", "IMAGE", null, false, tr
ue); | |
| 1321 testMatch("abc$match-case,script", "http://abc/adf", "IMAGE", null, false, f
alse); | |
| 1322 testMatch("abc$match-case,image", "http://ABC/adf", "IMAGE", null, false, fa
lse); | |
| 1323 testMatch("abc$match-case,script", "http://ABC/adf", "IMAGE", null, false, f
alse); | |
| 1324 testMatch("abc$third-party", "http://abc/adf", "IMAGE", null, false, false); | |
| 1325 testMatch("abc$third-party", "http://abc/adf", "IMAGE", null, true, true); | |
| 1326 testMatch("abd$third-party", "http://abc/adf", "IMAGE", null, false, false); | |
| 1327 testMatch("abd$third-party", "http://abc/adf", "IMAGE", null, true, false); | |
| 1328 testMatch("abc$image,third-party", "http://abc/adf", "IMAGE", null, false, f
alse); | |
| 1329 testMatch("abc$image,third-party", "http://abc/adf", "IMAGE", null, true, tr
ue); | |
| 1330 testMatch("abc$~image,third-party", "http://abc/adf", "IMAGE", null, false,
false); | |
| 1331 testMatch("abc$~image,third-party", "http://abc/adf", "IMAGE", null, true, f
alse); | |
| 1332 testMatch("abc$~third-party", "http://abc/adf", "IMAGE", null, false, true); | |
| 1333 testMatch("abc$~third-party", "http://abc/adf", "IMAGE", null, true, false); | |
| 1334 testMatch("abd$~third-party", "http://abc/adf", "IMAGE", null, false, false)
; | |
| 1335 testMatch("abd$~third-party", "http://abc/adf", "IMAGE", null, true, false); | |
| 1336 testMatch("abc$image,~third-party", "http://abc/adf", "IMAGE", null, false,
true); | |
| 1337 testMatch("abc$image,~third-party", "http://abc/adf", "IMAGE", null, true, f
alse); | |
| 1338 testMatch("abc$~image,~third-party", "http://abc/adf", "IMAGE", null, false,
false); | |
| 1339 }); | |
| 1340 test("Regular expressions", function() | |
| 1341 { | |
| 1342 testMatch("/abc/", "http://abc/adf", "IMAGE", null, false, true); | |
| 1343 testMatch("/abc/", "http://abcd/adf", "IMAGE", null, false, true); | |
| 1344 testMatch("*/abc/", "http://abc/adf", "IMAGE", null, false, true); | |
| 1345 testMatch("*/abc/", "http://abcd/adf", "IMAGE", null, false, false); | |
| 1346 testMatch("/a\\wc/", "http://abc/adf", "IMAGE", null, false, true); | |
| 1347 testMatch("/a\\wc/", "http://a1c/adf", "IMAGE", null, false, true); | |
| 1348 testMatch("/a\\wc/", "http://a_c/adf", "IMAGE", null, false, true); | |
| 1349 testMatch("/a\\wc/", "http://a%c/adf", "IMAGE", null, false, false); | |
| 1350 }); | |
| 1351 test("Regular expressions with type options", function() | |
| 1352 { | |
| 1353 testMatch("/abc/$image", "http://abc/adf", "IMAGE", null, false, true); | |
| 1354 testMatch("/abc/$image", "http://aBc/adf", "IMAGE", null, false, true); | |
| 1355 testMatch("/abc/$script", "http://abc/adf", "IMAGE", null, false, false); | |
| 1356 testMatch("/abc/$~image", "http://abcd/adf", "IMAGE", null, false, false); | |
| 1357 testMatch("/ab{2}c/$image", "http://abc/adf", "IMAGE", null, false, false); | |
| 1358 testMatch("/ab{2}c/$script", "http://abc/adf", "IMAGE", null, false, false); | |
| 1359 testMatch("/ab{2}c/$~image", "http://abcd/adf", "IMAGE", null, false, false)
; | |
| 1360 testMatch("/abc/$third-party", "http://abc/adf", "IMAGE", null, false, false
); | |
| 1361 testMatch("/abc/$third-party", "http://abc/adf", "IMAGE", null, true, true); | |
| 1362 testMatch("/abc/$~third-party", "http://abc/adf", "IMAGE", null, false, true
); | |
| 1363 testMatch("/abc/$~third-party", "http://abc/adf", "IMAGE", null, true, false
); | |
| 1364 testMatch("/abc/$match-case", "http://abc/adf", "IMAGE", null, false, true); | |
| 1365 testMatch("/abc/$match-case", "http://aBc/adf", "IMAGE", null, true, false); | |
| 1366 testMatch("/ab{2}c/$match-case", "http://abc/adf", "IMAGE", null, false, fal
se); | |
| 1367 testMatch("/ab{2}c/$match-case", "http://aBc/adf", "IMAGE", null, true, fals
e); | |
| 1368 testMatch("/abc/$~match-case", "http://abc/adf", "IMAGE", null, false, true)
; | |
| 1369 testMatch("/abc/$~match-case", "http://aBc/adf", "IMAGE", null, true, true); | |
| 1370 testMatch("/ab{2}c/$~match-case", "http://abc/adf", "IMAGE", null, false, fa
lse); | |
| 1371 testMatch("/ab{2}c/$~match-case", "http://aBc/adf", "IMAGE", null, true, fal
se); | |
| 1372 }); | |
| 1373 test("Domain restrictions", function() | |
| 1374 { | |
| 1375 testMatch("abc$domain=foo.com", "http://abc/def", "IMAGE", "foo.com", true,
true); | |
| 1376 testMatch("abc$domain=foo.com", "http://abc/def", "IMAGE", "foo.com.", true,
true); | |
| 1377 testMatch("abc$domain=foo.com", "http://abc/def", "IMAGE", "www.foo.com", tr
ue, true); | |
| 1378 testMatch("abc$domain=foo.com", "http://abc/def", "IMAGE", "www.foo.com.", t
rue, true); | |
| 1379 testMatch("abc$domain=foo.com", "http://abc/def", "IMAGE", "Foo.com", true,
true); | |
| 1380 testMatch("abc$domain=foo.com", "http://abc/def", "IMAGE", "abc.def.foo.com"
, true, true); | |
| 1381 testMatch("abc$domain=foo.com", "http://abc/def", "IMAGE", "www.baz.com", tr
ue, false); | |
| 1382 testMatch("abc$domain=foo.com", "http://abc/def", "IMAGE", null, true, false
); | |
| 1383 testMatch("abc$domain=foo.com|bar.com", "http://abc/def", "IMAGE", "foo.com"
, true, true); | |
| 1384 testMatch("abc$domain=foo.com|bar.com", "http://abc/def", "IMAGE", "foo.com.
", true, true); | |
| 1385 testMatch("abc$domain=foo.com|bar.com", "http://abc/def", "IMAGE", "www.foo.
com", true, true); | |
| 1386 testMatch("abc$domain=foo.com|bar.com", "http://abc/def", "IMAGE", "www.foo.
com.", true, true); | |
| 1387 testMatch("abc$domain=foo.com|bar.com", "http://abc/def", "IMAGE", "Foo.com"
, true, true); | |
| 1388 testMatch("abc$domain=foo.com|bar.com", "http://abc/def", "IMAGE", "abc.def.
foo.com", true, true); | |
| 1389 testMatch("abc$domain=foo.com|bar.com", "http://abc/def", "IMAGE", "www.baz.
com", true, false); | |
| 1390 testMatch("abc$domain=foo.com|bar.com", "http://abc/def", "IMAGE", null, tru
e, false); | |
| 1391 testMatch("abc$domain=bar.com|foo.com", "http://abc/def", "IMAGE", "foo.com"
, true, true); | |
| 1392 testMatch("abc$domain=bar.com|foo.com", "http://abc/def", "IMAGE", "foo.com.
", true, true); | |
| 1393 testMatch("abc$domain=bar.com|foo.com", "http://abc/def", "IMAGE", "www.foo.
com", true, true); | |
| 1394 testMatch("abc$domain=bar.com|foo.com", "http://abc/def", "IMAGE", "www.foo.
com.", true, true); | |
| 1395 testMatch("abc$domain=bar.com|foo.com", "http://abc/def", "IMAGE", "Foo.com"
, true, true); | |
| 1396 testMatch("abc$domain=bar.com|foo.com", "http://abc/def", "IMAGE", "abc.def.
foo.com", true, true); | |
| 1397 testMatch("abc$domain=bar.com|foo.com", "http://abc/def", "IMAGE", "www.baz.
com", true, false); | |
| 1398 testMatch("abc$domain=bar.com|foo.com", "http://abc/def", "IMAGE", null, tru
e, false); | |
| 1399 testMatch("abc$domain=~foo.com", "http://abc/def", "IMAGE", "foo.com", true,
false); | |
| 1400 testMatch("abc$domain=~foo.com", "http://abc/def", "IMAGE", "foo.com.", true
, false); | |
| 1401 testMatch("abc$domain=~foo.com", "http://abc/def", "IMAGE", "www.foo.com", t
rue, false); | |
| 1402 testMatch("abc$domain=~foo.com", "http://abc/def", "IMAGE", "www.foo.com.",
true, false); | |
| 1403 testMatch("abc$domain=~foo.com", "http://abc/def", "IMAGE", "Foo.com", true,
false); | |
| 1404 testMatch("abc$domain=~foo.com", "http://abc/def", "IMAGE", "abc.def.foo.com
", true, false); | |
| 1405 testMatch("abc$domain=~foo.com", "http://abc/def", "IMAGE", "www.baz.com", t
rue, true); | |
| 1406 testMatch("abc$domain=~foo.com", "http://abc/def", "IMAGE", null, true, true
); | |
| 1407 testMatch("abc$domain=~foo.com|~bar.com", "http://abc/def", "IMAGE", "foo.co
m", true, false); | |
| 1408 testMatch("abc$domain=~foo.com|~bar.com", "http://abc/def", "IMAGE", "foo.co
m.", true, false); | |
| 1409 testMatch("abc$domain=~foo.com|~bar.com", "http://abc/def", "IMAGE", "www.fo
o.com", true, false); | |
| 1410 testMatch("abc$domain=~foo.com|~bar.com", "http://abc/def", "IMAGE", "www.fo
o.com.", true, false); | |
| 1411 testMatch("abc$domain=~foo.com|~bar.com", "http://abc/def", "IMAGE", "Foo.co
m", true, false); | |
| 1412 testMatch("abc$domain=~foo.com|~bar.com", "http://abc/def", "IMAGE", "abc.de
f.foo.com", true, false); | |
| 1413 testMatch("abc$domain=~foo.com|~bar.com", "http://abc/def", "IMAGE", "www.ba
z.com", true, true); | |
| 1414 testMatch("abc$domain=~foo.com|~bar.com", "http://abc/def", "IMAGE", null, t
rue, true); | |
| 1415 testMatch("abc$domain=~bar.com|~foo.com", "http://abc/def", "IMAGE", "foo.co
m", true, false); | |
| 1416 testMatch("abc$domain=~bar.com|~foo.com", "http://abc/def", "IMAGE", "foo.co
m.", true, false); | |
| 1417 testMatch("abc$domain=~bar.com|~foo.com", "http://abc/def", "IMAGE", "www.fo
o.com", true, false); | |
| 1418 testMatch("abc$domain=~bar.com|~foo.com", "http://abc/def", "IMAGE", "www.fo
o.com.", true, false); | |
| 1419 testMatch("abc$domain=~bar.com|~foo.com", "http://abc/def", "IMAGE", "Foo.co
m", true, false); | |
| 1420 testMatch("abc$domain=~bar.com|~foo.com", "http://abc/def", "IMAGE", "abc.de
f.foo.com", true, false); | |
| 1421 testMatch("abc$domain=~bar.com|~foo.com", "http://abc/def", "IMAGE", "www.ba
z.com", true, true); | |
| 1422 testMatch("abc$domain=~bar.com|~foo.com", "http://abc/def", "IMAGE", null, t
rue, true); | |
| 1423 testMatch("abc$domain=foo.com|~bar.com", "http://abc/def", "IMAGE", "foo.com
", true, true); | |
| 1424 testMatch("abc$domain=foo.com|~bar.com", "http://abc/def", "IMAGE", "bar.com
", true, false); | |
| 1425 testMatch("abc$domain=foo.com|~bar.com", "http://abc/def", "IMAGE", "baz.com
", true, false); | |
| 1426 testMatch("abc$domain=foo.com|~bar.foo.com", "http://abc/def", "IMAGE", "foo
.com", true, true); | |
| 1427 testMatch("abc$domain=foo.com|~bar.foo.com", "http://abc/def", "IMAGE", "www
.foo.com", true, true); | |
| 1428 testMatch("abc$domain=foo.com|~bar.foo.com", "http://abc/def", "IMAGE", "bar
.foo.com", true, false); | |
| 1429 testMatch("abc$domain=foo.com|~bar.foo.com", "http://abc/def", "IMAGE", "www
.bar.foo.com", true, false); | |
| 1430 testMatch("abc$domain=foo.com|~bar.foo.com", "http://abc/def", "IMAGE", "baz
.com", true, false); | |
| 1431 testMatch("abc$domain=foo.com|~bar.foo.com", "http://abc/def", "IMAGE", "www
.baz.com", true, false); | |
| 1432 testMatch("abc$domain=com|~foo.com", "http://abc/def", "IMAGE", "bar.com", t
rue, true); | |
| 1433 testMatch("abc$domain=com|~foo.com", "http://abc/def", "IMAGE", "bar.net", t
rue, false); | |
| 1434 testMatch("abc$domain=com|~foo.com", "http://abc/def", "IMAGE", "foo.com", t
rue, false); | |
| 1435 testMatch("abc$domain=com|~foo.com", "http://abc/def", "IMAGE", "foo.net", t
rue, false); | |
| 1436 testMatch("abc$domain=com|~foo.com", "http://abc/def", "IMAGE", "com", true,
true); | |
| 1437 testMatch("abc$domain=foo.com", "http://ccc/def", "IMAGE", "foo.com", true,
false); | |
| 1438 testMatch("abc$domain=foo.com", "http://ccc/def", "IMAGE", "bar.com", true,
false); | |
| 1439 testMatch("abc$image,domain=foo.com", "http://abc/def", "IMAGE", "foo.com",
true, true); | |
| 1440 testMatch("abc$image,domain=foo.com", "http://abc/def", "IMAGE", "bar.com",
true, false); | |
| 1441 testMatch("abc$image,domain=foo.com", "http://abc/def", "OBJECT", "foo.com",
true, false); | |
| 1442 testMatch("abc$image,domain=foo.com", "http://abc/def", "OBJECT", "bar.com",
true, false); | |
| 1443 testMatch("abc$~image,domain=foo.com", "http://abc/def", "IMAGE", "foo.com",
true, false); | |
| 1444 testMatch("abc$~image,domain=foo.com", "http://abc/def", "IMAGE", "bar.com",
true, false); | |
| 1445 testMatch("abc$~image,domain=foo.com", "http://abc/def", "OBJECT", "foo.com"
, true, true); | |
| 1446 testMatch("abc$~image,domain=foo.com", "http://abc/def", "OBJECT", "bar.com"
, true, false); | |
| 1447 testMatch("abc$domain=foo.com,image", "http://abc/def", "IMAGE", "foo.com",
true, true); | |
| 1448 testMatch("abc$domain=foo.com,image", "http://abc/def", "IMAGE", "bar.com",
true, false); | |
| 1449 testMatch("abc$domain=foo.com,image", "http://abc/def", "OBJECT", "foo.com",
true, false); | |
| 1450 testMatch("abc$domain=foo.com,image", "http://abc/def", "OBJECT", "bar.com",
true, false); | |
| 1451 testMatch("abc$domain=foo.com,~image", "http://abc/def", "IMAGE", "foo.com",
true, false); | |
| 1452 testMatch("abc$domain=foo.com,~image", "http://abc/def", "IMAGE", "bar.com",
true, false); | |
| 1453 testMatch("abc$domain=foo.com,~image", "http://abc/def", "OBJECT", "foo.com"
, true, true); | |
| 1454 testMatch("abc$domain=foo.com,~image", "http://abc/def", "OBJECT", "bar.com"
, true, false); | |
| 1455 }); | |
| 1456 test("Exception rules", function() | |
| 1457 { | |
| 1458 testMatch("@@test", "http://test/", "DOCUMENT", null, false, false); | |
| 1459 testMatch("@@http://test*", "http://test/", "DOCUMENT", null, false, true); | |
| 1460 testMatch("@@ftp://test*", "ftp://test/", "DOCUMENT", null, false, true); | |
| 1461 testMatch("@@test$document", "http://test/", "DOCUMENT", null, false, true); | |
| 1462 testMatch("@@test$document,image", "http://test/", "DOCUMENT", null, false,
true); | |
| 1463 testMatch("@@test$~image", "http://test/", "DOCUMENT", null, false, false); | |
| 1464 testMatch("@@test$~image,document", "http://test/", "DOCUMENT", null, false,
true); | |
| 1465 testMatch("@@test$document,~image", "http://test/", "DOCUMENT", null, false,
true); | |
| 1466 testMatch("@@test$document,domain=foo.com", "http://test/", "DOCUMENT", "foo
.com", false, true); | |
| 1467 testMatch("@@test$document,domain=foo.com", "http://test/", "DOCUMENT", "bar
.com", false, false); | |
| 1468 testMatch("@@test$document,domain=~foo.com", "http://test/", "DOCUMENT", "fo
o.com", false, false); | |
| 1469 testMatch("@@test$document,domain=~foo.com", "http://test/", "DOCUMENT", "ba
r.com", false, true); | |
| 1470 }); | |
| 1471 })(); | |
| 1472 (function() | |
| 1473 { | |
| 1474 module("Subscription classes", | |
| 1475 { | |
| 1476 setup: prepareFilterComponents, | |
| 1477 teardown: restoreFilterComponents | |
| 1478 }); | |
| 1479 | |
| 1480 function compareSubscription(url, expected, postInit) | |
| 1481 { | |
| 1482 expected.push("[Subscription]"); | |
| 1483 var subscription = Subscription.fromURL(url); | |
| 1484 if (postInit) | |
| 1485 { | |
| 1486 postInit(subscription); | |
| 1487 } | |
| 1488 var result = []; | |
| 1489 subscription.serialize(result); | |
| 1490 equal(result.sort().join("\n"), expected.sort().join("\n"), url); | |
| 1491 var map = | |
| 1492 { | |
| 1493 __proto__: null | |
| 1494 }; | |
| 1495 for (var _loopIndex8 = 0; _loopIndex8 < result.slice(1).length; ++_loopIndex
8) | |
| 1496 { | |
| 1497 var line = result.slice(1)[_loopIndex8]; | |
| 1498 if (/(.*?)=(.*)/.test(line)) | |
| 1499 { | |
| 1500 map[RegExp.$1] = RegExp.$2; | |
| 1501 } | |
| 1502 } | |
| 1503 var subscription2 = Subscription.fromObject(map); | |
| 1504 equal(subscription.toString(), subscription2.toString(), url + " deserializa
tion"); | |
| 1505 } | |
| 1506 test("Subscription class definitions", function() | |
| 1507 { | |
| 1508 equal(typeof Subscription, "function", "typeof Subscription"); | |
| 1509 equal(typeof SpecialSubscription, "function", "typeof SpecialSubscription"); | |
| 1510 equal(typeof RegularSubscription, "function", "typeof RegularSubscription"); | |
| 1511 equal(typeof ExternalSubscription, "function", "typeof ExternalSubscription"
); | |
| 1512 equal(typeof DownloadableSubscription, "function", "typeof DownloadableSubsc
ription"); | |
| 1513 }); | |
| 1514 test("Subscriptions with state", function() | |
| 1515 { | |
| 1516 compareSubscription("~fl~", ["url=~fl~", "title=" + Utils.getString("newGrou
p_title")]); | |
| 1517 compareSubscription("http://test/default", ["url=http://test/default", "titl
e=http://test/default"]); | |
| 1518 compareSubscription("http://test/default_titled", ["url=http://test/default_
titled", "title=test"], function(subscription) | |
| 1519 { | |
| 1520 subscription.title = "test"; | |
| 1521 }); | |
| 1522 compareSubscription("http://test/non_default", ["url=http://test/non_default
", "title=test", "nextURL=http://test2/", "disabled=true", "lastSuccess=8", "las
tDownload=12", "lastCheck=16", "softExpiration=18", "expires=20", "downloadStatu
s=foo", "lastModified=bar", "errors=3", "requiredVersion=0.6", "alternativeLocat
ions=http://foo/;q=0.5,http://bar/;q=2"], function(subscription) | |
| 1523 { | |
| 1524 subscription.title = "test"; | |
| 1525 subscription.nextURL = "http://test2/"; | |
| 1526 subscription.disabled = true; | |
| 1527 subscription.lastSuccess = 8; | |
| 1528 subscription.lastDownload = 12; | |
| 1529 subscription.lastCheck = 16; | |
| 1530 subscription.softExpiration = 18; | |
| 1531 subscription.expires = 20; | |
| 1532 subscription.downloadStatus = "foo"; | |
| 1533 subscription.lastModified = "bar"; | |
| 1534 subscription.errors = 3; | |
| 1535 subscription.requiredVersion = "0.6"; | |
| 1536 subscription.alternativeLocations = "http://foo/;q=0.5,http://bar/;q=2"; | |
| 1537 }); | |
| 1538 compareSubscription("~wl~", ["url=~wl~", "disabled=true", "title=Test group"
], function(subscription) | |
| 1539 { | |
| 1540 subscription.title = "Test group"; | |
| 1541 subscription.disabled = true; | |
| 1542 }); | |
| 1543 }); | |
| 1544 })(); | |
| OLD | NEW |