Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(133)

Side by Side Diff: chrome/test/data/webui/md_bookmarks/dnd_manager_test.js

Issue 2746363013: [MD Bookmarks] Add a drag and drop indicator to bookmarks. (Closed)
Patch Set: address comments, add test Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698