| Index: lib/elemHide.js |
| =================================================================== |
| --- a/lib/elemHide.js |
| +++ b/lib/elemHide.js |
| @@ -66,59 +66,90 @@ let styleURL = null; |
| let ElemHide = exports.ElemHide = |
| { |
| /** |
| * Indicates whether filters have been added or removed since the last apply() call. |
| * @type Boolean |
| */ |
| isDirty: false, |
| - /** |
| - * Inidicates whether the element hiding stylesheet is currently applied. |
| - * @type Boolean |
| - */ |
| - applied: false, |
| + QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]), |
| /** |
| * Called on module startup. |
| */ |
| init: function() |
| { |
| TimeLine.enter("Entered ElemHide.init()"); |
| Prefs.addListener(function(name) |
| { |
| if (name == "enabled") |
| ElemHide.apply(); |
| }); |
|
Wladimir Palant
2014/05/20 19:36:12
This code is no longer necessary.
|
| onShutdown.add(function() |
| { |
| - ElemHide.unapply(); |
| - }); |
| + Services.obs.removeObserver(this, "content-document-global-created"); |
| + }.bind(this)); |
| TimeLine.log("done adding prefs listener"); |
| let styleFile = IO.resolveFilePath(Prefs.data_directory); |
| styleFile.append("elemhide.css"); |
| styleURL = Services.io.newFileURI(styleFile).QueryInterface(Ci.nsIFileURL); |
| TimeLine.log("done determining stylesheet URL"); |
| + Services.obs.addObserver(this, "content-document-global-created", true); |
| + |
| TimeLine.leave("ElemHide.init() done"); |
| }, |
| /** |
| * Removes all known filters |
| */ |
| clear: function() |
| { |
| filterByKey = {__proto__: null}; |
| keyByFilter = {__proto__: null}; |
| knownExceptions = {__proto__: null}; |
| exceptions = {__proto__: null}; |
| ElemHide.isDirty = false; |
| - ElemHide.unapply(); |
| + }, |
| + |
| + observe: function (subject, topic, data, additional) |
| + { |
| + if (topic != "content-document-global-created") |
| + return; |
| + |
| + if (!Prefs.enabled) |
| + return; |
| + |
| + let uri = subject.document.documentURIObject; |
| + if (!uri) |
| + return; |
| + |
| + switch(uri.scheme) |
| + { |
| + case "http": |
| + case "https": |
| + case "mailbox": |
| + case "imap": |
| + case "news": |
| + case "snews": |
| + break; |
| + default: |
| + // Avoid injecting in chrome documents |
| + return; |
| + } |
|
Wladimir Palant
2014/05/20 19:36:12
Please use Policy.isBlockableScheme() here (from c
|
| + |
| + // XXX is there some better way to test if it's disabled on that domain that we should do before? |
| + if (!ElemHide.anySelectorForDomain(uri.host)) |
| + return; |
|
Wladimir Palant
2014/05/20 19:36:12
Wow, performance will go down the drain here. We c
|
| + |
| + var windowUtils = subject.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils); |
| + windowUtils.loadSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); |
| }, |
| /** |
| * Add a new element hiding filter |
| * @param {ElemHideFilter} filter |
| */ |
| add: function(filter) |
| { |
| @@ -205,54 +236,29 @@ let ElemHide = exports.ElemHide = |
| /** |
| * Will be set to true if an apply() call arrives while apply() is already |
| * running (delayed execution). |
| * @type Boolean |
| */ |
| _needsApply: false, |
| /** |
| - * Generates stylesheet URL and applies it globally |
| + * Generates stylesheet URL. |
| */ |
| + // XXX Rename |
| apply: function() |
|
Wladimir Palant
2014/05/20 19:36:12
saveStylesheet()?
|
| { |
| if (this._applying) |
| { |
| this._needsApply = true; |
| return; |
| } |
| TimeLine.enter("Entered ElemHide.apply()"); |
| - if (!ElemHide.isDirty || !Prefs.enabled) |
| - { |
| - // Nothing changed, looks like we merely got enabled/disabled |
| - if (Prefs.enabled && !ElemHide.applied) |
| - { |
| - try |
| - { |
| - Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); |
| - ElemHide.applied = true; |
| - } |
| - catch (e) |
| - { |
| - Cu.reportError(e); |
| - } |
| - TimeLine.log("Applying existing stylesheet finished"); |
| - } |
| - else if (!Prefs.enabled && ElemHide.applied) |
| - { |
| - ElemHide.unapply(); |
| - TimeLine.log("ElemHide.unapply() finished"); |
| - } |
| - |
| - TimeLine.leave("ElemHide.apply() done (no file changes)"); |
| - return; |
| - } |
| - |
| IO.writeToFile(styleURL.file, this._generateCSSContent(), function(e) |
| { |
| TimeLine.enter("ElemHide.apply() write callback"); |
| this._applying = false; |
| // _generateCSSContent is throwing NS_ERROR_NOT_AVAILABLE to indicate that |
| // there are no filters. If that exception is passed through XPCOM we will |
| // see a proper exception here, otherwise a number. |
| @@ -269,33 +275,16 @@ let ElemHide = exports.ElemHide = |
| { |
| this._needsApply = false; |
| this.apply(); |
| } |
| else if (!e) |
| { |
| ElemHide.isDirty = false; |
| - ElemHide.unapply(); |
| - TimeLine.log("ElemHide.unapply() finished"); |
| - |
| - if (!noFilters) |
| - { |
| - try |
| - { |
| - Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); |
| - ElemHide.applied = true; |
| - } |
| - catch (e) |
| - { |
| - Cu.reportError(e); |
| - } |
| - TimeLine.log("Applying stylesheet finished"); |
| - } |
| - |
| FilterNotifier.triggerListeners("elemhideupdate"); |
|
Wladimir Palant
2014/05/20 19:36:12
Apparently, this is dead code. This notification h
|
| } |
| TimeLine.leave("ElemHide.apply() write callback done"); |
| }.bind(this), "ElemHideWrite"); |
| this._applying = true; |
| TimeLine.leave("ElemHide.apply() done", "ElemHideWrite"); |
| @@ -356,35 +345,23 @@ let ElemHide = exports.ElemHide = |
| } |
| }, |
| /** |
| * Unapplies current stylesheet URL |
| */ |
| unapply: function() |
| { |
| - if (ElemHide.applied) |
| - { |
| - try |
| - { |
| - Utils.styleService.unregisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); |
| - } |
| - catch (e) |
| - { |
| - Cu.reportError(e); |
| - } |
| - ElemHide.applied = false; |
| - } |
| }, |
|
Wladimir Palant
2014/05/20 19:36:12
This function should be removed.
|
| /** |
| * Retrieves the currently applied stylesheet URL |
| * @type String |
| */ |
| - get styleURL() ElemHide.applied ? styleURL.spec : null, |
| + get styleURL() styleURL.spec, |
|
Wladimir Palant
2014/05/20 19:36:12
This getter was also introduced in https://hg.adbl
|
| /** |
| * Retrieves an element hiding filter by the corresponding protocol key |
| */ |
| getFilterByKey: function(/**String*/ key) /**Filter*/ |
| { |
| return (key in filterByKey ? filterByKey[key] : null); |
| }, |
| @@ -407,10 +384,23 @@ let ElemHide = exports.ElemHide = |
| if (specificOnly && (!domains || domains[""])) |
| continue; |
| if (filter.isActiveOnDomain(domain) && !this.getException(filter, domain)) |
| result.push(filter.selector); |
| } |
| return result; |
| + }, |
| + |
| + anySelectorForDomain: function(/**String*/ domain) |
| + { |
| + for (let key in filterByKey) |
| + { |
| + let filter = filterByKey[key]; |
| + |
| + if (filter.isActiveOnDomain(domain) && !this.getException(filter, domain)) |
| + return true; |
| + } |
| + |
| + return false; |
| } |
| }; |