GreasemonkeyのAPIであるGM_setValueで保存できるデータの種類に制限があるのをご存知ですか?
それを調べるために、次のようなUserScriptを実行してみます。
但し、unsafeWindowを使っているので信用のおけるsiteで実行してください。
それを調べるために、次のような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);
}
}
)();
// @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」を入力し、設定値を表示します。
少数にも対応していません。
エラーメッセージにも「Error: Unsupported type for GM_setValue. Supported types are: string, bool, and 32 bit integers.」と書かれています。
Windowはともかく少数や配列は保存できそうなものですが無理です。それは何故でしょうか。
その理由はデータの保存先にあります。
保存先はFirefox各種動作を制御している設定値の中です。
Windowsにおけるレジストリと同じようなものだと思ってもらえれば、慎重にならないといけないのはわかってもらえると思います。
それでは、これをご理解頂いた上で、アドレスバーで「about:config」を入力し、設定値を表示します。
ここで表示される値は全て真偽値・整数値・文字列のどれかです。
それは、右クリックし「新規作成」のサブメニューを見ても明らかです。
それは、右クリックし「新規作成」のサブメニューを見ても明らかです。
Greasemonkeyで保存した値は本当にここに保存されているのでしょうか。
「フィルタ」テキストボックスに「GM_xxxValueTest」と入力してみましょう。
以下のようなものが表示されると思います。
「フィルタ」テキストボックスに「GM_xxxValueTest」と入力してみましょう。
以下のようなものが表示されると思います。
GM_setValueで保存した値が確認できました。
真偽値・整数値・文字列以外の値を保存したい場合には、JSON等に変換して保存すればいいでしょう。
Firefox3.1からはJSONオブジェクトが標準になるそうなので期待して待っていましょう。
真偽値・整数値・文字列以外の値を保存したい場合には、JSON等に変換して保存すればいいでしょう。
Firefox3.1からはJSONオブジェクトが標準になるそうなので期待して待っていましょう。