mirror of https://github.com/roytam1/boc-uxp.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
4.6 KiB
186 lines
4.6 KiB
/* |
|
* This Source Code is subject to the terms of the Mozilla Public License |
|
* version 2.0 (the "License"). You can obtain a copy of the License at |
|
* http://mozilla.org/MPL/2.0/. |
|
*/ |
|
|
|
#filter substitution |
|
|
|
/** |
|
* @fileOverview Element hiding protocol to be loaded in the content process for a multi-process setup (currently only Fennec) |
|
*/ |
|
|
|
var EXPORTED_SYMBOLS = ["ElemHideRemote"]; |
|
|
|
const Cc = Components.classes; |
|
const Ci = Components.interfaces; |
|
const Cr = Components.results; |
|
const Cu = Components.utils; |
|
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm"); |
|
Cu.import("resource://@ADDON_CHROME_NAME@/modules/Utils.jsm"); |
|
|
|
/** |
|
* Currently applied stylesheet URL |
|
* @type nsIURI |
|
*/ |
|
let styleURL = null; |
|
|
|
/** |
|
* nsIAboutModule implementation |
|
* @class |
|
*/ |
|
var ElemHideRemote = |
|
{ |
|
classID: Components.ID("{55fb7be0-1dd2-11b2-98e6-9e97caf8ba67}"), |
|
classDescription: "Element hiding hit registration protocol handler", |
|
aboutPrefix: "abp-elemhidehit", |
|
|
|
startup: function() |
|
{ |
|
let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar); |
|
registrar.registerFactory(ElemHideRemote.classID, ElemHideRemote.classDescription, |
|
"@mozilla.org/network/protocol/about;1?what=" + ElemHideRemote.aboutPrefix, ElemHideRemote); |
|
|
|
styleURL = Utils.makeURI(Utils.childMessageManager.sendSyncMessage("AdblockPlus:ElemHide:styleURL")); |
|
if (styleURL) |
|
Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); |
|
|
|
// Get notified about style URL changes |
|
Utils.childMessageManager.addMessageListener("AdblockPlus:ElemHide:updateStyleURL", function(message) |
|
{ |
|
if (styleURL) |
|
Utils.styleService.unregisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); |
|
|
|
styleURL = Utils.makeURI(message.json); |
|
if (styleURL) |
|
Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); |
|
}); |
|
}, |
|
|
|
// |
|
// Factory implementation |
|
// |
|
|
|
createInstance: function(outer, iid) |
|
{ |
|
if (outer != null) |
|
throw Cr.NS_ERROR_NO_AGGREGATION; |
|
|
|
return this.QueryInterface(iid); |
|
}, |
|
|
|
// |
|
// About module implementation |
|
// |
|
|
|
getURIFlags: function(uri) |
|
{ |
|
return Ci.nsIAboutModule.HIDE_FROM_ABOUTABOUT; |
|
}, |
|
|
|
newChannel: function(uri) |
|
{ |
|
let match = /\?(\d+)/.exec(uri.path) |
|
if (!match) |
|
throw Cr.NS_ERROR_FAILURE; |
|
|
|
return new HitRegistrationChannel(uri, match[1]); |
|
}, |
|
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory, Ci.nsIAboutModule]) |
|
}; |
|
|
|
/** |
|
* Channel returning data for element hiding hits. |
|
* @constructor |
|
*/ |
|
function HitRegistrationChannel(uri, key) |
|
{ |
|
this.key = key; |
|
this.URI = this.originalURI = uri; |
|
} |
|
HitRegistrationChannel.prototype = { |
|
key: null, |
|
URI: null, |
|
originalURI: null, |
|
contentCharset: "utf-8", |
|
contentLength: 0, |
|
contentType: "text/xml", |
|
owner: Utils.systemPrincipal, |
|
securityInfo: null, |
|
notificationCallbacks: null, |
|
loadFlags: 0, |
|
loadGroup: null, |
|
name: null, |
|
status: Cr.NS_OK, |
|
|
|
asyncOpen: function(listener, context) |
|
{ |
|
let stream = this.open(); |
|
Utils.runAsync(function() |
|
{ |
|
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) {} |
|
}, this); |
|
}, |
|
|
|
open: function() |
|
{ |
|
let data = "<bindings xmlns='http://www.mozilla.org/xbl'><binding id='dummy' bindToUntrustedContent='true'/></bindings>"; |
|
let wnd = Utils.getRequestWindow(this); |
|
|
|
if (wnd) |
|
{ |
|
wnd = Utils.getOriginWindow(wnd); |
|
|
|
let locations = []; |
|
let testWnd = wnd; |
|
while (true) |
|
{ |
|
locations.push(testWnd.location.href); |
|
if (testWnd.parent == testWnd) |
|
break; |
|
else |
|
testWnd = testWnd.parent; |
|
} |
|
|
|
let result = Utils.childMessageManager.sendSyncMessage("AdblockPlus:ElemHide:checkHit", { |
|
key: this.key, |
|
locations: locations})[0]; |
|
if (result) |
|
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; |
|
}, |
|
isPending: function() |
|
{ |
|
return false; |
|
}, |
|
cancel: function() |
|
{ |
|
throw Cr.NS_ERROR_NOT_IMPLEMENTED; |
|
}, |
|
suspend: function() |
|
{ |
|
throw Cr.NS_ERROR_NOT_IMPLEMENTED; |
|
}, |
|
resume: function() |
|
{ |
|
throw Cr.NS_ERROR_NOT_IMPLEMENTED; |
|
}, |
|
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIChannel, Ci.nsIRequest]) |
|
}; |
|
|
|
ElemHideRemote.startup();
|
|
|