3.3.2: ====== - install.rdf: changed version (3.3.1 -> 3.3.2) - FF3.6 compatibility (replaced old "contents.rdf" files by "chrome.manifest") 3.3.1: ====== - install.rdf: changed version (3.3.0 -> 3.3.1) - FF3.5 compatibility 3.3.0: ====== - install.rdf: changed version (3.2.9 -> 3.3.0) - added signature/certificate for FF3.0 - changed some shortcuts (e.g. for incrementing and decrementing urls...), because they are not free any more in FF3.0 3.2.9: ====== - install.rdf: changed version (3.2.8 -> 3.2.9) - changed maxVersion (2.0.* -> 3.0.*) for FF3.0 Beta 2 - added default file types for downloading (txt, bz2, ...) 3.2.8: ====== - install.rdf: changed version (3.2.7 -> 3.2.8) - fixed a bug where files weren't downloaded if there was no corresponding mime type registred - added some extensions (pps, ppt, tex, ...) 3.2.7: ====== - install.rdf: changed version (3.2.6 -> 3.2.7) - made Magpie compatible with Firefox 2.0 - fixed an exception thrown at init-time (792) - fixed a bug described at http://dlstatusbar.proboards43.com/index.cgi?board=menuedit&action=display&thread=1161828287 (different menuitems were using the same id) - fixed a bug where files/tabs were saved although the user pressed the cancel button in the "chooseSaveFolder" window ("Pick a folder to save to...") 3.2.6: ====== - install.rdf: changed version (3.2.5 -> 3.2.6) - moved to a new server so updated to 3.2.6 beacuse of the update server and the email address inside the archive 3.2.5: ====== - install.rdf: changed version (3.2.4 -> 3.2.5) - implemented some bkstr-fixes in "nsBkstrProtocolHandler.js" sent by Rick W. 3.2.4: ====== - install.rdf: changed version (3.2.3 -> 3.2.4) - fixed the "Remove-button stays gray" error (subclass changed) 3.2.3: ====== - install.rdf: changed version (3.2.2 -> 3.2.3) - fixed a bug where saving following tabs didn't work when empty tabs were open 3.2.2: ====== - install.rdf: changed version (3.2.1 -> 3.2.2) - renamed "changes.txt" to "history.txt" - deleted "saveAllFollowing_frodo.js" and "saveAllFollowing_original.js" - added default file types for downloading ("jpg,jpeg,wmv,asf,mov,mpg,avi" -> "bmp,gif,jpg,jpeg,png,doc,pdf,ps,mp3,wma,asf,avi,mpg,mpeg,mov,wmv,rar,tar,zip") in "tabdownloader.js" - changed in rdf files first line from "" to "" - changed header in files containing copyright information - added german translation for Magpie (changed some accesskeys for german translation) - all specific files are saved as UTF-8 - added and/or changed several other things not worth being mentioned here ;) 3.2.1: ====== - install.rdf: changed version (3.2.0 -> 3.2.1) - renamed "saveAllFollowing_old.js" to "saveAllFollowing_original.js" - added "saveAllFollowing_frodo.js" - frodo's edition to get Magpie work under Firefox 1.5 - edited "SaveAllFollowing.js": enabled Firefox-Cache to save files faster if they are already loaded 3.2.0: ====== The following changes have been made to get Magpie working with Firefox 1.5: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - install.rdf: changed version (3.1.2 -> 3.2.0) changed maxVersion (0.10 -> 1.5.*) (didn't touch minVersion because people may have set "app.extensions.version" to "1.0" in "about:config" for compatibility issues) changed creator ("Ben Goodger" -> "Christian") changed homepageURL ("http://www.bengoodger.com/software/tabloader/" -> "http://magpie.lockfile.org/") - "/chrome/tabdownloader.jar/content/tabdownloader/saveAllFollowing.js" renamed to "saveAllFollowing_old.js" - created new "saveAllFollowings.js" by adding the following lines to the original file: <------------------------------ snip ------------------------------> function nsHeaderSniffer(aURL, aCallback, aData, aSkipPrompt) { this.mCallback = aCallback; this.mData = aData; this.mSkipPrompt = aSkipPrompt; // Original Code from Firefox 1.07: // -------------------------------- // this.uri = makeURL(aURL); // Use new function makeURI(); // --------------------------- this.uri = makeURI(aURL); this.linkChecker = Components.classes["@mozilla.org/network/urichecker;1"] .createInstance(Components.interfaces.nsIURIChecker); this.linkChecker.init(this.uri); var flags; if (aData.bypassCache) { flags = Components.interfaces.nsIRequest.LOAD_BYPASS_CACHE; } else { flags = Components.interfaces.nsIRequest.LOAD_FROM_CACHE; } this.linkChecker.loadFlags = flags; this.linkChecker.asyncCheck(this, null); } nsHeaderSniffer.prototype = { // ---------- nsISupports methods ---------- QueryInterface: function (iid) { if (!iid.equals(Components.interfaces.nsIRequestObserver) && !iid.equals(Components.interfaces.nsISupports) && !iid.equals(Components.interfaces.nsIInterfaceRequestor)) { throw Components.results.NS_ERROR_NO_INTERFACE; } return this; }, // ---------- nsIInterfaceRequestor methods ---------- getInterface : function(iid) { if (iid.equals(Components.interfaces.nsIAuthPrompt)) { // use the window watcher service to get a nsIAuthPrompt impl var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"] .getService(Components.interfaces.nsIWindowWatcher); return ww.getNewAuthPrompter(window); } Components.returnCode = Components.results.NS_ERROR_NO_INTERFACE; return null; }, // ---------- nsIRequestObserver methods ---------- onStartRequest: function (aRequest, aContext) { }, onStopRequest: function (aRequest, aContext, aStatus) { try { if (aStatus == 0) { // NS_BINDING_SUCCEEDED, so there's something there var linkChecker = aRequest.QueryInterface(Components.interfaces.nsIURIChecker); var channel = linkChecker.baseChannel; this.contentType = channel.contentType; try { var httpChannel = channel.QueryInterface(Components.interfaces.nsIHttpChannel); var encodedChannel = channel.QueryInterface(Components.interfaces.nsIEncodedChannel); this.contentEncodingType = null; // There may be content-encodings on the channel. Multiple content // encodings are allowed, eg "Content-Encoding: gzip, uuencode". This // header would mean that the content was first gzipped and then // uuencoded. The encoding enumerator returns MIME types // corresponding to each encoding starting from the end, so the first // thing it returns corresponds to the outermost encoding. var encodingEnumerator = encodedChannel.contentEncodings; if (encodingEnumerator && encodingEnumerator.hasMore()) { try { this.contentEncodingType = encodingEnumerator.getNext(); } catch (e) { } } this.mContentDisposition = httpChannel.getResponseHeader("content-disposition"); } catch (e) { } if (!this.contentType || this.contentType == "application/x-unknown-content-type") { // We didn't get a type from the server. Fall back on other type detection mechanisms throw "Unknown Type"; } } else { dump("Error saving link aStatus = 0x" + aStatus.toString(16) + "\n"); var bundle = getStringBundle(); var errorTitle = bundle.GetStringFromName("saveLinkErrorTitle"); var errorMsg = bundle.GetStringFromName("saveLinkErrorMsg"); const promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService); promptService.alert(this.mData.window, errorTitle, errorMsg); return; } } catch (e) { if (this.mData.document) { this.contentType = this.mData.document.contentType; } else { var type = getMIMETypeForURI(this.uri); if (type) this.contentType = type; } } this.mCallback(this, this.mData, this.mSkipPrompt); }, // ------------------------------------------------ get promptService() { var promptSvc; try { promptSvc = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(); promptSvc = promptSvc.QueryInterface(Components.interfaces.nsIPromptService); } catch (e) {} return promptSvc; }, get suggestedFileName() { var fileName = ""; if (this.mContentDisposition) { const mhpContractID = "@mozilla.org/network/mime-hdrparam;1" const mhpIID = Components.interfaces.nsIMIMEHeaderParam; const mhp = Components.classes[mhpContractID].getService(mhpIID); var dummy = { value: null }; // To make JS engine happy. var charset = getCharsetforSave(null); try { fileName = mhp.getParameter(this.mContentDisposition, "filename", charset, true, dummy); } catch (e) { try { fileName = mhp.getParameter(this.mContentDisposition, "name", charset, true, dummy); } catch (e) { } } } fileName = fileName.replace(/^"|"$/g, ""); return fileName; } }; <------------------------------ snip ------------------------------>