| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 suite('<bookmarks-store>', function() { | 5 suite('<bookmarks-store>', function() { |
| 6 var store; | 6 var store; |
| 7 var TEST_TREE; | 7 var TEST_TREE; |
| 8 | 8 |
| 9 function replaceStore() { | 9 function replaceStore() { |
| 10 store = document.createElement('bookmarks-store'); | 10 store = document.createElement('bookmarks-store'); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 '8': 'rootNode.children.#3', | 86 '8': 'rootNode.children.#3', |
| 87 }; | 87 }; |
| 88 | 88 |
| 89 for (var id in store.idToNodeMap_) | 89 for (var id in store.idToNodeMap_) |
| 90 assertEquals(TEST_PATHS[id], store.idToNodeMap_[id].path); | 90 assertEquals(TEST_PATHS[id], store.idToNodeMap_[id].path); |
| 91 }); | 91 }); |
| 92 | 92 |
| 93 ////////////////////////////////////////////////////////////////////////////// | 93 ////////////////////////////////////////////////////////////////////////////// |
| 94 // editing bookmarks tree tests: | 94 // editing bookmarks tree tests: |
| 95 | 95 |
| 96 test('changing selectedId changes the displayedList', function() { | |
| 97 store.selectedId = '0'; | |
| 98 assertEquals(TEST_TREE.children, store.displayedList); | |
| 99 store.selectedId = '1'; | |
| 100 assertEquals(TEST_TREE.children[0].children, store.displayedList); | |
| 101 store.selectedId = '3'; | |
| 102 assertEquals( | |
| 103 TEST_TREE.children[0].children[1].children, store.displayedList); | |
| 104 | |
| 105 // Selecting an item selects the default folder. | |
| 106 store.selectedId = '5'; | |
| 107 assertEquals(TEST_TREE.children[0].children, store.displayedList); | |
| 108 }); | |
| 109 | |
| 110 test('store updates on selected event', function() { | 96 test('store updates on selected event', function() { |
| 111 // First child of root is selected by default. | 97 // First child of root is selected by default. |
| 112 assertEquals('1', store.selectedId); | 98 assertEquals('1', store.selectedId); |
| 113 assertTrue(store.idToNodeMap_['1'].isSelectedFolder); | 99 assertTrue(store.idToNodeMap_['1'].isSelectedFolder); |
| 114 | 100 |
| 115 // Selecting a selected folder doesn't deselect it. | 101 // Selecting a selected folder doesn't deselect it. |
| 116 store.fire('selected-folder-changed', '1'); | 102 store.fire('selected-folder-changed', {id: '1', clearSearch: true}); |
| 117 assertEquals('1', store.selectedId); | 103 assertEquals('1', store.selectedId); |
| 118 assertTrue(store.idToNodeMap_['1'].isSelectedFolder); | 104 assertTrue(store.idToNodeMap_['1'].isSelectedFolder); |
| 119 | 105 |
| 120 // Select a deeply nested descendant. | 106 // Select a deeply nested descendant. |
| 121 store.fire('selected-folder-changed', '3'); | 107 store.fire('selected-folder-changed', {id: '3', clearSearch: true}); |
| 122 assertEquals('3', store.selectedId); | 108 assertEquals('3', store.selectedId); |
| 123 assertTrue(store.idToNodeMap_['3'].isSelectedFolder); | 109 assertTrue(store.idToNodeMap_['3'].isSelectedFolder); |
| 124 assertFalse(store.idToNodeMap_['1'].isSelectedFolder); | 110 assertFalse(store.idToNodeMap_['1'].isSelectedFolder); |
| 125 | 111 |
| 126 // Select a folder in separate subtree. | 112 // Select a folder in separate subtree. |
| 127 store.fire('selected-folder-changed', '8'); | 113 store.fire('selected-folder-changed', {id: '8', clearSearch: true}); |
| 128 assertEquals('8', store.selectedId); | 114 assertEquals('8', store.selectedId); |
| 129 assertTrue(store.idToNodeMap_['8'].isSelectedFolder); | 115 assertTrue(store.idToNodeMap_['8'].isSelectedFolder); |
| 130 assertFalse(store.idToNodeMap_['3'].isSelectedFolder); | 116 assertFalse(store.idToNodeMap_['3'].isSelectedFolder); |
| 131 }); | 117 }); |
| 132 | 118 |
| 133 test('store updates on open and close', function() { | 119 test('store updates on open and close', function() { |
| 134 // All folders are open by default. | 120 // All folders are open by default. |
| 135 for (var id in store.idToNodeMap_) { | 121 for (var id in store.idToNodeMap_) { |
| 136 if (store.idToNodeMap_[id].url) | 122 if (store.idToNodeMap_[id].url) |
| 137 continue; | 123 continue; |
| 138 | 124 |
| 139 assertTrue(store.idToNodeMap_[id].isOpen); | 125 assertTrue(store.idToNodeMap_[id].isOpen); |
| 140 } | 126 } |
| 141 | 127 |
| 142 // Closing a folder doesn't close any descendants. | 128 // Closing a folder doesn't close any descendants. |
| 143 store.fire('folder-open-changed', {id: '1', open: false}); | 129 store.fire('folder-open-changed', {id: '1', open: false}); |
| 144 assertFalse(store.idToNodeMap_['1'].isOpen); | 130 assertFalse(store.idToNodeMap_['1'].isOpen); |
| 145 assertTrue(store.idToNodeMap_['3'].isOpen); | 131 assertTrue(store.idToNodeMap_['3'].isOpen); |
| 146 store.fire('folder-open-changed', {id: '1', open: true}); | 132 store.fire('folder-open-changed', {id: '1', open: true}); |
| 147 | 133 |
| 148 // Closing an ancestor folder of a selected folder selects the ancestor. | 134 // Closing an ancestor folder of a selected folder selects the ancestor. |
| 149 store.fire('selected-folder-changed', '3'); | 135 store.selectFolder('3'); |
| 150 store.fire('folder-open-changed', {id: '1', open: false}); | 136 store.fire('folder-open-changed', {id: '1', open: false}); |
| 151 assertFalse(store.idToNodeMap_['1'].isOpen); | 137 assertFalse(store.idToNodeMap_['1'].isOpen); |
| 152 assertEquals('1', store.selectedId); | 138 assertEquals('1', store.selectedId); |
| 153 assertTrue(store.idToNodeMap_['1'].isSelectedFolder); | 139 assertTrue(store.idToNodeMap_['1'].isSelectedFolder); |
| 154 assertFalse(store.idToNodeMap_['3'].isSelectedFolder); | 140 assertFalse(store.idToNodeMap_['3'].isSelectedFolder); |
| 155 }); | 141 }); |
| 156 | 142 |
| 157 test('parent folder opens when descendant folder is selected', function() { | 143 test('parent folder opens when descendant folder is selected', function() { |
| 158 store.idToNodeMap_['0'].isOpen = false; | 144 store.idToNodeMap_['0'].isOpen = false; |
| 159 store.idToNodeMap_['1'].isOpen = false; | 145 store.idToNodeMap_['1'].isOpen = false; |
| 160 store.idToNodeMap_['3'].isOpen = false; | 146 store.idToNodeMap_['3'].isOpen = false; |
| 161 store.fire('selected-folder-changed', '3'); | 147 store.selectFolder('3'); |
| 162 assertTrue(store.idToNodeMap_['0'].isOpen); | |
| 163 assertTrue(store.idToNodeMap_['1'].isOpen); | 148 assertTrue(store.idToNodeMap_['1'].isOpen); |
| 164 assertFalse(store.idToNodeMap_['3'].isOpen); | 149 assertFalse(store.idToNodeMap_['3'].isOpen); |
| 165 }); | 150 }); |
| 166 | 151 |
| 167 test('deleting a node updates the tree', function() { | 152 test('deleting a node updates the tree', function() { |
| 168 removeChild(TEST_TREE, 1); | 153 removeChild(TEST_TREE, 1); |
| 169 overrideBookmarksGetSubTree([TEST_TREE]); | 154 overrideBookmarksGetSubTree([TEST_TREE]); |
| 170 // Remove an empty folder/bookmark. | 155 // Remove an empty folder/bookmark. |
| 171 store.onBookmarkRemoved_('4', {parentId: '0', index: 1}); | 156 store.onBookmarkRemoved_('4', {parentId: '0', index: 1}); |
| 172 | 157 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 '5': 'rootNode.children.#0', | 201 '5': 'rootNode.children.#0', |
| 217 '8': 'rootNode.children.#1' | 202 '8': 'rootNode.children.#1' |
| 218 }; | 203 }; |
| 219 | 204 |
| 220 for (var id in store.idToNodeMap_) | 205 for (var id in store.idToNodeMap_) |
| 221 assertEquals(TEST_PATHS[id], store.idToNodeMap_[id].path); | 206 assertEquals(TEST_PATHS[id], store.idToNodeMap_[id].path); |
| 222 }); | 207 }); |
| 223 | 208 |
| 224 test('selectedId updates after removing a selected folder', function() { | 209 test('selectedId updates after removing a selected folder', function() { |
| 225 // Selected folder gets removed. | 210 // Selected folder gets removed. |
| 226 store.selectedId = '8'; | 211 store.selectFolder('8'); |
| 227 removeChild(TEST_TREE, 3); | 212 removeChild(TEST_TREE, 3); |
| 228 overrideBookmarksGetSubTree([TEST_TREE]); | 213 overrideBookmarksGetSubTree([TEST_TREE]); |
| 229 | 214 |
| 230 store.onBookmarkRemoved_('8', {parentId:'0', index:'3'}); | 215 store.onBookmarkRemoved_('8', {parentId:'0', index:'3'}); |
| 231 assertTrue(store.idToNodeMap_['0'].isSelectedFolder); | 216 assertTrue(store.idToNodeMap_['0'].isSelectedFolder); |
| 232 assertEquals('0', store.selectedId); | 217 assertEquals('0', store.selectedId); |
| 233 | 218 |
| 234 // A folder with selected folder in it gets removed. | 219 // A folder with selected folder in it gets removed. |
| 235 store.selectedId = '3'; | 220 store.selectFolder('3'); |
| 236 removeChild(TEST_TREE, 0); | 221 removeChild(TEST_TREE, 0); |
| 237 overrideBookmarksGetSubTree([TEST_TREE]); | 222 overrideBookmarksGetSubTree([TEST_TREE]); |
| 238 | 223 |
| 239 store.onBookmarkRemoved_('1', {parentId:'0', index:'0'}); | 224 store.onBookmarkRemoved_('1', {parentId:'0', index:'0'}); |
| 240 assertTrue(store.idToNodeMap_['0'].isSelectedFolder); | 225 assertTrue(store.idToNodeMap_['0'].isSelectedFolder); |
| 241 assertEquals('0', store.selectedId); | 226 assertEquals('0', store.selectedId); |
| 242 }); | 227 }); |
| 243 | 228 |
| 244 test('bookmark gets updated after editing', function() { | 229 test('bookmark gets updated after editing', function() { |
| 245 // Edit title updates idToNodeMap_ properly. | 230 // Edit title updates idToNodeMap_ properly. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 270 ////////////////////////////////////////////////////////////////////////////// | 255 ////////////////////////////////////////////////////////////////////////////// |
| 271 // search tests: | 256 // search tests: |
| 272 | 257 |
| 273 test('displayedList updates after searchTerm changes', function() { | 258 test('displayedList updates after searchTerm changes', function() { |
| 274 var SEARCH_RESULTS = [ | 259 var SEARCH_RESULTS = [ |
| 275 createItem('1', {title: 'cat'}), | 260 createItem('1', {title: 'cat'}), |
| 276 createItem('2', {title: 'apple'}), | 261 createItem('2', {title: 'apple'}), |
| 277 createItem('3', {title: 'paris'}), | 262 createItem('3', {title: 'paris'}), |
| 278 ]; | 263 ]; |
| 279 overrideBookmarksSearch(SEARCH_RESULTS); | 264 overrideBookmarksSearch(SEARCH_RESULTS); |
| 265 var prevFolder = store.idToNodeMap_[store.selectedId]; |
| 280 | 266 |
| 281 // Search for a non-empty string. | 267 // Search for a non-empty string. |
| 282 store.searchTerm = 'a'; | 268 store.searchTerm = 'a'; |
| 283 assertFalse(store.rootNode.children[0].isSelectedFolder); | 269 assertFalse(prevFolder.isSelectedFolder); |
| 284 assertEquals(null, store.selectedId); | 270 assertEquals(prevFolder.id, store.selectedId); |
| 285 assertEquals(SEARCH_RESULTS, store.displayedList); | 271 assertEquals(SEARCH_RESULTS, store.displayedList); |
| 286 | 272 |
| 287 // Clear the searchTerm. | 273 // Clearing search sets the displayed list to the previous folder. |
| 288 store.searchTerm = ''; | 274 store.searchTerm = ''; |
| 289 var defaultFolder = store.rootNode.children[0]; | 275 assertTrue(prevFolder.isSelectedFolder); |
| 290 assertTrue(defaultFolder.isSelectedFolder); | 276 assertEquals(prevFolder.id, store.selectedId); |
| 291 assertEquals(defaultFolder.id, store.selectedId); | 277 assertEquals(prevFolder.children, store.displayedList); |
| 292 assertEquals(defaultFolder.children, store.displayedList); | |
| 293 | 278 |
| 294 // Search with no bookmarks returned. | 279 // Search with no bookmarks returned. |
| 295 overrideBookmarksSearch([]); | 280 overrideBookmarksSearch([]); |
| 296 store.searchTerm = 'asdf'; | 281 store.searchTerm = 'asdf'; |
| 297 assertEquals(0, store.displayedList.length); | 282 assertEquals(0, store.displayedList.length); |
| 298 }); | 283 }); |
| 299 | 284 |
| 300 ////////////////////////////////////////////////////////////////////////////// | 285 ////////////////////////////////////////////////////////////////////////////// |
| 301 // router tests: | 286 // router tests: |
| 302 | 287 |
| 303 test('search updates from route', function() { | 288 test('search updates from route', function() { |
| 304 overrideBookmarksSearch([]); | 289 overrideBookmarksSearch([]); |
| 290 |
| 291 // Route with basic search. |
| 305 searchTerm = 'Pond'; | 292 searchTerm = 'Pond'; |
| 306 navigateTo('/?q=' + searchTerm); | 293 navigateTo('/?q=' + searchTerm); |
| 307 assertEquals(searchTerm, store.searchTerm); | 294 assertEquals(searchTerm, store.searchTerm); |
| 295 assertEquals(store.rootNode.children[0].id, store.selectedId); |
| 296 |
| 297 // Route with selected folder and search. |
| 298 var selectedId = '3'; |
| 299 searchTerm = 'Fish'; |
| 300 navigateTo('/?id=' + selectedId + '&q=' + searchTerm); |
| 301 assertEquals(searchTerm, store.searchTerm); |
| 302 assertEquals(selectedId, store.selectedId); |
| 303 |
| 304 // Route with invalid selected folder and search. |
| 305 selectedId = 'bar'; |
| 306 searchTerm = 'foo'; |
| 307 navigateTo('/?q=' + searchTerm + '&id=' + selectedId); |
| 308 assertEquals(searchTerm, store.searchTerm); |
| 309 assertEquals(store.rootNode.children[0].id, store.selectedId); |
| 308 }); | 310 }); |
| 309 | 311 |
| 310 test('search updates from route on setup', function() { | 312 test('search updates from route on setup', function() { |
| 311 overrideBookmarksSearch([]); | 313 overrideBookmarksSearch([]); |
| 312 var searchTerm = 'Boat24'; | 314 var searchTerm = 'Boat24'; |
| 313 navigateTo('/?q=' + searchTerm); | 315 navigateTo('/?q=' + searchTerm); |
| 314 replaceStore(); | 316 replaceStore(); |
| 315 assertEquals(searchTerm, store.searchTerm); | 317 assertEquals(searchTerm, store.searchTerm); |
| 316 }); | 318 }); |
| 317 | 319 |
| 318 test('route updates from search', function() { | 320 test('route updates from search', function() { |
| 319 overrideBookmarksSearch([]); | 321 overrideBookmarksSearch([]); |
| 322 var prevFolderId = '3'; |
| 323 store.selectFolder(prevFolderId); |
| 324 |
| 325 // Searching sets the previous folder and searchTerm as the URL parameters. |
| 320 var searchTerm = 'Boat24'; | 326 var searchTerm = 'Boat24'; |
| 321 store.searchTerm = searchTerm; | 327 store.searchTerm = searchTerm; |
| 322 assertEquals('chrome://bookmarks/?q=' + searchTerm, window.location.href); | 328 assertEquals( |
| 329 'chrome://bookmarks/?id=' + prevFolderId + '&q=' + searchTerm, |
| 330 window.location.href); |
| 331 |
| 332 // Search parameter is removed from the URL when search is cleared. |
| 333 searchTerm = ''; |
| 334 store.searchTerm = searchTerm; |
| 335 assertEquals( |
| 336 'chrome://bookmarks/?id=' + prevFolderId, window.location.href); |
| 323 }); | 337 }); |
| 324 | 338 |
| 325 test('selectedId updates from route', function() { | 339 test('selectedId updates from route', function() { |
| 326 // Folder id routes to the corresponding folder. | 340 // Folder id routes to the corresponding folder. |
| 327 var selectedId = '3'; | 341 var selectedId = '3'; |
| 328 navigateTo('/?id=' + selectedId); | 342 navigateTo('/?id=' + selectedId); |
| 329 assertEquals(selectedId, store.selectedId); | 343 assertEquals(selectedId, store.selectedId); |
| 330 | 344 |
| 331 // Bookmark id routes to the default Bookmarks Bar. | 345 // Bookmark id routes to the default Bookmarks Bar. |
| 332 var selectedId = '2'; | 346 var selectedId = '2'; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 assertEquals(0, store.anchorIndex_); | 380 assertEquals(0, store.anchorIndex_); |
| 367 | 381 |
| 368 // Select other item will remove the previous selection. | 382 // Select other item will remove the previous selection. |
| 369 store.fire('select-item', {item: store.idToNodeMap_['3']}); | 383 store.fire('select-item', {item: store.idToNodeMap_['3']}); |
| 370 assertDeepEquals( | 384 assertDeepEquals( |
| 371 [false, true, false, false], | 385 [false, true, false, false], |
| 372 store.displayedList.map(i => i.isSelectedItem)); | 386 store.displayedList.map(i => i.isSelectedItem)); |
| 373 assertEquals(1, store.anchorIndex_); | 387 assertEquals(1, store.anchorIndex_); |
| 374 | 388 |
| 375 // Deleting the selected item will unselect everything. | 389 // Deleting the selected item will unselect everything. |
| 376 store.selectedId = '1'; | 390 store.selectFolder('1'); |
| 377 store.fire('select-item', {item: store.idToNodeMap_['2']}); | 391 store.fire('select-item', {item: store.idToNodeMap_['2']}); |
| 378 removeChild(TEST_TREE.children[0], 0); | 392 removeChild(TEST_TREE.children[0], 0); |
| 379 overrideBookmarksGetSubTree([TEST_TREE.children[0]]); | 393 overrideBookmarksGetSubTree([TEST_TREE.children[0]]); |
| 380 store.onBookmarkRemoved_('2', {parentId: '1', index: 0}); | 394 store.onBookmarkRemoved_('2', {parentId: '1', index: 0}); |
| 381 assertDeepEquals( | 395 assertDeepEquals( |
| 382 [false, false, false], | 396 [false, false, false], |
| 383 store.displayedList.map(i => i.isSelectedItem)); | 397 store.displayedList.map(i => i.isSelectedItem)); |
| 384 assertEquals(null, store.anchorIndex_); | 398 assertEquals(null, store.anchorIndex_); |
| 385 | 399 |
| 386 // Changing the selected folder will remove the select status of the | 400 // Changing the selected folder will remove the select status of the |
| 387 // bookmark. | 401 // bookmark. |
| 388 store.selectedId = '3'; | 402 store.selectFolder('3'); |
| 389 assertDeepEquals( | 403 assertDeepEquals( |
| 390 [false, false, false], | 404 [false, false, false], |
| 391 store.idToNodeMap_['1'].children.map(i => i.isSelectedItem)); | 405 store.idToNodeMap_['1'].children.map(i => i.isSelectedItem)); |
| 392 assertEquals(null, store.anchorIndex_); | 406 assertEquals(null, store.anchorIndex_); |
| 393 }); | 407 }); |
| 394 | 408 |
| 395 test('shift select selects the correct bookmarks', function() { | 409 test('shift select selects the correct bookmarks', function() { |
| 396 // When nothing has been selected, it selects a single item. | 410 // When nothing has been selected, it selects a single item. |
| 397 assertEquals(null, store.anchorIndex_); | 411 assertEquals(null, store.anchorIndex_); |
| 398 store.fire('select-item', {item: store.idToNodeMap_['6'], range: true}); | 412 store.fire('select-item', {item: store.idToNodeMap_['6'], range: true}); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 }); | 461 }); |
| 448 | 462 |
| 449 test('selection in search mode', function() { | 463 test('selection in search mode', function() { |
| 450 // Item gets unselected in search. | 464 // Item gets unselected in search. |
| 451 overrideBookmarksSearch([ | 465 overrideBookmarksSearch([ |
| 452 createItem('4', {url: 'link4'}), | 466 createItem('4', {url: 'link4'}), |
| 453 createItem('2', {url: 'link2'}), | 467 createItem('2', {url: 'link2'}), |
| 454 createItem('5', {url: 'link5'}), | 468 createItem('5', {url: 'link5'}), |
| 455 ]); | 469 ]); |
| 456 | 470 |
| 457 store.selectedId = '1'; | 471 store.selectFolder('1'); |
| 458 store.fire('select-item', {item: store.idToNodeMap_['3']}); | 472 store.fire('select-item', {item: store.idToNodeMap_['3']}); |
| 459 store.searchTerm = 'a'; | 473 store.searchTerm = 'a'; |
| 460 assertFalse(store.idToNodeMap_['3'].isSelectedItem); | 474 assertFalse(store.idToNodeMap_['3'].isSelectedItem); |
| 461 assertEquals(null, store.anchorIndex_); | 475 assertEquals(null, store.anchorIndex_); |
| 462 | 476 |
| 463 // anchorIndex_ gets updated properly in single select. | 477 // anchorIndex_ gets updated properly in single select. |
| 464 store.fire('select-item', {item: store.displayedList[1]}); | 478 store.fire('select-item', {item: store.displayedList[1]}); |
| 465 assertDeepEquals( | 479 assertDeepEquals( |
| 466 [false, true, false], | 480 [false, true, false], |
| 467 store.displayedList.map(i => i.isSelectedItem)); | 481 store.displayedList.map(i => i.isSelectedItem)); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 store.fire( | 516 store.fire( |
| 503 'select-item', {item: store.displayedList[2], add: true, range: false}); | 517 'select-item', {item: store.displayedList[2], add: true, range: false}); |
| 504 store.fire( | 518 store.fire( |
| 505 'select-item', {item: store.displayedList[4], add: true, range: true}); | 519 'select-item', {item: store.displayedList[4], add: true, range: true}); |
| 506 assertDeepEquals( | 520 assertDeepEquals( |
| 507 [true, false, true, true, true], | 521 [true, false, true, true, true], |
| 508 store.displayedList.map(i => i.isSelectedItem)); | 522 store.displayedList.map(i => i.isSelectedItem)); |
| 509 assertEquals(2, store.anchorIndex_); | 523 assertEquals(2, store.anchorIndex_); |
| 510 }); | 524 }); |
| 511 }); | 525 }); |
| OLD | NEW |