diff options
Diffstat (limited to 'services/cloudsync/CloudSyncBookmarksFolderCache.jsm')
-rw-r--r-- | services/cloudsync/CloudSyncBookmarksFolderCache.jsm | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/services/cloudsync/CloudSyncBookmarksFolderCache.jsm b/services/cloudsync/CloudSyncBookmarksFolderCache.jsm new file mode 100644 index 000000000..f3c3fc8f2 --- /dev/null +++ b/services/cloudsync/CloudSyncBookmarksFolderCache.jsm @@ -0,0 +1,105 @@ +/* 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 = ["FolderCache"]; + +// Cache for bookmarks folder heirarchy. +var FolderCache = function () { + this.cache = new Map(); +} + +FolderCache.prototype = { + has: function (id) { + return this.cache.has(id); + }, + + insert: function (id, parentId) { + if (this.cache.has(id)) { + return; + } + + if (parentId && !(this.cache.has(parentId))) { + throw new Error("insert :: parentId not found in cache: " + parentId); + } + + this.cache.set(id, { + parent: parentId || null, + children: new Set(), + }); + + if (parentId) { + this.cache.get(parentId).children.add(id); + } + }, + + remove: function (id) { + if (!(this.cache.has(id))) { + throw new Error("remote :: id not found in cache: " + id); + } + + let parentId = this.cache.get(id).parent; + if (parentId) { + this.cache.get(parentId).children.delete(id); + } + + for (let child of this.cache.get(id).children) { + this.cache.get(child).parent = null; + } + + this.cache.delete(id); + }, + + setParent: function (id, parentId) { + if (!(this.cache.has(id))) { + throw new Error("setParent :: id not found in cache: " + id); + } + + if (parentId && !(this.cache.has(parentId))) { + throw new Error("setParent :: parentId not found in cache: " + parentId); + } + + let oldParent = this.cache.get(id).parent; + if (oldParent) { + this.cache.get(oldParent).children.delete(id); + } + this.cache.get(id).parent = parentId; + this.cache.get(parentId).children.add(id); + + return true; + }, + + getParent: function (id) { + if (this.cache.has(id)) { + return this.cache.get(id).parent; + } + + throw new Error("getParent :: id not found in cache: " + id); + }, + + getChildren: function (id) { + if (this.cache.has(id)) { + return this.cache.get(id).children; + } + + throw new Error("getChildren :: id not found in cache: " + id); + }, + + setChildren: function (id, children) { + for (let child of children) { + if (!this.cache.has(child)) { + this.insert(child, id); + } else { + this.setParent(child, id); + } + } + }, + + dump: function () { + dump("FolderCache: " + JSON.stringify(this.cache) + "\n"); + }, +}; + +this.FolderCache = FolderCache; |