summaryrefslogtreecommitdiffstats
path: root/services/cloudsync/CloudSyncBookmarksFolderCache.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'services/cloudsync/CloudSyncBookmarksFolderCache.jsm')
-rw-r--r--services/cloudsync/CloudSyncBookmarksFolderCache.jsm105
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;