Last active
January 9, 2019 20:43
-
-
Save sekrasoft/3cc484caa49cd5645b02 to your computer and use it in GitHub Desktop.
Подменяет localStorage Storage-подобным объектом с сохранением данных в настоящем хранилище.
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 Отложенная запись в localStorage | |
// @include http://*/* | |
// @include https://*/* | |
// @version 1.0.0 | |
// @grant none | |
// ==/UserScript== | |
(function(){ | |
// Сохраняем старое хранилище | |
var oldStorage = window.localStorage; | |
if(!oldStorage) return; | |
(function initStorage() { | |
var | |
// storage - объект-замена localStorage | |
storage = Object.create(null), | |
// data - место, где хранятся данные | |
// если Proxy есть, храним данные в отдельном объекте | |
data = window.Proxy ? Object.create(null) : storage; | |
// определение свойства у storage | |
function define(name, value){ | |
Object.defineProperty(storage, name, { | |
writable: false, | |
configurable: false, | |
enumerable: false, | |
value: value | |
}); | |
} | |
// свойства localStorage | |
Object.defineProperty(storage, 'length', { | |
configurable: false, | |
enumerable: false, | |
get: function() { | |
return Object.keys(data).length; | |
} | |
}); | |
define('key', function(k){ | |
var keys = Object.keys(data); | |
if(!isFinite(+k) || k < 0 || k >= keys.length) return null; | |
return keys[k]; | |
}); | |
define('clear', initStorage); | |
define('getItem', function(key){ | |
return key in data ? String(data[key]) : null; | |
}); | |
define('setItem', function(key, value){ | |
data[key] = String(value); | |
}); | |
define('removeItem', function(key){ | |
delete data[key]; | |
}); | |
// Позволяет Proxy эмулировать следующее поведение: | |
// localStorage.setItem - функция | |
// localStorage.getItem('setItem') - строка | |
var handler = { | |
get: function(obj, key) { | |
if(key in storage) return storage[key]; | |
return obj[key]; | |
} | |
}; | |
// Proxy позволит хранить свойства с именами length, setItem, ... | |
Object.defineProperty(window, 'localStorage', { | |
value: window.Proxy ? new Proxy(data, handler) : storage | |
}); | |
})(); | |
// Копирование из Storage в Storage | |
function copy(dst, src) { | |
for(var i=0, n=src.length; i<n; ++i) { | |
var k = src.key(i); | |
dst.setItem(k, src.getItem(k)); | |
} | |
} | |
// Копируем в эмулированное хранилище из оригинального localStorage | |
copy(window.localStorage, oldStorage); | |
// При закрытии страницы копируем все данные в оригинальное localStorage | |
window.addEventListener('beforeunload', function(){ | |
oldStorage.clear(); | |
copy(oldStorage, window.localStorage); | |
}); | |
})(); |
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 Без localStorage | |
// @include http://*/* | |
// @include https://*/* | |
// @version 1.0.0 | |
// @run-at document-start | |
// @grant none | |
// ==/UserScript== | |
Object.defineProperty(window, 'localStorage', { 'value': undefined }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment