Chromium Code Reviews| 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..d191f66350ef0dbcbb74ed83817b3fdc1ac80134 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); |
|
calamity
2017/02/03 03:34:59
Shouldn't this test be removing the same node as i
jiaxi
2017/02/06 02:01:01
This is removing the same node as in selectedId, s
calamity
2017/02/06 03:19:49
Ah, removeChild works by index. My bad.
|
| + 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. |
| + removeChild(TEST_TREE, 0); |
| + overrideBookmarksGetSubTree([TEST_TREE]); |
| + |
| store.selectedId = '3'; |
| - store.onBookmarkRemoved_('1', {parentId: '0', index: '0'}); |
| - assertTrue(store.idToNodeMap_['0'].isSelected); |
| + 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_); |
| + |
| + // Delete 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_); |
| + |
| + // Delete the selected item will unselect everything. |
|
calamity
2017/02/03 03:34:59
nit: Deleting
jiaxi
2017/02/06 02:01:01
Done.
|
| + 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 item. |
|
calamity
2017/02/03 03:34:59
s/select //
s/item/items/
jiaxi
2017/02/06 02:01:01
Done.
|
| + 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_); |
| + }); |
| }); |