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-folder-node>', function() { | 5 suite('<bookmarks-folder-node>', function() { |
6 var rootNode; | 6 var rootNode; |
7 var store; | 7 var store; |
| 8 var focusedNode; |
| 9 |
| 10 function getFolderNode(id) { |
| 11 return findFolderNode(rootNode, id); |
| 12 } |
8 | 13 |
9 setup(function() { | 14 setup(function() { |
10 store = new bookmarks.TestStore({ | 15 store = new bookmarks.TestStore({ |
11 nodes: testTree( | 16 nodes: testTree( |
12 createFolder( | 17 createFolder( |
13 '1', | 18 '1', |
14 [ | 19 [ |
15 createFolder( | 20 createFolder( |
16 '2', | 21 '2', |
17 [ | 22 [ |
18 createFolder('3', []), | 23 createFolder('3', []), |
19 createFolder('4', []), | 24 createFolder('4', []), |
20 ]), | 25 ]), |
21 createItem('5'), | 26 createItem('5'), |
22 ]), | 27 ]), |
23 createFolder('7', [])), | 28 createFolder('7', [])), |
| 29 selectedFolder: '1', |
24 }); | 30 }); |
25 bookmarks.Store.instance_ = store; | 31 bookmarks.Store.instance_ = store; |
26 | 32 |
27 rootNode = document.createElement('bookmarks-folder-node'); | 33 rootNode = document.createElement('bookmarks-folder-node'); |
28 rootNode.itemId = '0'; | 34 rootNode.itemId = '0'; |
29 rootNode.depth = -1; | 35 rootNode.depth = -1; |
| 36 rootNode.addEventListener('folder-node-focus-changed', (e) => { |
| 37 focusedNode = e.detail; |
| 38 }); |
30 replaceBody(rootNode); | 39 replaceBody(rootNode); |
31 Polymer.dom.flush(); | 40 Polymer.dom.flush(); |
32 }); | 41 }); |
33 | 42 |
34 test('selecting and deselecting folders dispatches action', function() { | 43 test('selecting and deselecting folders dispatches action', function() { |
35 var rootFolders = rootNode.root.querySelectorAll('bookmarks-folder-node'); | 44 var rootFolders = rootNode.root.querySelectorAll('bookmarks-folder-node'); |
36 var firstGen = rootFolders[0].$['descendants'].querySelectorAll( | 45 var firstGen = rootFolders[0].$['descendants'].querySelectorAll( |
37 'bookmarks-folder-node'); | 46 'bookmarks-folder-node'); |
38 var secondGen = | 47 var secondGen = |
39 firstGen[0].$['descendants'].querySelectorAll('bookmarks-folder-node'); | 48 firstGen[0].$['descendants'].querySelectorAll('bookmarks-folder-node'); |
(...skipping 28 matching lines...) Expand all Loading... |
68 }); | 77 }); |
69 Array.prototype.forEach.call(secondGen, function(f) { | 78 Array.prototype.forEach.call(secondGen, function(f) { |
70 assertEquals(2, f.depth); | 79 assertEquals(2, f.depth); |
71 assertEquals('2', f.style.getPropertyValue('--node-depth')); | 80 assertEquals('2', f.style.getPropertyValue('--node-depth')); |
72 }); | 81 }); |
73 }); | 82 }); |
74 | 83 |
75 test('doesn\'t highlight selected folder while searching', function() { | 84 test('doesn\'t highlight selected folder while searching', function() { |
76 var rootFolders = rootNode.root.querySelectorAll('bookmarks-folder-node'); | 85 var rootFolders = rootNode.root.querySelectorAll('bookmarks-folder-node'); |
77 | 86 |
78 store.data.selectedFolder = '1'; | |
79 store.notifyObservers(); | |
80 | |
81 assertEquals('1', rootFolders['0'].itemId); | 87 assertEquals('1', rootFolders['0'].itemId); |
82 assertTrue(rootFolders['0'].isSelectedFolder_); | 88 assertTrue(rootFolders['0'].isSelectedFolder_); |
83 | 89 |
84 store.data.search = { | 90 store.data.search = { |
85 term: 'test', | 91 term: 'test', |
86 inProgress: false, | 92 inProgress: false, |
87 results: ['3'], | 93 results: ['3'], |
88 }; | 94 }; |
89 store.notifyObservers(); | 95 store.notifyObservers(); |
90 | 96 |
91 assertFalse(rootFolders['0'].isSelectedFolder_); | 97 assertFalse(rootFolders['0'].isSelectedFolder_); |
92 }); | 98 }); |
| 99 |
| 100 test('last visible descendant', function() { |
| 101 assertEquals('7', rootNode.getLastVisibleDescendant_().itemId); |
| 102 assertEquals('4', getFolderNode('1').getLastVisibleDescendant_().itemId); |
| 103 |
| 104 store.data.closedFolders = new Set('2'); |
| 105 store.notifyObservers(); |
| 106 |
| 107 assertEquals('2', getFolderNode('1').getLastVisibleDescendant_().itemId); |
| 108 }); |
| 109 |
| 110 test('next/previous folder nodes', function() { |
| 111 function getNextVisibleFolderNode(parentId, targetId, reverse) { |
| 112 return getFolderNode(parentId).getNextVisibleFolderNode_( |
| 113 reverse, getFolderNode(targetId)); |
| 114 } |
| 115 |
| 116 // Forwards. |
| 117 assertEquals('2', getNextVisibleFolderNode('1', '1', false).itemId); |
| 118 assertEquals('4', getNextVisibleFolderNode('2', '3', false).itemId); |
| 119 assertEquals(null, getNextVisibleFolderNode('2', '4', false)); |
| 120 |
| 121 // Backwards. |
| 122 assertEquals('1', getNextVisibleFolderNode('1', '2', true).itemId); |
| 123 assertEquals('3', getNextVisibleFolderNode('2', '4', true).itemId); |
| 124 assertEquals('4', getNextVisibleFolderNode('0', '7', true).itemId); |
| 125 |
| 126 // Skips closed folders. |
| 127 store.data.closedFolders = new Set('2'); |
| 128 store.notifyObservers(); |
| 129 |
| 130 assertEquals(null, getNextVisibleFolderNode('1', '2', false)); |
| 131 assertEquals(null, getNextVisibleFolderNode('2', '2', false)); |
| 132 assertEquals('2', getNextVisibleFolderNode('0', '7', true).itemId); |
| 133 }); |
| 134 |
| 135 test('keyboard selection', function() { |
| 136 var focusedId; |
| 137 |
| 138 function changeKeyboardFocus(direction, targetId, activeElementId) { |
| 139 return getFolderNode(targetId ? targetId : focusedId) |
| 140 .changeKeyboardSelection_( |
| 141 direction, |
| 142 activeElementId ? getFolderNode(activeElementId) : |
| 143 getFolderNode(focusedId).$.container); |
| 144 } |
| 145 |
| 146 store.data.closedFolders = new Set('2'); |
| 147 store.notifyObservers(); |
| 148 |
| 149 // The selected folder is focus enabled on attach. |
| 150 focusedId = '1'; |
| 151 assertEquals(focusedId, focusedNode.itemId); |
| 152 |
| 153 // Move down into child. |
| 154 assertTrue(changeKeyboardFocus(1)); |
| 155 focusedId = '2'; |
| 156 assertEquals(focusedId, focusedNode.itemId); |
| 157 |
| 158 // Move down past closed folders. |
| 159 assertFalse(changeKeyboardFocus(1)); |
| 160 assertFalse(changeKeyboardFocus(1, '1', '2')); |
| 161 assertTrue(changeKeyboardFocus(1, '0', '1')); |
| 162 focusedId = '7'; |
| 163 assertEquals(focusedId, focusedNode.itemId); |
| 164 |
| 165 // Move down past end of list. |
| 166 assertFalse(changeKeyboardFocus(1)); |
| 167 assertFalse(changeKeyboardFocus(1, '0', '7')); |
| 168 focusedId = '7'; |
| 169 assertEquals(focusedId, focusedNode.itemId); |
| 170 |
| 171 // Move up past closed folders. |
| 172 assertFalse(changeKeyboardFocus(-1)); |
| 173 assertTrue(changeKeyboardFocus(-1, '0', '7')); |
| 174 focusedId = '2'; |
| 175 assertEquals(focusedId, focusedNode.itemId); |
| 176 |
| 177 // Move up into parent. |
| 178 assertFalse(changeKeyboardFocus(-1)); |
| 179 assertTrue(changeKeyboardFocus(-1, '1', '2')); |
| 180 focusedId = '1'; |
| 181 assertEquals(focusedId, focusedNode.itemId); |
| 182 |
| 183 // Move up past start of list. |
| 184 assertFalse(changeKeyboardFocus(-1)); |
| 185 assertTrue(changeKeyboardFocus(-1, '0', '1')); |
| 186 focusedId = '1'; |
| 187 assertEquals(focusedId, focusedNode.itemId); |
| 188 }); |
93 }); | 189 }); |
OLD | NEW |