Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: lib/child/elemHide.js

Issue 29348029: Issue 4253 - Implement a less fragile way to detect documents that element hiding needs to apply to (Closed)
Patch Set: Created July 19, 2016, 5:35 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>, 2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-2016 Eyeo GmbH 3 * Copyright (C) 2006-2016 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
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 }); 295 });
296 }); 296 });
297 } 297 }
298 }; 298 };
299 299
300 let observer = { 300 let observer = {
301 QueryInterface: XPCOMUtils.generateQI([ 301 QueryInterface: XPCOMUtils.generateQI([
302 Ci.nsIObserver, Ci.nsISupportsWeakReference 302 Ci.nsIObserver, Ci.nsISupportsWeakReference
303 ]), 303 ]),
304 304
305 topic: "content-document-global-created", 305 topic: "document-element-inserted",
306 styleURL: Utils.makeURI("about:abp-elemhide?css"), 306 styleURL: Utils.makeURI("about:abp-elemhide?css"),
307 sheet: null, 307 sheet: null,
308 308
309 init: function() 309 init: function()
310 { 310 {
311 Services.obs.addObserver(this, this.topic, true); 311 Services.obs.addObserver(this, this.topic, true);
312 onShutdown.add(() => 312 onShutdown.add(() =>
313 { 313 {
314 Services.obs.removeObserver(this, this.topic); 314 Services.obs.removeObserver(this, this.topic);
315 }); 315 });
316 316
317 port.on("elemhideupdate", () => 317 port.on("elemhideupdate", () =>
318 { 318 {
319 this.sheet = null; 319 this.sheet = null;
320 }); 320 });
321 }, 321 },
322 322
323 observe: function(subject, topic, data) 323 observe: function(subject, topic, data)
324 { 324 {
325 if (topic != this.topic) 325 if (topic != this.topic)
326 return; 326 return;
327 327
328 if (subject.document.readyState == "uninitialized") 328 let window = subject.defaultView;
329 if (!window)
329 { 330 {
330 // It would be nice to listen to the readystatechange event here. However, 331 // This is typically XBL bindings and SVG images, but also real
331 // adding event listeners on uninitialized documents isn't possible. So 332 // documents occasionally - probably due to speculative loading?
332 // we listen for DOMContentLoaded and beforescriptexecute - whichever
333 // fires first.
334 let listener = () =>
335 {
336 subject.removeEventListener("DOMContentLoaded", listener);
337 subject.removeEventListener("beforescriptexecute", listener);
338 this.observe(subject, topic, data);
339 };
340 subject.addEventListener("DOMContentLoaded", listener);
341 subject.addEventListener("beforescriptexecute", listener);
342 return; 333 return;
343 } 334 }
335 let type = window.QueryInterface(Ci.nsIInterfaceRequestor)
336 .getInterface(Ci.nsIWebNavigation)
337 .QueryInterface(Ci.nsIDocShellTreeItem)
338 .itemType;
339 if (type != Ci.nsIDocShellTreeItem.typeContent)
340 return;
344 341
345 port.emitWithResponse("elemhideEnabled", { 342 port.emitWithResponse("elemhideEnabled", {
346 frames: getFrames(subject), 343 frames: getFrames(window),
347 isPrivate: isPrivate(subject) 344 isPrivate: isPrivate(window)
348 }).then(({ 345 }).then(({
349 enabled, contentType, docDomain, thirdParty, location, filter, 346 enabled, contentType, docDomain, thirdParty, location, filter,
350 filterType 347 filterType
351 }) => 348 }) =>
352 { 349 {
353 if (Cu.isDeadWrapper(subject)) 350 if (Cu.isDeadWrapper(window))
354 { 351 {
355 // We are too late, the window is gone already. 352 // We are too late, the window is gone already.
356 return; 353 return;
357 } 354 }
358 355
359 if (enabled) 356 if (enabled)
360 { 357 {
361 if (!this.sheet) 358 if (!this.sheet)
362 { 359 {
363 this.sheet = Utils.styleService.preloadSheet(this.styleURL, 360 this.sheet = Utils.styleService.preloadSheet(this.styleURL,
364 Ci.nsIStyleSheetService.USER_SHEET); 361 Ci.nsIStyleSheetService.USER_SHEET);
365 } 362 }
366 363
367 let utils = subject.QueryInterface(Ci.nsIInterfaceRequestor) 364 let utils = window.QueryInterface(Ci.nsIInterfaceRequestor)
368 .getInterface(Ci.nsIDOMWindowUtils); 365 .getInterface(Ci.nsIDOMWindowUtils);
369 try 366 try
370 { 367 {
371 utils.addSheet(this.sheet, Ci.nsIStyleSheetService.USER_SHEET); 368 utils.addSheet(this.sheet, Ci.nsIStyleSheetService.USER_SHEET);
372 } 369 }
373 catch (e) 370 catch (e)
374 { 371 {
375 // Ignore NS_ERROR_ILLEGAL_VALUE - it will be thrown if we try to add 372 // Ignore NS_ERROR_ILLEGAL_VALUE - it will be thrown if we try to add
376 // the stylesheet multiple times to the same document (the observer 373 // the stylesheet multiple times to the same document (the observer
377 // will be notified twice for some documents). 374 // will be notified twice for some documents).
378 if (e.result != Cr.NS_ERROR_ILLEGAL_VALUE) 375 if (e.result != Cr.NS_ERROR_ILLEGAL_VALUE)
379 throw e; 376 throw e;
380 } 377 }
381 } 378 }
382 else if (filter) 379 else if (filter)
383 { 380 {
384 RequestNotifier.addNodeData(subject.document, subject.top, { 381 RequestNotifier.addNodeData(window.document, window.top, {
385 contentType, docDomain, thirdParty, location, filter, filterType 382 contentType, docDomain, thirdParty, location, filter, filterType
386 }); 383 });
387 } 384 }
388 }); 385 });
389 } 386 }
390 }; 387 };
391 observer.init(); 388 observer.init();
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld