« Emacs移行経過(2009/02/14) | メイン | リンク先のHTTP Status Codeを調べ、あらかじめ表示するUserScript »

GreasemonkeyのGM_setValueで保存できるデータの種類

GreasemonkeyのAPIであるGM_setValueで保存できるデータの種類に制限があるのをご存知ですか?
それを調べるために、次のようなUserScriptを実行してみます。
但し、unsafeWindowを使っているので信用のおけるsiteで実行してください。
GM_xxxValueTest.user.js
// ==UserScript==
// @name        GM_xxxValueTest
// @namespace   http://www.kanasansoft.com/
// @include     *
// ==/UserScript==

(
    function(){
        var data=[
            ["Boolean",true],
            ["Number",12345],
            ["Number",12345.67890],
            ["String","12345"],
            ["Array",[1,2,3,4,5,"a","b","c"]],
            ["Date",new Date()],
            ["Math",Math],
            ["Regexp",/./],
            ["Function",function(){return 12345;}],
            ["Object",{"a":1,"b":2}],
            ["Window",unsafeWindow],
            ["Document",unsafeWindow.document],
            ["body",unsafeWindow.document.body]
        ];
        var test=function(name,value){
            return function(){
                try{
                    GM_setValue(name,value);
                    var result=GM_getValue(name);
                    console.log(name,value,result,result.constructor);
                }catch(e){
                    console.log(name,value,e);
                }
            }
        };
        for(var i=0;i<data.length;i++){
            var name=data[i][0];
            var value=data[i][1];
            setTimeout(test(name,value),0);
        }
    }
)();
結果は次のとおり。
Boolean・Number・Stringしか保存されません。
少数にも対応していません。
エラーメッセージにも「Error: Unsupported type for GM_setValue. Supported types are: string, bool, and 32 bit integers.」と書かれています。
Windowはともかく少数や配列は保存できそうなものですが無理です。それは何故でしょうか。
その理由はデータの保存先にあります。
保存先はFirefox各種動作を制御している設定値の中です。
Windowsにおけるレジストリと同じようなものだと思ってもらえれば、慎重にならないといけないのはわかってもらえると思います。
それでは、これをご理解頂いた上で、アドレスバーで「about:config」を入力し、設定値を表示します。
ここで表示される値は全て真偽値・整数値・文字列のどれかです。
それは、右クリックし「新規作成」のサブメニューを見ても明らかです。
Greasemonkeyで保存した値は本当にここに保存されているのでしょうか。
「フィルタ」テキストボックスに「GM_xxxValueTest」と入力してみましょう。
以下のようなものが表示されると思います。
GM_setValueで保存した値が確認できました。
真偽値・整数値・文字列以外の値を保存したい場合には、JSON等に変換して保存すればいいでしょう。
Firefox3.1からはJSONオブジェクトが標準になるそうなので期待して待っていましょう。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google

タグ クラウド