Index: chrome/test/data/webui/md_bookmarks/store_test.js |
diff --git a/chrome/test/data/webui/md_bookmarks/store_test.js b/chrome/test/data/webui/md_bookmarks/store_test.js |
index 67b65c14df8e7bdc85a59b0e378c576602fd826e..3f7470cf909a51deada4933263bbc4c6a1eaadf2 100644 |
--- a/chrome/test/data/webui/md_bookmarks/store_test.js |
+++ b/chrome/test/data/webui/md_bookmarks/store_test.js |
@@ -27,6 +27,17 @@ suite('<bookmarks-store>', function() { |
}; |
} |
+ /** |
+ * Overrides the chrome.bookmarks.getSubTree to pass results into the |
+ * callback. |
+ * @param {Array} results |
+ */ |
+ function overrideBookmarksGetSubTree(results) { |
+ chrome.bookmarks.getSubTree = function(parentId, callback) { |
+ callback(results); |
+ }; |
+ } |
+ |
setup(function() { |
TEST_TREE = createFolder('0', [ |
createFolder( |
@@ -34,10 +45,12 @@ suite('<bookmarks-store>', function() { |
[ |
createItem('2', {url: 'link2'}), |
createFolder('3', []), |
+ createItem('6', {url: 'link4'}), |
+ createItem('7', {url: 'link5'}), |
]), |
createItem('4', {url: 'link4'}), |
createItem('5', {url: 'link5'}), |
- createFolder('6', []), |
+ createFolder('8', []), |
]); |
replaceStore(); |
@@ -68,7 +81,9 @@ suite('<bookmarks-store>', function() { |
'3': 'rootNode.children.#0.children.#1', |
'4': 'rootNode.children.#1', |
'5': 'rootNode.children.#2', |
- '6': 'rootNode.children.#3', |
+ '6': 'rootNode.children.#0.children.#2', |
+ '7': 'rootNode.children.#0.children.#3', |
+ '8': 'rootNode.children.#3', |
}; |
for (var id in store.idToNodeMap_) |
@@ -95,24 +110,24 @@ suite('<bookmarks-store>', function() { |
test('store updates on selected event', function() { |
// First child of root is selected by default. |
assertEquals('1', store.selectedId); |
- assertTrue(store.idToNodeMap_['1'].isSelected); |
+ assertTrue(store.idToNodeMap_['1'].isSelectedFolder); |
// Selecting a selected folder doesn't deselect it. |
store.fire('selected-folder-changed', '1'); |
assertEquals('1', store.selectedId); |
- assertTrue(store.idToNodeMap_['1'].isSelected); |
+ assertTrue(store.idToNodeMap_['1'].isSelectedFolder); |
// Select a deeply nested descendant. |
store.fire('selected-folder-changed', '3'); |
assertEquals('3', store.selectedId); |
- assertTrue(store.idToNodeMap_['3'].isSelected); |
- assertFalse(store.idToNodeMap_['1'].isSelected); |
+ assertTrue(store.idToNodeMap_['3'].isSelectedFolder); |
+ assertFalse(store.idToNodeMap_['1'].isSelectedFolder); |
// Select a folder in separate subtree. |
- store.fire('selected-folder-changed', '6'); |
- assertEquals('6', store.selectedId); |
- assertTrue(store.idToNodeMap_['6'].isSelected); |
- assertFalse(store.idToNodeMap_['3'].isSelected); |
+ store.fire('selected-folder-changed', '8'); |
+ assertEquals('8', store.selectedId); |
+ assertTrue(store.idToNodeMap_['8'].isSelectedFolder); |
+ assertFalse(store.idToNodeMap_['3'].isSelectedFolder); |
}); |
test('store updates on open and close', function() { |
@@ -135,13 +150,15 @@ suite('<bookmarks-store>', function() { |
store.fire('folder-open-changed', {id: '1', open: false}); |
assertFalse(store.idToNodeMap_['1'].isOpen); |
assertEquals('1', store.selectedId); |
- assertTrue(store.idToNodeMap_['1'].isSelected); |
- assertFalse(store.idToNodeMap_['3'].isSelected); |
+ assertTrue(store.idToNodeMap_['1'].isSelectedFolder); |
+ assertFalse(store.idToNodeMap_['3'].isSelectedFolder); |
}); |
test('deleting a node updates the tree', function() { |
+ removeChild(TEST_TREE, 1); |
+ overrideBookmarksGetSubTree([TEST_TREE]); |
// Remove an empty folder/bookmark. |
- store.onBookmarkRemoved_('4', {parentId: '0', index: '1'}); |
+ store.onBookmarkRemoved_('4', {parentId: '0', index: 1}); |
// Check the tree is correct. |
assertEquals('5', store.rootNode.children[1].id); |
@@ -157,18 +174,23 @@ suite('<bookmarks-store>', function() { |
'2': 'rootNode.children.#0.children.#0', |
'3': 'rootNode.children.#0.children.#1', |
'5': 'rootNode.children.#1', |
- '6': 'rootNode.children.#2', |
+ '6': 'rootNode.children.#0.children.#2', |
+ '7': 'rootNode.children.#0.children.#3', |
+ '8': 'rootNode.children.#2', |
}; |
for (var id in store.idToNodeMap_) |
assertEquals(TEST_PATHS[id], store.idToNodeMap_[id].path); |
// Remove a folder with children. |
+ removeChild(TEST_TREE, 0); |
+ overrideBookmarksGetSubTree([TEST_TREE]); |
+ |
store.onBookmarkRemoved_('1', {parentId: '0', index: '0'}); |
// Check the tree is correct. |
assertEquals('5', store.rootNode.children[0].id); |
- assertEquals('6', store.rootNode.children[1].id); |
+ assertEquals('8', store.rootNode.children[1].id); |
// idToNodeMap_ has been updated. |
assertEquals(undefined, store.idToNodeMap_['1']); |
@@ -176,13 +198,13 @@ suite('<bookmarks-store>', function() { |
assertEquals(undefined, store.idToNodeMap_['3']); |
assertEquals(undefined, store.idToNodeMap_['4']); |
assertEquals(store.rootNode.children[0], store.idToNodeMap_['5']); |
- assertEquals(store.rootNode.children[1], store.idToNodeMap_['6']); |
+ assertEquals(store.rootNode.children[1], store.idToNodeMap_['8']); |
// Paths have been updated. |
TEST_PATHS = { |
'0': 'rootNode', |
'5': 'rootNode.children.#0', |
- '6': 'rootNode.children.#1' |
+ '8': 'rootNode.children.#1' |
}; |
for (var id in store.idToNodeMap_) |
@@ -191,15 +213,21 @@ suite('<bookmarks-store>', function() { |
test('selectedId updates after removing a selected folder', function() { |
// Selected folder gets removed. |
- store.selectedId = '2'; |
- store.onBookmarkRemoved_('2', {parentId: '1', index: '0'}); |
- assertTrue(store.idToNodeMap_['1'].isSelected); |
- assertEquals('1', store.selectedId); |
+ store.selectedId = '8'; |
+ removeChild(TEST_TREE, 3); |
+ overrideBookmarksGetSubTree([TEST_TREE]); |
+ |
+ store.onBookmarkRemoved_('8', {parentId:'0', index:'3'}); |
+ assertTrue(store.idToNodeMap_['0'].isSelectedFolder); |
+ assertEquals('0', store.selectedId); |
// A folder with selected folder in it gets removed. |
store.selectedId = '3'; |
- store.onBookmarkRemoved_('1', {parentId: '0', index: '0'}); |
- assertTrue(store.idToNodeMap_['0'].isSelected); |
+ removeChild(TEST_TREE, 0); |
+ overrideBookmarksGetSubTree([TEST_TREE]); |
+ |
+ store.onBookmarkRemoved_('1', {parentId:'0', index:'0'}); |
+ assertTrue(store.idToNodeMap_['0'].isSelectedFolder); |
assertEquals('0', store.selectedId); |
}); |
@@ -228,30 +256,29 @@ suite('<bookmarks-store>', function() { |
test('displayedList updates after searchTerm changes', function() { |
var SEARCH_RESULTS = [ |
- 'cat', |
- 'apple', |
- 'Paris', |
+ createItem('1', {title: 'cat'}), |
+ createItem('2', {title: 'apple'}), |
+ createItem('3', {title: 'paris'}), |
]; |
overrideBookmarksSearch(SEARCH_RESULTS); |
// Search for a non-empty string. |
store.searchTerm = 'a'; |
- assertFalse(store.rootNode.children[0].isSelected); |
+ assertFalse(store.rootNode.children[0].isSelectedFolder); |
assertEquals(null, store.selectedId); |
assertEquals(SEARCH_RESULTS, store.displayedList); |
// Clear the searchTerm. |
store.searchTerm = ''; |
var defaultFolder = store.rootNode.children[0]; |
- assertTrue(defaultFolder.isSelected); |
+ assertTrue(defaultFolder.isSelectedFolder); |
assertEquals(defaultFolder.id, store.selectedId); |
assertEquals(defaultFolder.children, store.displayedList); |
// Search with no bookmarks returned. |
- var EMPTY_RESULT = []; |
- overrideBookmarksSearch(EMPTY_RESULT); |
+ overrideBookmarksSearch([]); |
store.searchTerm = 'asdf'; |
- assertEquals(EMPTY_RESULT, store.displayedList); |
+ assertEquals(0, store.displayedList.length); |
}); |
////////////////////////////////////////////////////////////////////////////// |
@@ -308,4 +335,161 @@ suite('<bookmarks-store>', function() { |
store.selectedId = selectedId; |
assertEquals('chrome://bookmarks/?id=' + selectedId, window.location.href); |
}); |
+ |
+ ////////////////////////////////////////////////////////////////////////////// |
+ // selection tests: |
+ |
+ test('single select selects the correct bookmark', function() { |
+ for (var id in store.idToNodeMap_) |
+ assertFalse(store.idToNodeMap_[id].isSelectedItem); |
+ |
+ store.fire('select-item', {item: store.idToNodeMap_['2']}); |
+ assertDeepEquals( |
+ [true, false, false, false], |
+ store.displayedList.map(i => i.isSelectedItem)); |
+ assertEquals(0, store.anchorIndex_); |
+ |
+ // Select other item will remove the previous selection. |
+ store.fire('select-item', {item: store.idToNodeMap_['3']}); |
+ assertDeepEquals( |
+ [false, true, false, false], |
+ store.displayedList.map(i => i.isSelectedItem)); |
+ assertEquals(1, store.anchorIndex_); |
+ |
+ // Deleting the selected item will unselect everything. |
+ store.selectedId = '1'; |
+ store.fire('select-item', {item: store.idToNodeMap_['2']}); |
+ removeChild(TEST_TREE.children[0], 0); |
+ overrideBookmarksGetSubTree([TEST_TREE.children[0]]); |
+ store.onBookmarkRemoved_('2', {parentId: '1', index: 0}); |
+ assertDeepEquals( |
+ [false, false, false], |
+ store.displayedList.map(i => i.isSelectedItem)); |
+ assertEquals(null, store.anchorIndex_); |
+ |
+ // Changing the selected folder will remove the select status of the |
+ // bookmark. |
+ store.selectedId = '3'; |
+ assertDeepEquals( |
+ [false, false, false], |
+ store.idToNodeMap_['1'].children.map(i => i.isSelectedItem)); |
+ assertEquals(null, store.anchorIndex_); |
+ }); |
+ |
+ test('shift select selects the correct bookmarks', function() { |
+ // When nothing has been selected, it selects a single item. |
+ assertEquals(null, store.anchorIndex_); |
+ store.fire('select-item', {item: store.idToNodeMap_['6'], range: true}); |
+ assertDeepEquals( |
+ [false, false, true, false], |
+ store.displayedList.map(i => i.isSelectedItem)); |
+ assertEquals(2, store.anchorIndex_); |
+ |
+ // Select an item below the previous selected item. |
+ store.fire('select-item', {item: store.idToNodeMap_['7'], range: true}); |
+ assertEquals(2, store.anchorIndex_); |
+ assertDeepEquals( |
+ [false, false, true, true], |
+ store.displayedList.map(i => i.isSelectedItem)); |
+ |
+ // Select an item above the previous selected item. |
+ store.fire('select-item', {item: store.idToNodeMap_['2'], range: true}); |
+ assertEquals(2, store.anchorIndex_); |
+ assertDeepEquals( |
+ [true, true, true, false], |
+ store.displayedList.map(i => i.isSelectedItem)); |
+ }); |
+ |
+ test('ctrl select selects the correct bookmarks', function() { |
+ // When nothing has been selected, it selects a single item. |
+ assertEquals(null, store.anchorIndex_); |
+ store.fire('select-item', {item: store.idToNodeMap_['6'], add: true}); |
+ assertDeepEquals( |
+ [false, false, true, false], |
+ store.displayedList.map(i => i.isSelectedItem)); |
+ assertEquals(2, store.anchorIndex_); |
+ |
+ // Select a new item will not deselect the previous item, but will update |
+ // anchorIndex_. |
+ store.fire('select-item', {item: store.idToNodeMap_['2'], add: true}); |
+ assertDeepEquals( |
+ [true, false, true, false], |
+ store.displayedList.map(i => i.isSelectedItem)); |
+ assertEquals(0, store.anchorIndex_); |
+ }); |
+ |
+ test('shift + ctrl select selects the correct bookmarks', function() { |
+ store.fire('select-item', {item: store.displayedList[0]}); |
+ store.fire( |
+ 'select-item', {item: store.displayedList[2], add: true, range: false}); |
+ store.fire( |
+ 'select-item', {item: store.displayedList[3], add: true, range: true}); |
+ assertDeepEquals( |
+ [true, false, true, true], |
+ store.displayedList.map(i => i.isSelectedItem)); |
+ assertEquals(2, store.anchorIndex_); |
+ }); |
+ |
+ test('selection in search mode', function() { |
+ // Item gets unselected in search. |
+ overrideBookmarksSearch([ |
+ createItem('4', {url: 'link4'}), |
+ createItem('2', {url: 'link2'}), |
+ createItem('5', {url: 'link5'}), |
+ ]); |
+ |
+ store.selectedId = '1'; |
+ store.fire('select-item', {item: store.idToNodeMap_['3']}); |
+ store.searchTerm = 'a'; |
+ assertFalse(store.idToNodeMap_['3'].isSelectedItem); |
+ assertEquals(null, store.anchorIndex_); |
+ |
+ // anchorIndex_ gets updated properly in single select. |
+ store.fire('select-item', {item: store.displayedList[1]}); |
+ assertDeepEquals( |
+ [false, true, false], |
+ store.displayedList.map(i => i.isSelectedItem)); |
+ assertEquals(1, store.anchorIndex_); |
+ |
+ // anchorIndex_ gets updated properly in ctrl select. |
+ store.fire('select-item', {item: store.displayedList[0], add: true}); |
+ assertDeepEquals( |
+ [true, true, false], |
+ store.displayedList.map(i => i.isSelectedItem)); |
+ assertEquals(0, store.anchorIndex_); |
+ |
+ // Deleting the selected item will unselect everything. |
+ store.fire('select-item', {item: store.displayedList[1]}); |
+ overrideBookmarksSearch([ |
+ createItem('4', {url: 'link4'}), |
+ createItem('5', {url: 'link5'}), |
+ ]); |
+ removeChild(TEST_TREE.children[0], 0); |
+ overrideBookmarksGetSubTree([TEST_TREE.children[0]]); |
+ |
+ store.onBookmarkRemoved_('2', {parentId: '1', index: 0}); |
+ assertDeepEquals( |
+ [false, false], |
+ store.displayedList.map(i => i.isSelectedItem)); |
+ assertEquals(null, store.anchorIndex_); |
+ |
+ // Shift+Ctrl select selects the right items. |
+ overrideBookmarksSearch([ |
+ createItem('4', {url: 'link4'}), |
+ createFolder('3', []), |
+ createItem('5', {url: 'link5'}), |
+ createItem('6', {url: 'link4'}), |
+ createItem('7', {url: 'link5'}), |
+ ]); |
+ store.searchTerm = 'b'; |
+ store.fire('select-item', {item: store.displayedList[0]}); |
+ store.fire( |
+ 'select-item', {item: store.displayedList[2], add: true, range: false}); |
+ store.fire( |
+ 'select-item', {item: store.displayedList[4], add: true, range: true}); |
+ assertDeepEquals( |
+ [true, false, true, true, true], |
+ store.displayedList.map(i => i.isSelectedItem)); |
+ assertEquals(2, store.anchorIndex_); |
+ }); |
}); |