User:Dickvl
Bookmarklets
Bookmarklets can be found here: User:Dickvl/Bookmarklets
See also Wikipedia: Bookmarklet
Here is a bookmarklet to display the content of the Navigator object (plugins, mimeTypes)
javascript:/* dickvl@kb.mozillazine.org */ (function(){ var b='<br>',i,L,O,p,pN,pT=('Navigator properties:').bold()+b+b,oT=('Navigator objects:').bold()+b+b,fT=('Navigator functions:').bold()+b+b; for(pN in navigator){ if(typeof navigator[pN]=='object'){ O=navigator[pN];L=(O.length)?O.length:0;oT+=(pN+': ').bold()+L.toString().bold()+b; for(i=0;i<L;i++){M=O[i];oT+=('['+(i+1)+'] ').bold(); for(p in M){if(typeof M[p]!='function'&&typeof M[p]!='object'&&p!='length'){oT+=(p+': ').bold()+M[p]+(' | ').bold()}} if(M.enabledPlugin){oT+=('Plugin: ').bold()+M.enabledPlugin.name} oT+=b} oT+=b} else if(typeof navigator[pN]!='function'){pT+=(pN+': ').bold()+navigator[pN]+b} else if(typeof navigator[pN]=='function'){if(/Enabled/.test(pN)){fT+=(pN+': ').bold()+navigator[pN]()+b}}} with(document.open()){write(pT+b+oT+b+fT);close();} })();
Code
Code for userChrome.css and userContent.css can be found here User:Dickvl/Code
Double Underlined pop-ups
You can add this code to userContent.css to hide some ads and some IntelliTXT type pop-ups (double underlined links) [1].
/* google_ads_frame */ iframe[src*="googlesyndication"], iframe[name="google_ads_frame"] {display:none!important} /* intelliTXT and others */ #iTt,#adbrite_inline_div,#AdvertBanner,#amzn-popup-div,#konaLayers,#lwPreview,#menuModule,#tf_AdDiv,#tooltipBox,#IL_BUBBLE,#IL_FORM_CONT {display:none!important} /* get.lingospot.com */ .lingo_info_box *,.lingo_spot *,.lingo_reset *{display:none!important}
Error Console
List Add-ons
Sometime ago I noticed the Mozilla's Places Stats Project thread with the possibility to display a list of installed extensions in JSON notation by using the Error Console. That gave me an idea to do the same for the printing passwords code in the Password Manager article.
I have also taken the opportunity to create a similar file for displaying the installed extensions. So here are two versions.
The first version shows the name and version number and the second version has the possibility to select which additional columns you wish to see.
/* * Paste this file into Firefox's JavaScript Console and evaluate it to display the installed extensions and themes - dickvl@kb.mozillazine.org */ (function () { var Cc = Components.classes; var Ci = Components.interfaces; var EMP = "http://www.mozilla.org/2004/em-rdf#"; var rv = {}; rv.ext = []; rv.the = []; var ds = Cc["@mozilla.org/extensions/manager;1"]. getService(Ci.nsIExtensionManager). datasource; var rdf = Cc["@mozilla.org/rdf/rdf-service;1"]. getService(Ci.nsIRDFService); var elts = Cc["@mozilla.org/rdf/container-utils;1"]. getService(Ci.nsIRDFContainerUtils). MakeSeq(ds, rdf.GetResource("urn:mozilla:item:root")). GetElements(); function rdfGS(elt,res){ try{ return(ds.GetTarget(elt,rdf.GetResource(EMP+res),true).QueryInterface(Ci.nsIRDFLiteral).Value); } catch(e){return("")} } function makeRV(elt,rv){ var nam = rdfGS(elt,"name"); var ver = rdfGS(elt,"version"); var dis = rdfGS(elt,"isDisabled"); var hom = rdfGS(elt,"homepageURL"); rv.push({name:nam,id:elt.Value.replace(/^urn:mozilla:item:/,""),vers:ver,dis:dis,home:hom}); return(rv); } function makeLIST(rv){ var list="",i,RV; for (i=0;RV=rv[i];i++) { var name = RV.name; var vers = RV.vers; var disab = (RV.dis=="true")?"(disabled)":""; var home = RV.home; list+="<a href=" + home + "><span>" + name + " </span><span> " + vers + " </span></a><span> " + disab + " </span></br>"; } return(list); } while (elts.hasMoreElements()) { var elt = elts.getNext().QueryInterface(Ci.nsIRDFResource); if (ds.HasAssertion(elt,rdf.GetResource(EMP+"type"),rdf.GetIntLiteral(2),true)){ makeRV(elt,rv.ext); } if (ds.HasAssertion(elt,rdf.GetResource(EMP+"type"),rdf.GetIntLiteral(4),true)){ makeRV(elt,rv.the); } } var extList="<p><b>Extensions:</b><br>"+makeLIST(rv.ext)+"</p>"; var theList="<p><b>Themes:</b><br>"+makeLIST(rv.the)+"</p>"; window.open('data:text/html, <html><head> <meta http-equiv=content-type" content="text/html; charset=ISO-8859-1"> <title>Mozilla Extensions</title> </head><body style="margin: 1em 3em; background-color: rgb(255, 221, 221);"> ' + extList + theList + ' </body></html>', "", "menubar=yes,toolbar=no,scrollbars=yes,resizable=yes,width=1000,height=600"); })();
/* *To display the installed extensions and themes paste this file into Firefox's JavaScript Console and evaluate it - dickvl@kb.mozillazine.org */ (function () { var Cc = Components.classes; var Ci = Components.interfaces; var EMP = "http://www.mozilla.org/2004/em-rdf#"; var EMT = 2; /* Extensions: EMT = 2; Themes: EMT = 4; */ var rv = {}; rv.ext = []; rv.the = []; /* columns - 0:space 1:name 2:version 3,4:disabled 5:id 6:description 7:homepage 8:compatible 9:install location */ var THEAD = ["","Name","Version","Disabled","(-)","ID","Description","Home Page","Comp.","Inst.Loc"]; var TCONT = (prompt("Columns:\n\n1:Name\n2:Version\n3:Disabled 4:(U|A)\n5:ID\n6:Description\n7:Home Page\n","1 2 3")); TCONT=((TCONT==null || TCONT=="")?"1 2 3":TCONT).split(" "); var ds = Cc["@mozilla.org/extensions/manager;1"]. getService(Ci.nsIExtensionManager). datasource; var rdf = Cc["@mozilla.org/rdf/rdf-service;1"]. getService(Ci.nsIRDFService); var elts = Cc["@mozilla.org/rdf/container-utils;1"]. getService(Ci.nsIRDFContainerUtils). MakeSeq(ds, rdf.GetResource("urn:mozilla:item:root")). GetElements(); function rdfGS(elt,res){ try{ return(ds.GetTarget(elt,rdf.GetResource(EMP+res),true).QueryInterface(Ci.nsIRDFLiteral).Value); }catch(e){return("")} } function makeTD(rv){ var i,j,DV,RV,TC,td=""; for (i=0;RV=rv[i];i++) { td+="<tr>"; for(j=0;TC=TCONT[j];j++){ switch(parseInt(TC)){ case 1: DV=RV.name;break; case 2: DV=RV.vers;break; case 3: DV=(RV.dis=="true")?"(disabled)":"";break; case 4: DV=((RV.adis=="true")?"(A)":"")+((RV.udis=="true")?"(U)":"");break; case 5: DV=RV.id;break; case 6: DV=RV.descr;break; case 7: DV=RV.home;break; case 8: DV=(RV.comp=="true")?"Yes":((RV.comp=="false")?"No":"");break; case 9: DV=RV.inst;break; default: DV="";break; } td+="<td>"+DV+"</td>"; } td+="</tr>"; } return(td); } function makeRV(elt,rv){ var nam = rdfGS(elt,"name"); var ver = rdfGS(elt,"version"); var des = rdfGS(elt,"description"); var dis = rdfGS(elt,"isDisabled"); var ads = rdfGS(elt,"appDisabled"); var uds = rdfGS(elt,"userDisabled"); var hom = rdfGS(elt,"homepageURL"); var com = rdfGS(elt,"compatible"); var ins = rdfGS(elt,"installLocation"); rv.push({name:nam,id:elt.Value.replace(/^urn:mozilla:item:/,""),vers:ver,descr:des,adis:ads,udis:uds,home:hom,dis:dis,inst:ins,comp:com}); return(rv); } while (elts.hasMoreElements()){ var elt = elts.getNext().QueryInterface(Ci.nsIRDFResource); if(isExt=ds.HasAssertion(elt,rdf.GetResource(EMP+"type"),rdf.GetIntLiteral(2),true)){ makeRV(elt,rv.ext); } if(isExt=ds.HasAssertion(elt,rdf.GetResource(EMP+"type"),rdf.GetIntLiteral(4),true)){ makeRV(elt,rv.the); } } var thead=""; for(j=0;TC=TCONT[j];j++){thead+="<td><b>"+(THEAD[(TC<THEAD.length)?TC:0])+"</b></td>";} var tdivE = makeTD(rv.ext); var tdivT = makeTD(rv.the); function TD(string) {return (string.length < 2) ? "0" + string : string ;} function FD(number){return (number < 1000) ? number + 2000 : number;} var now = new Date(); var hrs = TD(now.getHours() + ""); var min = TD(now.getMinutes() + ""); var sec = TD(now.getSeconds() + ""); var timeValue = " | At " + hrs + ":" + min + ":" + sec; var days = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"); var months = new Array("January","February","March","April","May","June","July","August","September","October","November","December"); var date = ((now.getDate()<10) ? "0" : "")+ now.getDate(); var today = "On " + days[now.getDay()] + ", " + date + " " + months[now.getMonth()] + " " + (FD(now.getYear())) + timeValue; function makeTABLE(label,thead,tcont){ return('<p><b>'+label+':</b><br> <table style="empty-cells: show; background-color: rgb(221, 255, 221);" border="1" cellspacing="0"> <tbody><tr style="background-color: rgb(204, 204, 255);">'+thead+'</tr>'+ tcont+'</tbody></table></p>'); } window.open('data:text/html, <html><head> <meta http-equiv=content-type" content="text/html; charset=ISO-8859-1"> <title>Mozilla Extensions & Themes</title> <style type="text/css"> td { font-family: "Trebuchet MS", Arial, Verdana, Sans-Serif; font-size: 85%; padding: 1px 2px 1px 2px; } </style> </head><body style="margin: 1em 3em; background-color: rgb(255, 221, 221);"> <b>MOZILLA ADD-ONS INFORMATION (by dickvl@kb.mozillazine.org)</b><p>'+today+'</p>'+ makeTABLE("Extensions",thead,tdivE) + makeTABLE("Themes",thead,tdivT)+' </body></html>',"", "menubar=yes,toolbar=no,resizable=yes,scrollbars=yes,width=1000,height=700"); })();
Printing Passwords
Here is an enhanced version of the Password printing code from Password Manager to show all the fields, may be helpful for troubleshooting issues.
/* * Paste this file into Firefox's JavaScript Console and evaluate it to display the saved names and passwords - dickvl@kb.mozillazine.org */ (function(){ function tdigs(str) {return (str.length < 2) ? "0" + str : str;} function fdigs(num){return (num < 1000) ? num + 2000 : num;} var now = new Date(); var hrs = tdigs(now.getHours() + "") ; var mins = tdigs(now.getMinutes() + "") ; var secs = tdigs(now.getSeconds() + "") ; var tValue = " | At " + hrs + ":" + mins + ":" + secs; var days = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"); var mons = new Array("January","February","March","April","May","June","July","August","September","October","November","December"); var date = ((now.getDate()<10) ? "0" : "")+ now.getDate(); var today = "On " + days[now.getDay()] + ", " + date + " " + mons[now.getMonth()] + " " + (fdigs(now.getYear())) + tValue ; var Cc = Components.classes; var Ci = Components.interfaces; netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var tokendb = Cc["@mozilla.org/security/pk11tokendb;1"] .createInstance(Ci.nsIPK11TokenDB); var token = tokendb.getInternalKeyToken(); try {token.login(true);} catch (e) {} if (token.isLoggedIn()) { var passwordmanager = Cc["@mozilla.org/login-manager;1"] .getService(Ci.nsILoginManager); var names="",signons = passwordmanager.getAllLogins({}); for (i=0;i<signons.length;i++) { try { var host = signons[i].hostname; var realm = signons[i].httpRealm; var user = signons[i].username; var usrf = signons[i].usernameField; var psw = signons[i].password; var pswf = signons[i].passwordField; var surl = signons[i].formSubmitURL; if (user == ""){ user = "<br>"; } names+="<tr>\n<td>"+host+"</td>\n<td>"+realm+" </td>\n<td>"+usrf+"</td>\n<td>"+user+"</td>\n<td>"+pswf+"</td>\n<td>"+psw+"</td>\n<td>"+surl+"</td>\n</tr>\n"; } catch(e) {} } void(window.open('data:text/html, <html><head> <meta http-equiv=content-type" content="text/html; charset=ISO-8859-1"> <title>Exported Mozilla Passwords</title> <style type="text/css"> td { font-family: "Trebuchet MS", Arial, Helvetica, Geneva, Verdana, Sans-Serif; font-size: 85%; padding: 1px 2px 1px 2px; } </style> </head><body style="margin: 1em 3em; background-color: rgb(255, 221, 221);"> <b>MOZILLA PASSWORD INFORMATION</b> <p>Produced by <i>Pasting Code in the "Tools > Error Console: Code field"</i> (by "ernie" - Andrew Poth - Ed Mullen - adapted by dickvl@kb.mozillazine.org to run in the Error Console)<br>'+today+ '</p><p> <table style="empty-cells: show; background-color: rgb(221, 255, 221);" border="1" cellspacing="0"> <tbody><tr style="background-color: rgb(204, 204, 255);"> <td> <b>Host</b> </td> <td> <b>Realm</b> </td> <td> <b>User Field</b> </td> <td> <b>User Name</b> </td> <td> <b>Psw Field</b> </td> <td> <b>Password</b> </td> <td> <b>Submit URL</b> </td> </tr>'+names+'</tbody></table> </p></body></html>',"","menubar=yes,resizable=yes,scrollbars=yes,width=1000,height:600")); } })();
Extensions
Private Browsing
Here is a simple extension to disable the "Tools -> Start Private Browsing" menu entry and the "Tools > Clear Recent History" menu entry in Firefox 3.5/6.
The extension hides these menu entries and also disables their shortcut keys. The code doesn't hide "Tools -> Options -> Privacy" to start PB mode automatically and you need to add code to userChrome.css to do that. This code also hides the menu entries if the extension is disabled or not installed. Current Firefox versions still process code in userChrome.css if started in Safe_mode. It is still possible to set the related pref browser.privatebrowsing.autostart on the about:config page and to clear the cache via "Tools -> Options -> Advanced -> Network" and to clear history in the Library and History sidebar. See also [2]
You need to add this code to userChrome.css below the @namespace line (only add the @namespace line if it is missing).
See http://kb.mozillazine.org/Editing_configuration#How_to_edit_configuration_files
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); /* Hide PB and Sanatize item in Tools menu */ #sanitizeSeparator, #privateBrowsingItem, #sanitizeItem {display:none!important;} /* Hide Autostart PB and Clear History in Options > Privacy */ #privateBrowsingAutoStart, #clearDataBox {display:none!important;}
Copy and paste the full DATA code in the location bar and press the Enter key. Save the file as pbdisable.xpi
You can install the extension via "File > Open File" or by dragging the file in a Firefox window.
You can move the extensions folder (pbdisable@mozillazine.org) from the extensions folder in the Profile Folder to the %AppData%\Mozilla\extensions\{ec8030f7-c20a-464f-9b0e-13a3a9e97384} folder to make the extension work in all Firefox profiles. If you do that then you can't uninstall, but you can disable the extension.
data:application/octet-stream;base64, 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
I use this code to remove menu entries and disable shortcut keys in the extension.:
void((E=window.document.getElementById('key_privatebrowsing')).removeAttribute('key')); void(E.removeAttribute('modifiers'));void(E.removeAttribute('command'));
You can use the DOM Inspector to find the ID of a menu entry if you want to disable other menu entries.
I use this code on Linux to disable some shortcuts that I want to use in Prefbar or that are otherwise dangerous (Ctr+Q to Quit Firefox is too close to Ctrl+W).
void((E=window.document.getElementById('key_closeWindow')).removeAttribute('key')); void(E.removeAttribute('modifiers'));void(E.removeAttribute('command')); void((E=window.document.getElementById('key_quitApplication')).removeAttribute('key')); void(E.removeAttribute('modifiers'));void(E.removeAttribute('command')); void((E=window.document.getElementById('key_privatebrowsing')).removeAttribute('key')); void(E.removeAttribute('modifiers'));void(E.removeAttribute('command')); void((E=window.document.getElementById('key_openDownloads')).removeAttribute('key')); void(E.removeAttribute('modifiers'));void(E.removeAttribute('command')); void((E=window.document.getElementById('key_undoCloseWindow')).removeAttribute('key')); void(E.removeAttribute('modifiers'));void(E.removeAttribute('command')); void((E=window.document.getElementById('manBookmarkKb')).removeAttribute('key')); void(E.removeAttribute('modifiers'));void(E.removeAttribute('command'));
You can modify the file pbdisable.js in the pbdisable.jar (zip) archive in the pbdisable.xpi (zip) archive to make the changes.
TabVisited
In Firefox 3.6 it is no longer possible to use the selected attribute to style unvisited and visited tabs with code in userChrome.css [3], https://bugzilla.mozilla.org/show_bug.cgi?id=487242]
I have attached an extension TabVisited to bug 487242 to add a visited attribute to tabs that have been visited that can be used until bug 487242 gets fixed.
Tabs that haven't been visited do not have that attribute. The currently selected attribute has a selected and a visited attribute.
See comment #c0 [4] (Description) for some coding examples.
Copy and paste the full DATA code in the location bar and save the file as tabvisited-1-1-fx-sm.xpi
You can install the extension via File > Open File or by dragging the file in a Firefox window.
You can move the extensions folder (tabvisited@mozillazine.org) from the extensions folder in the Profile Folder to the %AppData%\Mozilla\extensions\{ec8030f7-c20a-464f-9b0e-13a3a9e97384} folder to make the extension work in all Firefox profiles (that includes nightly Minefield and Namoroka builds). The maxVersion is set to 4.*. This version works for SeaMonkey 2 as well.
data:application/octet-stream;base64, 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 AAAAAA==
TabVisited with CSS code
This version has the CSS code from [5] embedded, so works right "out of the box"!.
Works with Firefox 3 (maxVersion 4.*) and SeaMonkey 2 (maxVersion 2.*).
Save as tabvisited-1-2-fx-sm.xpi
data:application/octet-stream;base64, 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