import Debug from '../conf/Debug'; import currentBrowser from '../conf/BrowserDetect'; import ExtensionConf from '../conf/ExtensionConf'; import ExtensionMode from '../../common/enums/extension-mode.enum'; import ObjectCopy from '../lib/ObjectCopy'; import Stretch from '../../common/enums/stretch.enum'; import VideoAlignment from '../../common/enums/video-alignment.enum'; class Settings { constructor(activeSettings, updateCallback) { this.active = activeSettings ? activeSettings : undefined; this.default = ExtensionConf; this.useSync = false; this.version = undefined; this.updateCallback = updateCallback; const ths = this; if(currentBrowser.firefox) { browser.storage.onChanged.addListener( (changes, area) => { if (Debug.debug && Debug.debugStorage) { console.log("[Settings::] Settings have been changed outside of here. Updating active settings. Changes:", changes, "storage area:", area); if (changes['uwSettings'] && changes['uwSettings'].newValue) { console.log("[Settings::] new settings object:", JSON.parse(changes.uwSettings.newValue)); } } if(changes['uwSettings'] && changes['uwSettings'].newValue) { ths.setActive(JSON.parse(changes.uwSettings.newValue)); } if(this.updateCallback) { try { updateCallback(ths); } catch (e) { console.log("[Settings] CALLING UPDATE CALLBACK FAILED.") } } }); } else if (currentBrowser.chrome) { chrome.storage.onChanged.addListener( (changes, area) => { if (Debug.debug && Debug.debugStorage) { console.log("[Settings::] Settings have been changed outside of here. Updating active settings. Changes:", changes, "storage area:", area); if (changes['uwSettings'] && changes['uwSettings'].newValue) { console.log("[Settings::] new settings object:", JSON.parse(changes.uwSettings.newValue)); } } if(changes['uwSettings'] && changes['uwSettings'].newValue) { ths.setActive(JSON.parse(changes.uwSettings.newValue)); } if(this.updateCallback) { try { updateCallback(ths); } catch (e) { console.log("[Settings] CALLING UPDATE CALLBACK FAILED.") } } }); } } async init() { const settings = await this.get(); if(Debug.debug) { console.log("[Settings::init] Configuration fetched from storage:", settings); if (Debug.flushStoredSettings) { console.log("%c[Settings::init] Debug.flushStoredSettings is true. Using default settings", "background: #d00; color: #ffd"); Debug.flushStoredSettings = false; // don't do it again this session this.setDefaultSettings(); this.active = this.getDefaultSettings(); return this.active; } } // if there's no settings saved, return default settings. if(! settings || (Object.keys(settings).length === 0 && settings.constructor === Object)) { this.setDefaultSettings(); this.active = this.getDefaultSettings(); return this.active; } // if there's settings, set saved object as active settings this.active = settings; // check if extension has been updated. If not, return settings as they were retreived if (currentBrowser.firefox) { this.version = browser.runtime.getManifest().version; } else if (currentBrowser.chrome) { this.version = chrome.runtime.getManifest().version; } else if (currentBrowser.edge) { this.version = browser.runtime.getManifest().version; } if(settings.version === this.version) { if(Debug.debug) { console.log("[Settings::init] extension was saved with current version of ultrawidify (", this.version, "). Returning object as-is."); } return this.active; } // if extension has been updated, update existing settings with any options added in the // new version. In addition to that, we remove old keys that are no longer used. const patched = ObjectCopy.addNew(settings, this.default); if(Debug.debug) { console.log("[Settings.init] Results from ObjectCopy.addNew()?", patched, "\n\nSettings from storage", settings, "\ndefault?", this.default,); } if(patched){ this.active = patched; } else { this.active = JSON.parse(JSON.stringify(this.default)); } this.set(this.active); return this.active; } async get() { let ret; if (currentBrowser.firefox) { ret = await browser.storage.local.get('uwSettings'); } else if (currentBrowser.chrome) { ret = await new Promise( (resolve, reject) => { chrome.storage.local.get('uwSettings', (res) => resolve(res)); }); } else if (currentBrowser.edge) { ret = await new Promise( (resolve, reject) => { browser.storage.local.get('uwSettings', (res) => resolve(res)); }); } try { return JSON.parse(ret.uwSettings); } catch(e) { return undefined; } } async set(extensionConf) { if (Debug.debug) { console.log("[Settings::set] setting new settings:", extensionConf) } if (currentBrowser.firefox || currentBrowser.edge) { extensionConf.version = this.version; return this.useSync ? browser.storage.local.set( {'uwSettings': JSON.stringify(extensionConf)}): browser.storage.local.set( {'uwSettings': JSON.stringify(extensionConf)}); } else if (currentBrowser.chrome) { return chrome.storage.local.set( {'uwSettings': JSON.stringify(extensionConf)}); } } async setActive(activeSettings) { this.active = activeSettings; } async setProp(prop, value) { this.active[prop] = value; } async save() { if (Debug.debug) { console.log("[Settings::save] Saving active settings:", this.active); } this.set(this.active); } async rollback() { this.active = await this.get(); } getDefaultSettings() { return JSON.parse(JSON.stringify(this.default)); } setDefaultSettings() { this.set(this.default); } // ----------------------------------------- // Nastavitve za posamezno stran // Config for a given page: // // : { // status: