User:Dickvl: Difference between revisions
((* added enhanced psw javascript code *)) |
(pbdisable) |
||
Line 1: | Line 1: | ||
===Navigator Object=== | |||
Here is a bookmarklet to display the content of the Navigator object (plugins, mimeTypes). | |||
<pre> | |||
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();} | |||
})(); | |||
</pre> | |||
===Add-ons=== | |||
Sometime ago I noticed the [http://forums.mozillazine.org/viewtopic.php?f=23&t=1172765 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.<br> | Sometime ago I noticed the [http://forums.mozillazine.org/viewtopic.php?f=23&t=1172765 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.<br> | ||
Line 202: | Line 223: | ||
</pre> | </pre> | ||
===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. | Here is an enhanced version of the Password printing code from [[Password Manager]] to show all the fields, may be helpful for troubleshooting issues. | ||
<pre>/* | <pre>/* | ||
Line 296: | Line 318: | ||
} | } | ||
})(); | })(); | ||
</pre> | |||
===Private Browsing=== | |||
Here is a simple extension that hides and disables the Tools -> Start Private Browsing entry and the Tools > Clear Recent History entry in Friefox3.5/6.<br /> | |||
You also need to add code to [[userChrome.css]] below the @namespace line.<br /> | |||
See http://kb.mozillazine.org/Editing_configuration#How_to_edit_configuration_files | |||
<pre>#sanitizeSeparator, #privateBrowsingItem, #sanitizeItem {display:none!important;} | |||
#privateBrowsingAutoStart {display:none!important;} | |||
</pre> | |||
Copy and paste the code in the location bar and save the file as pbdisable.xpi<br /> | |||
You can install the extension via File > Open File or by dragging the file in a Firefox window. | |||
<pre>data:application/octet-stream;base64, | |||
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 | |||
</pre> | </pre> |
Revision as of 05:29, 25 January 2010
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();} })();
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")); } })();
Private Browsing
Here is a simple extension that hides and disables the Tools -> Start Private Browsing entry and the Tools > Clear Recent History entry in Friefox3.5/6.
You also need to add code to userChrome.css below the @namespace line.
See http://kb.mozillazine.org/Editing_configuration#How_to_edit_configuration_files
#sanitizeSeparator, #privateBrowsingItem, #sanitizeItem {display:none!important;} #privateBrowsingAutoStart {display:none!important;}
Copy and paste the code in the location bar and save the file as pbdisable.xpi
You can install the extension via File > Open File or by dragging the file in a Firefox window.
data:application/octet-stream;base64, UEsDBBQAAAAIAIIoOTz7YFT+VQAAAI8AAAAPABUAY2hyb21lLm1hbmlmZXN0VVQJAAMzGF1LMxhd S1V4BADoA2QAS87PK0nNK+EsSErJLE5MyknlzEosskrOKMrPTdWHC+oBBRX1kyFq9Xm5eLnyy1KL chIrOSEqrfT1k4ryy4tTi+CKoHy9itIchCK4gXBlCCuACnm5AFBLAwQUAAAACAB3MTk8a5K3anwB AAAFAwAACwAVAGluc3RhbGwucmRmVVQJAAMSKF1LEihdS1V4BADoA2QAbZLLboMwEEXXqZR/cOmu kjEB+gAR+lCVVRdVpHbvwJBYxTayTZO26r+XODghUXbm3nPHM2Oyhw2v0RcozaSYehM/8B7y8cX4 Ipu/zFDnCT31VsY0KSHr9dpfR75USzJJkoQEIQlDrMoK629h6AYLfeXtMinwoxiXP6yuqc2GQRAT 4NvgldfdNcpeQBeKNaZrAdGFbM3Ua5VI+1DKhDa0rjGnglWgjQ2NMuApK/NmUTJNFzU89vgPE7C9 JyM7wLGCcsjfnlGPW9tqDuiXkHc7sKb7dn556HJQB2F30qhTOYgW6ZVUpmiNLTOMuVKFAmqkyktW fH7VFnOSQ1aSQ0OX8D5/zftFVlK1XPvn5hzSroL5biAPrW2PVr/EGM2YgkpuEMYHlqolmKemqVlB 962Ojp6ml/ab/4XiPoiC6g4XYUBxfBtXOFkEgCcRjWgCyV10H/8Nn8GFORMf/XIj/8YSA+mIpBsn x/71jjxIfY/ktMndzOdGOmUz0v3m+T9QSwMECgAAAAAADaV2OwAAAAAAAAAAAAAAAAcAFQBjaHJv bWUvVVQJAAOpkwlLqZMJS1V4BADoA2QAUEsDBBQAAAAIAHotOTyQFhPm/AIAAOwDAAAUABUAY2hy b21lL3BiZGlzYWJsZS5qYXJVVAkAA4chXUtsIV1LVXgEAOgDZAAL8GZmEWFgYOBgKNK2tGG++4Rt KpB3A4hFgTA5P68kNa9EvyApJbM4MSknVS+5uDg0hJOBeYdsrDcIh1awMLxgTmGo7dvI1xTA41ou 9G9hW++KN7s0Zs/mjA/YmvF4ser70JCe/3mSMTJzZlXfqs5fLfTmEGcUH4tddQ/bLSuVG9cLHrWw 379w2ENo9YFDNz9atfguV25vUObWNZ23cM0nnfNdLYeOKZs+CcyQeh7wZSK7yarF94RPV6Zfsfwb 5ycUd+8Ke806l9a0O1+leI9ey+//szE/f1mvb/0/w1qGALjnMoCe+7WDcfY2IG8KIwODCFbPZUH8 tgToryVIftvbt5HrkIOAS7Xi/w1zPRM/MSqtmHDo3KE4vZ2+MXt2T93tm/TpaxyLo8DBU1ltM48b uDIu52bNOKHgsldT/wDvCdaHO9h9HUM3Hty9gPsIX5jh6vV7b0bNOyFhOvHwnNrZOpNc19tMeb3C x8r39FkHv88TstdZd/t9EltqYnH7b8WFl5+6Hv98tjK8aepzxQnZ0yOnVW+589jvSPBVTrudM/a3 nfY/sGlZ24V2yd9sV3PWFv3KfXm829FSaNaH+PtyCM/76lrafAoSdTsK5Hkx4orZitIcsO+NFGO9 GRURvu/tP5jHZMjj8t7jj/MTa847WgofdNV2qEzwXXQj1fzvL7a30+KqP585UTfvcaXUoqqgpxMm t869d+jnlri14cfDNyRmTrwh3Plpqp2uRfxnh+rkU0+lJPQn9pz21Dg5f7GssUZmqw6Hb1Jc1c5Z 1lpJwQ+zHu7dEBkTMHfmjSZxzbmGfYvlPpV3CJauM/+8wEyBO7TYeSF74MvFFauWML+ek3T5cnjL zCPr2pROS0d48fAtnW5SXvNIRq6u+v0Xdo117+b/fceT1jbj6ed1dcCUwMgkzowrofMygAAwZBje NoJYOJI9KyTZh1YwoJiHmbaQzbuL1bwsiHFLsBiHGVvIxt1ixGYcOO5YIXEHMY+VDaSHGQjfA+nn TCAeAFBLAQIXAxQAAAAIAIIoOTz7YFT+VQAAAI8AAAAPAA0AAAAAAAEAAADtgQAAAABjaHJvbWUu bWFuaWZlc3RVVAUAAzMYXUtVeAAAUEsBAhcDFAAAAAgAdzE5PGuSt2p8AQAABQMAAAsADQAAAAAA AQAAAO2BlwAAAGluc3RhbGwucmRmVVQFAAMSKF1LVXgAAFBLAQIXAwoAAAAAAA2ldjsAAAAAAAAA AAAAAAAHAA0AAAAAAAAAEADtQVECAABjaHJvbWUvVVQFAAOpkwlLVXgAAFBLAQIXAxQAAAAIAHot OTyQFhPm/AIAAOwDAAAUAA0AAAAAAAAAAACkgYsCAABjaHJvbWUvcGJkaXNhYmxlLmphclVUBQAD hyFdS1V4AABQSwUGAAAAAAQABAAhAQAAzgUAAAAA