Index: chrome/browser/resources/extensions/extensions.js |
diff --git a/chrome/browser/resources/extensions/extensions.js b/chrome/browser/resources/extensions/extensions.js |
index ceeea64b25606abc17e7e8d5ae1aa85e03c0c525..fbf7b3cb2a4dcc18f7b7bbd05364d9aa12e2ac26 100644 |
--- a/chrome/browser/resources/extensions/extensions.js |
+++ b/chrome/browser/resources/extensions/extensions.js |
@@ -5,6 +5,7 @@ |
<include src="../../../../ui/webui/resources/js/cr/ui/focus_row.js"> |
<include src="../../../../ui/webui/resources/js/cr/ui/focus_grid.js"> |
<include src="../uber/uber_utils.js"> |
+<include src="drag_and_drop_handler.js"> |
<include src="extension_code.js"> |
<include src="extension_commands_overlay.js"> |
<include src="extension_error_overlay.js"> |
@@ -26,76 +27,6 @@ var webuiResponded = false; |
cr.define('extensions', function() { |
var ExtensionList = extensions.ExtensionList; |
- // Implements the DragWrapper handler interface. |
- var dragWrapperHandler = { |
- /** @override */ |
- shouldAcceptDrag: function(e) { |
- // External Extension installation can be disabled globally, e.g. while a |
- // different overlay is already showing. |
- if (!ExtensionSettings.getInstance().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'); |
- ExtensionSettings.showOverlay($('drop-target-overlay')); |
- }, |
- /** @override */ |
- doDragLeave: function() { |
- this.hideDropTargetOverlay_(); |
- chrome.send('stopDrag'); |
- }, |
- /** @override */ |
- doDragOver: function(e) { |
- e.preventDefault(); |
- }, |
- /** @override */ |
- doDrop: function(e) { |
- this.hideDropTargetOverlay_(); |
- if (e.dataTransfer.files.length != 1) |
- return; |
- |
- var toSend = null; |
- // 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); |
- } |
- }, |
- |
- /** |
- * Hide the current overlay if it is the drop target overlay. |
- * @private |
- */ |
- hideDropTargetOverlay_: function() { |
- var currentOverlay = ExtensionSettings.getCurrentOverlay(); |
- if (currentOverlay && currentOverlay.id === 'drop-target-overlay') |
- ExtensionSettings.showOverlay(null); |
- } |
- }; |
- |
/** |
* ExtensionSettings class |
* @class |
@@ -107,8 +38,6 @@ cr.define('extensions', function() { |
cr.addSingletonGetter(ExtensionSettings); |
ExtensionSettings.prototype = { |
- __proto__: HTMLDivElement.prototype, |
- |
/** |
* The drag-drop wrapper for installing external Extensions, if available. |
* null if external Extension installation is not available. |
@@ -182,9 +111,20 @@ cr.define('extensions', function() { |
this.handleUpdateExtensionNow_.bind(this)); |
if (!loadTimeData.getBoolean('offStoreInstallEnabled')) { |
- this.dragWrapper_ = new cr.ui.DragWrapper(document.documentElement, |
- dragWrapperHandler); |
- this.dragEnabled_ = true; |
+ var dragTarget = document.documentElement; |
+ /** @private {extensions.DragAndDropHandler} */ |
+ this.dragWrapperHandler_ = |
+ new extensions.DragAndDropHandler(true, dragTarget); |
+ dragTarget.addEventListener('extension-drag-started', function() { |
+ ExtensionSettings.showOverlay($('drop-target-overlay')); |
+ }); |
+ dragTarget.addEventListener('extension-drag-ended', function() { |
+ var overlay = ExtensionSettings.getCurrentOverlay(); |
+ if (overlay && overlay.id === 'drop-target-overlay') |
+ ExtensionSettings.showOverlay(null); |
+ }); |
+ this.dragWrapper_ = |
+ new cr.ui.DragWrapper(dragTarget, this.dragWrapperHandler_); |
} |
extensions.PackExtensionOverlay.getInstance().initializePage(); |
@@ -428,8 +368,10 @@ cr.define('extensions', function() { |
// drag-drop when there is any overlay showing other than the usual overlay |
// shown when drag-drop is started. |
var settings = ExtensionSettings.getInstance(); |
- if (settings.dragWrapper_) |
- settings.dragEnabled_ = !node || node == $('drop-target-overlay'); |
+ if (settings.dragWrapper_) { |
+ assert(settings.dragWrapperHandler_).dragEnabled = |
+ !node || node == $('drop-target-overlay'); |
+ } |
uber.invokeMethodOnParent(node ? 'beginInterceptingEvents' : |
'stopInterceptingEvents'); |