| OLD | NEW |
| 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 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 {function((Function|null|string), number)} |
| 207 */ | 207 */ |
| 208 this.setTimeout_ = window.setTimeout.bind(window); | 208 this.setTimeout = window.setTimeout.bind(window); |
| 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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 window.clearTimeout(this.removeDropIndicatorTimer_); |
| 263 this.removeDropIndicatorTimer_ = this.setTimeout_(function() { | 263 this.removeDropIndicatorTimer_ = this.setTimeout(function() { |
| 264 this.removeDropIndicatorStyle(); | 264 this.removeDropIndicatorStyle(); |
| 265 }.bind(this), 100); | 265 }.bind(this), 100); |
| 266 }, | 266 }, |
| 267 | |
| 268 disableTimeoutForTesting: function() { | |
| 269 this.setTimeout_ = function(fn, timeout) { | |
| 270 fn(); | |
| 271 }; | |
| 272 }, | |
| 273 }; | 267 }; |
| 274 | 268 |
| 275 /** | 269 /** |
| 276 * Manages drag and drop events for the bookmarks-app. | 270 * Manages drag and drop events for the bookmarks-app. |
| 277 * @constructor | 271 * @constructor |
| 278 */ | 272 */ |
| 279 function DNDManager() { | 273 function DNDManager() { |
| 280 /** @private {bookmarks.DragInfo} */ | 274 /** @private {bookmarks.DragInfo} */ |
| 281 this.dragInfo_ = null; | 275 this.dragInfo_ = null; |
| 282 | 276 |
| 283 /** @private {?DropDestination} */ | 277 /** @private {?DropDestination} */ |
| 284 this.dropDestination_ = null; | 278 this.dropDestination_ = null; |
| 285 | 279 |
| 286 /** @private {bookmarks.DropIndicator} */ | 280 /** @private {bookmarks.DropIndicator} */ |
| 287 this.dropIndicator_ = null; | 281 this.dropIndicator_ = null; |
| 288 | 282 |
| 289 /** @private {Object<string, function(!Event)>} */ | 283 /** @private {Object<string, function(!Event)>} */ |
| 290 this.documentListeners_ = null; | 284 this.documentListeners_ = null; |
| 285 |
| 286 /** |
| 287 * Used to instantly clearDragData in tests. |
| 288 * @private {function((Function|null|string), number)} |
| 289 */ |
| 290 this.setTimeout = window.setTimeout.bind(window); |
| 291 } | 291 } |
| 292 | 292 |
| 293 DNDManager.prototype = { | 293 DNDManager.prototype = { |
| 294 init: function() { | 294 init: function() { |
| 295 this.dragInfo_ = new DragInfo(); | 295 this.dragInfo_ = new DragInfo(); |
| 296 this.dropIndicator_ = new DropIndicator(); | 296 this.dropIndicator_ = new DropIndicator(); |
| 297 this.autoExpander_ = new AutoExpander(); | 297 this.autoExpander_ = new AutoExpander(); |
| 298 | 298 |
| 299 this.documentListeners_ = { | 299 this.documentListeners_ = { |
| 300 'dragstart': this.onDragStart_.bind(this), | 300 'dragstart': this.onDragStart_.bind(this), |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 } | 377 } |
| 378 | 378 |
| 379 return { | 379 return { |
| 380 index: index, | 380 index: index, |
| 381 parentId: parentId, | 381 parentId: parentId, |
| 382 }; | 382 }; |
| 383 }, | 383 }, |
| 384 | 384 |
| 385 /** @private */ | 385 /** @private */ |
| 386 clearDragData_: function() { | 386 clearDragData_: function() { |
| 387 this.dragInfo_.clearDragData(); | 387 // Defer the clearing of the data so that the bookmark manager API's drop |
| 388 this.dropDestination_ = null; | 388 // event doesn't clear the drop data before the web drop event has a |
| 389 this.dropIndicator_.finish(); | 389 // chance to execute (on Mac). |
| 390 this.setTimeout_(function() { |
| 391 this.dragInfo_.clearDragData(); |
| 392 this.dropDestination_ = null; |
| 393 this.dropIndicator_.finish(); |
| 394 }.bind(this), 0); |
| 390 }, | 395 }, |
| 391 | 396 |
| 392 /** | 397 /** |
| 393 * @private | 398 * @private |
| 394 * @param {Event} e | 399 * @param {Event} e |
| 395 */ | 400 */ |
| 396 onDragStart_: function(e) { | 401 onDragStart_: function(e) { |
| 397 var dragElement = getBookmarkElement(e.path); | 402 var dragElement = getBookmarkElement(e.path); |
| 398 if (!dragElement) | 403 if (!dragElement) |
| 399 return; | 404 return; |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 607 return state.selectedFolder && | 612 return state.selectedFolder && |
| 608 state.nodes[state.selectedFolder].children.length == 0; | 613 state.nodes[state.selectedFolder].children.length == 0; |
| 609 } | 614 } |
| 610 | 615 |
| 611 // We can only drop on a folder. | 616 // We can only drop on a folder. |
| 612 if (getBookmarkNode(overElement).url) | 617 if (getBookmarkNode(overElement).url) |
| 613 return false; | 618 return false; |
| 614 | 619 |
| 615 return !this.dragInfo_.isDraggingChildBookmark(overElement.itemId) | 620 return !this.dragInfo_.isDraggingChildBookmark(overElement.itemId) |
| 616 }, | 621 }, |
| 622 |
| 623 disableTimeoutsForTesting: function() { |
| 624 this.setTimeout_ = function(fn) { |
| 625 fn(); |
| 626 }; |
| 627 this.dropIndicator_.setTimeout = this.setTimeout_; |
| 628 } |
| 617 }; | 629 }; |
| 618 | 630 |
| 619 return { | 631 return { |
| 620 DNDManager: DNDManager, | 632 DNDManager: DNDManager, |
| 621 DragInfo: DragInfo, | 633 DragInfo: DragInfo, |
| 622 DropIndicator: DropIndicator, | 634 DropIndicator: DropIndicator, |
| 623 }; | 635 }; |
| 624 }); | 636 }); |
| OLD | NEW |