OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
| 3 * Copyright (C) 2006-present 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 "use strict"; |
| 19 |
| 20 const {createSandbox} = require("./_common"); |
| 21 |
| 22 let Filter = null; |
| 23 let FilterNotifier = null; |
| 24 let FilterStorage = null; |
| 25 let Subscription = null; |
| 26 |
| 27 exports.setUp = function(callback) |
| 28 { |
| 29 let sandboxedRequire = createSandbox(); |
| 30 |
| 31 ( |
| 32 {Filter} = sandboxedRequire("../lib/filterClasses"), |
| 33 {FilterNotifier} = sandboxedRequire("../lib/filterNotifier"), |
| 34 {FilterStorage} = sandboxedRequire("../lib/filterStorage"), |
| 35 {Subscription} = sandboxedRequire("../lib/subscriptionClasses") |
| 36 ); |
| 37 |
| 38 callback(); |
| 39 }; |
| 40 |
| 41 function compareSubscriptionList(test, testMessage, list) |
| 42 { |
| 43 let result = Array.from(FilterStorage.subscriptions, subscription => subscript
ion.url); |
| 44 let expected = list.map(subscription => subscription.url); |
| 45 test.deepEqual(result, expected, testMessage); |
| 46 } |
| 47 |
| 48 function compareFiltersList(test, testMessage, list) |
| 49 { |
| 50 let result = Array.from(FilterStorage.subscriptions, subscription => |
| 51 { |
| 52 return Array.from(subscription.filters, filter => filter.text); |
| 53 }); |
| 54 test.deepEqual(result, list, testMessage); |
| 55 } |
| 56 |
| 57 exports.testAddingRemovingSubscriptions = function(test) |
| 58 { |
| 59 let subscription1 = Subscription.fromURL("http://test1/"); |
| 60 let subscription2 = Subscription.fromURL("http://test2/"); |
| 61 test.ok(!subscription1.listed, "First subscription not listed"); |
| 62 test.ok(!subscription2.listed, "Second subscription not listed"); |
| 63 |
| 64 let changes = []; |
| 65 function listener(action, subscription) |
| 66 { |
| 67 if (action.indexOf("subscription.") == 0) |
| 68 changes.push(action + " " + subscription.url); |
| 69 } |
| 70 FilterNotifier.addListener(listener); |
| 71 |
| 72 compareSubscriptionList(test, "Initial state", []); |
| 73 test.deepEqual(changes, [], "Received changes"); |
| 74 |
| 75 changes = []; |
| 76 FilterStorage.addSubscription(subscription1); |
| 77 compareSubscriptionList(test, "Adding first subscription", [subscription1]); |
| 78 test.deepEqual(changes, ["subscription.added http://test1/"], "Received change
s"); |
| 79 test.ok(subscription1.listed, "First subscription listed"); |
| 80 test.ok(!subscription2.listed, "Second subscription not listed"); |
| 81 |
| 82 changes = []; |
| 83 FilterStorage.addSubscription(subscription1); |
| 84 compareSubscriptionList(test, "Adding already added subscription", [subscripti
on1]); |
| 85 test.deepEqual(changes, [], "Received changes"); |
| 86 test.ok(subscription1.listed, "First subscription listed"); |
| 87 test.ok(!subscription2.listed, "Second subscription not listed"); |
| 88 |
| 89 changes = []; |
| 90 FilterStorage.addSubscription(subscription2); |
| 91 compareSubscriptionList(test, "Adding second", [subscription1, subscription2])
; |
| 92 test.deepEqual(changes, ["subscription.added http://test2/"], "Received change
s"); |
| 93 test.ok(subscription1.listed, "First subscription listed"); |
| 94 test.ok(subscription2.listed, "Second subscription listed"); |
| 95 |
| 96 changes = []; |
| 97 FilterStorage.removeSubscription(subscription1); |
| 98 compareSubscriptionList(test, "Remove", [subscription2]); |
| 99 test.deepEqual(changes, ["subscription.removed http://test1/"], "Received chan
ges"); |
| 100 test.ok(!subscription1.listed, "First subscription not listed"); |
| 101 test.ok(subscription2.listed, "Second subscription listed"); |
| 102 |
| 103 changes = []; |
| 104 FilterStorage.removeSubscription(subscription1); |
| 105 compareSubscriptionList(test, "Removing already removed subscription", [subscr
iption2]); |
| 106 test.deepEqual(changes, [], "Received changes"); |
| 107 test.ok(!subscription1.listed, "First subscription not listed"); |
| 108 test.ok(subscription2.listed, "Second subscription listed"); |
| 109 |
| 110 changes = []; |
| 111 FilterStorage.removeSubscription(subscription2); |
| 112 compareSubscriptionList(test, "Removing remaining subscription", []); |
| 113 test.deepEqual(changes, ["subscription.removed http://test2/"], "Received chan
ges"); |
| 114 test.ok(!subscription1.listed, "First subscription not listed"); |
| 115 test.ok(!subscription2.listed, "Second subscription not listed"); |
| 116 |
| 117 changes = []; |
| 118 FilterStorage.addSubscription(subscription2); |
| 119 compareSubscriptionList(test, "Re-adding previously removed subscription", [su
bscription2]); |
| 120 test.deepEqual(changes, ["subscription.added http://test2/"], "Received change
s"); |
| 121 test.ok(!subscription1.listed, "First subscription not listed"); |
| 122 test.ok(subscription2.listed, "Second subscription listed"); |
| 123 |
| 124 changes = []; |
| 125 FilterStorage.removeSubscription(subscription2); |
| 126 compareSubscriptionList(test, "Re-removing previously added subscription", [])
; |
| 127 test.deepEqual(changes, ["subscription.removed http://test2/"], "Received chan
ges"); |
| 128 test.ok(!subscription1.listed, "First subscription not listed"); |
| 129 test.ok(!subscription2.listed, "Second subscription not listed"); |
| 130 |
| 131 subscription1.delete(); |
| 132 subscription2.delete(); |
| 133 |
| 134 test.done(); |
| 135 }; |
| 136 |
| 137 exports.testMovingSubscriptions = function(test) |
| 138 { |
| 139 let subscription1 = Subscription.fromURL("http://test1/"); |
| 140 let subscription2 = Subscription.fromURL("http://test2/"); |
| 141 let subscription3 = Subscription.fromURL("http://test3/"); |
| 142 |
| 143 FilterStorage.addSubscription(subscription1); |
| 144 FilterStorage.addSubscription(subscription2); |
| 145 FilterStorage.addSubscription(subscription3); |
| 146 |
| 147 let changes = []; |
| 148 function listener(action, subscription) |
| 149 { |
| 150 if (action.indexOf("subscription.") == 0) |
| 151 changes.push(action + " " + subscription.url); |
| 152 } |
| 153 FilterNotifier.addListener(listener); |
| 154 |
| 155 compareSubscriptionList(test, "Initial state", [subscription1, subscription2,
subscription3]); |
| 156 test.deepEqual(changes, [], "Received changes"); |
| 157 |
| 158 changes = []; |
| 159 test.ok(FilterStorage.moveSubscription(subscription1), "Move without explicit
position succeeded"); |
| 160 compareSubscriptionList(test, "Move without explicit position", [subscription2
, subscription3, subscription1]); |
| 161 test.deepEqual(changes, ["subscription.moved http://test1/"], "Received change
s"); |
| 162 |
| 163 changes = []; |
| 164 test.ok(!FilterStorage.moveSubscription(subscription1), "Move without explicit
position failed (subscription already last)"); |
| 165 compareSubscriptionList(test, "Move without explicit position (subscription al
ready last)", [subscription2, subscription3, subscription1]); |
| 166 test.deepEqual(changes, [], "Received changes"); |
| 167 |
| 168 changes = []; |
| 169 test.ok(FilterStorage.moveSubscription(subscription2, subscription1), "Move wi
th explicit position succeeded"); |
| 170 compareSubscriptionList(test, "Move with explicit position", [subscription3, s
ubscription2, subscription1]); |
| 171 test.deepEqual(changes, ["subscription.moved http://test2/"], "Received change
s"); |
| 172 |
| 173 changes = []; |
| 174 test.ok(!FilterStorage.moveSubscription(subscription3, subscription2), "Move w
ithout explicit position failed (subscription already at position)"); |
| 175 compareSubscriptionList(test, "Move without explicit position (subscription al
ready at position)", [subscription3, subscription2, subscription1]); |
| 176 test.deepEqual(changes, [], "Received changes"); |
| 177 |
| 178 FilterStorage.removeSubscription(subscription2); |
| 179 compareSubscriptionList(test, "Remove", [subscription3, subscription1]); |
| 180 |
| 181 changes = []; |
| 182 test.ok(FilterStorage.moveSubscription(subscription3, subscription2), "Move be
fore removed subscription succeeded"); |
| 183 compareSubscriptionList(test, "Move before removed subscription", [subscriptio
n1, subscription3]); |
| 184 test.deepEqual(changes, ["subscription.moved http://test3/"], "Received change
s"); |
| 185 |
| 186 changes = []; |
| 187 test.ok(!FilterStorage.moveSubscription(subscription2), "Move of removed subsc
ription failed"); |
| 188 compareSubscriptionList(test, "Move of removed subscription", [subscription1,
subscription3]); |
| 189 test.deepEqual(changes, [], "Received changes"); |
| 190 |
| 191 subscription1.delete(); |
| 192 subscription2.delete(); |
| 193 subscription3.delete(); |
| 194 |
| 195 test.done(); |
| 196 }; |
| 197 |
| 198 exports.testAddingRemovingFilters = function(test) |
| 199 { |
| 200 function addFilter(text) |
| 201 { |
| 202 let filter = Filter.fromText(text); |
| 203 FilterStorage.addFilter(filter); |
| 204 filter.delete(); |
| 205 } |
| 206 |
| 207 function removeFilter(text) |
| 208 { |
| 209 let filter = Filter.fromText(text); |
| 210 FilterStorage.removeFilter(filter); |
| 211 filter.delete(); |
| 212 } |
| 213 |
| 214 |
| 215 let changes = []; |
| 216 function listener(action, filter, subscription, position) |
| 217 { |
| 218 if (action.indexOf("filter.") == 0) |
| 219 { |
| 220 changes.push([ |
| 221 action, filter.text, FilterStorage.indexOfSubscription(subscription), |
| 222 position |
| 223 ].join(" ")); |
| 224 } |
| 225 } |
| 226 FilterNotifier.addListener(listener); |
| 227 |
| 228 compareFiltersList(test, "Initial state", []); |
| 229 test.deepEqual(changes, [], "Received changes"); |
| 230 |
| 231 changes = []; |
| 232 addFilter("foo"); |
| 233 compareFiltersList(test, "Adding blocking filter", [["foo"]]); |
| 234 test.deepEqual(changes, ["filter.added foo 0 0"], "Received changes"); |
| 235 |
| 236 changes = []; |
| 237 addFilter("@@bar"); |
| 238 compareFiltersList(test, "Adding exception rule", [["foo"], ["@@bar"]]); |
| 239 test.deepEqual(changes, ["filter.added @@bar 1 0"], "Received changes"); |
| 240 |
| 241 { |
| 242 let subscription = FilterStorage.subscriptionAt(1); |
| 243 let filter = Filter.fromText("##elemhide"); |
| 244 subscription.makeDefaultFor(filter); |
| 245 filter.delete(); |
| 246 subscription.delete(); |
| 247 } |
| 248 |
| 249 { |
| 250 let subscription = Subscription.fromURL("~other"); |
| 251 FilterStorage.addSubscription(subscription); |
| 252 subscription.delete(); |
| 253 } |
| 254 |
| 255 test.deepEqual(Array.from(FilterStorage.subscriptions, s => s.isGeneric()), |
| 256 [false, false, true], "SpecialSubscription.isGeneric() result"); |
| 257 |
| 258 changes = []; |
| 259 addFilter("foo##bar"); |
| 260 compareFiltersList(test, "Adding hiding rule", [["foo"], ["@@bar", "foo##bar"]
, []]); |
| 261 test.deepEqual(changes, ["filter.added foo##bar 1 1"], "Received changes"); |
| 262 |
| 263 changes = []; |
| 264 addFilter("foo#@#bar"); |
| 265 compareFiltersList(test, "Adding hiding exception", [["foo"], ["@@bar", "foo##
bar", "foo#@#bar"], []]); |
| 266 test.deepEqual(changes, ["filter.added foo#@#bar 1 2"], "Received changes"); |
| 267 |
| 268 changes = []; |
| 269 addFilter("!foobar"); |
| 270 compareFiltersList(test, "Adding comment", [["foo"], ["@@bar", "foo##bar", "fo
o#@#bar"], ["!foobar"]]); |
| 271 test.deepEqual(changes, ["filter.added !foobar 2 0"], "Received changes"); |
| 272 |
| 273 changes = []; |
| 274 addFilter("foo"); |
| 275 compareFiltersList(test, "Adding already added filter", [["foo"], ["@@bar", "f
oo##bar", "foo#@#bar"], ["!foobar"]]); |
| 276 test.deepEqual(changes, [], "Received changes"); |
| 277 |
| 278 { |
| 279 let subscription = FilterStorage.subscriptionAt(0); |
| 280 subscription.disabled = true; |
| 281 subscription.delete(); |
| 282 } |
| 283 |
| 284 changes = []; |
| 285 addFilter("foo"); |
| 286 compareFiltersList(test, "Adding filter already in a disabled subscription", [
["foo"], ["@@bar", "foo##bar", "foo#@#bar"], ["!foobar", "foo"]]); |
| 287 test.deepEqual(changes, ["filter.added foo 2 1"], "Received changes"); |
| 288 |
| 289 changes = []; |
| 290 removeFilter("foo"); |
| 291 compareFiltersList(test, "Removing filter", [[], ["@@bar", "foo##bar", "foo#@#
bar"], ["!foobar"]]); |
| 292 test.deepEqual(changes, [ |
| 293 "filter.removed foo 0 0", |
| 294 "filter.removed foo 2 1" |
| 295 ], "Received changes"); |
| 296 |
| 297 changes = []; |
| 298 removeFilter("foo"); |
| 299 compareFiltersList(test, "Removing unknown filter", [[], ["@@bar", "foo##bar",
"foo#@#bar"], ["!foobar"]]); |
| 300 test.deepEqual(changes, [], "Received changes"); |
| 301 |
| 302 test.done(); |
| 303 }; |
OLD | NEW |