diff --git a/src/ol/events.js b/src/ol/events.js index c07373bd30..2035441864 100644 --- a/src/ol/events.js +++ b/src/ol/events.js @@ -107,11 +107,12 @@ ol.events.ListenerObjType; */ ol.events.bindListener_ = function(listenerObj) { var boundListener = function(evt) { - var rv = listenerObj.listener.call(listenerObj.bindTo, evt); + var listener = listenerObj.listener; + var bindTo = listenerObj.bindTo || listenerObj.target; if (listenerObj.callOnce) { ol.events.unlistenByKey(listenerObj); } - return rv; + return listener.call(bindTo, evt); } listenerObj.boundListener = boundListener; return boundListener; diff --git a/test/spec/ol/events.test.js b/test/spec/ol/events.test.js index 6592bdcb3d..6a9f79dd4c 100644 --- a/test/spec/ol/events.test.js +++ b/test/spec/ol/events.test.js @@ -24,23 +24,32 @@ describe('ol.events', function() { boundListener(); expect(listenerObj.listener.thisValues[0]).to.equal(listenerObj.bindTo); }); - it('binds a self-unregistering listener when callOnce is true', function() { - var bindTo = {id: 1}; - var listener = sinon.spy(); - target.removeEventListener = function() {}; + it('binds to the target when bindTo is not provided', function() { var listenerObj = { - type: 'foo', - target: target, - listener: listener, - bindTo: bindTo, - callOnce: true + listener: sinon.spy(), + target: {id: 1} }; var boundListener = ol.events.bindListener_(listenerObj); expect(listenerObj.boundListener).to.equal(boundListener); - var spy = sinon.spy(ol.events, 'unlistenByKey'); boundListener(); - expect(listener.thisValues[0]).to.equal(bindTo); - expect(spy.firstCall.args[0]).to.eql(listenerObj); + expect(listenerObj.listener.thisValues[0]).to.equal(listenerObj.target); + }); + it('binds a self-unregistering listener when callOnce is true', function() { + var bindTo = {id: 1}; + var listenerObj = { + type: 'foo', + target: target, + bindTo: bindTo, + callOnce: true + }; + var unlistenSpy = sinon.spy(ol.events, 'unlistenByKey'); + listenerObj.listener = function() { + expect(this).to.equal(bindTo); + expect(unlistenSpy.firstCall.args[0]).to.eql(listenerObj); + } + var boundListener = ol.events.bindListener_(listenerObj); + expect(listenerObj.boundListener).to.equal(boundListener); + boundListener(); ol.events.unlistenByKey.restore(); }); });