71c3e0c7a8
* chrome.storage.onChanged supported in own pages * values are stored in the background page * chrome.storage in own pages accesses that background storage
79 lines
2.6 KiB
JavaScript
79 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
// eslint-disable-next-line no-unused-expressions
|
|
(chrome.runtime.id.includes('@temporary') || !('sync' in chrome.storage)) && (() => {
|
|
|
|
const listeners = new Set();
|
|
Object.assign(chrome.storage.onChanged, {
|
|
addListener: fn => listeners.add(fn),
|
|
hasListener: fn => listeners.has(fn),
|
|
removeListener: fn => listeners.delete(fn),
|
|
});
|
|
|
|
for (const name of ['local', 'sync']) {
|
|
const dummy = tryJSONparse(localStorage['dummyStorage.' + name]) || {};
|
|
chrome.storage[name] = {
|
|
get(data, cb) {
|
|
let result = {};
|
|
if (data === null) {
|
|
result = deepCopy(dummy);
|
|
} else if (Array.isArray(data)) {
|
|
for (const key of data) {
|
|
result[key] = dummy[key];
|
|
}
|
|
} else if (typeof data === 'object') {
|
|
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
for (const key in data) {
|
|
if (hasOwnProperty.call(data, key)) {
|
|
const value = dummy[key];
|
|
result[key] = value === undefined ? data[key] : value;
|
|
}
|
|
}
|
|
} else {
|
|
result[data] = dummy[data];
|
|
}
|
|
if (typeof cb === 'function') cb(result);
|
|
},
|
|
set(data, cb) {
|
|
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
const changes = {};
|
|
for (const key in data) {
|
|
if (!hasOwnProperty.call(data, key)) continue;
|
|
const newValue = data[key];
|
|
changes[key] = {newValue, oldValue: dummy[key]};
|
|
dummy[key] = newValue;
|
|
}
|
|
localStorage['dummyStorage.' + name] = JSON.stringify(dummy);
|
|
if (typeof cb === 'function') cb();
|
|
notify(changes);
|
|
},
|
|
remove(keyOrKeys, cb) {
|
|
const changes = {};
|
|
for (const key of Array.isArray(keyOrKeys) ? keyOrKeys : [keyOrKeys]) {
|
|
changes[key] = {oldValue: dummy[key]};
|
|
delete dummy[key];
|
|
}
|
|
localStorage['dummyStorage.' + name] = JSON.stringify(dummy);
|
|
if (typeof cb === 'function') cb();
|
|
notify(changes);
|
|
},
|
|
};
|
|
}
|
|
|
|
window.API_METHODS = Object.assign(window.API_METHODS || {}, {
|
|
dummyStorageGet: ({data, name}) => new Promise(resolve => chrome.storage[name].get(data, resolve)),
|
|
dummyStorageSet: ({data, name}) => new Promise(resolve => chrome.storage[name].set(data, resolve)),
|
|
dummyStorageRemove: ({data, name}) => new Promise(resolve => chrome.storage[name].remove(data, resolve)),
|
|
});
|
|
|
|
function notify(changes, name) {
|
|
for (const fn of listeners.values()) {
|
|
fn(changes, name);
|
|
}
|
|
sendMessage({
|
|
dummyStorageChanges: changes,
|
|
dummyStorageName: name,
|
|
}, ignoreChromeError);
|
|
}
|
|
})();
|