michael@0: /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* vim:set ts=2 sw=2 sts=2 et: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: // Get history service michael@0: var histsvc = PlacesUtils.history; michael@0: var bhist = PlacesUtils.bhistory; michael@0: var bmsvc = PlacesUtils.bookmarks; michael@0: michael@0: var resultObserver = { michael@0: insertedNode: null, michael@0: nodeInserted: function(parent, node, newIndex) { michael@0: this.insertedNode = node; michael@0: }, michael@0: removedNode: null, michael@0: nodeRemoved: function(parent, node, oldIndex) { michael@0: this.removedNode = node; michael@0: }, michael@0: michael@0: nodeAnnotationChanged: function() {}, michael@0: michael@0: newTitle: "", michael@0: nodeChangedByTitle: null, michael@0: nodeTitleChanged: function(node, newTitle) { michael@0: this.nodeChangedByTitle = node; michael@0: this.newTitle = newTitle; michael@0: }, michael@0: michael@0: newAccessCount: 0, michael@0: newTime: 0, michael@0: nodeChangedByHistoryDetails: null, michael@0: nodeHistoryDetailsChanged: function(node, michael@0: updatedVisitDate, michael@0: updatedVisitCount) { michael@0: this.nodeChangedByHistoryDetails = node michael@0: this.newTime = updatedVisitDate; michael@0: this.newAccessCount = updatedVisitCount; michael@0: }, michael@0: michael@0: movedNode: null, michael@0: nodeMoved: function(node, oldParent, oldIndex, newParent, newIndex) { michael@0: this.movedNode = node; michael@0: }, michael@0: openedContainer: null, michael@0: closedContainer: null, michael@0: containerStateChanged: function (aNode, aOldState, aNewState) { michael@0: if (aNewState == Ci.nsINavHistoryContainerResultNode.STATE_OPENED) { michael@0: this.openedContainer = aNode; michael@0: } michael@0: else if (aNewState == Ci.nsINavHistoryContainerResultNode.STATE_CLOSED) { michael@0: this.closedContainer = aNode; michael@0: } michael@0: }, michael@0: invalidatedContainer: null, michael@0: invalidateContainer: function(node) { michael@0: this.invalidatedContainer = node; michael@0: }, michael@0: sortingMode: null, michael@0: sortingChanged: function(sortingMode) { michael@0: this.sortingMode = sortingMode; michael@0: }, michael@0: inBatchMode: false, michael@0: batching: function(aToggleMode) { michael@0: do_check_neq(this.inBatchMode, aToggleMode); michael@0: this.inBatchMode = aToggleMode; michael@0: }, michael@0: result: null, michael@0: reset: function() { michael@0: this.insertedNode = null; michael@0: this.removedNode = null; michael@0: this.nodeChangedByTitle = null; michael@0: this.nodeChangedByHistoryDetails = null; michael@0: this.replacedNode = null; michael@0: this.movedNode = null; michael@0: this.openedContainer = null; michael@0: this.closedContainer = null; michael@0: this.invalidatedContainer = null; michael@0: this.sortingMode = null; michael@0: } michael@0: }; michael@0: michael@0: var testURI = uri("http://mozilla.com"); michael@0: michael@0: function run_test() { michael@0: run_next_test(); michael@0: } michael@0: michael@0: add_test(function check_history_query() { michael@0: var options = histsvc.getNewQueryOptions(); michael@0: options.sortingMode = options.SORT_BY_DATE_DESCENDING; michael@0: options.resultType = options.RESULTS_AS_VISIT; michael@0: var query = histsvc.getNewQuery(); michael@0: var result = histsvc.executeQuery(query, options); michael@0: result.addObserver(resultObserver, false); michael@0: var root = result.root; michael@0: root.containerOpen = true; michael@0: michael@0: do_check_neq(resultObserver.openedContainer, null); michael@0: michael@0: // nsINavHistoryResultObserver.nodeInserted michael@0: // add a visit michael@0: promiseAddVisits(testURI).then(function() { michael@0: do_check_eq(testURI.spec, resultObserver.insertedNode.uri); michael@0: michael@0: // nsINavHistoryResultObserver.nodeHistoryDetailsChanged michael@0: // adding a visit causes nodeHistoryDetailsChanged for the folder michael@0: do_check_eq(root.uri, resultObserver.nodeChangedByHistoryDetails.uri); michael@0: michael@0: // nsINavHistoryResultObserver.itemTitleChanged for a leaf node michael@0: promiseAddVisits({ uri: testURI, title: "baz" }).then(function () { michael@0: do_check_eq(resultObserver.nodeChangedByTitle.title, "baz"); michael@0: michael@0: // nsINavHistoryResultObserver.nodeRemoved michael@0: var removedURI = uri("http://google.com"); michael@0: promiseAddVisits(removedURI).then(function() { michael@0: bhist.removePage(removedURI); michael@0: do_check_eq(removedURI.spec, resultObserver.removedNode.uri); michael@0: michael@0: // nsINavHistoryResultObserver.invalidateContainer michael@0: bhist.removePagesFromHost("mozilla.com", false); michael@0: do_check_eq(root.uri, resultObserver.invalidatedContainer.uri); michael@0: michael@0: // nsINavHistoryResultObserver.sortingChanged michael@0: resultObserver.invalidatedContainer = null; michael@0: result.sortingMode = options.SORT_BY_TITLE_ASCENDING; michael@0: do_check_eq(resultObserver.sortingMode, options.SORT_BY_TITLE_ASCENDING); michael@0: do_check_eq(resultObserver.invalidatedContainer, result.root); michael@0: michael@0: // nsINavHistoryResultObserver.invalidateContainer michael@0: bhist.removeAllPages(); michael@0: do_check_eq(root.uri, resultObserver.invalidatedContainer.uri); michael@0: michael@0: // nsINavHistoryResultObserver.batching michael@0: do_check_false(resultObserver.inBatchMode); michael@0: histsvc.runInBatchMode({ michael@0: runBatched: function (aUserData) { michael@0: do_check_true(resultObserver.inBatchMode); michael@0: } michael@0: }, null); michael@0: do_check_false(resultObserver.inBatchMode); michael@0: bmsvc.runInBatchMode({ michael@0: runBatched: function (aUserData) { michael@0: do_check_true(resultObserver.inBatchMode); michael@0: } michael@0: }, null); michael@0: do_check_false(resultObserver.inBatchMode); michael@0: michael@0: root.containerOpen = false; michael@0: do_check_eq(resultObserver.closedContainer, resultObserver.openedContainer); michael@0: result.removeObserver(resultObserver); michael@0: resultObserver.reset(); michael@0: promiseAsyncUpdates().then(run_next_test); michael@0: }); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function check_bookmarks_query() { michael@0: var options = histsvc.getNewQueryOptions(); michael@0: var query = histsvc.getNewQuery(); michael@0: query.setFolders([bmsvc.bookmarksMenuFolder], 1); michael@0: var result = histsvc.executeQuery(query, options); michael@0: result.addObserver(resultObserver, false); michael@0: var root = result.root; michael@0: root.containerOpen = true; michael@0: michael@0: do_check_neq(resultObserver.openedContainer, null); michael@0: michael@0: // nsINavHistoryResultObserver.nodeInserted michael@0: // add a bookmark michael@0: var testBookmark = bmsvc.insertBookmark(bmsvc.bookmarksMenuFolder, testURI, bmsvc.DEFAULT_INDEX, "foo"); michael@0: do_check_eq("foo", resultObserver.insertedNode.title); michael@0: do_check_eq(testURI.spec, resultObserver.insertedNode.uri); michael@0: michael@0: // nsINavHistoryResultObserver.nodeHistoryDetailsChanged michael@0: // adding a visit causes nodeHistoryDetailsChanged for the folder michael@0: do_check_eq(root.uri, resultObserver.nodeChangedByHistoryDetails.uri); michael@0: michael@0: // nsINavHistoryResultObserver.nodeTitleChanged for a leaf node michael@0: bmsvc.setItemTitle(testBookmark, "baz"); michael@0: do_check_eq(resultObserver.nodeChangedByTitle.title, "baz"); michael@0: do_check_eq(resultObserver.newTitle, "baz"); michael@0: michael@0: var testBookmark2 = bmsvc.insertBookmark(bmsvc.bookmarksMenuFolder, uri("http://google.com"), bmsvc.DEFAULT_INDEX, "foo"); michael@0: bmsvc.moveItem(testBookmark2, bmsvc.bookmarksMenuFolder, 0); michael@0: do_check_eq(resultObserver.movedNode.itemId, testBookmark2); michael@0: michael@0: // nsINavHistoryResultObserver.nodeRemoved michael@0: bmsvc.removeItem(testBookmark2); michael@0: do_check_eq(testBookmark2, resultObserver.removedNode.itemId); michael@0: michael@0: // XXX nsINavHistoryResultObserver.invalidateContainer michael@0: michael@0: // nsINavHistoryResultObserver.sortingChanged michael@0: resultObserver.invalidatedContainer = null; michael@0: result.sortingMode = options.SORT_BY_TITLE_ASCENDING; michael@0: do_check_eq(resultObserver.sortingMode, options.SORT_BY_TITLE_ASCENDING); michael@0: do_check_eq(resultObserver.invalidatedContainer, result.root); michael@0: michael@0: // nsINavHistoryResultObserver.batching michael@0: do_check_false(resultObserver.inBatchMode); michael@0: histsvc.runInBatchMode({ michael@0: runBatched: function (aUserData) { michael@0: do_check_true(resultObserver.inBatchMode); michael@0: } michael@0: }, null); michael@0: do_check_false(resultObserver.inBatchMode); michael@0: bmsvc.runInBatchMode({ michael@0: runBatched: function (aUserData) { michael@0: do_check_true(resultObserver.inBatchMode); michael@0: } michael@0: }, null); michael@0: do_check_false(resultObserver.inBatchMode); michael@0: michael@0: root.containerOpen = false; michael@0: do_check_eq(resultObserver.closedContainer, resultObserver.openedContainer); michael@0: result.removeObserver(resultObserver); michael@0: resultObserver.reset(); michael@0: promiseAsyncUpdates().then(run_next_test); michael@0: }); michael@0: michael@0: add_test(function check_mixed_query() { michael@0: var options = histsvc.getNewQueryOptions(); michael@0: var query = histsvc.getNewQuery(); michael@0: query.onlyBookmarked = true; michael@0: var result = histsvc.executeQuery(query, options); michael@0: result.addObserver(resultObserver, false); michael@0: var root = result.root; michael@0: root.containerOpen = true; michael@0: michael@0: do_check_neq(resultObserver.openedContainer, null); michael@0: michael@0: // nsINavHistoryResultObserver.batching michael@0: do_check_false(resultObserver.inBatchMode); michael@0: histsvc.runInBatchMode({ michael@0: runBatched: function (aUserData) { michael@0: do_check_true(resultObserver.inBatchMode); michael@0: } michael@0: }, null); michael@0: do_check_false(resultObserver.inBatchMode); michael@0: bmsvc.runInBatchMode({ michael@0: runBatched: function (aUserData) { michael@0: do_check_true(resultObserver.inBatchMode); michael@0: } michael@0: }, null); michael@0: do_check_false(resultObserver.inBatchMode); michael@0: michael@0: root.containerOpen = false; michael@0: do_check_eq(resultObserver.closedContainer, resultObserver.openedContainer); michael@0: result.removeObserver(resultObserver); michael@0: resultObserver.reset(); michael@0: promiseAsyncUpdates().then(run_next_test); michael@0: });