Skip to content

Instantly share code, notes, and snippets.

@sekrasoft
Last active January 9, 2019 20:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save sekrasoft/3cc484caa49cd5645b02 to your computer and use it in GitHub Desktop.
Save sekrasoft/3cc484caa49cd5645b02 to your computer and use it in GitHub Desktop.
Подменяет localStorage Storage-подобным объектом с сохранением данных в настоящем хранилище.
// ==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);
});
})();
// ==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