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: let bmsvc = PlacesUtils.bookmarks; michael@0: let tagssvc = PlacesUtils.tagging; michael@0: let annosvc = PlacesUtils.annotations; michael@0: let txnManager = PlacesUtils.transactionManager; michael@0: const DESCRIPTION_ANNO = "bookmarkProperties/description"; michael@0: michael@0: // create and add bookmarks observer michael@0: let observer = { michael@0: michael@0: onBeginUpdateBatch: function() { michael@0: this._beginUpdateBatch = true; michael@0: }, michael@0: _beginUpdateBatch: false, michael@0: michael@0: onEndUpdateBatch: function() { michael@0: this._endUpdateBatch = true; michael@0: }, michael@0: _endUpdateBatch: false, michael@0: michael@0: onItemAdded: function(id, folder, index, itemType, uri) { michael@0: this._itemAddedId = id; michael@0: this._itemAddedParent = folder; michael@0: this._itemAddedIndex = index; michael@0: this._itemAddedType = itemType; michael@0: }, michael@0: _itemAddedId: null, michael@0: _itemAddedParent: null, michael@0: _itemAddedIndex: null, michael@0: _itemAddedType: null, michael@0: michael@0: onItemRemoved: function(id, folder, index, itemType) { michael@0: this._itemRemovedId = id; michael@0: this._itemRemovedFolder = folder; michael@0: this._itemRemovedIndex = index; michael@0: }, michael@0: _itemRemovedId: null, michael@0: _itemRemovedFolder: null, michael@0: _itemRemovedIndex: null, michael@0: michael@0: onItemChanged: function(id, property, isAnnotationProperty, newValue, michael@0: lastModified, itemType) { michael@0: // The transaction manager is being rewritten in bug 891303, so just michael@0: // skip checking this for now. michael@0: if (property == "tags") michael@0: return; michael@0: this._itemChangedId = id; michael@0: this._itemChangedProperty = property; michael@0: this._itemChanged_isAnnotationProperty = isAnnotationProperty; michael@0: this._itemChangedValue = newValue; michael@0: }, michael@0: _itemChangedId: null, michael@0: _itemChangedProperty: null, michael@0: _itemChanged_isAnnotationProperty: null, michael@0: _itemChangedValue: null, michael@0: michael@0: onItemVisited: function(id, visitID, time) { michael@0: this._itemVisitedId = id; michael@0: this._itemVisitedVistId = visitID; michael@0: this._itemVisitedTime = time; michael@0: }, michael@0: _itemVisitedId: null, michael@0: _itemVisitedVistId: null, michael@0: _itemVisitedTime: null, michael@0: michael@0: onItemMoved: function(id, oldParent, oldIndex, newParent, newIndex, michael@0: itemType) { michael@0: this._itemMovedId = id; michael@0: this._itemMovedOldParent = oldParent; michael@0: this._itemMovedOldIndex = oldIndex; michael@0: this._itemMovedNewParent = newParent; michael@0: this._itemMovedNewIndex = newIndex; michael@0: }, michael@0: _itemMovedId: null, michael@0: _itemMovedOldParent: null, michael@0: _itemMovedOldIndex: null, michael@0: _itemMovedNewParent: null, michael@0: _itemMovedNewIndex: null, michael@0: michael@0: QueryInterface: function(iid) { michael@0: if (iid.equals(Ci.nsINavBookmarkObserver) || michael@0: iid.equals(Ci.nsISupports)) { michael@0: return this; michael@0: } michael@0: throw Cr.NS_ERROR_NO_INTERFACE; michael@0: } michael@0: }; michael@0: michael@0: // index at which items should begin michael@0: let bmStartIndex = 0; michael@0: michael@0: // get bookmarks root id michael@0: let root = PlacesUtils.bookmarksMenuFolderId; michael@0: michael@0: function run_test() { michael@0: bmsvc.addObserver(observer, false); michael@0: do_register_cleanup(function () { michael@0: bmsvc.removeObserver(observer); michael@0: }); michael@0: michael@0: run_next_test(); michael@0: } michael@0: michael@0: add_test(function test_create_folder_with_description() { michael@0: const TEST_FOLDERNAME = "Test creating a folder with a description"; michael@0: const TEST_DESCRIPTION = "this is my test description"; michael@0: michael@0: let annos = [{ name: DESCRIPTION_ANNO, michael@0: type: annosvc.TYPE_STRING, michael@0: flags: 0, michael@0: value: TEST_DESCRIPTION, michael@0: expires: annosvc.EXPIRE_NEVER }]; michael@0: let txn = new PlacesCreateFolderTransaction(TEST_FOLDERNAME, root, bmStartIndex, annos); michael@0: txnManager.doTransaction(txn); michael@0: michael@0: // This checks that calling undoTransaction on an "empty batch" doesn't michael@0: // undo the previous transaction (getItemTitle will fail) michael@0: txnManager.beginBatch(null); michael@0: txnManager.endBatch(false); michael@0: txnManager.undoTransaction(); michael@0: michael@0: let folderId = observer._itemAddedId; michael@0: do_check_eq(bmsvc.getItemTitle(folderId), TEST_FOLDERNAME); michael@0: do_check_eq(observer._itemAddedIndex, bmStartIndex); michael@0: do_check_eq(observer._itemAddedParent, root); michael@0: do_check_eq(observer._itemAddedId, folderId); michael@0: do_check_eq(TEST_DESCRIPTION, annosvc.getItemAnnotation(folderId, DESCRIPTION_ANNO)); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemRemovedId, folderId); michael@0: do_check_eq(observer._itemRemovedFolder, root); michael@0: do_check_eq(observer._itemRemovedIndex, bmStartIndex); michael@0: michael@0: txn.redoTransaction(); michael@0: do_check_eq(observer._itemAddedIndex, bmStartIndex); michael@0: do_check_eq(observer._itemAddedParent, root); michael@0: do_check_eq(observer._itemAddedId, folderId); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemRemovedId, folderId); michael@0: do_check_eq(observer._itemRemovedFolder, root); michael@0: do_check_eq(observer._itemRemovedIndex, bmStartIndex); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_create_item() { michael@0: let testURI = NetUtil.newURI("http://test_create_item.com"); michael@0: michael@0: let txn = new PlacesCreateBookmarkTransaction(testURI, root, bmStartIndex, michael@0: "Test creating an item"); michael@0: michael@0: txnManager.doTransaction(txn); michael@0: let id = bmsvc.getBookmarkIdsForURI(testURI)[0]; michael@0: do_check_eq(observer._itemAddedId, id); michael@0: do_check_eq(observer._itemAddedIndex, bmStartIndex); michael@0: do_check_true(bmsvc.isBookmarked(testURI)); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemRemovedId, id); michael@0: do_check_eq(observer._itemRemovedIndex, bmStartIndex); michael@0: do_check_false(bmsvc.isBookmarked(testURI)); michael@0: michael@0: txn.redoTransaction(); michael@0: do_check_true(bmsvc.isBookmarked(testURI)); michael@0: let newId = bmsvc.getBookmarkIdsForURI(testURI)[0]; michael@0: do_check_eq(observer._itemAddedIndex, bmStartIndex); michael@0: do_check_eq(observer._itemAddedParent, root); michael@0: do_check_eq(observer._itemAddedId, newId); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemRemovedId, newId); michael@0: do_check_eq(observer._itemRemovedFolder, root); michael@0: do_check_eq(observer._itemRemovedIndex, bmStartIndex); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_create_item_to_folder() { michael@0: const TEST_FOLDERNAME = "Test creating item to a folder"; michael@0: let testURI = NetUtil.newURI("http://test_create_item_to_folder.com"); michael@0: let folderId = bmsvc.createFolder(root, TEST_FOLDERNAME, bmsvc.DEFAULT_INDEX); michael@0: michael@0: let txn = new PlacesCreateBookmarkTransaction(testURI, folderId, bmStartIndex, michael@0: "Test creating item"); michael@0: txnManager.doTransaction(txn); michael@0: let bkmId = bmsvc.getBookmarkIdsForURI(testURI)[0]; michael@0: do_check_eq(observer._itemAddedId, bkmId); michael@0: do_check_eq(observer._itemAddedIndex, bmStartIndex); michael@0: do_check_true(bmsvc.isBookmarked(testURI)); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemRemovedId, bkmId); michael@0: do_check_eq(observer._itemRemovedIndex, bmStartIndex); michael@0: michael@0: txn.redoTransaction(); michael@0: let newBkmId = bmsvc.getBookmarkIdsForURI(testURI)[0]; michael@0: do_check_eq(observer._itemAddedIndex, bmStartIndex); michael@0: do_check_eq(observer._itemAddedParent, folderId); michael@0: do_check_eq(observer._itemAddedId, newBkmId); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemRemovedId, newBkmId); michael@0: do_check_eq(observer._itemRemovedFolder, folderId); michael@0: do_check_eq(observer._itemRemovedIndex, bmStartIndex); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_move_items_to_folder() { michael@0: let testFolderId = bmsvc.createFolder(root, "Test move items", bmsvc.DEFAULT_INDEX); michael@0: let testURI = NetUtil.newURI("http://test_move_items.com"); michael@0: let testBkmId = bmsvc.insertBookmark(testFolderId, testURI, bmsvc.DEFAULT_INDEX, "1: Test move items"); michael@0: bmsvc.insertBookmark(testFolderId, testURI, bmsvc.DEFAULT_INDEX, "2: Test move items"); michael@0: michael@0: // Moving items between the same folder michael@0: let sameTxn = new PlacesMoveItemTransaction(testBkmId, testFolderId, bmsvc.DEFAULT_INDEX); michael@0: michael@0: sameTxn.doTransaction(); michael@0: do_check_eq(observer._itemMovedId, testBkmId); michael@0: do_check_eq(observer._itemMovedOldParent, testFolderId); michael@0: do_check_eq(observer._itemMovedOldIndex, 0); michael@0: do_check_eq(observer._itemMovedNewParent, testFolderId); michael@0: do_check_eq(observer._itemMovedNewIndex, 1); michael@0: michael@0: sameTxn.undoTransaction(); michael@0: do_check_eq(observer._itemMovedId, testBkmId); michael@0: do_check_eq(observer._itemMovedOldParent, testFolderId); michael@0: do_check_eq(observer._itemMovedOldIndex, 1); michael@0: do_check_eq(observer._itemMovedNewParent, testFolderId); michael@0: do_check_eq(observer._itemMovedNewIndex, 0); michael@0: michael@0: sameTxn.redoTransaction(); michael@0: do_check_eq(observer._itemMovedId, testBkmId); michael@0: do_check_eq(observer._itemMovedOldParent, testFolderId); michael@0: do_check_eq(observer._itemMovedOldIndex, 0); michael@0: do_check_eq(observer._itemMovedNewParent, testFolderId); michael@0: do_check_eq(observer._itemMovedNewIndex, 1); michael@0: michael@0: sameTxn.undoTransaction(); michael@0: do_check_eq(observer._itemMovedId, testBkmId); michael@0: do_check_eq(observer._itemMovedOldParent, testFolderId); michael@0: do_check_eq(observer._itemMovedOldIndex, 1); michael@0: do_check_eq(observer._itemMovedNewParent, testFolderId); michael@0: do_check_eq(observer._itemMovedNewIndex, 0); michael@0: michael@0: // Moving items between different folders michael@0: let folderId = bmsvc.createFolder(testFolderId, michael@0: "Test move items between different folders", michael@0: bmsvc.DEFAULT_INDEX); michael@0: let diffTxn = new PlacesMoveItemTransaction(testBkmId, folderId, bmsvc.DEFAULT_INDEX); michael@0: michael@0: diffTxn.doTransaction(); michael@0: do_check_eq(observer._itemMovedId, testBkmId); michael@0: do_check_eq(observer._itemMovedOldParent, testFolderId); michael@0: do_check_eq(observer._itemMovedOldIndex, 0); michael@0: do_check_eq(observer._itemMovedNewParent, folderId); michael@0: do_check_eq(observer._itemMovedNewIndex, 0); michael@0: michael@0: sameTxn.undoTransaction(); michael@0: do_check_eq(observer._itemMovedId, testBkmId); michael@0: do_check_eq(observer._itemMovedOldParent, folderId); michael@0: do_check_eq(observer._itemMovedOldIndex, 0); michael@0: do_check_eq(observer._itemMovedNewParent, testFolderId); michael@0: do_check_eq(observer._itemMovedNewIndex, 0); michael@0: michael@0: diffTxn.redoTransaction(); michael@0: do_check_eq(observer._itemMovedId, testBkmId); michael@0: do_check_eq(observer._itemMovedOldParent, testFolderId); michael@0: do_check_eq(observer._itemMovedOldIndex, 0); michael@0: do_check_eq(observer._itemMovedNewParent, folderId); michael@0: do_check_eq(observer._itemMovedNewIndex, 0); michael@0: michael@0: sameTxn.undoTransaction(); michael@0: do_check_eq(observer._itemMovedId, testBkmId); michael@0: do_check_eq(observer._itemMovedOldParent, folderId); michael@0: do_check_eq(observer._itemMovedOldIndex, 0); michael@0: do_check_eq(observer._itemMovedNewParent, testFolderId); michael@0: do_check_eq(observer._itemMovedNewIndex, 0); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_remove_folder() { michael@0: let testFolder = bmsvc.createFolder(root, "Test Removing a Folder", bmsvc.DEFAULT_INDEX); michael@0: let folderId = bmsvc.createFolder(testFolder, "Removed Folder", bmsvc.DEFAULT_INDEX); michael@0: michael@0: let txn = new PlacesRemoveItemTransaction(folderId); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_eq(observer._itemRemovedId, folderId); michael@0: do_check_eq(observer._itemRemovedFolder, testFolder); michael@0: do_check_eq(observer._itemRemovedIndex, 0); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemAddedId, folderId); michael@0: do_check_eq(observer._itemAddedParent, testFolder); michael@0: do_check_eq(observer._itemAddedIndex, 0); michael@0: michael@0: txn.redoTransaction(); michael@0: do_check_eq(observer._itemRemovedId, folderId); michael@0: do_check_eq(observer._itemRemovedFolder, testFolder); michael@0: do_check_eq(observer._itemRemovedIndex, 0); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemAddedId, folderId); michael@0: do_check_eq(observer._itemAddedParent, testFolder); michael@0: do_check_eq(observer._itemAddedIndex, 0); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_remove_item_with_keyword_and_tag() { michael@0: // Notice in this case the tag persists since other bookmarks have same uri. michael@0: let testFolder = bmsvc.createFolder(root, "Test removing an item with a keyword and a tag", michael@0: bmsvc.DEFAULT_INDEX); michael@0: michael@0: const KEYWORD = "test: test removing an item with a keyword and a tag"; michael@0: const TAG_NAME = "tag-test_remove_item_with_keyword_and_tag"; michael@0: let testURI = NetUtil.newURI("http://test_remove_item_with_keyword_and_tag.com"); michael@0: let testBkmId = bmsvc.insertBookmark(testFolder, testURI, bmsvc.DEFAULT_INDEX, "test-item1"); michael@0: michael@0: // create bookmark for not removing tag. michael@0: bmsvc.insertBookmark(testFolder, testURI, bmsvc.DEFAULT_INDEX, "test-item2"); michael@0: michael@0: // set tag & keyword michael@0: bmsvc.setKeywordForBookmark(testBkmId, KEYWORD); michael@0: tagssvc.tagURI(testURI, [TAG_NAME]); michael@0: michael@0: let txn = new PlacesRemoveItemTransaction(testBkmId); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_eq(observer._itemRemovedId, testBkmId); michael@0: do_check_eq(observer._itemRemovedFolder, testFolder); michael@0: do_check_eq(observer._itemRemovedIndex, 0); michael@0: do_check_eq(bmsvc.getKeywordForBookmark(testBkmId), null); michael@0: do_check_eq(tagssvc.getTagsForURI(testURI)[0], TAG_NAME); michael@0: michael@0: txn.undoTransaction(); michael@0: let newbkmk2Id = observer._itemAddedId; michael@0: do_check_eq(observer._itemAddedParent, testFolder); michael@0: do_check_eq(observer._itemAddedIndex, 0); michael@0: do_check_eq(bmsvc.getKeywordForBookmark(newbkmk2Id), KEYWORD); michael@0: do_check_eq(tagssvc.getTagsForURI(testURI)[0], TAG_NAME); michael@0: michael@0: txn.redoTransaction(); michael@0: do_check_eq(observer._itemRemovedId, newbkmk2Id); michael@0: do_check_eq(observer._itemRemovedFolder, testFolder); michael@0: do_check_eq(observer._itemRemovedIndex, 0); michael@0: do_check_eq(bmsvc.getKeywordForBookmark(newbkmk2Id), null); michael@0: do_check_eq(tagssvc.getTagsForURI(testURI)[0], TAG_NAME); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemAddedParent, testFolder); michael@0: do_check_eq(observer._itemAddedIndex, 0); michael@0: do_check_eq(tagssvc.getTagsForURI(testURI)[0], TAG_NAME); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_remove_item_with_tag() { michael@0: const TAG_NAME = "tag-test_remove_item_with_tag"; michael@0: let testURI = NetUtil.newURI("http://test_remove_item_with_tag.com/"); michael@0: let itemId = bmsvc.insertBookmark(root, testURI, bmsvc.DEFAULT_INDEX, "Test removing an item with a tag"); michael@0: tagssvc.tagURI(testURI, [TAG_NAME]); michael@0: michael@0: let txn = new PlacesRemoveItemTransaction(itemId); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_true(tagssvc.getTagsForURI(testURI).length == 0); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(tagssvc.getTagsForURI(testURI)[0], TAG_NAME); michael@0: michael@0: txn.redoTransaction(); michael@0: do_check_true(tagssvc.getTagsForURI(testURI).length == 0); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(tagssvc.getTagsForURI(testURI)[0], TAG_NAME); michael@0: michael@0: txn.redoTransaction(); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_creating_separator() { michael@0: let testFolder = bmsvc.createFolder(root, "Test creating a separator", bmsvc.DEFAULT_INDEX); michael@0: michael@0: let txn = new PlacesCreateSeparatorTransaction(testFolder, 0); michael@0: txn.doTransaction(); michael@0: michael@0: let sepId = observer._itemAddedId; michael@0: do_check_eq(observer._itemAddedIndex, 0); michael@0: do_check_eq(observer._itemAddedParent, testFolder); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemRemovedId, sepId); michael@0: do_check_eq(observer._itemRemovedFolder, testFolder); michael@0: do_check_eq(observer._itemRemovedIndex, 0); michael@0: michael@0: txn.redoTransaction(); michael@0: let newSepId = observer._itemAddedId; michael@0: do_check_eq(observer._itemAddedIndex, 0); michael@0: do_check_eq(observer._itemAddedParent, testFolder); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemRemovedId, newSepId); michael@0: do_check_eq(observer._itemRemovedFolder, testFolder); michael@0: do_check_eq(observer._itemRemovedIndex, 0); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_removing_separator() { michael@0: let testFolder = bmsvc.createFolder(root, "Test removing a separator", bmsvc.DEFAULT_INDEX); michael@0: michael@0: let sepId = bmsvc.insertSeparator(testFolder, 0); michael@0: let txn = new PlacesRemoveItemTransaction(sepId); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_eq(observer._itemRemovedId, sepId); michael@0: do_check_eq(observer._itemRemovedFolder, testFolder); michael@0: do_check_eq(observer._itemRemovedIndex, 0); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemAddedId, sepId); //New separator created michael@0: do_check_eq(observer._itemAddedParent, testFolder); michael@0: do_check_eq(observer._itemAddedIndex, 0); michael@0: michael@0: txn.redoTransaction(); michael@0: do_check_eq(observer._itemRemovedId, sepId); michael@0: do_check_eq(observer._itemRemovedFolder, testFolder); michael@0: do_check_eq(observer._itemRemovedIndex, 0); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemAddedId, sepId); //New separator created michael@0: do_check_eq(observer._itemAddedParent, testFolder); michael@0: do_check_eq(observer._itemAddedIndex, 0); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_editing_item_title() { michael@0: const TITLE = "Test editing item title"; michael@0: const MOD_TITLE = "Mod: Test editing item title"; michael@0: let testURI = NetUtil.newURI("http://www.test_editing_item_title.com"); michael@0: let testBkmId = bmsvc.insertBookmark(root, testURI, bmsvc.DEFAULT_INDEX, TITLE); michael@0: michael@0: let txn = new PlacesEditItemTitleTransaction(testBkmId, MOD_TITLE); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, "title"); michael@0: do_check_eq(observer._itemChangedValue, MOD_TITLE); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, "title"); michael@0: do_check_eq(observer._itemChangedValue, TITLE); michael@0: michael@0: txn.redoTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, "title"); michael@0: do_check_eq(observer._itemChangedValue, MOD_TITLE); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, "title"); michael@0: do_check_eq(observer._itemChangedValue, TITLE); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_editing_item_uri() { michael@0: const OLD_TEST_URI = NetUtil.newURI("http://old.test_editing_item_uri.com/"); michael@0: const NEW_TEST_URI = NetUtil.newURI("http://new.test_editing_item_uri.com/"); michael@0: let testBkmId = bmsvc.insertBookmark(root, OLD_TEST_URI, bmsvc.DEFAULT_INDEX, michael@0: "Test editing item title"); michael@0: tagssvc.tagURI(OLD_TEST_URI, ["tag"]); michael@0: michael@0: let txn = new PlacesEditBookmarkURITransaction(testBkmId, NEW_TEST_URI); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, "uri"); michael@0: do_check_eq(observer._itemChangedValue, NEW_TEST_URI.spec); michael@0: do_check_eq(JSON.stringify(tagssvc.getTagsForURI(NEW_TEST_URI)), JSON.stringify(["tag"])); michael@0: do_check_eq(JSON.stringify(tagssvc.getTagsForURI(OLD_TEST_URI)), JSON.stringify([])); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, "uri"); michael@0: do_check_eq(observer._itemChangedValue, OLD_TEST_URI.spec); michael@0: do_check_eq(JSON.stringify(tagssvc.getTagsForURI(OLD_TEST_URI)), JSON.stringify(["tag"])); michael@0: do_check_eq(JSON.stringify(tagssvc.getTagsForURI(NEW_TEST_URI)), JSON.stringify([])); michael@0: michael@0: txn.redoTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, "uri"); michael@0: do_check_eq(observer._itemChangedValue, NEW_TEST_URI.spec); michael@0: do_check_eq(JSON.stringify(tagssvc.getTagsForURI(NEW_TEST_URI)), JSON.stringify(["tag"])); michael@0: do_check_eq(JSON.stringify(tagssvc.getTagsForURI(OLD_TEST_URI)), JSON.stringify([])); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, "uri"); michael@0: do_check_eq(observer._itemChangedValue, OLD_TEST_URI.spec); michael@0: do_check_eq(JSON.stringify(tagssvc.getTagsForURI(OLD_TEST_URI)), JSON.stringify(["tag"])); michael@0: do_check_eq(JSON.stringify(tagssvc.getTagsForURI(NEW_TEST_URI)), JSON.stringify([])); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_edit_description_transaction() { michael@0: let testURI = NetUtil.newURI("http://test_edit_description_transaction.com"); michael@0: let testBkmId = bmsvc.insertBookmark(root, testURI, bmsvc.DEFAULT_INDEX, "Test edit description transaction"); michael@0: michael@0: let anno = { michael@0: name: DESCRIPTION_ANNO, michael@0: type: Ci.nsIAnnotationService.TYPE_STRING, michael@0: flags: 0, michael@0: value: "Test edit Description", michael@0: expires: Ci.nsIAnnotationService.EXPIRE_NEVER, michael@0: }; michael@0: let txn = new PlacesSetItemAnnotationTransaction(testBkmId, anno); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, DESCRIPTION_ANNO); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_edit_keyword() { michael@0: const KEYWORD = "keyword-test_edit_keyword"; michael@0: michael@0: let testURI = NetUtil.newURI("http://test_edit_keyword.com"); michael@0: let testBkmId = bmsvc.insertBookmark(root, testURI, bmsvc.DEFAULT_INDEX, "Test edit keyword"); michael@0: michael@0: let txn = new PlacesEditBookmarkKeywordTransaction(testBkmId, KEYWORD); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, "keyword"); michael@0: do_check_eq(observer._itemChangedValue, KEYWORD); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, "keyword"); michael@0: do_check_eq(observer._itemChangedValue, ""); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_LoadInSidebar_transaction() { michael@0: let testURI = NetUtil.newURI("http://test_LoadInSidebar_transaction.com"); michael@0: let testBkmId = bmsvc.insertBookmark(root, testURI, bmsvc.DEFAULT_INDEX, "Test LoadInSidebar transaction"); michael@0: michael@0: const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar"; michael@0: let anno = { name: LOAD_IN_SIDEBAR_ANNO, michael@0: type: Ci.nsIAnnotationService.TYPE_INT32, michael@0: flags: 0, michael@0: value: true, michael@0: expires: Ci.nsIAnnotationService.EXPIRE_NEVER }; michael@0: let txn = new PlacesSetItemAnnotationTransaction(testBkmId, anno); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, LOAD_IN_SIDEBAR_ANNO); michael@0: do_check_eq(observer._itemChanged_isAnnotationProperty, true); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, LOAD_IN_SIDEBAR_ANNO); michael@0: do_check_eq(observer._itemChanged_isAnnotationProperty, true); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_generic_item_annotation() { michael@0: let testURI = NetUtil.newURI("http://test_generic_item_annotation.com"); michael@0: let testBkmId = bmsvc.insertBookmark(root, testURI, bmsvc.DEFAULT_INDEX, "Test generic item annotation"); michael@0: michael@0: let itemAnnoObj = { name: "testAnno/testInt", michael@0: type: Ci.nsIAnnotationService.TYPE_INT32, michael@0: flags: 0, michael@0: value: 123, michael@0: expires: Ci.nsIAnnotationService.EXPIRE_NEVER }; michael@0: let txn = new PlacesSetItemAnnotationTransaction(testBkmId, itemAnnoObj); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, "testAnno/testInt"); michael@0: do_check_eq(observer._itemChanged_isAnnotationProperty, true); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, "testAnno/testInt"); michael@0: do_check_eq(observer._itemChanged_isAnnotationProperty, true); michael@0: michael@0: txn.redoTransaction(); michael@0: do_check_eq(observer._itemChangedId, testBkmId); michael@0: do_check_eq(observer._itemChangedProperty, "testAnno/testInt"); michael@0: do_check_eq(observer._itemChanged_isAnnotationProperty, true); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_editing_item_date_added() { michael@0: let testURI = NetUtil.newURI("http://test_editing_item_date_added.com"); michael@0: let testBkmId = bmsvc.insertBookmark(root, testURI, bmsvc.DEFAULT_INDEX, michael@0: "Test editing item date added"); michael@0: michael@0: let oldAdded = bmsvc.getItemDateAdded(testBkmId); michael@0: let newAdded = Date.now() + 1000; michael@0: let txn = new PlacesEditItemDateAddedTransaction(testBkmId, newAdded); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_eq(newAdded, bmsvc.getItemDateAdded(testBkmId)); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(oldAdded, bmsvc.getItemDateAdded(testBkmId)); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_edit_item_last_modified() { michael@0: let testURI = NetUtil.newURI("http://test_edit_item_last_modified.com"); michael@0: let testBkmId = bmsvc.insertBookmark(root, testURI, bmsvc.DEFAULT_INDEX, michael@0: "Test editing item last modified"); michael@0: michael@0: let oldModified = bmsvc.getItemLastModified(testBkmId); michael@0: let newModified = Date.now() + 1000; michael@0: let txn = new PlacesEditItemLastModifiedTransaction(testBkmId, newModified); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_eq(newModified, bmsvc.getItemLastModified(testBkmId)); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(oldModified, bmsvc.getItemLastModified(testBkmId)); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_generic_page_annotation() { michael@0: const TEST_ANNO = "testAnno/testInt"; michael@0: let testURI = NetUtil.newURI("http://www.mozilla.org/"); michael@0: promiseAddVisits(testURI).then(function () { michael@0: let pageAnnoObj = { name: TEST_ANNO, michael@0: type: Ci.nsIAnnotationService.TYPE_INT32, michael@0: flags: 0, michael@0: value: 123, michael@0: expires: Ci.nsIAnnotationService.EXPIRE_NEVER }; michael@0: let txn = new PlacesSetPageAnnotationTransaction(testURI, pageAnnoObj); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_true(annosvc.pageHasAnnotation(testURI, TEST_ANNO)); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_false(annosvc.pageHasAnnotation(testURI, TEST_ANNO)); michael@0: michael@0: txn.redoTransaction(); michael@0: do_check_true(annosvc.pageHasAnnotation(testURI, TEST_ANNO)); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_sort_folder_by_name() { michael@0: let testFolder = bmsvc.createFolder(root, "Test PlacesSortFolderByNameTransaction", michael@0: bmsvc.DEFAULT_INDEX); michael@0: let testURI = NetUtil.newURI("http://test_sort_folder_by_name.com"); michael@0: michael@0: bmsvc.insertBookmark(testFolder, testURI, bmsvc.DEFAULT_INDEX, "bookmark3"); michael@0: bmsvc.insertBookmark(testFolder, testURI, bmsvc.DEFAULT_INDEX, "bookmark2"); michael@0: bmsvc.insertBookmark(testFolder, testURI, bmsvc.DEFAULT_INDEX, "bookmark1"); michael@0: michael@0: let bkmIds = bmsvc.getBookmarkIdsForURI(testURI); michael@0: bkmIds.sort(); michael@0: michael@0: let b1 = bkmIds[0]; michael@0: let b2 = bkmIds[1]; michael@0: let b3 = bkmIds[2]; michael@0: michael@0: do_check_eq(0, bmsvc.getItemIndex(b1)); michael@0: do_check_eq(1, bmsvc.getItemIndex(b2)); michael@0: do_check_eq(2, bmsvc.getItemIndex(b3)); michael@0: michael@0: let txn = new PlacesSortFolderByNameTransaction(testFolder); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_eq(2, bmsvc.getItemIndex(b1)); michael@0: do_check_eq(1, bmsvc.getItemIndex(b2)); michael@0: do_check_eq(0, bmsvc.getItemIndex(b3)); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(0, bmsvc.getItemIndex(b1)); michael@0: do_check_eq(1, bmsvc.getItemIndex(b2)); michael@0: do_check_eq(2, bmsvc.getItemIndex(b3)); michael@0: michael@0: txn.redoTransaction(); michael@0: do_check_eq(2, bmsvc.getItemIndex(b1)); michael@0: do_check_eq(1, bmsvc.getItemIndex(b2)); michael@0: do_check_eq(0, bmsvc.getItemIndex(b3)); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_eq(0, bmsvc.getItemIndex(b1)); michael@0: do_check_eq(1, bmsvc.getItemIndex(b2)); michael@0: do_check_eq(2, bmsvc.getItemIndex(b3)); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_edit_postData() { michael@0: const POST_DATA_ANNO = "bookmarkProperties/POSTData"; michael@0: let postData = "post-test_edit_postData"; michael@0: let testURI = NetUtil.newURI("http://test_edit_postData.com"); michael@0: let testBkmId = bmsvc.insertBookmark(root, testURI, bmsvc.DEFAULT_INDEX, "Test edit Post Data"); michael@0: michael@0: let txn = new PlacesEditBookmarkPostDataTransaction(testBkmId, postData); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_true(annosvc.itemHasAnnotation(testBkmId, POST_DATA_ANNO)); michael@0: do_check_eq(annosvc.getItemAnnotation(testBkmId, POST_DATA_ANNO), postData); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_false(annosvc.itemHasAnnotation(testBkmId, POST_DATA_ANNO)); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_tagURI_untagURI() { michael@0: const TAG_1 = "tag-test_tagURI_untagURI-bar"; michael@0: const TAG_2 = "tag-test_tagURI_untagURI-foo"; michael@0: let tagURI = NetUtil.newURI("http://test_tagURI_untagURI.com"); michael@0: michael@0: // Test tagURI michael@0: let tagTxn = new PlacesTagURITransaction(tagURI, [TAG_1, TAG_2]); michael@0: michael@0: tagTxn.doTransaction(); michael@0: do_check_eq(JSON.stringify(tagssvc.getTagsForURI(tagURI)), JSON.stringify([TAG_1,TAG_2])); michael@0: michael@0: tagTxn.undoTransaction(); michael@0: do_check_eq(tagssvc.getTagsForURI(tagURI).length, 0); michael@0: michael@0: tagTxn.redoTransaction(); michael@0: do_check_eq(JSON.stringify(tagssvc.getTagsForURI(tagURI)), JSON.stringify([TAG_1,TAG_2])); michael@0: michael@0: // Test untagURI michael@0: let untagTxn = new PlacesUntagURITransaction(tagURI, [TAG_1]); michael@0: michael@0: untagTxn.doTransaction(); michael@0: do_check_eq(JSON.stringify(tagssvc.getTagsForURI(tagURI)), JSON.stringify([TAG_2])); michael@0: michael@0: untagTxn.undoTransaction(); michael@0: do_check_eq(JSON.stringify(tagssvc.getTagsForURI(tagURI)), JSON.stringify([TAG_1,TAG_2])); michael@0: michael@0: untagTxn.redoTransaction(); michael@0: do_check_eq(JSON.stringify(tagssvc.getTagsForURI(tagURI)), JSON.stringify([TAG_2])); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_aggregate_removeItem_Txn() { michael@0: let testFolder = bmsvc.createFolder(root, "Test aggregate removeItem transaction", bmsvc.DEFAULT_INDEX); michael@0: michael@0: const TEST_URL = "http://test_aggregate_removeitem_txn.com/"; michael@0: const FOLDERNAME = "Folder"; michael@0: let testURI = NetUtil.newURI(TEST_URL); michael@0: michael@0: let bkmk1Id = bmsvc.insertBookmark(testFolder, testURI, 0, "Mozilla"); michael@0: let bkmk2Id = bmsvc.insertSeparator(testFolder, 1); michael@0: let bkmk3Id = bmsvc.createFolder(testFolder, FOLDERNAME, 2); michael@0: michael@0: let bkmk3_1Id = bmsvc.insertBookmark(bkmk3Id, testURI, 0, "Mozilla"); michael@0: let bkmk3_2Id = bmsvc.insertSeparator(bkmk3Id, 1); michael@0: let bkmk3_3Id = bmsvc.createFolder(bkmk3Id, FOLDERNAME, 2); michael@0: michael@0: let childTxn1 = new PlacesRemoveItemTransaction(bkmk1Id); michael@0: let childTxn2 = new PlacesRemoveItemTransaction(bkmk2Id); michael@0: let childTxn3 = new PlacesRemoveItemTransaction(bkmk3Id); michael@0: let transactions = [childTxn1, childTxn2, childTxn3]; michael@0: let txn = new PlacesAggregatedTransaction("RemoveItems", transactions); michael@0: michael@0: txn.doTransaction(); michael@0: do_check_eq(bmsvc.getItemIndex(bkmk1Id), -1); michael@0: do_check_eq(bmsvc.getItemIndex(bkmk2Id), -1); michael@0: do_check_eq(bmsvc.getItemIndex(bkmk3Id), -1); michael@0: do_check_eq(bmsvc.getItemIndex(bkmk3_1Id), -1); michael@0: do_check_eq(bmsvc.getItemIndex(bkmk3_2Id), -1); michael@0: do_check_eq(bmsvc.getItemIndex(bkmk3_3Id), -1); michael@0: // Check last removed item id. michael@0: do_check_eq(observer._itemRemovedId, bkmk3Id); michael@0: michael@0: txn.undoTransaction(); michael@0: let newBkmk1Id = bmsvc.getIdForItemAt(testFolder, 0); michael@0: let newBkmk2Id = bmsvc.getIdForItemAt(testFolder, 1); michael@0: let newBkmk3Id = bmsvc.getIdForItemAt(testFolder, 2); michael@0: let newBkmk3_1Id = bmsvc.getIdForItemAt(newBkmk3Id, 0); michael@0: let newBkmk3_2Id = bmsvc.getIdForItemAt(newBkmk3Id, 1); michael@0: let newBkmk3_3Id = bmsvc.getIdForItemAt(newBkmk3Id, 2); michael@0: do_check_eq(bmsvc.getItemType(newBkmk1Id), bmsvc.TYPE_BOOKMARK); michael@0: do_check_eq(bmsvc.getBookmarkURI(newBkmk1Id).spec, TEST_URL); michael@0: do_check_eq(bmsvc.getItemType(newBkmk2Id), bmsvc.TYPE_SEPARATOR); michael@0: do_check_eq(bmsvc.getItemType(newBkmk3Id), bmsvc.TYPE_FOLDER); michael@0: do_check_eq(bmsvc.getItemTitle(newBkmk3Id), FOLDERNAME); michael@0: do_check_eq(bmsvc.getFolderIdForItem(newBkmk3_1Id), newBkmk3Id); michael@0: do_check_eq(bmsvc.getItemType(newBkmk3_1Id), bmsvc.TYPE_BOOKMARK); michael@0: do_check_eq(bmsvc.getBookmarkURI(newBkmk3_1Id).spec, TEST_URL); michael@0: do_check_eq(bmsvc.getFolderIdForItem(newBkmk3_2Id), newBkmk3Id); michael@0: do_check_eq(bmsvc.getItemType(newBkmk3_2Id), bmsvc.TYPE_SEPARATOR); michael@0: do_check_eq(bmsvc.getFolderIdForItem(newBkmk3_3Id), newBkmk3Id); michael@0: do_check_eq(bmsvc.getItemType(newBkmk3_3Id), bmsvc.TYPE_FOLDER); michael@0: do_check_eq(bmsvc.getItemTitle(newBkmk3_3Id), FOLDERNAME); michael@0: // Check last added back item id. michael@0: // Notice items are restored in reverse order. michael@0: do_check_eq(observer._itemAddedId, newBkmk1Id); michael@0: michael@0: txn.redoTransaction(); michael@0: do_check_eq(bmsvc.getItemIndex(newBkmk1Id), -1); michael@0: do_check_eq(bmsvc.getItemIndex(newBkmk2Id), -1); michael@0: do_check_eq(bmsvc.getItemIndex(newBkmk3Id), -1); michael@0: do_check_eq(bmsvc.getItemIndex(newBkmk3_1Id), -1); michael@0: do_check_eq(bmsvc.getItemIndex(newBkmk3_2Id), -1); michael@0: do_check_eq(bmsvc.getItemIndex(newBkmk3_3Id), -1); michael@0: // Check last removed item id. michael@0: do_check_eq(observer._itemRemovedId, newBkmk3Id); michael@0: michael@0: txn.undoTransaction(); michael@0: newBkmk1Id = bmsvc.getIdForItemAt(testFolder, 0); michael@0: newBkmk2Id = bmsvc.getIdForItemAt(testFolder, 1); michael@0: newBkmk3Id = bmsvc.getIdForItemAt(testFolder, 2); michael@0: newBkmk3_1Id = bmsvc.getIdForItemAt(newBkmk3Id, 0); michael@0: newBkmk3_2Id = bmsvc.getIdForItemAt(newBkmk3Id, 1); michael@0: newBkmk3_3Id = bmsvc.getIdForItemAt(newBkmk3Id, 2); michael@0: do_check_eq(bmsvc.getItemType(newBkmk1Id), bmsvc.TYPE_BOOKMARK); michael@0: do_check_eq(bmsvc.getBookmarkURI(newBkmk1Id).spec, TEST_URL); michael@0: do_check_eq(bmsvc.getItemType(newBkmk2Id), bmsvc.TYPE_SEPARATOR); michael@0: do_check_eq(bmsvc.getItemType(newBkmk3Id), bmsvc.TYPE_FOLDER); michael@0: do_check_eq(bmsvc.getItemTitle(newBkmk3Id), FOLDERNAME); michael@0: do_check_eq(bmsvc.getFolderIdForItem(newBkmk3_1Id), newBkmk3Id); michael@0: do_check_eq(bmsvc.getItemType(newBkmk3_1Id), bmsvc.TYPE_BOOKMARK); michael@0: do_check_eq(bmsvc.getBookmarkURI(newBkmk3_1Id).spec, TEST_URL); michael@0: do_check_eq(bmsvc.getFolderIdForItem(newBkmk3_2Id), newBkmk3Id); michael@0: do_check_eq(bmsvc.getItemType(newBkmk3_2Id), bmsvc.TYPE_SEPARATOR); michael@0: do_check_eq(bmsvc.getFolderIdForItem(newBkmk3_3Id), newBkmk3Id); michael@0: do_check_eq(bmsvc.getItemType(newBkmk3_3Id), bmsvc.TYPE_FOLDER); michael@0: do_check_eq(bmsvc.getItemTitle(newBkmk3_3Id), FOLDERNAME); michael@0: // Check last added back item id. michael@0: // Notice items are restored in reverse order. michael@0: do_check_eq(observer._itemAddedId, newBkmk1Id); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_create_item_with_childTxn() { michael@0: let testFolder = bmsvc.createFolder(root, "Test creating an item with childTxns", bmsvc.DEFAULT_INDEX); michael@0: michael@0: const BOOKMARK_TITLE = "parent item"; michael@0: let testURI = NetUtil.newURI("http://test_create_item_with_childTxn.com"); michael@0: let childTxns = []; michael@0: let newDateAdded = Date.now() - 20000; michael@0: let editDateAdddedTxn = new PlacesEditItemDateAddedTransaction(null, newDateAdded); michael@0: childTxns.push(editDateAdddedTxn); michael@0: michael@0: let itemChildAnnoObj = { name: "testAnno/testInt", michael@0: type: Ci.nsIAnnotationService.TYPE_INT32, michael@0: flags: 0, michael@0: value: 123, michael@0: expires: Ci.nsIAnnotationService.EXPIRE_NEVER }; michael@0: let annoTxn = new PlacesSetItemAnnotationTransaction(null, itemChildAnnoObj); michael@0: childTxns.push(annoTxn); michael@0: michael@0: let itemWChildTxn = new PlacesCreateBookmarkTransaction(testURI, testFolder, bmStartIndex, michael@0: BOOKMARK_TITLE, null, null, michael@0: childTxns); michael@0: try { michael@0: txnManager.doTransaction(itemWChildTxn); michael@0: let itemId = bmsvc.getBookmarkIdsForURI(testURI)[0]; michael@0: do_check_eq(observer._itemAddedId, itemId); michael@0: do_check_eq(newDateAdded, bmsvc.getItemDateAdded(itemId)); michael@0: do_check_eq(observer._itemChangedProperty, "testAnno/testInt"); michael@0: do_check_eq(observer._itemChanged_isAnnotationProperty, true); michael@0: do_check_true(annosvc.itemHasAnnotation(itemId, itemChildAnnoObj.name)) michael@0: do_check_eq(annosvc.getItemAnnotation(itemId, itemChildAnnoObj.name), itemChildAnnoObj.value); michael@0: michael@0: itemWChildTxn.undoTransaction(); michael@0: do_check_eq(observer._itemRemovedId, itemId); michael@0: michael@0: itemWChildTxn.redoTransaction(); michael@0: do_check_true(bmsvc.isBookmarked(testURI)); michael@0: let newId = bmsvc.getBookmarkIdsForURI(testURI)[0]; michael@0: do_check_eq(newDateAdded, bmsvc.getItemDateAdded(newId)); michael@0: do_check_eq(observer._itemAddedId, newId); michael@0: do_check_eq(observer._itemChangedProperty, "testAnno/testInt"); michael@0: do_check_eq(observer._itemChanged_isAnnotationProperty, true); michael@0: do_check_true(annosvc.itemHasAnnotation(newId, itemChildAnnoObj.name)) michael@0: do_check_eq(annosvc.getItemAnnotation(newId, itemChildAnnoObj.name), itemChildAnnoObj.value); michael@0: michael@0: itemWChildTxn.undoTransaction(); michael@0: do_check_eq(observer._itemRemovedId, newId); michael@0: } michael@0: catch (ex) { michael@0: do_throw("Setting a child transaction in a createItem transaction did throw: " + ex); michael@0: } michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_create_folder_with_child_itemTxn() { michael@0: let childURI = NetUtil.newURI("http://test_create_folder_with_child_itemTxn.com"); michael@0: let childItemTxn = new PlacesCreateBookmarkTransaction(childURI, root, michael@0: bmStartIndex, "childItem"); michael@0: let txn = new PlacesCreateFolderTransaction("Test creating a folder with child itemTxns", michael@0: root, bmStartIndex, null, [childItemTxn]); michael@0: try { michael@0: txnManager.doTransaction(txn); michael@0: let childItemId = bmsvc.getBookmarkIdsForURI(childURI)[0]; michael@0: do_check_eq(observer._itemAddedId, childItemId); michael@0: do_check_eq(observer._itemAddedIndex, 0); michael@0: do_check_true(bmsvc.isBookmarked(childURI)); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_false(bmsvc.isBookmarked(childURI)); michael@0: michael@0: txn.redoTransaction(); michael@0: let newchildItemId = bmsvc.getBookmarkIdsForURI(childURI)[0]; michael@0: do_check_eq(observer._itemAddedIndex, 0); michael@0: do_check_eq(observer._itemAddedId, newchildItemId); michael@0: do_check_true(bmsvc.isBookmarked(childURI)); michael@0: michael@0: txn.undoTransaction(); michael@0: do_check_false(bmsvc.isBookmarked(childURI)); michael@0: } michael@0: catch (ex) { michael@0: do_throw("Setting a child item transaction in a createFolder transaction did throw: " + ex); michael@0: } michael@0: michael@0: run_next_test(); michael@0: });