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 |