blob: 9ead0b2641d321c1ae4f8a87a289d0162c8c2139 [file] [log] [blame]
import optionsPrototype from './optionsPrototype.json5';
import specialOptions from './specialOptions.json5';
export {optionsPrototype, specialOptions};
// Adds missing options with their default value. If |dryRun| is set to false,
// they are also saved to the sync storage area.
export function cleanUpOptions(options, dryRun = false) {
console.debug('[cleanUpOptions] Previous options', JSON.stringify(options));
if (typeof options !== 'object' || options === null) options = {};
var ok = true;
for (const [opt, optMeta] of Object.entries(optionsPrototype)) {
if (!(opt in options)) {
ok = false;
options[opt] = optMeta['defaultValue'];
}
}
console.debug('[cleanUpOptions] New options', JSON.stringify(options));
if (!ok && !dryRun) {
chrome.storage.sync.set(options);
}
return options;
}
// Returns a promise which returns the values of options |options| which are
// stored in the sync storage area.
export function getOptions(options) {
// Once we only target MV3, this can be greatly simplified.
return new Promise((resolve, reject) => {
if (typeof options === 'string')
options = [options, '_forceDisabledFeatures'];
else if (Array.isArray(options))
options = [...options, '_forceDisabledFeatures'];
else if (options !== null)
console.error(
'Unexpected |options| parameter of type ' + (typeof options) +
' (expected: string, array, or null).');
chrome.storage.sync.get(options, items => {
if (chrome.runtime.lastError) return reject(chrome.runtime.lastError);
// Handle applicable kill switches which force disable features
if (items?._forceDisabledFeatures) {
for (let feature of items?._forceDisabledFeatures) {
items[feature] = false;
}
delete items._forceDisabledFeatures;
}
resolve(items);
});
});
}
// Returns a promise which returns whether the |option| option/feature is
// currently enabled.
export function isOptionEnabled(option) {
return getOptions(option).then(options => {
return options?.[option] === true;
});
}