summaryrefslogtreecommitdiffstats
path: root/browser/components/places/tests/browser/browser_library_views_liveupdate.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/places/tests/browser/browser_library_views_liveupdate.js')
-rw-r--r--browser/components/places/tests/browser/browser_library_views_liveupdate.js217
1 files changed, 217 insertions, 0 deletions
diff --git a/browser/components/places/tests/browser/browser_library_views_liveupdate.js b/browser/components/places/tests/browser/browser_library_views_liveupdate.js
new file mode 100644
index 0000000000..ca79768f8f
--- /dev/null
+++ b/browser/components/places/tests/browser/browser_library_views_liveupdate.js
@@ -0,0 +1,217 @@
+/* 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/. */
+
+/**
+ * Tests Library Left pane view for liveupdate.
+ */
+
+let gLibrary = null;
+
+add_setup(async function () {
+ gLibrary = await promiseLibrary();
+ await PlacesUtils.bookmarks.eraseEverything();
+
+ registerCleanupFunction(async () => {
+ await PlacesUtils.bookmarks.eraseEverything();
+ await promiseLibraryClosed(gLibrary);
+ });
+});
+
+async function testInFolder(folderGuid, prefix) {
+ let addedBookmarks = [];
+
+ let item = await insertAndCheckItem(
+ {
+ parentGuid: folderGuid,
+ title: `${prefix}1`,
+ url: `http://${prefix}1.mozilla.org/`,
+ },
+ 0
+ );
+ item.title = `${prefix}1_edited`;
+ await updateAndCheckItem(item, 0);
+ addedBookmarks.push(item);
+
+ item = await insertAndCheckItem(
+ {
+ parentGuid: folderGuid,
+ title: `${prefix}2`,
+ url: "place:",
+ },
+ 0
+ );
+
+ item.title = `${prefix}2_edited`;
+ await updateAndCheckItem(item, 0);
+ addedBookmarks.push(item);
+
+ item = await insertAndCheckItem(
+ {
+ parentGuid: folderGuid,
+ type: PlacesUtils.bookmarks.TYPE_SEPARATOR,
+ },
+ 2
+ );
+ addedBookmarks.push(item);
+
+ item = await insertAndCheckItem(
+ {
+ parentGuid: folderGuid,
+ title: `${prefix}f`,
+ type: PlacesUtils.bookmarks.TYPE_FOLDER,
+ },
+ 1
+ );
+
+ item.title = `${prefix}f_edited`;
+ await updateAndCheckItem(item, 1);
+
+ item.index = 0;
+ await updateAndCheckItem(item, 0);
+ addedBookmarks.push(item);
+
+ let folderGuid1 = item.guid;
+
+ item = await insertAndCheckItem(
+ {
+ parentGuid: folderGuid1,
+ title: `${prefix}f1`,
+ url: `http://${prefix}f1.mozilla.org/`,
+ },
+ 0
+ );
+ addedBookmarks.push(item);
+
+ item = await insertAndCheckItem(
+ {
+ parentGuid: folderGuid,
+ title: `${prefix}f12`,
+ url: `http://${prefix}f12.mozilla.org/`,
+ },
+ 4
+ );
+ addedBookmarks.push(item);
+
+ // Move to a different folder and index.
+ item.parentGuid = folderGuid1;
+ item.index = 0;
+ await updateAndCheckItem(item, 0);
+
+ return addedBookmarks;
+}
+
+add_task(async function test() {
+ let addedBookmarks = [];
+
+ info("*** Acting on menu bookmarks");
+ addedBookmarks = addedBookmarks.concat(
+ await testInFolder(PlacesUtils.bookmarks.menuGuid, "bm")
+ );
+
+ info("*** Acting on toolbar bookmarks");
+ addedBookmarks = addedBookmarks.concat(
+ await testInFolder(PlacesUtils.bookmarks.toolbarGuid, "tb")
+ );
+
+ info("*** Acting on unsorted bookmarks");
+ addedBookmarks = addedBookmarks.concat(
+ await testInFolder(PlacesUtils.bookmarks.unfiledGuid, "ub")
+ );
+
+ // Remove bookmarks in reverse order, so that the effects are correct.
+ for (let i = addedBookmarks.length - 1; i >= 0; i--) {
+ await removeAndCheckItem(addedBookmarks[i]);
+ }
+});
+
+function selectItem(item, parentTreeIndex) {
+ let useLeftPane =
+ item.type == PlacesUtils.bookmarks.TYPE_FOLDER || // is Folder
+ (item.type == PlacesUtils.bookmarks.TYPE_BOOKMARK &&
+ item.url.protocol == "place:"); // is Query
+ let tree = useLeftPane
+ ? gLibrary.PlacesOrganizer._places
+ : gLibrary.ContentTree.view;
+ tree.selectItems([item.guid]);
+ let treeIndex = tree.view.treeIndexForNode(tree.selectedNode);
+ let title = tree.view.getCellText(treeIndex, tree.columns.getColumnAt(0));
+ if (useLeftPane) {
+ // Make the treeIndex relative to the parent, otherwise getting the right
+ // index value is tricky due to separators and URIs being hidden in the left
+ // pane.
+ treeIndex -= parentTreeIndex + 1;
+ }
+ return {
+ node: tree.selectedNode,
+ title,
+ parentRelativeTreeIndex: treeIndex,
+ };
+}
+
+function itemExists(item) {
+ let useLeftPane =
+ item.type == PlacesUtils.bookmarks.TYPE_FOLDER || // is Folder
+ (item.type == PlacesUtils.bookmarks.TYPE_BOOKMARK &&
+ item.url.protocol == "place:"); // is Query
+ let tree = useLeftPane
+ ? gLibrary.PlacesOrganizer._places
+ : gLibrary.ContentTree.view;
+ tree.selectItems([item.guid], true);
+ return tree.selectedNode?.bookmarkGuid == item.guid;
+}
+
+async function insertAndCheckItem(insertItem, expectedParentRelativeIndex) {
+ // Ensure the parent is selected before the change, this covers live updating
+ // better than selecting the parent later, that would just refresh all its
+ // children.
+ Assert.ok(insertItem.parentGuid, "Must have a parentGuid");
+ gLibrary.PlacesOrganizer._places.selectItems([insertItem.parentGuid], true);
+ let tree = gLibrary.PlacesOrganizer._places;
+ let parentTreeIndex = tree.view.treeIndexForNode(tree.selectedNode);
+
+ let item = await PlacesUtils.bookmarks.insert(insertItem);
+
+ let { node, title, parentRelativeTreeIndex } = selectItem(
+ item,
+ parentTreeIndex
+ );
+ Assert.equal(item.guid, node.bookmarkGuid, "Should find the updated node");
+ Assert.equal(title, item.title, "Should have the correct title");
+ Assert.equal(
+ parentRelativeTreeIndex,
+ expectedParentRelativeIndex,
+ "Should have the expected index"
+ );
+ return item;
+}
+
+async function updateAndCheckItem(updateItem, expectedParentRelativeTreeIndex) {
+ // Ensure the parent is selected before the change, this covers live updating
+ // better than selecting the parent later, that would just refresh all its
+ // children.
+ Assert.ok(updateItem.parentGuid, "Must have a parentGuid");
+ gLibrary.PlacesOrganizer._places.selectItems([updateItem.parentGuid], true);
+ let tree = gLibrary.PlacesOrganizer._places;
+ let parentTreeIndex = tree.view.treeIndexForNode(tree.selectedNode);
+
+ let item = await PlacesUtils.bookmarks.update(updateItem);
+
+ let { node, title, parentRelativeTreeIndex } = selectItem(
+ item,
+ parentTreeIndex
+ );
+ Assert.equal(item.guid, node.bookmarkGuid, "Should find the updated node");
+ Assert.equal(title, item.title, "Should have the correct title");
+ Assert.equal(
+ parentRelativeTreeIndex,
+ expectedParentRelativeTreeIndex,
+ "Should have the expected index"
+ );
+ return item;
+}
+
+async function removeAndCheckItem(itemData) {
+ await PlacesUtils.bookmarks.remove(itemData);
+ Assert.ok(!itemExists(itemData), "Should not find the updated node");
+}