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

Side by Side Diff: chrome/browser/resources/md_bookmarks/dnd_manager.js

Issue 2926763005: [MD Bookmarks] Refactor window timer mocking. (Closed)
Patch Set: address comments Created 3 years, 6 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
1 // Copyright 2017 The Chromium Authors. All rights reserved. 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 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 cr.define('bookmarks', function() { 5 cr.define('bookmarks', function() {
6 /** 6 /**
7 * @param {BookmarkElement} element 7 * @param {BookmarkElement} element
8 * @return {boolean} 8 * @return {boolean}
9 */ 9 */
10 function isBookmarkItem(element) { 10 function isBookmarkItem(element) {
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 179
180 /** 180 /**
181 * Encapsulates the behavior of the drag and drop indicator which puts a line 181 * Encapsulates the behavior of the drag and drop indicator which puts a line
182 * between items or highlights folders which are valid drop targets. 182 * between items or highlights folders which are valid drop targets.
183 * @constructor 183 * @constructor
184 */ 184 */
185 function DropIndicator() { 185 function DropIndicator() {
186 /** 186 /**
187 * @private {number|null} Timer id used to help minimize flicker. 187 * @private {number|null} Timer id used to help minimize flicker.
188 */ 188 */
189 this.removeDropIndicatorTimer_ = null; 189 this.removeDropIndicatorTimeoutId_ = null;
190 190
191 /** 191 /**
192 * The element that had a style applied it to indicate the drop location. 192 * The element that had a style applied it to indicate the drop location.
193 * This is used to easily remove the style when necessary. 193 * This is used to easily remove the style when necessary.
194 * @private {BookmarkElement|null} 194 * @private {BookmarkElement|null}
195 */ 195 */
196 this.lastIndicatorElement_ = null; 196 this.lastIndicatorElement_ = null;
197 197
198 /** 198 /**
199 * The style that was applied to indicate the drop location. 199 * The style that was applied to indicate the drop location.
200 * @private {?string|null} 200 * @private {?string|null}
201 */ 201 */
202 this.lastIndicatorClassName_ = null; 202 this.lastIndicatorClassName_ = null;
203 203
204 /** 204 /**
205 * Used to instantly remove the indicator style in tests. 205 * Used to instantly remove the indicator style in tests.
206 * @private {function((Function|null|string), number)} 206 * @private {bookmarks.TimerProxy}
207 */ 207 */
208 this.setTimeout = window.setTimeout.bind(window); 208 this.timerProxy = new bookmarks.TimerProxy();
209 } 209 }
210 210
211 DropIndicator.prototype = { 211 DropIndicator.prototype = {
212 /** 212 /**
213 * Applies the drop indicator style on the target element and stores that 213 * Applies the drop indicator style on the target element and stores that
214 * information to easily remove the style in the future. 214 * information to easily remove the style in the future.
215 * @param {HTMLElement} indicatorElement 215 * @param {HTMLElement} indicatorElement
216 * @param {DropPosition} position 216 * @param {DropPosition} position
217 */ 217 */
218 addDropIndicatorStyle: function(indicatorElement, position) { 218 addDropIndicatorStyle: function(indicatorElement, position) {
(...skipping 18 matching lines...) Expand all
237 this.lastIndicatorElement_ = null; 237 this.lastIndicatorElement_ = null;
238 this.lastIndicatorClassName_ = null; 238 this.lastIndicatorClassName_ = null;
239 }, 239 },
240 240
241 /** 241 /**
242 * Displays the drop indicator on the current drop target to give the 242 * Displays the drop indicator on the current drop target to give the
243 * user feedback on where the drop will occur. 243 * user feedback on where the drop will occur.
244 * @param {DropDestination} dropDest 244 * @param {DropDestination} dropDest
245 */ 245 */
246 update: function(dropDest) { 246 update: function(dropDest) {
247 window.clearTimeout(this.removeDropIndicatorTimer_); 247 this.timerProxy.clearTimeout(this.removeDropIndicatorTimeoutId_);
248 248
249 var indicatorElement = dropDest.element.getDropTarget(); 249 var indicatorElement = dropDest.element.getDropTarget();
250 var position = dropDest.position; 250 var position = dropDest.position;
251 251
252 this.removeDropIndicatorStyle(); 252 this.removeDropIndicatorStyle();
253 this.addDropIndicatorStyle(indicatorElement, position); 253 this.addDropIndicatorStyle(indicatorElement, position);
254 }, 254 },
255 255
256 /** 256 /**
257 * Stop displaying the drop indicator. 257 * Stop displaying the drop indicator.
258 */ 258 */
259 finish: function() { 259 finish: function() {
260 // The use of a timeout is in order to reduce flickering as we move 260 // The use of a timeout is in order to reduce flickering as we move
261 // between valid drop targets. 261 // between valid drop targets.
262 window.clearTimeout(this.removeDropIndicatorTimer_); 262 this.timerProxy.clearTimeout(this.removeDropIndicatorTimeoutId_);
263 this.removeDropIndicatorTimer_ = this.setTimeout(function() { 263 this.removeDropIndicatorTimeoutId_ =
264 this.removeDropIndicatorStyle(); 264 this.timerProxy.setTimeout(function() {
265 }.bind(this), 100); 265 this.removeDropIndicatorStyle();
266 }.bind(this), 100);
266 }, 267 },
267 }; 268 };
268 269
269 /** 270 /**
270 * Manages drag and drop events for the bookmarks-app. 271 * Manages drag and drop events for the bookmarks-app.
271 * @constructor 272 * @constructor
272 */ 273 */
273 function DNDManager() { 274 function DNDManager() {
274 /** @private {bookmarks.DragInfo} */ 275 /** @private {bookmarks.DragInfo} */
275 this.dragInfo_ = null; 276 this.dragInfo_ = null;
276 277
277 /** @private {?DropDestination} */ 278 /** @private {?DropDestination} */
278 this.dropDestination_ = null; 279 this.dropDestination_ = null;
279 280
280 /** @private {bookmarks.DropIndicator} */ 281 /** @private {bookmarks.DropIndicator} */
281 this.dropIndicator_ = null; 282 this.dropIndicator_ = null;
282 283
283 /** @private {Object<string, function(!Event)>} */ 284 /** @private {Object<string, function(!Event)>} */
284 this.documentListeners_ = null; 285 this.documentListeners_ = null;
285 286
286 /** 287 /**
287 * Used to instantly clearDragData in tests. 288 * Used to instantly clearDragData in tests.
288 * @private {function((Function|null|string), number)} 289 * @private {bookmarks.TimerProxy}
289 */ 290 */
290 this.setTimeout_ = window.setTimeout.bind(window); 291 this.timerProxy_ = new bookmarks.TimerProxy();
291 } 292 }
292 293
293 DNDManager.prototype = { 294 DNDManager.prototype = {
294 init: function() { 295 init: function() {
295 this.dragInfo_ = new DragInfo(); 296 this.dragInfo_ = new DragInfo();
296 this.dropIndicator_ = new DropIndicator(); 297 this.dropIndicator_ = new DropIndicator();
297 this.autoExpander_ = new AutoExpander(); 298 this.autoExpander_ = new AutoExpander();
298 299
299 this.documentListeners_ = { 300 this.documentListeners_ = {
300 'dragstart': this.onDragStart_.bind(this), 301 'dragstart': this.onDragStart_.bind(this),
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 index: index, 380 index: index,
380 parentId: parentId, 381 parentId: parentId,
381 }; 382 };
382 }, 383 },
383 384
384 /** @private */ 385 /** @private */
385 clearDragData_: function() { 386 clearDragData_: function() {
386 // Defer the clearing of the data so that the bookmark manager API's drop 387 // Defer the clearing of the data so that the bookmark manager API's drop
387 // event doesn't clear the drop data before the web drop event has a 388 // event doesn't clear the drop data before the web drop event has a
388 // chance to execute (on Mac). 389 // chance to execute (on Mac).
389 this.setTimeout_(function() { 390 this.timerProxy_.setTimeout(function() {
390 this.dragInfo_.clearDragData(); 391 this.dragInfo_.clearDragData();
391 this.dropDestination_ = null; 392 this.dropDestination_ = null;
392 this.dropIndicator_.finish(); 393 this.dropIndicator_.finish();
393 }.bind(this), 0); 394 }.bind(this), 0);
394 }, 395 },
395 396
396 /** 397 /**
397 * @private 398 * @private
398 * @param {Event} e 399 * @param {Event} e
399 */ 400 */
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
631 state.nodes[state.selectedFolder].children.length == 0; 632 state.nodes[state.selectedFolder].children.length == 0;
632 } 633 }
633 634
634 // We can only drop on a folder. 635 // We can only drop on a folder.
635 if (getBookmarkNode(overElement).url) 636 if (getBookmarkNode(overElement).url)
636 return false; 637 return false;
637 638
638 return !this.dragInfo_.isDraggingChildBookmark(overElement.itemId); 639 return !this.dragInfo_.isDraggingChildBookmark(overElement.itemId);
639 }, 640 },
640 641
641 disableTimeoutsForTesting: function() { 642 /** @param {bookmarks.TimerProxy} timerProxy */
642 this.setTimeout_ = function(fn) { 643 setTimerProxyForTesting: function(timerProxy) {
643 fn(); 644 this.timerProxy_ = timerProxy;
644 }; 645 this.dropIndicator_.timerProxy = timerProxy;
645 this.dropIndicator_.setTimeout = this.setTimeout_;
646 } 646 }
647 }; 647 };
648 648
649 return { 649 return {
650 DNDManager: DNDManager, 650 DNDManager: DNDManager,
651 DragInfo: DragInfo, 651 DragInfo: DragInfo,
652 DropIndicator: DropIndicator, 652 DropIndicator: DropIndicator,
653 }; 653 };
654 }); 654 });
OLDNEW
« no previous file with comments | « chrome/browser/resources/md_bookmarks/dnd_manager.html ('k') | chrome/browser/resources/md_bookmarks/timer_proxy.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698