OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * This Source Code is subject to the terms of the Mozilla Public License |
| 3 * version 2.0 (the "License"). You can obtain a copy of the License at |
| 4 * http://mozilla.org/MPL/2.0/. |
| 5 */ |
| 6 |
| 7 // |
| 8 // This file has been generated automatically from Adblock Plus source code |
| 9 // |
| 10 |
| 11 (function (_patchFunc0) { |
| 12 var filterByKey = { |
| 13 __proto__: null |
| 14 }; |
| 15 var styleURL = null; |
| 16 var ElemHide = { |
| 17 isDirty: false, |
| 18 applied: false, |
| 19 keyByFilter: { |
| 20 __proto__: null |
| 21 }, |
| 22 init: function () { |
| 23 Prefs.addListener(function (name) { |
| 24 if (name == "enabled") |
| 25 ElemHide.apply(); |
| 26 } |
| 27 ); |
| 28 var styleFile = Utils.resolveFilePath(Prefs.data_directory); |
| 29 styleFile.append("elemhide.css"); |
| 30 styleURL = Utils.ioService.newFileURI(styleFile).QueryInterface(Ci.nsIFile
URL); |
| 31 var registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar
); |
| 32 registrar.registerFactory(ElemHidePrivate.classID, ElemHidePrivate.classDe
scription, "@mozilla.org/network/protocol/about;1?what=" + ElemHidePrivate.about
Prefix, ElemHidePrivate); |
| 33 } |
| 34 , |
| 35 clear: function () { |
| 36 filterByKey = { |
| 37 __proto__: null |
| 38 }; |
| 39 ElemHide.keyByFilter = { |
| 40 __proto__: null |
| 41 }; |
| 42 ElemHide.isDirty = false; |
| 43 ElemHide.unapply(); |
| 44 } |
| 45 , |
| 46 add: function (filter) { |
| 47 if (filter.text in ElemHide.keyByFilter) |
| 48 return ; |
| 49 var key; |
| 50 do { |
| 51 key = Math.random().toFixed(15).substr(5); |
| 52 } |
| 53 while (key in filterByKey); |
| 54 filterByKey[key] = filter.text; |
| 55 ElemHide.keyByFilter[filter.text] = key; |
| 56 ElemHide.isDirty = true; |
| 57 } |
| 58 , |
| 59 remove: function (filter) { |
| 60 if (!(filter.text in ElemHide.keyByFilter)) |
| 61 return ; |
| 62 var key = ElemHide.keyByFilter[filter.text]; |
| 63 delete filterByKey[key]; |
| 64 delete ElemHide.keyByFilter[filter.text]; |
| 65 ElemHide.isDirty = true; |
| 66 } |
| 67 , |
| 68 apply: function () { |
| 69 if (ElemHide.applied) |
| 70 ElemHide.unapply(); |
| 71 try { |
| 72 if (!Prefs.enabled) { |
| 73 return ; |
| 74 } |
| 75 if (ElemHide.isDirty) { |
| 76 ElemHide.isDirty = false; |
| 77 var domains = { |
| 78 __proto__: null |
| 79 }; |
| 80 var hasFilters = false; |
| 81 for (var key in filterByKey) { |
| 82 var filter = Filter.knownFilters[filterByKey[key]]; |
| 83 if (!filter) { |
| 84 delete filterByKey[key]; |
| 85 continue; |
| 86 } |
| 87 var domain = filter.selectorDomain || ""; |
| 88 var list; |
| 89 if (domain in domains) |
| 90 list = domains[domain]; |
| 91 else { |
| 92 list = { |
| 93 __proto__: null |
| 94 }; |
| 95 domains[domain] = list; |
| 96 } |
| 97 list[filter.selector] = key; |
| 98 hasFilters = true; |
| 99 } |
| 100 if (!hasFilters) { |
| 101 return ; |
| 102 } |
| 103 try { |
| 104 styleURL.file.parent.create(Ci.nsIFile.DIRECTORY_TYPE, 493); |
| 105 } |
| 106 catch (e){} |
| 107 var stream; |
| 108 try { |
| 109 stream = Cc["@mozilla.org/network/safe-file-output-stream;1"].create
Instance(Ci.nsIFileOutputStream); |
| 110 stream.init(styleURL.file, 2 | 8 | 32, 420, 0); |
| 111 } |
| 112 catch (e){ |
| 113 Cu.reportError(e); |
| 114 return ; |
| 115 } |
| 116 var buf = []; |
| 117 var maxBufLen = 1024; |
| 118 function escapeChar(match) { |
| 119 return "\\" + match.charCodeAt(0).toString(16) + " "; |
| 120 } |
| 121 function writeString(str, forceWrite) { |
| 122 buf.push(str); |
| 123 if (buf.length >= maxBufLen || forceWrite) { |
| 124 var output = buf.join("").replace(/[^\x01-\x7F]/g, escapeChar); |
| 125 stream.write(output, output.length); |
| 126 buf.splice(0, buf.length); |
| 127 } |
| 128 } |
| 129 var cssTemplate = "-moz-binding: url(about:" + ElemHidePrivate.aboutPr
efix + "?%ID%#dummy) !important;"; |
| 130 for (var domain in domains) { |
| 131 var rules = []; |
| 132 var list = domains[domain]; |
| 133 if (domain) |
| 134 writeString("@-moz-document domain(\"" + domain.split(",").join("\
"),domain(\"") + "\"){\n"); |
| 135 else { |
| 136 writeString("@-moz-document url-prefix(\"http://\"),url-prefix(\"h
ttps://\"),url-prefix(\"mailbox://\"),url-prefix(\"imap://\"),url-prefix(\"news:
//\"),url-prefix(\"snews://\"){\n"); |
| 137 } |
| 138 for (var selector in list) |
| 139 writeString(selector + "{" + cssTemplate.replace("%ID%", list[sele
ctor]) + "}\n"); |
| 140 writeString("}\n"); |
| 141 } |
| 142 writeString("", true); |
| 143 try { |
| 144 stream.QueryInterface(Ci.nsISafeOutputStream).finish(); |
| 145 } |
| 146 catch (e){ |
| 147 Cu.reportError(e); |
| 148 return ; |
| 149 } |
| 150 } |
| 151 try { |
| 152 Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetServ
ice.USER_SHEET); |
| 153 ElemHide.applied = true; |
| 154 } |
| 155 catch (e){ |
| 156 Cu.reportError(e); |
| 157 } |
| 158 } |
| 159 finally { |
| 160 FilterNotifier.triggerListeners("elemhideupdate"); |
| 161 } |
| 162 } |
| 163 , |
| 164 unapply: function () { |
| 165 if (ElemHide.applied) { |
| 166 try { |
| 167 Utils.styleService.unregisterSheet(styleURL, Ci.nsIStyleSheetService.U
SER_SHEET); |
| 168 } |
| 169 catch (e){ |
| 170 Cu.reportError(e); |
| 171 } |
| 172 ElemHide.applied = false; |
| 173 } |
| 174 } |
| 175 , |
| 176 get styleURL() { |
| 177 return ElemHide.applied ? styleURL.spec : null; |
| 178 }, |
| 179 getFilterByKey: function (key) { |
| 180 return (key in filterByKey ? Filter.knownFilters[filterByKey[key]] : null)
; |
| 181 } |
| 182 , |
| 183 toCache: function (cache) { |
| 184 cache.elemhide = { |
| 185 filterByKey: filterByKey |
| 186 }; |
| 187 } |
| 188 , |
| 189 fromCache: function (cache) { |
| 190 filterByKey = cache.elemhide.filterByKey; |
| 191 filterByKey.__proto__ = null; |
| 192 delete ElemHide.keyByFilter; |
| 193 ElemHide.__defineGetter__("keyByFilter", function () { |
| 194 var result = { |
| 195 __proto__: null |
| 196 }; |
| 197 for (var k in filterByKey) |
| 198 result[filterByKey[k]] = k; |
| 199 return ElemHide.keyByFilter = result; |
| 200 } |
| 201 ); |
| 202 ElemHide.__defineSetter__("keyByFilter", function (value) { |
| 203 delete ElemHide.keyByFilter; |
| 204 return ElemHide.keyByFilter = value; |
| 205 } |
| 206 ); |
| 207 } |
| 208 |
| 209 }; |
| 210 var ElemHidePrivate = { |
| 211 classID: Components.ID("{55fb7be0-1dd2-11b2-98e6-9e97caf8ba67}"), |
| 212 classDescription: "Element hiding hit registration protocol handler", |
| 213 aboutPrefix: "abp-elemhidehit", |
| 214 createInstance: function (outer, iid) { |
| 215 if (outer != null) |
| 216 throw Cr.NS_ERROR_NO_AGGREGATION; |
| 217 return this.QueryInterface(iid); |
| 218 } |
| 219 , |
| 220 getURIFlags: function (uri) { |
| 221 return ("HIDE_FROM_ABOUTABOUT" in Ci.nsIAboutModule ? Ci.nsIAboutModule.HI
DE_FROM_ABOUTABOUT : 0); |
| 222 } |
| 223 , |
| 224 newChannel: function (uri) { |
| 225 if (!/\?(\d+)/.test(uri.path)) |
| 226 throw Cr.NS_ERROR_FAILURE; |
| 227 return new HitRegistrationChannel(uri, RegExp["$1"]); |
| 228 } |
| 229 , |
| 230 QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory, Ci.nsIAboutModule]) |
| 231 }; |
| 232 function HitRegistrationChannel(uri, key) { |
| 233 this.key = key; |
| 234 this.URI = this.originalURI = uri; |
| 235 } |
| 236 HitRegistrationChannel.prototype = { |
| 237 key: null, |
| 238 URI: null, |
| 239 originalURI: null, |
| 240 contentCharset: "utf-8", |
| 241 contentLength: 0, |
| 242 contentType: "text/xml", |
| 243 owner: Utils.systemPrincipal, |
| 244 securityInfo: null, |
| 245 notificationCallbacks: null, |
| 246 loadFlags: 0, |
| 247 loadGroup: null, |
| 248 name: null, |
| 249 status: Cr.NS_OK, |
| 250 asyncOpen: function (listener, context) { |
| 251 var stream = this.open(); |
| 252 Utils.runAsync(function () { |
| 253 try { |
| 254 listener.onStartRequest(this, context); |
| 255 } |
| 256 catch (e){} |
| 257 try { |
| 258 listener.onDataAvailable(this, context, stream, 0, stream.available())
; |
| 259 } |
| 260 catch (e){} |
| 261 try { |
| 262 listener.onStopRequest(this, context, Cr.NS_OK); |
| 263 } |
| 264 catch (e){} |
| 265 } |
| 266 , this); |
| 267 } |
| 268 , |
| 269 open: function () { |
| 270 var data = "<bindings xmlns='http://www.mozilla.org/xbl'><binding id='dumm
y'/></bindings>"; |
| 271 if (this.key in filterByKey) { |
| 272 var wnd = Utils.getRequestWindow(this); |
| 273 if (wnd && wnd.document && !Policy.processNode(wnd, wnd.document, Policy
.type.ELEMHIDE, Filter.knownFilters[filterByKey[this.key]])) |
| 274 data = "<bindings xmlns='http://www.mozilla.org/xbl'/>"; |
| 275 } |
| 276 var stream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci
.nsIStringInputStream); |
| 277 stream.setData(data, data.length); |
| 278 return stream; |
| 279 } |
| 280 , |
| 281 isPending: function () { |
| 282 return false; |
| 283 } |
| 284 , |
| 285 cancel: function () { |
| 286 throw Cr.NS_ERROR_NOT_IMPLEMENTED; |
| 287 } |
| 288 , |
| 289 suspend: function () { |
| 290 throw Cr.NS_ERROR_NOT_IMPLEMENTED; |
| 291 } |
| 292 , |
| 293 resume: function () { |
| 294 throw Cr.NS_ERROR_NOT_IMPLEMENTED; |
| 295 } |
| 296 , |
| 297 QueryInterface: XPCOMUtils.generateQI([Ci.nsIChannel, Ci.nsIRequest]) |
| 298 }; |
| 299 if (typeof _patchFunc0 != "undefined") |
| 300 eval("(" + _patchFunc0.toString() + ")()"); |
| 301 window.ElemHide = ElemHide; |
| 302 } |
| 303 )(window.ElemHidePatch); |
OLD | NEW |