Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 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 cr.define('extensions', function() { | |
| 6 'use strict'; | |
| 7 | |
| 8 /** | |
| 9 * @param {boolean} dragEnabled | |
| 10 * @param {!EventTarget} target | |
| 11 * @constructor | |
| 12 * @implements cr.ui.DragWrapperDelegate | |
| 13 */ | |
| 14 function DragAndDropHandler(dragEnabled, target) { | |
| 15 this.dragEnabled = dragEnabled; | |
| 16 /** @private {!EventTarget} */ | |
| 17 this.eventTarget_ = target; | |
| 18 } | |
| 19 | |
| 20 // TODO(devlin): Un-chrome.send-ify this implementation. | |
| 21 DragAndDropHandler.prototype = { | |
| 22 /** @type {boolean} */ | |
| 23 dragEnabled: false, | |
| 24 | |
| 25 /** @override */ | |
| 26 shouldAcceptDrag: function(e) { | |
| 27 // External Extension installation can be disabled globally, e.g. while a | |
| 28 // different overlay is already showing. | |
| 29 if (!this.dragEnabled) | |
| 30 return false; | |
| 31 | |
| 32 // We can't access filenames during the 'dragenter' event, so we have to | |
| 33 // wait until 'drop' to decide whether to do something with the file or | |
| 34 // not. | |
| 35 // See: http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html#concept-dnd-p | |
| 36 return !!e.dataTransfer.types && | |
| 37 e.dataTransfer.types.indexOf('Files') > -1; | |
| 38 }, | |
| 39 | |
| 40 /** @override */ | |
| 41 doDragEnter: function() { | |
| 42 chrome.send('startDrag'); | |
| 43 this.eventTarget_.dispatchEvent( | |
| 44 new CustomEvent('extension-drag-started')); | |
| 45 }, | |
| 46 | |
| 47 /** @override */ | |
| 48 doDragLeave: function() { | |
| 49 this.fireDragEnded_(); | |
|
Dan Beam
2016/07/21 23:42:39
i think it's odd to say the drag has ended if this
| |
| 50 chrome.send('stopDrag'); | |
| 51 }, | |
| 52 | |
| 53 /** @override */ | |
| 54 doDragOver: function(e) { | |
| 55 e.preventDefault(); | |
| 56 }, | |
| 57 | |
| 58 /** @override */ | |
| 59 doDrop: function(e) { | |
| 60 this.fireDragEnded_(); | |
| 61 if (e.dataTransfer.files.length != 1) | |
| 62 return; | |
| 63 | |
| 64 var toSend = ''; | |
| 65 // Files lack a check if they're a directory, but we can find out through | |
| 66 // its item entry. | |
| 67 for (var i = 0; i < e.dataTransfer.items.length; ++i) { | |
| 68 if (e.dataTransfer.items[i].kind == 'file' && | |
| 69 e.dataTransfer.items[i].webkitGetAsEntry().isDirectory) { | |
| 70 toSend = 'installDroppedDirectory'; | |
| 71 break; | |
| 72 } | |
| 73 } | |
| 74 // Only process files that look like extensions. Other files should | |
| 75 // navigate the browser normally. | |
| 76 if (!toSend && | |
| 77 /\.(crx|user\.js|zip)$/i.test(e.dataTransfer.files[0].name)) { | |
| 78 toSend = 'installDroppedFile'; | |
| 79 } | |
| 80 | |
| 81 if (toSend) { | |
| 82 e.preventDefault(); | |
| 83 chrome.send(toSend); | |
| 84 } | |
| 85 }, | |
| 86 | |
| 87 /** @private */ | |
| 88 fireDragEnded_: function() { | |
| 89 this.eventTarget_.dispatchEvent(new CustomEvent('extension-drag-ended')); | |
| 90 } | |
| 91 }; | |
| 92 | |
| 93 return { | |
| 94 DragAndDropHandler: DragAndDropHandler, | |
| 95 }; | |
| 96 }); | |
| OLD | NEW |