Files
tubestation/toolkit/components/extensions/parent/ext-storage.js
Cosmin Sabou 0f5163a609 Backed out 10 changesets (bug 1406181) as per developers request.
Backed out changeset 06461ddb2699 (bug 1406181)
Backed out changeset fd61d9faedf0 (bug 1406181)
Backed out changeset b52c2fb70ae1 (bug 1406181)
Backed out changeset 4f387b4a76a9 (bug 1406181)
Backed out changeset db783c96c076 (bug 1406181)
Backed out changeset 62e9126ecd0d (bug 1406181)
Backed out changeset d34810cab822 (bug 1406181)
Backed out changeset 3241c2dfb296 (bug 1406181)
Backed out changeset 912a2eaf4d26 (bug 1406181)
Backed out changeset fdac47b8ef20 (bug 1406181)
2018-06-03 16:10:23 +03:00

139 lines
4.6 KiB
JavaScript

"use strict";
XPCOMUtils.defineLazyModuleGetters(this, {
AddonManagerPrivate: "resource://gre/modules/AddonManager.jsm",
ExtensionStorage: "resource://gre/modules/ExtensionStorage.jsm",
ExtensionStorageIDB: "resource://gre/modules/ExtensionStorageIDB.jsm",
extensionStorageSync: "resource://gre/modules/ExtensionStorageSync.jsm",
NativeManifests: "resource://gre/modules/NativeManifests.jsm",
});
var {
ExtensionError,
} = ExtensionUtils;
const enforceNoTemporaryAddon = extensionId => {
const EXCEPTION_MESSAGE =
"The storage API will not work with a temporary addon ID. " +
"Please add an explicit addon ID to your manifest. " +
"For more information see https://bugzil.la/1323228.";
if (AddonManagerPrivate.isTemporaryInstallID(extensionId)) {
throw new ExtensionError(EXCEPTION_MESSAGE);
}
};
// WeakMap[extension -> Promise<SerializableMap?>]
const managedStorage = new WeakMap();
const lookupManagedStorage = async (extensionId, context) => {
let info = await NativeManifests.lookupManifest("storage", extensionId, context);
if (info) {
return ExtensionStorage._serializableMap(info.manifest.data);
}
return null;
};
this.storage = class extends ExtensionAPI {
getAPI(context) {
let {extension} = context;
return {
storage: {
local: {
// Private storage.local JSONFile backend methods (used internally by the child
// ext-storage.js module).
JSONFileBackend: {
get(spec) {
return ExtensionStorage.get(extension.id, spec);
},
set(items) {
return ExtensionStorage.set(extension.id, items);
},
remove(keys) {
return ExtensionStorage.remove(extension.id, keys);
},
clear() {
return ExtensionStorage.clear(extension.id);
},
},
// Private storage.local IDB backend methods (used internally by the child ext-storage.js
// module).
IDBBackend: {
selectBackend() {
return ExtensionStorageIDB.selectBackend(context);
},
hasListeners() {
return ExtensionStorageIDB.hasListeners(extension.id);
},
fireOnChanged(changes) {
ExtensionStorageIDB.notifyListeners(extension.id, changes);
},
onceDataMigrated() {
return ExtensionStorageIDB.onceDataMigrated(context);
},
},
},
sync: {
get(spec) {
enforceNoTemporaryAddon(extension.id);
return extensionStorageSync.get(extension, spec, context);
},
set(items) {
enforceNoTemporaryAddon(extension.id);
return extensionStorageSync.set(extension, items, context);
},
remove(keys) {
enforceNoTemporaryAddon(extension.id);
return extensionStorageSync.remove(extension, keys, context);
},
clear() {
enforceNoTemporaryAddon(extension.id);
return extensionStorageSync.clear(extension, context);
},
},
managed: {
async get(keys) {
enforceNoTemporaryAddon(extension.id);
let lookup = managedStorage.get(extension);
if (!lookup) {
lookup = lookupManagedStorage(extension.id, context);
managedStorage.set(extension, lookup);
}
let data = await lookup;
if (!data) {
return Promise.reject({message: "Managed storage manifest not found"});
}
return ExtensionStorage._filterProperties(data, keys);
},
},
onChanged: new EventManager({
context,
name: "storage.onChanged",
register: fire => {
let listenerLocal = changes => {
fire.raw(changes, "local");
};
let listenerSync = changes => {
fire.async(changes, "sync");
};
ExtensionStorage.addOnChangedListener(extension.id, listenerLocal);
ExtensionStorageIDB.addOnChangedListener(extension.id, listenerLocal);
extensionStorageSync.addOnChangedListener(extension, listenerSync, context);
return () => {
ExtensionStorage.removeOnChangedListener(extension.id, listenerLocal);
ExtensionStorageIDB.removeOnChangedListener(extension.id, listenerLocal);
extensionStorageSync.removeOnChangedListener(extension, listenerSync);
};
},
}).api(),
},
};
}
};