Tentando di scrivere una nuova e più completa versione dello script FFHideByKeyword mi sono scontrato con un subdolo e fastidioso bug di Greasemokey, il famoso script engine per Firefox che permette di modificare il comportamento ed il layout di una pagina HTML. Il bug in questione è legato all’utilizzo del localStorage, una tecnologia introdotta con HTML5 alternativa ai vecchi cookie, tecnologia che uso per archiviare le parole chiave indesiderate scelte dall’utente. La tecnologia è supportata dai maggiori browser [è possibile fare un test a questo indirizzo: HTML5 test], fornisce delle API chiare e facili da usare, e mi è quindi sembrato un peccato non sfruttarla.
Ma veniamo al bug. La parte subdola sta nel fatto che non tutte le API sono disponibili, e quella che manca è la proprietà window.localStorage.length, che riporta il numero di coppie chiave/valore presenti nello storage. La proprietà è molto importante, perché in assenza di iteratori conoscere questo valore è l’unico modo pulito per accedere agli elementi, con un classico ciclo for:
1 2 3 4 | for (var i = 0; i < window.localStorage.length; i++) { k = window.localStorage.key(i); myFunction(window.localStorage.getItem(k)); } |
Ho usato il termine pulito perché in effetti è si possibile usare un metodo alternativo, ma sinceramente lo trovo brutto e per nulla ottimizzato. Il seguente ciclo potrebbe funzionare, ma non l’ho testato:
1 2 3 4 5 6 7 8 | var i = 0; if (window.localStorage.key(i) != null) { do { k = window.localStorage.key(i); myFunction(window.localStorage.getItem(k)); i++; } while (window.localStorage.key(i) != null); } |
Il bug è facilmente verificabile.
Il seguente codice HTML è funzionante:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <html> <head> </head> <body> <div id="out"></div> <script language="Javascript"> var out = document.getElementById("out"); window.localStorage.setItem("test", "test"); out.innerHTML += "Getting data: " + window.localStorage.getItem("test") + "<br />"; window.localStorage.setItem("test1", "test1"); out.innerHTML += "Total count: " + window.localStorage.length; </script> </body> </html> |
mentre il seguente userscript no:
1 2 3 4 5 6 7 8 9 10 11 12 13 | // ==UserScript== // @name Length Test // @namespace me // @description A test for localStorage.length // @include http://www.google.it/ // ==/UserScript== var out = document.getElementById("ghead"); window.localStorage.setItem("test", "test"); out.innerHTML += "Getting data: " + window.localStorage.getItem("test") + "<br />"; window.localStorage.setItem("test1", "test1"); out.innerHTML += "Total count: " + window.localStorage.length; |
Qui c’è la segnalazione, direi scarsamente considerata, e qui il thread nel Google Group relativo. In attesa di un bugfix, lo sviluppo dello script è interrotto.
Technorati Tags: greasemonkey, ffhidebykeyword


