OLD | NEW |
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 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 data = getEntry(nodeData, node); | 245 let data = getEntry(nodeData, node); |
245 if (typeof data != "undefined") | 246 if (typeof data != "undefined") |
246 { | 247 { |
| 248 let entry = null; |
247 // Look for matching entry | 249 // Look for matching entry |
248 for (let k in data) | 250 for (let k in data) |
249 { | 251 { |
250 let entry = data[k]; | 252 if ((!entry || entry.id < data[k].id) && |
251 if ((typeof type == "undefined" || entry.type == type) && | 253 (typeof type == "undefined" || data[k].type == type) && |
252 (typeof location == "undefined" || entry.location == location)) | 254 (typeof location == "undefined" || data[k].location == location)) |
253 { | 255 { |
254 return [node, entry]; | 256 entry = data[k]; |
255 } | 257 } |
256 } | 258 } |
| 259 if (entry) |
| 260 return [node, entry]; |
257 } | 261 } |
258 | 262 |
259 // 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 |
260 if ((typeof noParent != "boolean" || !noParent) && | 264 if ((typeof noParent != "boolean" || !noParent) && |
261 node.parentNode instanceof Ci.nsIDOMElement) | 265 node.parentNode instanceof Ci.nsIDOMElement) |
262 { | 266 { |
263 node = node.parentNode; | 267 node = node.parentNode; |
264 } | 268 } |
265 else | 269 else |
266 { | 270 { |
267 node = null; | 271 node = null; |
268 } | 272 } |
269 } | 273 } |
270 | 274 |
271 return null; | 275 return null; |
272 }; | 276 }; |
273 | 277 |
274 function RequestEntry(node, topWnd, contentType, docDomain, thirdParty, location
, filter) | 278 function RequestEntry(node, topWnd, contentType, docDomain, thirdParty, location
, filter) |
275 { | 279 { |
276 this.type = contentType; | 280 this.type = contentType; |
277 this.docDomain = docDomain; | 281 this.docDomain = docDomain; |
278 this.thirdParty = thirdParty; | 282 this.thirdParty = thirdParty; |
279 this.location = location; | 283 this.location = location; |
280 this.filter = filter; | 284 this.filter = filter; |
| 285 this.id = ++requestEntryMaxId; |
281 | 286 |
282 this.attachToNode(node); | 287 this.attachToNode(node); |
283 | 288 |
284 // Update window statistics | 289 // Update window statistics |
285 if (!hasEntry(windowStats, topWnd.document)) | 290 if (!hasEntry(windowStats, topWnd.document)) |
286 { | 291 { |
287 setEntry(windowStats, topWnd.document, { | 292 setEntry(windowStats, topWnd.document, { |
288 items: 0, | 293 items: 0, |
289 hidden: 0, | 294 hidden: 0, |
290 blocked: 0, | 295 blocked: 0, |
(...skipping 21 matching lines...) Expand all Loading... |
312 } | 317 } |
313 | 318 |
314 // Notify listeners | 319 // Notify listeners |
315 for (let notifier of activeNotifiers) | 320 for (let notifier of activeNotifiers) |
316 if (!notifier.window || notifier.window == topWnd) | 321 if (!notifier.window || notifier.window == topWnd) |
317 notifier.notifyListener(topWnd, node, this); | 322 notifier.notifyListener(topWnd, node, this); |
318 } | 323 } |
319 RequestEntry.prototype = | 324 RequestEntry.prototype = |
320 { | 325 { |
321 /** | 326 /** |
| 327 * id of request (used to determine last entry attached to a node) |
| 328 * @type integer |
| 329 */ |
| 330 id: 0, |
| 331 /** |
322 * Content type of the request (one of the nsIContentPolicy constants) | 332 * Content type of the request (one of the nsIContentPolicy constants) |
323 * @type Integer | 333 * @type Integer |
324 */ | 334 */ |
325 type: null, | 335 type: null, |
326 /** | 336 /** |
327 * Domain name of the requesting document | 337 * Domain name of the requesting document |
328 * @type String | 338 * @type String |
329 */ | 339 */ |
330 docDomain: null, | 340 docDomain: null, |
331 /** | 341 /** |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 if (typeof existingData == "undefined") | 379 if (typeof existingData == "undefined") |
370 { | 380 { |
371 existingData = {}; | 381 existingData = {}; |
372 setEntry(nodeData, node, existingData); | 382 setEntry(nodeData, node, existingData); |
373 } | 383 } |
374 | 384 |
375 // Add this request to the node data | 385 // Add this request to the node data |
376 existingData[this.type + " " + this.location] = this; | 386 existingData[this.type + " " + this.location] = this; |
377 } | 387 } |
378 }; | 388 }; |
OLD | NEW |