diff options
author | Einar Egilsson <einar@einaregilsson.com> | 2016-02-22 11:13:53 +0000 |
---|---|---|
committer | Einar Egilsson <einar@einaregilsson.com> | 2016-02-22 11:13:53 +0000 |
commit | 4320359ef8dae668f9916c5db1e7de8efab8aa8d (patch) | |
tree | 8b7df77fc09de35444ee692b96dc5a577e6381fd /js/firefox | |
parent | 18ff916419996e991fd5679b74850938182495fa (diff) |
Use built in ExtensionStorage module
Diffstat (limited to 'js/firefox')
-rw-r--r-- | js/firefox/background-shim.js | 6 | ||||
-rw-r--r-- | js/firefox/extension-storage.jsm | 156 |
2 files changed, 3 insertions, 159 deletions
diff --git a/js/firefox/background-shim.js b/js/firefox/background-shim.js index 3551e48..d937104 100644 --- a/js/firefox/background-shim.js +++ b/js/firefox/background-shim.js @@ -68,8 +68,8 @@ migrateFromOlderVersion(); function makeUrl(relativeUrl) { return self.data.url(relativeUrl).replace('/data/', '/'); } -//Get the extension storage from Nightly. -Cu.import(makeUrl('js/firefox/extension-storage.jsm')); + +Cu.import('resource://gre/modules/ExtensionStorage.jsm'); //Create the browser action: var { ToggleButton } = require("sdk/ui/button/toggle"); @@ -107,7 +107,7 @@ var chrome = { }, clearCache : function() { - ExtensionStorage.clearCache(); + ExtensionStorage.cache.clear(); }, onChanged : { diff --git a/js/firefox/extension-storage.jsm b/js/firefox/extension-storage.jsm deleted file mode 100644 index f102b6f..0000000 --- a/js/firefox/extension-storage.jsm +++ /dev/null @@ -1,156 +0,0 @@ -//Copied from resource://gre/modules/ExtensionStorage.jsm in Nightly. -//Will be removed when this addon moves to the WebExtensions API. - -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -"use strict"; - -this.EXPORTED_SYMBOLS = ["ExtensionStorage"]; - -const Ci = Components.interfaces; -const Cc = Components.classes; -const Cu = Components.utils; -const Cr = Components.results; - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/osfile.jsm") -Cu.import("resource://gre/modules/AsyncShutdown.jsm"); - -let Path = OS.Path; -let profileDir = OS.Constants.Path.profileDir; - -this.ExtensionStorage = { - cache: new Map(), - listeners: new Map(), - - extensionDir: Path.join(profileDir, "browser-extension-data"), - - getExtensionDir(extensionId) { - return Path.join(this.extensionDir, extensionId); - }, - - getStorageFile(extensionId) { - return Path.join(this.extensionDir, extensionId, "storage.js"); - }, - - clearCache : function() { - this.cache = new Map(); - }, - - read(extensionId) { - if (this.cache.has(extensionId)) { - return this.cache.get(extensionId); - } - - let path = this.getStorageFile(extensionId); - let decoder = new TextDecoder(); - let promise = OS.File.read(path); - promise = promise.then(array => { - return JSON.parse(decoder.decode(array)); - }).catch(() => { - Cu.reportError("Unable to parse JSON data for extension storage."); - return {}; - }); - this.cache.set(extensionId, promise); - return promise; - }, - - write(extensionId) { - let promise = this.read(extensionId).then(extData => { - let encoder = new TextEncoder(); - let array = encoder.encode(JSON.stringify(extData)); - let path = this.getStorageFile(extensionId); - OS.File.makeDir(this.getExtensionDir(extensionId), {ignoreExisting: true, from: profileDir}); - let promise = OS.File.writeAtomic(path, array); - return promise; - }).catch(() => { - // Make sure this promise is never rejected. - Cu.reportError("Unable to write JSON data for extension storage."); - }); - - AsyncShutdown.profileBeforeChange.addBlocker( - "ExtensionStorage: Finish writing extension data", - promise); - - return promise.then(() => { - AsyncShutdown.profileBeforeChange.removeBlocker(promise); - }); - }, - - set(extensionId, items) { - return this.read(extensionId).then(extData => { - let changes = {}; - for (let prop in items) { - changes[prop] = {oldValue: extData[prop], newValue: items[prop]}; - extData[prop] = items[prop]; - } - - let listeners = this.listeners.get(extensionId); - if (listeners) { - for (let listener of listeners) { - listener(changes); - } - } - - return this.write(extensionId); - }); - }, - - remove(extensionId, items) { - return this.read(extensionId).then(extData => { - let changes = {}; - for (let prop in items) { - changes[prop] = {oldValue: extData[prop]}; - delete extData[prop]; - } - - let listeners = this.listeners.get(extensionId); - if (listeners) { - for (let listener of listeners) { - listener(changes); - } - } - - return this.write(extensionId); - }); - }, - - get(extensionId, keys) { - return this.read(extensionId).then(extData => { - let result = {}; - if (keys === null) { - Object.assign(result, extData); - } else if (typeof(keys) == "object") { - for (let prop in keys) { - if (prop in extData) { - result[prop] = extData[prop]; - } else { - result[prop] = keys[prop]; - } - } - } else if (typeof(keys) == "string") { - result[prop] = extData[prop] || undefined; - } else { - for (let prop of keys) { - result[prop] = extData[prop] || undefined; - } - } - - return result; - }); - }, - - addOnChangedListener(extensionId, listener) { - let listeners = this.listeners.get(extensionId) || new Set(); - listeners.add(listener); - this.listeners.set(extensionId, listeners); - }, - - removeOnChangedListener(extensionId, listener) { - let listeners = this.listeners.get(extensionId); - listeners.delete(listener); - }, -}; |