1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/components/places/tests/unit/test_418643_removeFolderChildren.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,143 @@ 1.4 +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim:set ts=2 sw=2 sts=2 et: */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +// Get services. 1.11 +try { 1.12 + var histSvc = Cc["@mozilla.org/browser/nav-history-service;1"]. 1.13 + getService(Ci.nsINavHistoryService); 1.14 + var bmSvc = Cc["@mozilla.org/browser/nav-bookmarks-service;1"]. 1.15 + getService(Ci.nsINavBookmarksService); 1.16 + var annoSvc = Cc["@mozilla.org/browser/annotation-service;1"] 1.17 + .getService(Ci.nsIAnnotationService); 1.18 +} catch(ex) { 1.19 + do_throw("Could not get services\n"); 1.20 +} 1.21 + 1.22 +var validAnnoName = "validAnno"; 1.23 +var validItemName = "validItem"; 1.24 +var deletedAnnoName = "deletedAnno"; 1.25 +var deletedItemName = "deletedItem"; 1.26 +var bookmarkedURI = uri("http://www.mozilla.org/"); 1.27 +// set lastModified to the past to prevent VM timing bugs 1.28 +var pastDate = Date.now() * 1000 - 1; 1.29 +var deletedBookmarkIds = []; 1.30 + 1.31 +// bookmarks observer 1.32 +var observer = { 1.33 + // cached ordered array of notified items 1.34 + _onItemRemovedItemIds: [], 1.35 + onItemRemoved: function(aItemId, aParentId, aIndex) { 1.36 + // We should first get notifications for children, then for their parent 1.37 + do_check_eq(this._onItemRemovedItemIds.indexOf(aParentId), -1); 1.38 + // Ensure we are not wrongly removing 1 level up 1.39 + do_check_neq(aParentId, bmSvc.toolbarFolder); 1.40 + // Removed item must be one of those we have manually deleted 1.41 + do_check_neq(deletedBookmarkIds.indexOf(aItemId), -1); 1.42 + this._onItemRemovedItemIds.push(aItemId); 1.43 + }, 1.44 + 1.45 + QueryInterface: function(aIID) { 1.46 + if (aIID.equals(Ci.nsINavBookmarkObserver) || 1.47 + aIID.equals(Ci.nsISupports)) { 1.48 + return this; 1.49 + } 1.50 + throw Cr.NS_ERROR_NO_INTERFACE; 1.51 + } 1.52 +}; 1.53 + 1.54 +bmSvc.addObserver(observer, false); 1.55 + 1.56 +function add_bookmarks() { 1.57 + // This is the folder we will cleanup 1.58 + var validFolderId = bmSvc.createFolder(bmSvc.toolbarFolder, 1.59 + validItemName, 1.60 + bmSvc.DEFAULT_INDEX); 1.61 + annoSvc.setItemAnnotation(validFolderId, validAnnoName, 1.62 + "annotation", 0, 1.63 + annoSvc.EXPIRE_NEVER); 1.64 + bmSvc.setItemLastModified(validFolderId, pastDate); 1.65 + 1.66 + // This bookmark should not be deleted 1.67 + var validItemId = bmSvc.insertBookmark(bmSvc.toolbarFolder, 1.68 + bookmarkedURI, 1.69 + bmSvc.DEFAULT_INDEX, 1.70 + validItemName); 1.71 + annoSvc.setItemAnnotation(validItemId, validAnnoName, 1.72 + "annotation", 0, annoSvc.EXPIRE_NEVER); 1.73 + 1.74 + // The following contents should be deleted 1.75 + var deletedItemId = bmSvc.insertBookmark(validFolderId, 1.76 + bookmarkedURI, 1.77 + bmSvc.DEFAULT_INDEX, 1.78 + deletedItemName); 1.79 + annoSvc.setItemAnnotation(deletedItemId, deletedAnnoName, 1.80 + "annotation", 0, annoSvc.EXPIRE_NEVER); 1.81 + deletedBookmarkIds.push(deletedItemId); 1.82 + 1.83 + var internalFolderId = bmSvc.createFolder(validFolderId, 1.84 + deletedItemName, 1.85 + bmSvc.DEFAULT_INDEX); 1.86 + annoSvc.setItemAnnotation(internalFolderId, deletedAnnoName, 1.87 + "annotation", 0, annoSvc.EXPIRE_NEVER); 1.88 + deletedBookmarkIds.push(internalFolderId); 1.89 + 1.90 + deletedItemId = bmSvc.insertBookmark(internalFolderId, 1.91 + bookmarkedURI, 1.92 + bmSvc.DEFAULT_INDEX, 1.93 + deletedItemName); 1.94 + annoSvc.setItemAnnotation(deletedItemId, deletedAnnoName, 1.95 + "annotation", 0, annoSvc.EXPIRE_NEVER); 1.96 + deletedBookmarkIds.push(deletedItemId); 1.97 + 1.98 + return validFolderId; 1.99 +} 1.100 + 1.101 +function check_bookmarks(aFolderId) { 1.102 + // check that we still have valid bookmarks 1.103 + var bookmarks = bmSvc.getBookmarkIdsForURI(bookmarkedURI); 1.104 + for(var i = 0; i < bookmarks.length; i++) { 1.105 + do_check_eq(bmSvc.getItemTitle(bookmarks[i]), validItemName); 1.106 + do_check_true(annoSvc.itemHasAnnotation(bookmarks[i],validAnnoName)); 1.107 + } 1.108 + 1.109 + // check that folder exists and has still its annotation 1.110 + do_check_eq(bmSvc.getItemTitle(aFolderId), validItemName); 1.111 + do_check_true(annoSvc.itemHasAnnotation(aFolderId, validAnnoName)); 1.112 + 1.113 + // check that folder is empty 1.114 + var options = histSvc.getNewQueryOptions(); 1.115 + var query = histSvc.getNewQuery(); 1.116 + query.setFolders([aFolderId], 1); 1.117 + var result = histSvc.executeQuery(query, options); 1.118 + var root = result.root; 1.119 + root.containerOpen = true; 1.120 + do_check_eq(root.childCount, 0); 1.121 + root.containerOpen = false; 1.122 + 1.123 + // test that lastModified got updated 1.124 + do_check_true(pastDate < bmSvc.getItemLastModified(aFolderId)); 1.125 + 1.126 + // test that all children have been deleted, we use annos for that 1.127 + var deletedItems = annoSvc.getItemsWithAnnotation(deletedAnnoName); 1.128 + do_check_eq(deletedItems.length, 0); 1.129 + 1.130 + // test that observer has been called for (and only for) deleted items 1.131 + do_check_eq(observer._onItemRemovedItemIds.length, deletedBookmarkIds.length); 1.132 + 1.133 + // Sanity check: all roots should be intact 1.134 + do_check_eq(bmSvc.getFolderIdForItem(bmSvc.placesRoot), 0); 1.135 + do_check_eq(bmSvc.getFolderIdForItem(bmSvc.bookmarksMenuFolder), bmSvc.placesRoot); 1.136 + do_check_eq(bmSvc.getFolderIdForItem(bmSvc.tagsFolder), bmSvc.placesRoot); 1.137 + do_check_eq(bmSvc.getFolderIdForItem(bmSvc.unfiledBookmarksFolder), bmSvc.placesRoot); 1.138 + do_check_eq(bmSvc.getFolderIdForItem(bmSvc.toolbarFolder), bmSvc.placesRoot); 1.139 +} 1.140 + 1.141 +// main 1.142 +function run_test() { 1.143 + var folderId = add_bookmarks(); 1.144 + bmSvc.removeFolderChildren(folderId); 1.145 + check_bookmarks(folderId); 1.146 +}