Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Errors

/* -*- 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/. */
/**
*
* 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();
});