Created
February 2, 2009 12:49
-
-
Save yoko/56894 to your computer and use it in GitHub Desktop.
クッキーを使った疑似GM_setValue/getValue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==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