| Index: lib/elemHideHitRegistration.js |
| =================================================================== |
| --- a/lib/elemHideHitRegistration.js |
| +++ b/lib/elemHideHitRegistration.js |
| @@ -14,25 +14,70 @@ |
| * You should have received a copy of the GNU General Public License |
| * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| /** |
| * @fileOverview Hit counts for element hiding. |
| */ |
| -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); |
| +try |
| +{ |
| + // Hack: SDK loader masks our Components object with a getter. |
| + let proto = Object.getPrototypeOf(this); |
| + let property = Object.getOwnPropertyDescriptor(proto, "Components"); |
| + if (property && property.get) |
| + delete proto.Components; |
| +} |
| +catch (e) |
| +{ |
| + Cu.reportError(e); |
| +} |
| + |
| +let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {}); |
| +let {PrivateBrowsingUtils} = Cu.import("resource://gre/modules/PrivateBrowsingUtils.jsm") |
| let {Utils} = require("utils"); |
| +let messageID = 0; |
| + |
| +// The allowXBL binding below won't have any effect on the element. For elements |
| +// that should be hidden however we don't return any binding at all, this makes |
| +// Gecko stop constructing the node - it cannot be shown. |
| +const allowXBL = "<bindings xmlns='http://www.mozilla.org/xbl'><binding id='dummy' bindToUntrustedContent='true'/></bindings>"; |
| +const hideXBL = "<bindings xmlns='http://www.mozilla.org/xbl'/>"; |
| + |
| +function getFrames(window) |
| +{ |
| + let frames = []; |
| + while (window) |
| + { |
| + let frame = { |
| + location: window.location.href, |
| + sitekey: null |
| + }; |
| + |
| + let documentElement = window.document && window.document.documentElement; |
| + if (documentElement) |
| + frame.sitekey = documentElement.getAttribute("data-adblockkey") |
| + |
| + if (window == window.parent) |
| + frame.privateBrowsing = PrivateBrowsingUtils.isWindowPrivate(window); |
| + |
| + frames.push(frame); |
| + window = (window != window.parent ? window.parent : null); |
| + } |
| + return frames; |
| +} |
| + |
| /** |
| * about: URL module used to count hits. |
| * @class |
| */ |
| -let AboutHandler = exports.AboutHandler = |
| +let AboutHandler = |
| { |
| classID: Components.ID("{55fb7be0-1dd2-11b2-98e6-9e97caf8ba67}"), |
| classDescription: "Element hiding hit registration protocol handler", |
| aboutPrefix: "abp-elemhidehit", |
| /** |
| * Registers handler on startup. |
| */ |
| @@ -103,58 +148,55 @@ HitRegistrationChannel.prototype = { |
| notificationCallbacks: null, |
| loadFlags: 0, |
| loadGroup: null, |
| name: null, |
| status: Cr.NS_OK, |
| asyncOpen: function(listener, context) |
| { |
| - let stream = this.open(); |
| - Utils.runAsync(() => |
| + let responseMessage = "AdblockPlus:ElemHideHit:Response" + (++messageID); |
| + |
| + let processResponse = (message) => |
| { |
| + removeMessageListener(responseMessage, processResponse); |
| + |
| + let data = (message.data ? hideXBL : allowXBL); |
| + let stream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); |
| + stream.setData(data, data.length); |
| + |
| try { |
| listener.onStartRequest(this, context); |
| } catch(e) {} |
| try { |
| listener.onDataAvailable(this, context, stream, 0, stream.available()); |
| } catch(e) {} |
| try { |
| listener.onStopRequest(this, context, Cr.NS_OK); |
| } catch(e) {} |
| + }; |
| + |
| + addMessageListener(responseMessage, processResponse); |
| + sendAsyncMessage("AdblockPlus:ElemHideHit", { |
| + responseMessage, |
| + key: this.key, |
| + frames: getFrames(Utils.getRequestWindow(this)) |
| }); |
| }, |
| asyncOpen2: function(listener) |
| { |
| if (!this.loadInfo.triggeringPrincipal.equals(Utils.systemPrincipal)) |
| throw Cr.NS_ERROR_FAILURE; |
| this.asyncOpen(listener, null); |
| }, |
| open: function() |
| { |
| - let {Policy} = require("contentPolicy"); |
| - let {ElemHide} = require("elemHide"); |
| - |
| - // This dummy binding below won't have any effect on the element. For |
| - // elements that should be hidden however we don't return any binding at |
| - // all, this makes Gecko stop constructing the node - it cannot be shown. |
| - let data = "<bindings xmlns='http://www.mozilla.org/xbl'><binding id='dummy' bindToUntrustedContent='true'/></bindings>"; |
| - let filter = ElemHide.getFilterByKey(this.key); |
| - if (filter) |
| - { |
| - let wnd = Utils.getRequestWindow(this); |
| - if (wnd && wnd.document && !Policy.processNode(wnd, wnd.document, Policy.type.ELEMHIDE, filter)) |
| - data = "<bindings xmlns='http://www.mozilla.org/xbl'/>"; |
| - } |
| - |
| - let stream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); |
| - stream.setData(data, data.length); |
| - return stream; |
| + throw Cr.NS_ERROR_NOT_IMPLEMENTED; |
| }, |
| isPending: function() |
| { |
| return false; |
| }, |
| cancel: function() |
| { |
| throw Cr.NS_ERROR_NOT_IMPLEMENTED; |