From 09eee4682254f61856e6915fab245e285a54d6cc Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 1 Mar 2016 23:58:36 -0700 Subject: [PATCH] Use ol.Disposable instead of goog.Disposable --- src/ol/control/zoomslidercontrol.js | 22 ++++++++++---- src/ol/disposable.js | 30 +++++++++++++++++++ src/ol/events/eventtarget.js | 7 ++--- src/ol/map.js | 15 ++++++---- src/ol/render/box.js | 7 ++--- src/ol/renderer/maprenderer.js | 7 ++--- .../spec/ol/control/zoomslidercontrol.test.js | 9 ++---- 7 files changed, 67 insertions(+), 30 deletions(-) create mode 100644 src/ol/disposable.js diff --git a/src/ol/control/zoomslidercontrol.js b/src/ol/control/zoomslidercontrol.js index 1a4859df6e..c5e13a0ef5 100644 --- a/src/ol/control/zoomslidercontrol.js +++ b/src/ol/control/zoomslidercontrol.js @@ -118,14 +118,17 @@ ol.control.ZoomSlider = function(opt_options) { [className, ol.css.CLASS_UNSELECTABLE, ol.css.CLASS_CONTROL], thumbElement); - var dragger = new ol.pointer.PointerEventHandler(containerElement); - this.registerDisposable(dragger); + /** + * @type {ol.pointer.PointerEventHandler} + * @private + */ + this.dragger_ = new ol.pointer.PointerEventHandler(containerElement); - ol.events.listen(dragger, ol.pointer.EventType.POINTERDOWN, + ol.events.listen(this.dragger_, ol.pointer.EventType.POINTERDOWN, this.handleDraggerStart_, this); - ol.events.listen(dragger, ol.pointer.EventType.POINTERMOVE, + ol.events.listen(this.dragger_, ol.pointer.EventType.POINTERMOVE, this.handleDraggerDrag_, this); - ol.events.listen(dragger, ol.pointer.EventType.POINTERUP, + ol.events.listen(this.dragger_, ol.pointer.EventType.POINTERUP, this.handleDraggerEnd_, this); ol.events.listen(containerElement, ol.events.EventType.CLICK, @@ -143,6 +146,15 @@ ol.control.ZoomSlider = function(opt_options) { goog.inherits(ol.control.ZoomSlider, ol.control.Control); +/** + * @inheritDoc + */ +ol.control.ZoomSlider.prototype.disposeInternal = function() { + this.dragger_.dispose(); + goog.base(this, 'disposeInternal'); +}; + + /** * The enum for available directions. * diff --git a/src/ol/disposable.js b/src/ol/disposable.js new file mode 100644 index 0000000000..87d84fe590 --- /dev/null +++ b/src/ol/disposable.js @@ -0,0 +1,30 @@ +goog.provide('ol.Disposable'); + +/** + * Objects that need to clean up after themselves. + * @constructor + */ +ol.Disposable = function() {}; + +/** + * The object has already been disposed. + * @type {boolean} + * @private + */ +ol.Disposable.prototype.disposed_ = false; + +/** + * Clean up. + */ +ol.Disposable.prototype.dispose = function() { + if (!this.disposed_) { + this.disposed_ = true; + this.disposeInternal(); + } +}; + +/** + * Extension point for disposable objects. + * @protected + */ +ol.Disposable.prototype.disposeInternal = function() {}; diff --git a/src/ol/events/eventtarget.js b/src/ol/events/eventtarget.js index b103a25e8c..f2591ef538 100644 --- a/src/ol/events/eventtarget.js +++ b/src/ol/events/eventtarget.js @@ -1,6 +1,6 @@ goog.provide('ol.events.EventTarget'); -goog.require('goog.Disposable'); +goog.require('ol.Disposable'); goog.require('ol.events'); goog.require('ol.events.Event'); @@ -20,7 +20,7 @@ goog.require('ol.events.Event'); * returns false. * * @constructor - * @extends {goog.Disposable} + * @extends {ol.Disposable} */ ol.events.EventTarget = function() { @@ -33,7 +33,7 @@ ol.events.EventTarget = function() { this.listeners_ = {}; }; -goog.inherits(ol.events.EventTarget, goog.Disposable); +goog.inherits(ol.events.EventTarget, ol.Disposable); /** @@ -79,7 +79,6 @@ ol.events.EventTarget.prototype.dispatchEvent = function(event) { */ ol.events.EventTarget.prototype.disposeInternal = function() { ol.events.unlistenAll(this); - goog.base(this, 'disposeInternal'); }; diff --git a/src/ol/map.js b/src/ol/map.js index dc8535fbdb..36ba13e3c0 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -300,12 +300,15 @@ ol.Map = function(options) { } this.viewport_.appendChild(this.overlayContainerStopEvent_); - var mapBrowserEventHandler = new ol.MapBrowserEventHandler(this); + /** + * @private + * @type {ol.MapBrowserEventHandler} + */ + this.mapBrowserEventHandler_ = new ol.MapBrowserEventHandler(this); for (var key in ol.MapBrowserEvent.EventType) { - ol.events.listen(mapBrowserEventHandler, ol.MapBrowserEvent.EventType[key], + ol.events.listen(this.mapBrowserEventHandler_, ol.MapBrowserEvent.EventType[key], this.handleMapBrowserEvent, this); } - this.registerDisposable(mapBrowserEventHandler); /** * @private @@ -353,9 +356,7 @@ ol.Map = function(options) { * @type {ol.renderer.Map} * @private */ - this.renderer_ = - new optionsInternal.rendererConstructor(this.viewport_, this); - this.registerDisposable(this.renderer_); + this.renderer_ = new optionsInternal.rendererConstructor(this.viewport_, this); /** * @type {function(Event)|undefined} @@ -577,6 +578,8 @@ ol.Map.prototype.removePreRenderFunction = function(preRenderFunction) { * @inheritDoc */ ol.Map.prototype.disposeInternal = function() { + this.mapBrowserEventHandler_.dispose(); + this.renderer_.dispose(); ol.events.unlisten(this.viewport_, ol.events.EventType.WHEEL, this.handleBrowserEvent, this); ol.events.unlisten(this.viewport_, ol.events.EventType.MOUSEWHEEL, diff --git a/src/ol/render/box.js b/src/ol/render/box.js index cc2c534b97..b2b9fd154d 100644 --- a/src/ol/render/box.js +++ b/src/ol/render/box.js @@ -2,14 +2,14 @@ goog.provide('ol.render.Box'); -goog.require('goog.Disposable'); goog.require('goog.asserts'); +goog.require('ol.Disposable'); goog.require('ol.geom.Polygon'); /** * @constructor - * @extends {goog.Disposable} + * @extends {ol.Disposable} * @param {string} className CSS class name. */ ol.render.Box = function(className) { @@ -47,7 +47,7 @@ ol.render.Box = function(className) { this.endPixel_ = null; }; -goog.inherits(ol.render.Box, goog.Disposable); +goog.inherits(ol.render.Box, ol.Disposable); /** @@ -55,7 +55,6 @@ goog.inherits(ol.render.Box, goog.Disposable); */ ol.render.Box.prototype.disposeInternal = function() { this.setMap(null); - goog.base(this, 'disposeInternal'); }; diff --git a/src/ol/renderer/maprenderer.js b/src/ol/renderer/maprenderer.js index c4cf887e8f..eab340e91b 100644 --- a/src/ol/renderer/maprenderer.js +++ b/src/ol/renderer/maprenderer.js @@ -1,11 +1,11 @@ goog.provide('ol.RendererType'); goog.provide('ol.renderer.Map'); -goog.require('goog.Disposable'); goog.require('goog.asserts'); goog.require('goog.functions'); goog.require('goog.vec.Mat4'); goog.require('ol'); +goog.require('ol.Disposable'); goog.require('ol.events'); goog.require('ol.events.EventType'); goog.require('ol.extent'); @@ -29,7 +29,7 @@ ol.RendererType = { /** * @constructor - * @extends {goog.Disposable} + * @extends {ol.Disposable} * @param {Element} container Container. * @param {ol.Map} map Map. * @struct @@ -58,7 +58,7 @@ ol.renderer.Map = function(container, map) { this.layerRendererListeners_ = {}; }; -goog.inherits(ol.renderer.Map, goog.Disposable); +goog.inherits(ol.renderer.Map, ol.Disposable); /** @@ -96,7 +96,6 @@ ol.renderer.Map.prototype.disposeInternal = function() { for (var id in this.layerRenderers_) { this.layerRenderers_[id].dispose(); } - goog.base(this, 'disposeInternal'); }; diff --git a/test/spec/ol/control/zoomslidercontrol.test.js b/test/spec/ol/control/zoomslidercontrol.test.js index e21c36d021..c01f355e43 100644 --- a/test/spec/ol/control/zoomslidercontrol.test.js +++ b/test/spec/ol/control/zoomslidercontrol.test.js @@ -102,7 +102,6 @@ describe('ol.control.ZoomSlider', function() { }); it('[horizontal] handles a drag sequence', function() { - var spy = sinon.spy(goog.Disposable.prototype, 'registerDisposable'); var control = new ol.control.ZoomSlider(); map.addControl(control); map.getView().setZoom(0); @@ -111,8 +110,7 @@ describe('ol.control.ZoomSlider', function() { control.element.firstChild.style.width = '100px'; control.element.firstChild.style.height = '10px'; map.renderSync(); - var dragger = spy.firstCall.args[0]; - spy.restore(); + var dragger = control.dragger_; var event = new ol.pointer.PointerEvent(ol.pointer.EventType.POINTERDOWN, { target: control.element.firstElementChild }); @@ -138,7 +136,6 @@ describe('ol.control.ZoomSlider', function() { expect(control.dragging_).to.be(false); }); it('[vertical] handles a drag sequence', function() { - var spy = sinon.spy(goog.Disposable.prototype, 'registerDisposable'); var control = new ol.control.ZoomSlider(); control.element.style.width = '10px'; control.element.style.height = '100px'; @@ -147,8 +144,7 @@ describe('ol.control.ZoomSlider', function() { map.addControl(control); map.getView().setZoom(8); map.renderSync(); - var dragger = spy.firstCall.args[0]; - spy.restore(); + var dragger = control.dragger_; var event = new ol.pointer.PointerEvent(ol.pointer.EventType.POINTERDOWN, { target: control.element.firstElementChild }); @@ -177,7 +173,6 @@ describe('ol.control.ZoomSlider', function() { }); -goog.require('goog.Disposable'); goog.require('goog.dom.classlist'); goog.require('ol.Map'); goog.require('ol.View');