User:Dickvl

From MozillaZine Knowledge Base
Revision as of 22:18, 6 February 2010 by Dickvl (talk | contribs) ((moved TabVisited))
Jump to navigationJump to search

Bookmarklets

Bookmarklets can be found here: User:Dickvl/Bookmarklets
See also Wikipedia: Bookmarklet

Navigator Object

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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
omRLVXgAAFBLBQYAAAAABAAEACEBAACUBQAAAAA=

Keysdisable

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).

if(E=window.document.getElementById('key_closeWindow')){E.removeAttribute('key');E.removeAttribute('modifiers');E.removeAttribute('command');}
if(E=window.document.getElementById('key_quitApplication')){E.removeAttribute('key');E.removeAttribute('modifiers');E.removeAttribute('command');}
if(E=window.document.getElementById('key_privatebrowsing')){E.removeAttribute('key');E.removeAttribute('modifiers');E.removeAttribute('command');}
if(E=window.document.getElementById('key_openDownloads')){E.removeAttribute('key');E.removeAttribute('modifiers');E.removeAttribute('command');}
if(E=window.document.getElementById('key_undoCloseWindow')){E.removeAttribute('key');E.removeAttribute('modifiers');E.removeAttribute('command');}
if(E=window.document.getElementById('manBookmarkKb')){E.removeAttribute('key');E.removeAttribute('modifiers');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.
You can modify the file keysdisable.xul in the keysdisable.jar (zip) archive in the keysdisable.xpi (zip) archive to make the changes.

Copy and paste the full DATA code in the location bar and press the Enter key. Save the file as keysdisable.xpi

data:application/octet-stream;base64,
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

Restart Firefox

This extension adds a Restart Firefox item to the File menu. It displays that menu entry in the language of the installed locale (should work for all locales). All open tabs and windows should be restored if session restore is working properly.
Copy and paste the full DATA code in the location bar and press the Enter key. Save the file as restarter-1.0-fx.xpi

data:application/octet-stream;base64,
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
c3RQSwUGAAAAAAUABQBmAQAAvAUAAAAA

TabVisited

TabVisited has been moved to User:Dickvl/TabVisited