Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 /* | 1 /* |
2 * This file is part of Adblock Plus <http://adblockplus.org/>, | 2 * This file is part of Adblock Plus <http://adblockplus.org/>, |
3 * Copyright (C) 2006-2014 Eyeo GmbH | 3 * Copyright (C) 2006-2014 Eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 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 | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU General Public License | 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/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
16 */ | 16 */ |
17 | 17 |
18 /** | 18 /** |
19 * @fileOverview Stores Adblock Plus data to be attached to a window. | 19 * @fileOverview Stores Adblock Plus data to be attached to a window. |
20 */ | 20 */ |
21 | 21 |
22 Cu.import("resource://gre/modules/Services.jsm"); | 22 Cu.import("resource://gre/modules/Services.jsm"); |
23 | 23 |
24 let {Utils} = require("utils"); | 24 let {Utils} = require("utils"); |
25 let {BlockingFilter, WhitelistFilter, ElemHideBase, ElemHideFilter, ElemHideExce ption} = require("filterClasses"); | 25 let {BlockingFilter, WhitelistFilter, ElemHideBase, ElemHideFilter, ElemHideExce ption} = require("filterClasses"); |
26 | 26 |
27 let nodeData = new WeakMap(); | 27 let nodeData = new WeakMap(); |
28 let windowStats = new WeakMap(); | 28 let windowStats = new WeakMap(); |
29 let windowSelection = new WeakMap(); | 29 let windowSelection = new WeakMap(); |
30 let requestEntryMaxId = 0; | |
30 | 31 |
31 let setEntry, hasEntry, getEntry; | 32 let setEntry, hasEntry, getEntry; |
32 // Last issue(Bug 982561) preventing us from using WeakMap fixed for FF version 32 | 33 // Last issue(Bug 982561) preventing us from using WeakMap fixed for FF version 32 |
33 if (Services.vc.compare(Utils.platformVersion, "32.0a1") >= 0) | 34 if (Services.vc.compare(Utils.platformVersion, "32.0a1") >= 0) |
34 { | 35 { |
35 setEntry = (map, key, value) => map.set(key, value); | 36 setEntry = (map, key, value) => map.set(key, value); |
36 hasEntry = (map, key) => map.has(key); | 37 hasEntry = (map, key) => map.has(key); |
37 getEntry = (map, key) => map.get(key); | 38 getEntry = (map, key) => map.get(key); |
38 } | 39 } |
39 else | 40 else |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
234 * @param {Boolean} noParent if missing or false, the search will extend to the parent nodes until one is found that has data associated with it | 235 * @param {Boolean} noParent if missing or false, the search will extend to the parent nodes until one is found that has data associated with it |
235 * @param {Integer} [type] request type to be looking for | 236 * @param {Integer} [type] request type to be looking for |
236 * @param {String} [location] request location to be looking for | 237 * @param {String} [location] request location to be looking for |
237 * @result {[Node, RequestEntry]} | 238 * @result {[Node, RequestEntry]} |
238 * @static | 239 * @static |
239 */ | 240 */ |
240 RequestNotifier.getDataForNode = function(node, noParent, type, location) | 241 RequestNotifier.getDataForNode = function(node, noParent, type, location) |
241 { | 242 { |
242 while (node) | 243 while (node) |
243 { | 244 { |
244 let entry = getEntry(nodeData, node); | 245 let data = getEntry(nodeData, node); |
245 if (typeof entry != "undefined" && | 246 if (typeof data != "undefined") |
246 (typeof type == "undefined" || entry.type == type) && | 247 { |
247 (typeof location == "undefined" || entry.location == location)) | 248 let entry = null; |
248 { | 249 // Look for matching entry |
249 return [node, entry]; | 250 for (let k in data) |
251 { | |
252 if ((!entry || entry.id < data[k].id) && | |
253 (typeof type == "undefined" || data[k].type == type) && | |
254 (typeof location == "undefined" || data[k].location == location)) | |
255 { | |
256 entry = data[k]; | |
257 } | |
258 } | |
259 if (entry) | |
260 return [node, entry]; | |
250 } | 261 } |
251 | 262 |
252 // If we don't have any match on this node then maybe its parent will do | 263 // If we don't have any match on this node then maybe its parent will do |
253 if ((typeof noParent != "boolean" || !noParent) && | 264 if ((typeof noParent != "boolean" || !noParent) && |
254 node.parentNode instanceof Ci.nsIDOMElement) | 265 node.parentNode instanceof Ci.nsIDOMElement) |
255 { | 266 { |
256 node = node.parentNode; | 267 node = node.parentNode; |
257 } | 268 } |
258 else | 269 else |
259 { | 270 { |
260 node = null; | 271 node = null; |
261 } | 272 } |
262 } | 273 } |
263 | 274 |
264 return null; | 275 return null; |
265 }; | 276 }; |
266 | 277 |
267 function RequestEntry(node, topWnd, contentType, docDomain, thirdParty, location , filter) | 278 function RequestEntry(node, topWnd, contentType, docDomain, thirdParty, location , filter) |
268 { | 279 { |
269 this.type = contentType; | 280 this.type = contentType; |
270 this.docDomain = docDomain; | 281 this.docDomain = docDomain; |
271 this.thirdParty = thirdParty; | 282 this.thirdParty = thirdParty; |
272 this.location = location; | 283 this.location = location; |
273 this.filter = filter; | 284 this.filter = filter; |
285 this.id = ++requestEntryMaxId; | |
274 | 286 |
275 this.attachToNode(node); | 287 this.attachToNode(node); |
276 | 288 |
277 // Update window statistics | 289 // Update window statistics |
278 if (!hasEntry(windowStats, topWnd.document)) | 290 if (!hasEntry(windowStats, topWnd.document)) |
279 { | 291 { |
280 setEntry(windowStats, topWnd.document, { | 292 setEntry(windowStats, topWnd.document, { |
281 items: 0, | 293 items: 0, |
282 hidden: 0, | 294 hidden: 0, |
283 blocked: 0, | 295 blocked: 0, |
(...skipping 21 matching lines...) Expand all Loading... | |
305 } | 317 } |
306 | 318 |
307 // Notify listeners | 319 // Notify listeners |
308 for (let notifier of activeNotifiers) | 320 for (let notifier of activeNotifiers) |
309 if (!notifier.window || notifier.window == topWnd) | 321 if (!notifier.window || notifier.window == topWnd) |
310 notifier.notifyListener(topWnd, node, this); | 322 notifier.notifyListener(topWnd, node, this); |
311 } | 323 } |
312 RequestEntry.prototype = | 324 RequestEntry.prototype = |
313 { | 325 { |
314 /** | 326 /** |
327 * id of request (used to determine last entry attached to a node) | |
328 * @type integer | |
329 */ | |
330 id: 0, | |
331 /** | |
315 * Content type of the request (one of the nsIContentPolicy constants) | 332 * Content type of the request (one of the nsIContentPolicy constants) |
316 * @type Integer | 333 * @type Integer |
317 */ | 334 */ |
318 type: null, | 335 type: null, |
319 /** | 336 /** |
320 * Domain name of the requesting document | 337 * Domain name of the requesting document |
321 * @type String | 338 * @type String |
322 */ | 339 */ |
323 docDomain: null, | 340 docDomain: null, |
324 /** | 341 /** |
(...skipping 26 matching lines...) Expand all Loading... | |
351 get localizedDescr() | 368 get localizedDescr() |
352 { | 369 { |
353 return require("contentPolicy").Policy.localizedDescr[this.type]; | 370 return require("contentPolicy").Policy.localizedDescr[this.type]; |
354 }, | 371 }, |
355 | 372 |
356 /** | 373 /** |
357 * Attaches this request object to a DOM node. | 374 * Attaches this request object to a DOM node. |
358 */ | 375 */ |
359 attachToNode: function(/**Node*/ node) | 376 attachToNode: function(/**Node*/ node) |
360 { | 377 { |
361 setEntry(nodeData, node, this); | 378 let existingData = getEntry(nodeData, node); |
Wladimir Palant
2014/08/14 20:44:57
The the list of blockable items is broken now beca
saroyanm
2014/08/17 14:25:21
Oops, Thanks for that.
| |
362 } | 379 if (typeof existingData == "undefined") |
363 }; | 380 { |
381 existingData = {}; | |
382 setEntry(nodeData, node, existingData); | |
383 } | |
384 | |
385 // Add this request to the node data | |
386 existingData[this.type + " " + this.location] = this; | |
387 } | |
388 }; | |
LEFT | RIGHT |