mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-13 05:15:45 +00:00
bb351ebfca
MozReview-Commit-ID: 8TbTIM4WX2d --HG-- extra : source : a3ed5ad1bc338e7fd8055c2efcf73695c25e09e5
63 lines
2.2 KiB
JavaScript
63 lines
2.2 KiB
JavaScript
"use strict";
|
|
|
|
XPCOMUtils.defineLazyModuleGetter(this, "ExtensionStorage",
|
|
"resource://gre/modules/ExtensionStorage.jsm");
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
|
|
this.storage = class extends ExtensionAPI {
|
|
getAPI(context) {
|
|
function sanitize(items) {
|
|
// The schema validator already takes care of arrays (which are only allowed
|
|
// to contain strings). Strings and null are safe values.
|
|
if (typeof items != "object" || items === null || Array.isArray(items)) {
|
|
return items;
|
|
}
|
|
// If we got here, then `items` is an object generated by `ObjectType`'s
|
|
// `normalize` method from Schemas.jsm. The object returned by `normalize`
|
|
// lives in this compartment, while the values live in compartment of
|
|
// `context.contentWindow`. The `sanitize` method runs with the principal
|
|
// of `context`, so we cannot just use `ExtensionStorage.sanitize` because
|
|
// it is not allowed to access properties of `items`.
|
|
// So we enumerate all properties and sanitize each value individually.
|
|
let sanitized = {};
|
|
for (let [key, value] of Object.entries(items)) {
|
|
sanitized[key] = ExtensionStorage.sanitize(value, context);
|
|
}
|
|
return sanitized;
|
|
}
|
|
return {
|
|
storage: {
|
|
local: {
|
|
get: function(keys) {
|
|
keys = sanitize(keys);
|
|
return context.childManager.callParentAsyncFunction("storage.local.get", [
|
|
keys,
|
|
]);
|
|
},
|
|
set: function(items) {
|
|
items = sanitize(items);
|
|
return context.childManager.callParentAsyncFunction("storage.local.set", [
|
|
items,
|
|
]);
|
|
},
|
|
},
|
|
|
|
sync: {
|
|
get: function(keys) {
|
|
keys = sanitize(keys);
|
|
return context.childManager.callParentAsyncFunction("storage.sync.get", [
|
|
keys,
|
|
]);
|
|
},
|
|
set: function(items) {
|
|
items = sanitize(items);
|
|
return context.childManager.callParentAsyncFunction("storage.sync.set", [
|
|
items,
|
|
]);
|
|
},
|
|
},
|
|
},
|
|
};
|
|
}
|
|
};
|