Index: chrome/browser/resources/extensions/drag_and_drop_handler.js |
diff --git a/chrome/browser/resources/extensions/drag_and_drop_handler.js b/chrome/browser/resources/extensions/drag_and_drop_handler.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9643f5ee2220d4a60ab52df475eafd5b3f061760 |
--- /dev/null |
+++ b/chrome/browser/resources/extensions/drag_and_drop_handler.js |
@@ -0,0 +1,96 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+cr.define('extensions', function() { |
+ 'use strict'; |
+ |
+ /** |
+ * @param {boolean} dragEnabled |
+ * @param {!EventTarget} target |
+ * @constructor |
+ * @implements cr.ui.DragWrapperDelegate |
+ */ |
+ function DragAndDropHandler(dragEnabled, target) { |
+ this.dragEnabled = dragEnabled; |
+ /** @private {!EventTarget} */ |
+ this.eventTarget_ = target; |
+ } |
+ |
+ // TODO(devlin): Un-chrome.send-ify this implementation. |
+ DragAndDropHandler.prototype = { |
+ /** @type {boolean} */ |
+ dragEnabled: false, |
+ |
+ /** @override */ |
+ shouldAcceptDrag: function(e) { |
+ // External Extension installation can be disabled globally, e.g. while a |
+ // different overlay is already showing. |
+ if (!this.dragEnabled) |
+ return false; |
+ |
+ // We can't access filenames during the 'dragenter' event, so we have to |
+ // wait until 'drop' to decide whether to do something with the file or |
+ // not. |
+ // See: http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html#concept-dnd-p |
+ return !!e.dataTransfer.types && |
+ e.dataTransfer.types.indexOf('Files') > -1; |
+ }, |
+ |
+ /** @override */ |
+ doDragEnter: function() { |
+ chrome.send('startDrag'); |
+ this.eventTarget_.dispatchEvent( |
+ new CustomEvent('extension-drag-started')); |
+ }, |
+ |
+ /** @override */ |
+ doDragLeave: function() { |
+ this.fireDragEnded_(); |
Dan Beam
2016/07/21 23:42:39
i think it's odd to say the drag has ended if this
|
+ chrome.send('stopDrag'); |
+ }, |
+ |
+ /** @override */ |
+ doDragOver: function(e) { |
+ e.preventDefault(); |
+ }, |
+ |
+ /** @override */ |
+ doDrop: function(e) { |
+ this.fireDragEnded_(); |
+ if (e.dataTransfer.files.length != 1) |
+ return; |
+ |
+ var toSend = ''; |
+ // Files lack a check if they're a directory, but we can find out through |
+ // its item entry. |
+ for (var i = 0; i < e.dataTransfer.items.length; ++i) { |
+ if (e.dataTransfer.items[i].kind == 'file' && |
+ e.dataTransfer.items[i].webkitGetAsEntry().isDirectory) { |
+ toSend = 'installDroppedDirectory'; |
+ break; |
+ } |
+ } |
+ // Only process files that look like extensions. Other files should |
+ // navigate the browser normally. |
+ if (!toSend && |
+ /\.(crx|user\.js|zip)$/i.test(e.dataTransfer.files[0].name)) { |
+ toSend = 'installDroppedFile'; |
+ } |
+ |
+ if (toSend) { |
+ e.preventDefault(); |
+ chrome.send(toSend); |
+ } |
+ }, |
+ |
+ /** @private */ |
+ fireDragEnded_: function() { |
+ this.eventTarget_.dispatchEvent(new CustomEvent('extension-drag-ended')); |
+ } |
+ }; |
+ |
+ return { |
+ DragAndDropHandler: DragAndDropHandler, |
+ }; |
+}); |