Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 suite('drag and drop', function() { | |
| 6 var app; | |
| 7 var list; | |
| 8 var sidebar; | |
| 9 var store; | |
| 10 var dnd_manager; | |
|
tsergeant
2017/03/23 00:28:23
underscoresArentReallyTheStyle
calamity
2017/03/23 06:12:34
but_im_a_hacker_
| |
| 11 var draggedIds; | |
| 12 | |
| 13 var DRAG_STYLE = { | |
| 14 NONE: 0, | |
| 15 ON: 1, | |
| 16 ABOVE: 2, | |
| 17 BELOW: 3, | |
| 18 }; | |
| 19 | |
| 20 function getFolderNode(id) { | |
| 21 var nodes = [sidebar]; | |
| 22 var node; | |
| 23 while (nodes.length) { | |
| 24 node = nodes.pop(); | |
| 25 if (node.itemId == id) | |
| 26 return node; | |
| 27 | |
| 28 node.root.querySelectorAll('bookmarks-folder-node') | |
| 29 .forEach((x) => {nodes.unshift(x)}); | |
| 30 } | |
| 31 } | |
| 32 | |
| 33 function getListItem(id) { | |
| 34 var items = list.root.querySelectorAll('bookmarks-item'); | |
| 35 for (var i = 0; i < items.length; i++) { | |
| 36 if (items[i].itemId == id) | |
| 37 return items[i]; | |
| 38 } | |
| 39 } | |
| 40 | |
| 41 function dispatchDragEvent(type, node, xy) { | |
| 42 xy = xy || MockInteractions.middleOfNode(node); | |
| 43 var props = { | |
| 44 bubbles: true, | |
| 45 cancelable: true, | |
| 46 clientX: xy.x, | |
| 47 clientY: xy.y, | |
| 48 // Make this a primary input. | |
| 49 buttons: 1, | |
| 50 }; | |
| 51 var e = new DragEvent(type, props); | |
| 52 node.dispatchEvent(e); | |
| 53 } | |
| 54 | |
| 55 function assertDragStyle(bookmarkElement, style) { | |
| 56 var dragStyles = {}; | |
| 57 dragStyles[DRAG_STYLE.ON] = 'drag-on'; | |
| 58 dragStyles[DRAG_STYLE.ABOVE] = 'drag-above'; | |
| 59 dragStyles[DRAG_STYLE.BELOW] = 'drag-below'; | |
| 60 | |
| 61 var classList = bookmarkElement.getDropTarget().classList; | |
| 62 Object.keys(dragStyles) | |
| 63 .forEach( | |
| 64 dragStyle => assertEquals( | |
|
tsergeant
2017/03/23 00:28:23
This is pretty hard to read. Maybe add {} to the f
calamity
2017/03/23 06:12:34
Done.
| |
| 65 dragStyle == style, classList.contains(dragStyles[dragStyle]), | |
| 66 dragStyles[dragStyle] + | |
| 67 (dragStyle == style ? ' missing' : ' found') + | |
| 68 ' in classList ' + classList)); | |
| 69 } | |
| 70 | |
| 71 function createDragData(ids, sameProfile) { | |
|
tsergeant
2017/03/23 00:28:23
You don't test sameProfile anywhere: seems like it
calamity
2017/03/23 06:12:34
Done.
| |
| 72 return { | |
| 73 elements: ids.map(id => store.data.nodes[id]), | |
| 74 sameProfile: sameProfile == undefined ? true : sameProfile, | |
| 75 } | |
| 76 } | |
| 77 | |
| 78 setup(function() { | |
| 79 store = new bookmarks.TestStore({ | |
| 80 nodes: testTree( | |
| 81 createFolder( | |
| 82 '1', | |
| 83 [ | |
| 84 createFolder( | |
| 85 '11', | |
| 86 [ | |
| 87 createFolder('111', []), | |
| 88 createFolder('112', []), | |
| 89 ]), | |
| 90 createItem('12'), | |
| 91 createItem('13'), | |
| 92 createFolder('14', []), | |
| 93 createFolder('15', []), | |
| 94 ]), | |
| 95 createFolder('2', [])), | |
| 96 selectedFolder: '1', | |
| 97 }); | |
| 98 bookmarks.Store.instance_ = store; | |
| 99 | |
| 100 chrome.bookmarkManagerPrivate.startDrag = function(nodes, isTouch) { | |
| 101 draggedIds = nodes | |
| 102 }; | |
| 103 | |
| 104 app = document.createElement('bookmarks-app'); | |
| 105 replaceBody(app); | |
| 106 list = app.$$('bookmarks-list'); | |
| 107 sidebar = app.$$('bookmarks-sidebar'); | |
| 108 dnd_manager = app.dnd_manager_; | |
| 109 dnd_manager.dropIndicator_.synchronous_ = true; | |
| 110 Polymer.dom.flush(); | |
| 111 }); | |
| 112 | |
| 113 test('dragInfo isDraggingFolderToDescendant', function() { | |
| 114 var dragInfo = new bookmarks.DragInfo(); | |
| 115 var nodes = store.data.nodes; | |
| 116 dragInfo.handleChromeDragEnter(createDragData(['11'])); | |
| 117 assertTrue(dragInfo.isDraggingFolderToDescendant('111', nodes)); | |
| 118 assertFalse(dragInfo.isDraggingFolderToDescendant('1', nodes)); | |
| 119 assertFalse(dragInfo.isDraggingFolderToDescendant('2', nodes)); | |
| 120 | |
| 121 dragInfo.handleChromeDragEnter(createDragData(['1'])); | |
| 122 assertTrue(dragInfo.isDraggingFolderToDescendant('14', nodes)); | |
| 123 assertTrue(dragInfo.isDraggingFolderToDescendant('111', nodes)); | |
| 124 assertFalse(dragInfo.isDraggingFolderToDescendant('2', nodes)); | |
| 125 }); | |
| 126 | |
| 127 test('drag in list', function() { | |
| 128 var dragElement = getListItem('13'); | |
| 129 var dragTarget = getListItem('12'); | |
| 130 | |
| 131 dispatchDragEvent('dragstart', dragElement); | |
| 132 assertDeepEquals(['13'], draggedIds); | |
| 133 dnd_manager.dragInfo_.handleChromeDragEnter(createDragData(draggedIds)); | |
| 134 | |
| 135 // Bookmark items cannot be dragged onto other items. | |
| 136 dispatchDragEvent( | |
| 137 'dragover', dragTarget, MockInteractions.topLeftOfNode(dragTarget)); | |
| 138 assertEquals( | |
| 139 DropPosition.ABOVE, | |
| 140 dnd_manager.calculateValidDropPositions_(dragTarget)); | |
| 141 assertDragStyle(dragTarget, DRAG_STYLE.ABOVE); | |
| 142 | |
| 143 dispatchDragEvent('dragleave', dragTarget); | |
| 144 assertDragStyle(dragTarget, DRAG_STYLE.NONE); | |
| 145 | |
| 146 // Bookmark items can be dragged onto folders. | |
| 147 dragTarget = getListItem('11'); | |
| 148 dispatchDragEvent('dragover', dragTarget); | |
| 149 assertEquals( | |
| 150 DropPosition.ON | DropPosition.ABOVE | DropPosition.BELOW, | |
| 151 dnd_manager.calculateValidDropPositions_(dragTarget)); | |
| 152 assertDragStyle(dragTarget, DRAG_STYLE.ON); | |
| 153 | |
| 154 // There are no valid drop locations for dragging an item onto itself. | |
| 155 assertEquals( | |
| 156 DropPosition.NONE, | |
| 157 dnd_manager.calculateValidDropPositions_(dragElement)); | |
| 158 dispatchDragEvent('dragleave', dragTarget); | |
| 159 dispatchDragEvent('dragover', dragElement); | |
| 160 | |
| 161 assertDragStyle(dragTarget, DRAG_STYLE.NONE); | |
| 162 assertDragStyle(dragElement, DRAG_STYLE.NONE); | |
| 163 }); | |
| 164 | |
| 165 test('reorder folder nodes', function() { | |
| 166 var dragElement = getFolderNode('112'); | |
| 167 var dragTarget = getFolderNode('111'); | |
| 168 dispatchDragEvent('dragstart', dragElement); | |
| 169 dnd_manager.dragInfo_.handleChromeDragEnter(createDragData(draggedIds)); | |
| 170 | |
| 171 assertEquals( | |
| 172 DropPosition.ON | DropPosition.ABOVE, | |
| 173 dnd_manager.calculateValidDropPositions_(dragTarget)); | |
| 174 | |
| 175 dispatchDragEvent( | |
| 176 'dragover', dragTarget, MockInteractions.topLeftOfNode(dragTarget)); | |
| 177 assertDragStyle(dragTarget, DRAG_STYLE.ABOVE); | |
| 178 }); | |
| 179 | |
| 180 test('drag an item into a sidebar folder', function() { | |
| 181 var dragElement = getListItem('13'); | |
| 182 var dragTarget = getFolderNode('2'); | |
| 183 dispatchDragEvent('dragstart', dragElement); | |
| 184 dnd_manager.dragInfo_.handleChromeDragEnter(createDragData(draggedIds)); | |
| 185 | |
| 186 dispatchDragEvent('dragover', dragTarget); | |
| 187 assertDragStyle(dragTarget, DRAG_STYLE.ON); | |
|
tsergeant
2017/03/23 00:28:23
Should assert that it's not possible to drag above
calamity
2017/03/23 06:12:34
Done.
| |
| 188 | |
| 189 // Items cannot be dragged onto their parent folders. | |
| 190 dragTarget = getFolderNode('1'); | |
| 191 dispatchDragEvent('dragover', dragTarget); | |
| 192 assertDragStyle(dragTarget, DRAG_STYLE.NONE); | |
| 193 }); | |
| 194 | |
| 195 test('drag a folder into a descendant', function() { | |
| 196 var dragElement = getFolderNode('11'); | |
| 197 var dragTarget = getFolderNode('112'); | |
| 198 | |
| 199 // Folders cannot be dragged into their descendants. | |
| 200 dispatchDragEvent('dragstart', dragElement); | |
| 201 dnd_manager.dragInfo_.handleChromeDragEnter(createDragData(draggedIds)); | |
| 202 assertEquals( | |
| 203 DropPosition.NONE, | |
| 204 dnd_manager.calculateValidDropPositions_(dragTarget)); | |
| 205 | |
| 206 dispatchDragEvent('dragover', dragTarget); | |
| 207 | |
| 208 assertDragStyle(dragTarget, DRAG_STYLE.NONE); | |
| 209 }); | |
| 210 | |
| 211 test('drag item into sidebar folder with descendants', function() { | |
| 212 var dragElement = getFolderNode('15'); | |
| 213 var dragTarget = getFolderNode('11'); | |
| 214 dispatchDragEvent('dragstart', dragElement); | |
| 215 dnd_manager.dragInfo_.handleChromeDragEnter(createDragData(draggedIds)); | |
| 216 | |
| 217 // Drags below an open folder are not allowed. | |
| 218 assertEquals( | |
| 219 DropPosition.ON | DropPosition.ABOVE, | |
| 220 dnd_manager.calculateValidDropPositions_(dragTarget)); | |
| 221 | |
| 222 dispatchDragEvent('dragover', dragTarget); | |
| 223 | |
| 224 assertDragStyle(dragTarget, DRAG_STYLE.ON); | |
| 225 | |
| 226 dispatchDragEvent('dragend', dragElement); | |
| 227 assertDragStyle(dragTarget, DRAG_STYLE.NONE); | |
| 228 | |
| 229 store.data.closedFolders['11'] = true; | |
| 230 | |
| 231 dispatchDragEvent('dragstart', dragElement); | |
| 232 dnd_manager.dragInfo_.handleChromeDragEnter(createDragData(draggedIds)); | |
| 233 | |
| 234 // Drags below a closed folder are allowed. | |
| 235 assertEquals( | |
| 236 DropPosition.ON | DropPosition.ABOVE | DropPosition.BELOW, | |
| 237 dnd_manager.calculateValidDropPositions_(dragTarget)); | |
| 238 }); | |
| 239 | |
| 240 test('drag multiple list items', function() { | |
| 241 // Dragging multiple items. | |
| 242 store.data.selection.items = {'13': true, '15': true}; | |
| 243 dispatchDragEvent('dragstart', getListItem('13')); | |
| 244 assertDeepEquals(['13', '15'], draggedIds); | |
| 245 dnd_manager.dragInfo_.handleChromeDragEnter(createDragData(draggedIds)); | |
| 246 | |
| 247 // The dragged items should not be allowed to be dragged around any selected | |
| 248 // item. | |
| 249 assertEquals( | |
| 250 DropPosition.NONE, | |
| 251 dnd_manager.calculateValidDropPositions_(getListItem('13'))); | |
| 252 assertEquals( | |
| 253 DropPosition.ON, | |
| 254 dnd_manager.calculateValidDropPositions_(getListItem('14'))); | |
| 255 assertEquals( | |
| 256 DropPosition.NONE, | |
| 257 dnd_manager.calculateValidDropPositions_(getListItem('15'))); | |
| 258 | |
| 259 // Dragging an unselected item should only drag the unselected item. | |
| 260 dispatchDragEvent('dragstart', getListItem('14')); | |
| 261 assertDeepEquals(['14'], draggedIds); | |
| 262 | |
| 263 // Dragging a folder node should only drag the node. | |
| 264 dispatchDragEvent('dragstart', getListItem('11')); | |
| 265 assertDeepEquals(['11'], draggedIds); | |
| 266 }); | |
|
tsergeant
2017/03/23 00:28:23
Maybe should have a test for dragging from the sid
| |
| 267 }); | |
| OLD | NEW |