Site icon Just another blog

Greasemonkey e localStorage

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:


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:


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:








mentre il seguente userscript no:


// ==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") + "
";
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.

[tags]greasemonkey, ffhidebykeyword[/tags]

Exit mobile version