Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save yoko/56894 to your computer and use it in GitHub Desktop.
Save yoko/56894 to your computer and use it in GitHub Desktop.
クッキーを使った疑似GM_setValue/getValue
// ==UserScript==
// @name GM_setValue and GM_getValue on GreaseKit Sample
// @namespace http://codefairy.org/ns/userscripts
// @include *
// @version 0.1
// @license MIT License
// ==/UserScript==
new function() {
registerGM_value('Foo', 1);
alert('document.cookie:\n' + document.cookie);
alert('typeof GM_setValue:\n' + typeof GM_setValue);
alert('typeof GM_getValue:\n' + typeof GM_getValue);
alert('foo:\n' + GM_getValue('foo') || 'no data yet');
alert('bar:\n' + GM_getValue('bar') || 'no data yet');
GM_setValue('foo', 'GM_setValue test');
GM_setValue('bar', { obj: 'is ok too!' });
function registerGM_value(prefix, expireDay) {
if (!(typeof GM_setValue == 'undefined' && typeof GM_getValue == 'undefined')) return;
var w = (typeof unsafeWindow != 'undefined') ? unsafeWindow : window;
// http://svn.coderepos.org/share/lang/javascript/clone/trunk/uneval.js
/*
* $Id: uneval.js,v 0.2 2008/06/13 17:47:18 dankogai Exp dankogai $
*/
try{
eval('uneval');
}catch(e){
var protos = [];
var char2esc = {'\t':'t','\n':'n','\v':'v','\f':'f','\r':'\r',
'\'':'\'','\"':'\"','\\':'\\'};
var escapeChar = function(c){
if (c in char2esc) return '\\' + char2esc[c];
var ord = c.charCodeAt(0);
return ord < 0x20 ? '\\x0' + ord.toString(16)
: ord < 0x7F ? '\\' + c
: ord < 0x100 ? '\\x' + ord.toString(16)
: ord < 0x1000 ? '\\u0' + ord.toString(16)
: '\\u' + ord.toString(16)
};
var uneval_asis = function(o){ return o.toString() };
/* predefine objects where typeof(o) != 'object' */
var name2uneval = {
'boolean':uneval_asis,
'number': uneval_asis,
'string': function(o){
return '\''
+ o.toString().replace(/[\x00-\x1F\'\"\\\u007F-\uFFFF]/g, escapeChar)
+ '\''
},
'undefined': function(o){ return 'undefined' },
'function':uneval_asis
};
var uneval_default = function(o, np){
var src = []; // a-ha!
for (var p in o){
if (!o.hasOwnProperty(p)) continue;
src[src.length] = uneval(p) + ':' + uneval(o[p], 1);
}
// parens needed to make eval() happy
return np ? '{' + src.toString() + '}' : '({' + src.toString() + '})';
};
uneval_set = function(proto, name, func){
protos[protos.length] = [ proto, name ];
name2uneval[name] = func || uneval_default;
};
uneval_set(Array, 'array', function(o){
var src = [];
for (var i = 0, l = o.length; i < l; i++)
src[i] = uneval(o[i]);
return '[' + src.toString() + ']';
});
uneval_set(RegExp, 'regexp', uneval_asis);
uneval_set(Date, 'date', function(o){
return '(new Date(' + o.valueOf() + '))';
});
var typeName = function(o){
// if (o === null) return 'null';
var t = typeof o;
if (t != 'object') return t;
// we have to lenear-search. sigh.
for (var i = 0, l = protos.length; i < l; i++){
if (o instanceof protos[i][0]) return protos[i][1];
}
return 'object';
};
w.uneval = function(o, np){
// if (o.toSource) return o.toSource();
if (o === null) return 'null';
var func = name2uneval[typeName(o)] || uneval_default;
return func(o, np);
}
}
w.GM_setValue = function(key, value) {
var expire, date;
if (value == '') // clear
expire = -1;
else {
value = uneval(value);
date = new Date;
date.setTime(date.getTime() + 1000 * 60 * 60 * 24 * expireDay);
expire = date.toUTCString();
}
document.cookie = [
prefix+key+'='+encodeURIComponent(value),
'expires='+expire,
'path=/'
].join(';');
};
w.GM_getValue = function(key) {
var find = new RegExp('^'+prefix+key+'=(.+)$');
var trim = /^\s+|\s+$/g;
var cookies = document.cookie.split(';');
for (var i = 0, length = cookies.length; i < length; i++) {
var cookie = cookies[i].replace(trim, '');
var c = find.exec(cookie);
if (c) return decodeURIComponent(c[1]);
}
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment