Here is a Mozilla Javascript Module which allow to catch absolutely all requests based on their Content-Type Http header (ie Mime type) or their filename.
contentTypeObserver.js
(under LGPL License)
Normally, it would be simple to catch all firefox request by adding a nsIURIContentListener like this :
Components.classes["@mozilla.org/uriloader;1"].getService(Components.interfaces.nsIURILoader).registerContentListener( ...nsIURIContentListener... );
But for some reason, this listener is bypassed
here when the HTTP request contains a Content-Disposition header :(
So I give you there all Mozilla black magic needed to catch really all
requests.
Hello world
Components.utils.import("resource://your-extension/contentTypeObserver.js");
var contentTypeObserver = {};
// Tell if we must catch requests with this content-type
// requestInfo is an object with 3 attributes : contentType, contentLength and fileName.
contentTypeObserver.getRequestListener = function (requestInfo) {
// Return a new instance of nsIWebProgressListener
// (a new instance to avoid conflicts with multiple simultaneous downloads)
return {
onStartRequest : function (request, context) {
},
onStopRequest : function (request, context, statusCode) {
},
onDataAvailable : function (request, context, inputStream, offset, count) {
}
};
// There is an helper function that allow to automatically save this request to a file,
// you just have to pass destinationFile argument which hold a nsIFile instance :
return createSaveToFileRequestListener(requestInfo, destinationFile, function () { dump("file : "+destinationFile.spec+" downloaded!
"); }
}
addContentTypeObserver(contentTypeObserver);