62 lines
1.4 KiB
JavaScript
62 lines
1.4 KiB
JavaScript
// cookieStorage is useful Safari private browser mode, where localStorage
|
|
// doesn't work but cookies do. This implementation is adopted from
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
|
|
|
|
var util = require('../src/util')
|
|
var Global = util.Global
|
|
var trim = util.trim
|
|
|
|
module.exports = {
|
|
name: 'cookieStorage',
|
|
read: read,
|
|
write: write,
|
|
each: each,
|
|
remove: remove,
|
|
clearAll: clearAll,
|
|
}
|
|
|
|
var doc = Global.document
|
|
|
|
function read(key) {
|
|
if (!key || !_has(key)) { return null }
|
|
var regexpStr = "(?:^|.*;\\s*)" +
|
|
escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
|
|
"\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*"
|
|
return unescape(doc.cookie.replace(new RegExp(regexpStr), "$1"))
|
|
}
|
|
|
|
function each(callback) {
|
|
var cookies = doc.cookie.split(/; ?/g)
|
|
for (var i = cookies.length - 1; i >= 0; i--) {
|
|
if (!trim(cookies[i])) {
|
|
continue
|
|
}
|
|
var kvp = cookies[i].split('=')
|
|
var key = unescape(kvp[0])
|
|
var val = unescape(kvp[1])
|
|
callback(val, key)
|
|
}
|
|
}
|
|
|
|
function write(key, data) {
|
|
if(!key) { return }
|
|
doc.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/"
|
|
}
|
|
|
|
function remove(key) {
|
|
if (!key || !_has(key)) {
|
|
return
|
|
}
|
|
doc.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/"
|
|
}
|
|
|
|
function clearAll() {
|
|
each(function(_, key) {
|
|
remove(key)
|
|
})
|
|
}
|
|
|
|
function _has(key) {
|
|
return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc.cookie)
|
|
}
|