diff --git a/src/ol/interaction/draganddrop.js b/src/ol/interaction/draganddrop.js index c49b4606b8..ffdfe7040b 100644 --- a/src/ol/interaction/draganddrop.js +++ b/src/ol/interaction/draganddrop.js @@ -65,17 +65,14 @@ ol.inherits(ol.interaction.DragAndDrop, ol.interaction.Interaction); * @private */ ol.interaction.DragAndDrop.handleDrop_ = function(event) { - var active = this.getActive(); - if (active) { - var files = event.dataTransfer.files; - var i, ii, file; - for (i = 0, ii = files.length; i < ii; ++i) { - file = files.item(i); - var reader = new FileReader(); - reader.addEventListener(ol.events.EventType.LOAD, - this.handleResult_.bind(this, file)); - reader.readAsText(file); - } + var files = event.dataTransfer.files; + var i, ii, file; + for (i = 0, ii = files.length; i < ii; ++i) { + file = files.item(i); + var reader = new FileReader(); + reader.addEventListener(ol.events.EventType.LOAD, + this.handleResult_.bind(this, file)); + reader.readAsText(file); } }; @@ -85,12 +82,9 @@ ol.interaction.DragAndDrop.handleDrop_ = function(event) { * @private */ ol.interaction.DragAndDrop.handleStop_ = function(event) { - var active = this.getActive(); - if (active) { - event.stopPropagation(); - event.preventDefault(); - event.dataTransfer.dropEffect = 'copy'; - } + event.stopPropagation(); + event.preventDefault(); + event.dataTransfer.dropEffect = 'copy'; }; @@ -147,14 +141,10 @@ ol.interaction.DragAndDrop.handleEvent = ol.functions.TRUE; /** - * @inheritDoc + * @private */ -ol.interaction.DragAndDrop.prototype.setMap = function(map) { - if (this.dropListenKeys_) { - this.dropListenKeys_.forEach(ol.events.unlistenByKey); - this.dropListenKeys_ = null; - } - ol.interaction.Interaction.prototype.setMap.call(this, map); +ol.interaction.DragAndDrop.prototype.registerListeners_ = function() { + var map = this.getMap(); if (map) { var dropArea = this.target ? this.target : map.getViewport(); this.dropListenKeys_ = [ @@ -171,6 +161,31 @@ ol.interaction.DragAndDrop.prototype.setMap = function(map) { }; +/** + * @inheritDoc + */ +ol.interaction.DragAndDrop.prototype.setActive = function(active) { + ol.interaction.Interaction.prototype.setActive.call(this, active); + if (active) { + this.registerListeners_(); + } else { + this.unregisterListeners_(); + } +}; + + +/** + * @inheritDoc + */ +ol.interaction.DragAndDrop.prototype.setMap = function(map) { + this.unregisterListeners_(); + ol.interaction.Interaction.prototype.setMap.call(this, map); + if (this.getActive()) { + this.registerListeners_(); + } +}; + + /** * @param {ol.format.Feature} format Format. * @param {string} text Text. @@ -187,6 +202,17 @@ ol.interaction.DragAndDrop.prototype.tryReadFeatures_ = function(format, text, o }; +/** + * @private + */ +ol.interaction.DragAndDrop.prototype.unregisterListeners_ = function() { + if (this.dropListenKeys_) { + this.dropListenKeys_.forEach(ol.events.unlistenByKey); + this.dropListenKeys_ = null; + } +}; + + /** * @enum {string} * @private diff --git a/test/spec/ol/interaction/draganddrop.test.js b/test/spec/ol/interaction/draganddrop.test.js index 0515c119db..6397e49b56 100644 --- a/test/spec/ol/interaction/draganddrop.test.js +++ b/test/spec/ol/interaction/draganddrop.test.js @@ -37,7 +37,20 @@ describe('ol.interaction.DragAndDrop', function() { expect(interaction.formatConstructors_).to.have.length(1); }); + }); + describe('#setActive()', function() { + it('registers and unregisters listeners', function() { + interaction.setMap(map); + interaction.setActive(true); + expect(viewport.hasListener('dragenter')).to.be(true); + expect(viewport.hasListener('dragover')).to.be(true); + expect(viewport.hasListener('drop')).to.be(true); + interaction.setActive(false); + expect(viewport.hasListener('dragenter')).to.be(false); + expect(viewport.hasListener('dragover')).to.be(false); + expect(viewport.hasListener('drop')).to.be(false); + }); }); describe('#setMap()', function() {