From f5ba373208a45f3596e5a28efe0e3d60049e6295 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Fri, 13 Dec 2013 19:02:21 +0100 Subject: [PATCH 1/5] Minor apidoc updates --- src/objectliterals.jsdoc | 49 ++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc index f6fba884dc..72b96d01cd 100644 --- a/src/objectliterals.jsdoc +++ b/src/objectliterals.jsdoc @@ -118,7 +118,7 @@ * @property {ol.Coordinate|undefined} center The initial center for the view. * The coordinate system for the center is specified with the `projection` * option. Default is `undefined`, and layer sources will not be fetched if - * this is not set. + * this is not set. * @property {ol.Extent|undefined} extent The extent that constrains the center, * in other words, center cannot be set outside this extent. * Default is `undefined`. @@ -205,12 +205,12 @@ /** * @typedef {Object} olx.control.DefaultsOptions - * @property {boolean|undefined} attribution Attribution. + * @property {boolean|undefined} attribution Attribution. Default is `true`. * @property {olx.control.AttributionOptions|undefined} attributionOptions * Attribution options. - * @property {boolean|undefined} logo Logo. + * @property {boolean|undefined} logo Logo. Default is `true`. * @property {olx.control.LogoOptions|undefined} logoOptions Logo options. - * @property {boolean|undefined} zoom Zoom. + * @property {boolean|undefined} zoom Zoom. Default is `true`. * @property {olx.control.ZoomOptions|undefined} zoomOptions Zoom options. * @todo stability experimental */ @@ -245,9 +245,10 @@ /** * @typedef {Object} olx.control.ScaleLineOptions * @property {string|undefined} className CSS Class name. Default is `ol-scale-line`. - * @property {number|undefined} minWidth Minimum width in pixels. + * @property {number|undefined} minWidth Minimum width in pixels. Default is `64`. * @property {Element|undefined} target Target. * @property {ol.control.ScaleLineUnits|undefined} units Units. + * Default is `ol.control.ScaleLineUnits.METRIC`. * @todo stability experimental */ @@ -322,20 +323,20 @@ * Interactions for the map. Default is `true` for all options. * @typedef {Object} olx.interaction.DefaultsOptions * @property {boolean|undefined} altShiftDragRotate Whether Alt-Shift-drag - * rotate is desired. + * rotate is desired. Default is `true`. * @property {boolean|undefined} doubleClickZoom Whether double click zoom is - * desired. - * @property {boolean|undefined} dragPan Whether drag-pan is desired. + * desired. Default is `true`. + * @property {boolean|undefined} dragPan Whether drag-pan is desired. Default is `true`. * @property {boolean|undefined} keyboard Whether keyboard interaction is - * desired. + * desired. Default is `true`. * @property {boolean|undefined} mouseWheelZoom Whether mousewheel zoom is - * desired. + * desired. Default is `true`. * @property {boolean|undefined} shiftDragZoom Whether Shift-drag zoom is - * desired. + * desired. Default is `true`. * @property {boolean|undefined} touchPan Whether touch pan is - * desired. - * @property {boolean|undefined} touchRotate Whether touch rotate is desired. - * @property {boolean|undefined} touchZoom Whether touch zoom is desired. + * desired. Default is `true`. + * @property {boolean|undefined} touchRotate Whether touch rotate is desired. Default is `true`. + * @property {boolean|undefined} touchZoom Whether touch zoom is desired. Default is `true`. * @property {number|undefined} zoomDelta Zoom delta. * @property {number|undefined} zoomDuration Zoom duration. * @todo stability experimental @@ -634,14 +635,14 @@ /** * @typedef {Object} olx.source.MapGuideOptions * @property {string|undefined} url The mapagent url. - * @property {number|undefined} metersPerUnit The meters-per-unit value. - * @property {ol.Extent|undefined} extent Extent.. - * @property {boolean|undefined} useOverlay If true, will use - * GETDYNAMICMAPOVERLAYIMAGE. + * @property {number|undefined} metersPerUnit The meters-per-unit value. Default is `1`. + * @property {ol.Extent|undefined} extent Extent. + * @property {boolean|undefined} useOverlay If `true`, will use + * `GETDYNAMICMAPOVERLAYIMAGE`. * @property {ol.proj.ProjectionLike} projection Projection. - * @property {number|undefined} ratio Ratio. 1 means image requests are the size - * of the map viewport, 2 means twice the size of the map viewport, and so - * on. + * @property {number|undefined} ratio Ratio. `1` means image requests are the size + * of the map viewport, `2` means twice the size of the map viewport, and so + * on. Default is `1`. * @property {Array.|undefined} resolutions Resolutions. If specified, * requests will be made for these resolutions only. * @property {Object|undefined} params Additional parameters. @@ -687,9 +688,9 @@ * `1.3.0` by default. `WIDTH`, `HEIGHT`, `BBOX` and `CRS` (`SRS` for WMS * version < 1.3.0) will be set dynamically. * @property {ol.proj.ProjectionLike} projection Projection. - * @property {number|undefined} ratio Ratio. 1 means image requests are the size - * of the map viewport, 2 means twice the size of the map viewport, and so - * on. + * @property {number|undefined} ratio Ratio. `1` means image requests are the size + * of the map viewport, `2` means twice the size of the map viewport, and so + * on. Default is `1.5`. * @property {Array.|undefined} resolutions Resolutions. If specified, * requests will be made for these resolutions only. * @property {string|undefined} url WMS service URL. From b48fd5156114f4d3df271c25676c09f4df267688 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Dec 2013 20:34:56 +0100 Subject: [PATCH 2/5] Make ol.Object#accessors_ a private renameable property --- src/ol/object.js | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/src/ol/object.js b/src/ol/object.js index a918f8df06..1f892cf948 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -107,7 +107,6 @@ ol.ObjectAccessor.prototype.transform = function(from, to) { * @enum {string} */ ol.ObjectProperty = { - ACCESSORS: 'ol_accessors_', BINDINGS: 'ol_bindings_' }; @@ -129,6 +128,12 @@ ol.Object = function(opt_values) { */ this.values_ = {}; + /** + * @private + * @type {Object.} + */ + this.accessors_ = {}; + /** * Lookup of beforechange listener keys. * @type {Object.} @@ -173,16 +178,6 @@ ol.Object.capitalize = function(str) { }; -/** - * @param {ol.Object} obj Object. - * @return {Object.} Accessors. - */ -ol.Object.getAccessors = function(obj) { - return obj[ol.ObjectProperty.ACCESSORS] || - (obj[ol.ObjectProperty.ACCESSORS] = {}); -}; - - /** * @param {string} key Key name. * @return {string} Change name. @@ -273,8 +268,7 @@ ol.Object.prototype.bindTo = function(key, target, opt_targetKey) { undefined, this); var accessor = new ol.ObjectAccessor(target, targetKey); - var accessors = ol.Object.getAccessors(this); - accessors[key] = accessor; + this.accessors_[key] = accessor; this.notifyInternal_(key); return accessor; }; @@ -312,7 +306,7 @@ ol.Object.prototype.createBeforeChangeListener_ = function(key, targetKey) { */ ol.Object.prototype.get = function(key) { var value; - var accessors = ol.Object.getAccessors(this); + var accessors = this.accessors_; if (accessors.hasOwnProperty(key)) { var accessor = accessors[key]; var target = accessor.target; @@ -336,7 +330,7 @@ ol.Object.prototype.get = function(key) { * @return {Array.} List of property names. */ ol.Object.prototype.getKeys = function() { - var accessors = ol.Object.getAccessors(this); + var accessors = this.accessors_; var keysObject; if (goog.object.isEmpty(this.values_)) { if (goog.object.isEmpty(accessors)) { @@ -372,7 +366,7 @@ ol.Object.prototype.getProperties = function() { for (key in this.values_) { properties[key] = this.values_[key]; } - for (key in ol.Object.getAccessors(this)) { + for (key in this.accessors_) { properties[key] = this.get(key); } return properties; @@ -387,7 +381,7 @@ ol.Object.prototype.getProperties = function() { * @todo stability experimental */ ol.Object.prototype.notify = function(key) { - var accessors = ol.Object.getAccessors(this); + var accessors = this.accessors_; if (accessors.hasOwnProperty(key)) { var accessor = accessors[key]; var target = accessor.target; @@ -420,7 +414,7 @@ ol.Object.prototype.notifyInternal_ = function(key) { ol.Object.prototype.set = function(key, value) { this.dispatchEvent( new ol.ObjectEvent(ol.ObjectEventType.BEFOREPROPERTYCHANGE, key)); - var accessors = ol.Object.getAccessors(this); + var accessors = this.accessors_; if (accessors.hasOwnProperty(key)) { var accessor = accessors[key]; var target = accessor.target; @@ -471,8 +465,7 @@ ol.Object.prototype.unbind = function(key) { delete listeners[key]; goog.events.unlistenByKey(listener); var value = this.get(key); - var accessors = ol.Object.getAccessors(this); - delete accessors[key]; + delete this.accessors_[key]; this.values_[key] = value; } From 6e3bcc7478102cca90d6c5ea5605697eec25a3ff Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Dec 2013 20:35:27 +0100 Subject: [PATCH 3/5] Make ol.Object#listeners_ a private renameable property --- src/ol/object.js | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/src/ol/object.js b/src/ol/object.js index 1f892cf948..9b4fd5b4b2 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -103,14 +103,6 @@ ol.ObjectAccessor.prototype.transform = function(from, to) { }; -/** - * @enum {string} - */ -ol.ObjectProperty = { - BINDINGS: 'ol_bindings_' -}; - - /** * Base class implementing KVO (Key Value Observing). @@ -141,6 +133,12 @@ ol.Object = function(opt_values) { */ this.beforeChangeListeners_ = {}; + /** + * @private + * @type {Object.} + */ + this.listeners_ = {}; + if (goog.isDef(opt_values)) { this.setValues(opt_values); } @@ -200,16 +198,6 @@ ol.Object.getGetterName = function(key) { }; -/** - * @param {ol.Object} obj Object. - * @return {Object.} Listeners. - */ -ol.Object.getListeners = function(obj) { - return obj[ol.ObjectProperty.BINDINGS] || - (obj[ol.ObjectProperty.BINDINGS] = {}); -}; - - /** * @param {string} key String. * @return {string} Setter name. @@ -256,8 +244,7 @@ ol.Object.prototype.bindTo = function(key, target, opt_targetKey) { // listen for change:targetkey events var eventType = ol.Object.getChangeEventType(targetKey); - var listeners = ol.Object.getListeners(this); - listeners[key] = goog.events.listen(target, eventType, function() { + this.listeners_[key] = goog.events.listen(target, eventType, function() { this.notifyInternal_(key); }, undefined, this); @@ -459,7 +446,7 @@ ol.Object.prototype.setValues = function(values) { * @todo stability experimental */ ol.Object.prototype.unbind = function(key) { - var listeners = ol.Object.getListeners(this); + var listeners = this.listeners_; var listener = listeners[key]; if (listener) { delete listeners[key]; @@ -483,7 +470,7 @@ ol.Object.prototype.unbind = function(key) { * @todo stability experimental */ ol.Object.prototype.unbindAll = function() { - for (var key in ol.Object.getListeners(this)) { + for (var key in this.listeners_) { this.unbind(key); } }; From d63fec80d1d1bac36a85f7b467bf8cc3bf7568c0 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Dec 2013 20:36:32 +0100 Subject: [PATCH 4/5] Use goog.object.get to suppress compiler warning about use of [] with struct --- src/ol/object.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/ol/object.js b/src/ol/object.js index 9b4fd5b4b2..14edbb94c6 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -299,8 +299,10 @@ ol.Object.prototype.get = function(key) { var target = accessor.target; var targetKey = accessor.key; var getterName = ol.Object.getGetterName(targetKey); - if (target[getterName]) { - value = target[getterName](); + var getter = /** @type {function(): *|undefined} */ + (goog.object.get(target, getterName)); + if (goog.isDef(getter)) { + value = getter.call(target); } else { value = target.get(targetKey); } @@ -406,10 +408,12 @@ ol.Object.prototype.set = function(key, value) { var accessor = accessors[key]; var target = accessor.target; var targetKey = accessor.key; - var setterName = ol.Object.getSetterName(targetKey); value = accessor.from(value); - if (target[setterName]) { - target[setterName](value); + var setterName = ol.Object.getSetterName(targetKey); + var setter = /** @type {function(*)|undefined} */ + (goog.object.get(target, setterName)); + if (goog.isDef(setter)) { + setter.call(target, value); } else { target.set(targetKey, value); } @@ -426,12 +430,14 @@ ol.Object.prototype.set = function(key, value) { * @todo stability experimental */ ol.Object.prototype.setValues = function(values) { - var key, value, setterName; + var key; for (key in values) { - value = values[key]; - setterName = ol.Object.getSetterName(key); - if (this[setterName]) { - this[setterName](value); + var value = values[key]; + var setterName = ol.Object.getSetterName(key); + var setter = /** @type {function(*)|undefined} */ + (goog.object.get(this, setterName)); + if (goog.isDef(setter)) { + setter.call(this, value); } else { this.set(key, value); } From 90e44c39794052cee7dbdbe9ed1612edc917b1e5 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Dec 2013 20:44:10 +0100 Subject: [PATCH 5/5] Make ol.Observable a @struct --- src/ol/observable.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ol/observable.js b/src/ol/observable.js index 6becf17b47..5b20280df6 100644 --- a/src/ol/observable.js +++ b/src/ol/observable.js @@ -10,6 +10,8 @@ goog.require('goog.events.EventTarget'); * and unregistration. * @constructor * @extends {goog.events.EventTarget} + * @suppress {checkStructDictInheritance} + * @struct * @todo stability experimental */ ol.Observable = function() {