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_(); |
| 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 |