summaryrefslogtreecommitdiffstats
path: root/browser/components/places/tests/browser/browser_library_search.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/places/tests/browser/browser_library_search.js')
-rw-r--r--browser/components/places/tests/browser/browser_library_search.js206
1 files changed, 206 insertions, 0 deletions
diff --git a/browser/components/places/tests/browser/browser_library_search.js b/browser/components/places/tests/browser/browser_library_search.js
new file mode 100644
index 0000000000..898f664269
--- /dev/null
+++ b/browser/components/places/tests/browser/browser_library_search.js
@@ -0,0 +1,206 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et: */
+/* 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/. */
+
+/**
+ * Bug 451151
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=451151
+ *
+ * Summary:
+ * Tests frontend Places Library searching -- search, search reset, search scope
+ * consistency.
+ *
+ * Details:
+ * Each test below
+ * 1. selects a folder in the left pane and ensures that the content tree is
+ * appropriately updated,
+ * 2. performs a search and ensures that the content tree is correct for the
+ * folder and search and that the search UI is visible and appropriate to
+ * folder,
+ * 5. resets the search and ensures that the content tree is correct and that
+ * the search UI is hidden, and
+ * 6. if folder scope was clicked, searches again and ensures folder scope
+ * remains selected.
+ */
+
+const TEST_URL = "http://dummy.mozilla.org/";
+const TEST_DOWNLOAD_URL = "http://dummy.mozilla.org/dummy.pdf";
+const TEST_PARENT_FOLDER = "testParentFolder";
+const TEST_SIF_URL = "http://testsif.example.com/";
+const TEST_SIF_TITLE = "TestSIF";
+
+var gLibrary;
+
+/**
+ * Performs a search for a given folder and search string and ensures that the
+ * URI of the right pane's content tree is as expected for the folder and search
+ * string. Also ensures that the search scope button is as expected after the
+ * search.
+ *
+ * @param {string} aFolderGuid
+ * the item guid of a node in the left pane's tree
+ * @param {string} aSearchStr
+ * the search text; may be empty to reset the search
+ */
+async function search(aFolderGuid, aSearchStr) {
+ let doc = gLibrary.document;
+ let folderTree = doc.getElementById("placesList");
+ let contentTree = doc.getElementById("placeContent");
+
+ // First, ensure that selecting the folder in the left pane updates the
+ // content tree properly.
+ if (aFolderGuid) {
+ folderTree.selectItems([aFolderGuid]);
+ Assert.notEqual(
+ folderTree.selectedNode,
+ null,
+ "Sanity check: left pane tree should have selection after selecting!"
+ );
+
+ // The downloads folder never quite matches the url of the contentTree,
+ // probably due to the way downloads are loaded.
+ if (aFolderGuid !== PlacesUtils.virtualDownloadsGuid) {
+ Assert.equal(
+ folderTree.selectedNode.uri,
+ contentTree.place,
+ "Content tree's folder should be what was selected in the left pane"
+ );
+ }
+ }
+
+ // Second, ensure that searching updates the content tree and search UI
+ // properly.
+ let searchBox = doc.getElementById("searchFilter");
+ searchBox.value = aSearchStr;
+ gLibrary.PlacesSearchBox.search(searchBox.value);
+ let query = {};
+ PlacesUtils.history.queryStringToQuery(
+ contentTree.result.root.uri,
+ query,
+ {}
+ );
+ if (aSearchStr) {
+ Assert.equal(
+ query.value.searchTerms,
+ aSearchStr,
+ "Content tree's searchTerms should be text in search box"
+ );
+ } else {
+ Assert.equal(
+ query.value.hasSearchTerms,
+ false,
+ "Content tree's searchTerms should not exist after search reset"
+ );
+ }
+}
+
+async function showInFolder(aFolderGuid, aSearchStr, aParentFolderGuid) {
+ let doc = gLibrary.document;
+ let folderTree = doc.getElementById("placesList");
+ let contentTree = doc.getElementById("placeContent");
+
+ let searchBox = doc.getElementById("searchFilter");
+ searchBox.value = aSearchStr;
+ gLibrary.PlacesSearchBox.search(searchBox.value);
+ let theNode = contentTree.view._getNodeForRow(0);
+ let bookmarkGuid = theNode.bookmarkGuid;
+
+ Assert.equal(theNode.uri, TEST_SIF_URL, "Found expected bookmark");
+
+ contentTree.selectNode(theNode);
+ info("Executing showInFolder");
+ info("Waiting for showInFolder to select folder in tree");
+ let folderSelected = BrowserTestUtils.waitForEvent(folderTree, "select");
+ contentTree.controller.doCommand("placesCmd_showInFolder");
+ await folderSelected;
+
+ let treeNode = folderTree.selectedNode;
+ let contentNode = contentTree.selectedNode;
+ Assert.equal(
+ treeNode.bookmarkGuid,
+ aParentFolderGuid,
+ "Containing folder node selected on left tree pane"
+ );
+ Assert.equal(
+ contentNode.bookmarkGuid,
+ bookmarkGuid,
+ "The searched bookmark guid matches selected node in content pane"
+ );
+ Assert.equal(
+ contentNode.uri,
+ TEST_SIF_URL,
+ "The searched bookmark URL matches selected node in content pane"
+ );
+}
+
+add_task(async function test() {
+ // Add visits, a bookmark and a tag.
+ await PlacesTestUtils.addVisits([
+ {
+ uri: Services.io.newURI(TEST_URL),
+ visitDate: Date.now() * 1000,
+ transition: PlacesUtils.history.TRANSITION_TYPED,
+ },
+ {
+ uri: Services.io.newURI(TEST_DOWNLOAD_URL),
+ visitDate: Date.now() * 1000,
+ transition: PlacesUtils.history.TRANSITION_DOWNLOAD,
+ },
+ ]);
+
+ await PlacesUtils.bookmarks.insert({
+ parentGuid: PlacesUtils.bookmarks.unfiledGuid,
+ title: "dummy",
+ url: TEST_URL,
+ });
+
+ PlacesUtils.tagging.tagURI(Services.io.newURI(TEST_URL), ["dummyTag"]);
+
+ gLibrary = await promiseLibrary();
+
+ const rootsToTest = [
+ PlacesUtils.virtualAllBookmarksGuid,
+ PlacesUtils.virtualHistoryGuid,
+ PlacesUtils.virtualDownloadsGuid,
+ ];
+
+ for (let root of rootsToTest) {
+ await search(root, "dummy");
+ }
+
+ await promiseLibraryClosed(gLibrary);
+
+ // Cleanup before testing Show in Folder.
+ PlacesUtils.tagging.untagURI(Services.io.newURI(TEST_URL), ["dummyTag"]);
+
+ await PlacesUtils.bookmarks.eraseEverything();
+ await PlacesUtils.history.clear();
+
+ // Now test Show in Folder
+ gLibrary = await promiseLibrary();
+ info("Test Show in Folder");
+ let parentFolder = await PlacesUtils.bookmarks.insert({
+ parentGuid: PlacesUtils.bookmarks.unfiledGuid,
+ type: PlacesUtils.bookmarks.TYPE_FOLDER,
+ title: TEST_PARENT_FOLDER,
+ });
+
+ await PlacesUtils.bookmarks.insert({
+ parentGuid: parentFolder.guid,
+ title: TEST_SIF_TITLE,
+ url: TEST_SIF_URL,
+ });
+
+ await showInFolder(
+ PlacesUtils.virtualAllBookmarksGuid,
+ TEST_SIF_TITLE,
+ parentFolder.guid
+ );
+
+ // Cleanup
+ await promiseLibraryClosed(gLibrary);
+ await PlacesUtils.bookmarks.eraseEverything();
+ await PlacesUtils.history.clear();
+});