From 3a4b504a5da4e9c1f6faf9f71e7bdffee23009e8 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 06:31:08 -0700 Subject: [PATCH 01/16] Add polyfill for Object.assign() --- src/ol/object.js | 30 ++++++++++++++++++++++++++++++ test/spec/ol/object.test.js | 32 +++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/ol/object.js b/src/ol/object.js index 363e7d4b17..7db672797f 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -1,12 +1,42 @@ goog.provide('ol.Object'); goog.provide('ol.ObjectEvent'); goog.provide('ol.ObjectEventType'); +goog.provide('ol.object'); goog.require('ol.events'); goog.require('ol.events.Event'); goog.require('ol.Observable'); +/** + * Polyfill for Object.assign(). Assigns enumerable and own properties from + * one or more source objects to a target object. + * + * @see https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + * @param {!Object} target The target object. + * @param {...Object} var_sources The source object(s). + * @return {!Object} The modified target object. + */ +ol.object.assign = (typeof Object.assign === 'function') ? Object.assign : function(target, var_sources) { + if (target === undefined || target === null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + + var output = Object(target); + for (var i = 1, ii = arguments.length; i < ii; ++i) { + var source = arguments[i]; + if (source !== undefined && source !== null) { + for (var key in source) { + if (source.hasOwnProperty(key)) { + output[key] = source[key]; + } + } + } + } + return output; +}; + + /** * @enum {string} */ diff --git a/test/spec/ol/object.test.js b/test/spec/ol/object.test.js index 87aa668e09..5d22b167a9 100644 --- a/test/spec/ol/object.test.js +++ b/test/spec/ol/object.test.js @@ -238,7 +238,37 @@ describe('ol.Object', function() { }); +describe('ol.object.assign()', function() { + + it('is an alias for Object.assign() where available', function() { + if (typeof Object.assign === 'function') { + expect(ol.object.assign).to.be(Object.assign); + } + }); + + it('assigns properties from a source object to a target object', function() { + + var source = { + sourceProp1: 'sourceValue1', + sourceProp2: 'sourceValue2' + }; + + var target = { + sourceProp1: 'overridden', + targetProp1: 'targetValue1' + }; + + var assigned = ol.object.assign(target, source); + expect(assigned).to.be(target); + expect(assigned.sourceProp1).to.be('sourceValue1'); + expect(assigned.sourceProp2).to.be('sourceValue2'); + expect(assigned.targetProp1).to.be('targetValue1'); + + }); + +}); -goog.require('ol.events'); goog.require('ol.Object'); goog.require('ol.ObjectEventType'); +goog.require('ol.events'); +goog.require('ol.object'); From 619e070d805a4c7e6342b1b7283f877d459a0106 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 06:43:57 -0700 Subject: [PATCH 02/16] Use ol.object.assign() in object.getPoperties() --- src/ol/object.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/ol/object.js b/src/ol/object.js index 7db672797f..b0abb8c402 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -199,12 +199,7 @@ ol.Object.prototype.getKeys = function() { * @api stable */ ol.Object.prototype.getProperties = function() { - var properties = {}; - var key; - for (key in this.values_) { - properties[key] = this.values_[key]; - } - return properties; + return ol.object.assign({}, this.values_); }; From a74af66d5f616a8b2ebc9d803bd74715b6e69db2 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 07:22:39 -0700 Subject: [PATCH 03/16] Use ol.object.assign() instead of goog.object.clone() --- src/ol/control/attributioncontrol.js | 3 ++- src/ol/format/esrijsonformat.js | 3 ++- src/ol/format/gml/gml3format.js | 7 ++++--- src/ol/format/wfsformat.js | 5 +++-- src/ol/layer/heatmaplayer.js | 4 ++-- src/ol/layer/layer.js | 4 ++-- src/ol/layer/layerbase.js | 4 ++-- src/ol/layer/layergroup.js | 5 +++-- src/ol/layer/tilelayer.js | 4 ++-- src/ol/layer/vectorlayer.js | 4 ++-- src/ol/layer/vectortilelayer.js | 4 ++-- src/ol/map.js | 3 ++- src/ol/source/rastersource.js | 12 ++++++------ 13 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/ol/control/attributioncontrol.js b/src/ol/control/attributioncontrol.js index 2aec3d73c8..8da0c15e8d 100644 --- a/src/ol/control/attributioncontrol.js +++ b/src/ol/control/attributioncontrol.js @@ -13,6 +13,7 @@ goog.require('ol'); goog.require('ol.Attribution'); goog.require('ol.control.Control'); goog.require('ol.css'); +goog.require('ol.object'); goog.require('ol.source.Tile'); @@ -150,7 +151,7 @@ ol.control.Attribution.prototype.getSourceAttributions = function(frameState) { var intersectsTileRange; var layerStatesArray = frameState.layerStatesArray; /** @type {Object.} */ - var attributions = goog.object.clone(frameState.attributions); + var attributions = ol.object.assign({}, frameState.attributions); /** @type {Object.} */ var hiddenAttributions = {}; var projection = frameState.viewState.projection; diff --git a/src/ol/format/esrijsonformat.js b/src/ol/format/esrijsonformat.js index 7d62c8d00d..670f062d22 100644 --- a/src/ol/format/esrijsonformat.js +++ b/src/ol/format/esrijsonformat.js @@ -17,6 +17,7 @@ goog.require('ol.geom.MultiPolygon'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); goog.require('ol.geom.flat.orient'); +goog.require('ol.object'); goog.require('ol.proj'); @@ -70,7 +71,7 @@ ol.format.EsriJSON.readGeometry_ = function(object, opt_options) { } else if (object.rings) { var layout = ol.format.EsriJSON.getGeometryLayout_(object); var rings = ol.format.EsriJSON.convertRings_(object.rings, layout); - object = /** @type {EsriJSONGeometry} */(goog.object.clone(object)); + object = /** @type {EsriJSONGeometry} */(ol.object.assign({}, object)); if (rings.length === 1) { type = ol.geom.GeometryType.POLYGON; object.rings = rings[0]; diff --git a/src/ol/format/gml/gml3format.js b/src/ol/format/gml/gml3format.js index 2696457e37..e6f548b3a1 100644 --- a/src/ol/format/gml/gml3format.js +++ b/src/ol/format/gml/gml3format.js @@ -19,6 +19,7 @@ goog.require('ol.geom.MultiLineString'); goog.require('ol.geom.MultiPolygon'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); +goog.require('ol.object'); goog.require('ol.proj'); goog.require('ol.xml'); @@ -1003,7 +1004,7 @@ ol.format.GML3.prototype.writeCurveSegments_ = function(node, line, objectStack) ol.format.GML3.prototype.writeGeometryElement = function(node, geometry, objectStack) { var context = objectStack[objectStack.length - 1]; goog.asserts.assert(goog.isObject(context), 'context should be an Object'); - var item = goog.object.clone(context); + var item = ol.object.assign({}, context); item.node = node; var value; if (goog.isArray(geometry)) { @@ -1064,7 +1065,7 @@ ol.format.GML3.prototype.writeFeatureElement = function(node, feature, objectSta } } } - var item = goog.object.clone(context); + var item = ol.object.assign({}, context); item.node = node; ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ (item), context.serializers, @@ -1089,7 +1090,7 @@ ol.format.GML3.prototype.writeFeatureMembers_ = function(node, features, objectS serializers[featureNS] = {}; serializers[featureNS][featureType] = ol.xml.makeChildAppender( this.writeFeatureElement, this); - var item = goog.object.clone(context); + var item = ol.object.assign({}, context); item.node = node; ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ (item), diff --git a/src/ol/format/wfsformat.js b/src/ol/format/wfsformat.js index 4159a2e56f..a8caa61168 100644 --- a/src/ol/format/wfsformat.js +++ b/src/ol/format/wfsformat.js @@ -9,6 +9,7 @@ goog.require('ol.format.GMLBase'); goog.require('ol.format.XMLFeature'); goog.require('ol.format.XSD'); goog.require('ol.geom.Geometry'); +goog.require('ol.object'); goog.require('ol.proj'); goog.require('ol.xml'); @@ -543,7 +544,7 @@ ol.format.WFS.writeQuery_ = function(node, featureType, objectStack) { ol.xml.setAttributeNS(node, ol.format.WFS.XMLNS, 'xmlns:' + featurePrefix, featureNS); } - var item = goog.object.clone(context); + var item = ol.object.assign({}, context); item.node = node; ol.xml.pushSerializeAndPop(item, ol.format.WFS.QUERY_SERIALIZERS_, @@ -610,7 +611,7 @@ ol.format.WFS.GETFEATURE_SERIALIZERS_ = { ol.format.WFS.writeGetFeature_ = function(node, featureTypes, objectStack) { var context = objectStack[objectStack.length - 1]; goog.asserts.assert(goog.isObject(context), 'context should be an Object'); - var item = goog.object.clone(context); + var item = ol.object.assign({}, context); item.node = node; ol.xml.pushSerializeAndPop(item, ol.format.WFS.GETFEATURE_SERIALIZERS_, diff --git a/src/ol/layer/heatmaplayer.js b/src/ol/layer/heatmaplayer.js index a5daba97ea..40d17252e3 100644 --- a/src/ol/layer/heatmaplayer.js +++ b/src/ol/layer/heatmaplayer.js @@ -2,12 +2,12 @@ goog.provide('ol.layer.Heatmap'); goog.require('goog.asserts'); goog.require('ol.events'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.Object'); goog.require('ol.dom'); goog.require('ol.layer.Vector'); goog.require('ol.math'); +goog.require('ol.object'); goog.require('ol.render.EventType'); goog.require('ol.style.Icon'); goog.require('ol.style.Style'); @@ -39,7 +39,7 @@ ol.layer.HeatmapLayerProperty = { ol.layer.Heatmap = function(opt_options) { var options = opt_options ? opt_options : {}; - var baseOptions = goog.object.clone(options); + var baseOptions = ol.object.assign({}, options); delete baseOptions.gradient; delete baseOptions.radius; diff --git a/src/ol/layer/layer.js b/src/ol/layer/layer.js index 61ae7a32c0..b36f80204b 100644 --- a/src/ol/layer/layer.js +++ b/src/ol/layer/layer.js @@ -2,11 +2,11 @@ goog.provide('ol.layer.Layer'); goog.require('ol.events'); goog.require('ol.events.EventType'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.Object'); goog.require('ol.layer.Base'); goog.require('ol.layer.LayerProperty'); +goog.require('ol.object'); goog.require('ol.render.EventType'); goog.require('ol.source.State'); @@ -34,7 +34,7 @@ goog.require('ol.source.State'); */ ol.layer.Layer = function(options) { - var baseOptions = goog.object.clone(options); + var baseOptions = ol.object.assign({}, options); delete baseOptions.source; goog.base(this, /** @type {olx.layer.LayerOptions} */ (baseOptions)); diff --git a/src/ol/layer/layerbase.js b/src/ol/layer/layerbase.js index 6d4dfef89b..2b498c5403 100644 --- a/src/ol/layer/layerbase.js +++ b/src/ol/layer/layerbase.js @@ -2,10 +2,10 @@ goog.provide('ol.layer.Base'); goog.provide('ol.layer.LayerProperty'); goog.provide('ol.layer.LayerState'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.Object'); goog.require('ol.math'); +goog.require('ol.object'); goog.require('ol.source.State'); @@ -57,7 +57,7 @@ ol.layer.Base = function(options) { /** * @type {Object.} */ - var properties = goog.object.clone(options); + var properties = ol.object.assign({}, options); properties[ol.layer.LayerProperty.OPACITY] = options.opacity !== undefined ? options.opacity : 1; properties[ol.layer.LayerProperty.VISIBLE] = diff --git a/src/ol/layer/layergroup.js b/src/ol/layer/layergroup.js index 291ee58e7c..daa3db3524 100644 --- a/src/ol/layer/layergroup.js +++ b/src/ol/layer/layergroup.js @@ -1,9 +1,9 @@ goog.provide('ol.layer.Group'); goog.require('goog.asserts'); +goog.require('goog.object'); goog.require('ol.events'); goog.require('ol.events.EventType'); -goog.require('goog.object'); goog.require('ol.Collection'); goog.require('ol.CollectionEvent'); goog.require('ol.CollectionEventType'); @@ -11,6 +11,7 @@ goog.require('ol.Object'); goog.require('ol.ObjectEventType'); goog.require('ol.extent'); goog.require('ol.layer.Base'); +goog.require('ol.object'); goog.require('ol.source.State'); @@ -37,7 +38,7 @@ ol.layer.Group = function(opt_options) { var options = opt_options || {}; var baseOptions = /** @type {olx.layer.GroupOptions} */ - (goog.object.clone(options)); + (ol.object.assign({}, options)); delete baseOptions.layers; var layers = options.layers; diff --git a/src/ol/layer/tilelayer.js b/src/ol/layer/tilelayer.js index 0430749ffb..4bf1d26ceb 100644 --- a/src/ol/layer/tilelayer.js +++ b/src/ol/layer/tilelayer.js @@ -1,8 +1,8 @@ goog.provide('ol.layer.Tile'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.layer.Layer'); +goog.require('ol.object'); /** @@ -31,7 +31,7 @@ ol.layer.TileProperty = { ol.layer.Tile = function(opt_options) { var options = opt_options ? opt_options : {}; - var baseOptions = goog.object.clone(options); + var baseOptions = ol.object.assign({}, options); delete baseOptions.preload; delete baseOptions.useInterimTilesOnError; diff --git a/src/ol/layer/vectorlayer.js b/src/ol/layer/vectorlayer.js index f2f30d7ab5..a001e370e2 100644 --- a/src/ol/layer/vectorlayer.js +++ b/src/ol/layer/vectorlayer.js @@ -1,9 +1,9 @@ goog.provide('ol.layer.Vector'); goog.require('goog.asserts'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.layer.Layer'); +goog.require('ol.object'); goog.require('ol.style.Style'); @@ -38,7 +38,7 @@ ol.layer.Vector = function(opt_options) { goog.isFunction(options.renderOrder), 'renderOrder must be a comparator function'); - var baseOptions = goog.object.clone(options); + var baseOptions = ol.object.assign({}, options); delete baseOptions.style; delete baseOptions.renderBuffer; diff --git a/src/ol/layer/vectortilelayer.js b/src/ol/layer/vectortilelayer.js index 50a7a63485..0631c893b0 100644 --- a/src/ol/layer/vectortilelayer.js +++ b/src/ol/layer/vectortilelayer.js @@ -1,7 +1,7 @@ goog.provide('ol.layer.VectorTile'); -goog.require('goog.object'); goog.require('ol.layer.Vector'); +goog.require('ol.object'); /** @@ -28,7 +28,7 @@ ol.layer.VectorTileProperty = { ol.layer.VectorTile = function(opt_options) { var options = opt_options ? opt_options : {}; - var baseOptions = goog.object.clone(options); + var baseOptions = ol.object.assign({}, options); delete baseOptions.preload; delete baseOptions.useInterimTilesOnError; diff --git a/src/ol/map.js b/src/ol/map.js index 785de7fcad..ecd7aa41c7 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -44,6 +44,7 @@ goog.require('ol.has'); goog.require('ol.interaction'); goog.require('ol.layer.Base'); goog.require('ol.layer.Group'); +goog.require('ol.object'); goog.require('ol.proj'); goog.require('ol.proj.common'); goog.require('ol.renderer.Map'); @@ -1325,7 +1326,7 @@ ol.Map.prototype.renderFrame_ = function(time) { index: this.frameIndex_++, layerStates: layerStates, layerStatesArray: layerStatesArray, - logos: goog.object.clone(this.logos_), + logos: ol.object.assign({}, this.logos_), pixelRatio: this.pixelRatio_, pixelToCoordinateMatrix: this.pixelToCoordinateMatrix_, postRenderFunctions: [], diff --git a/src/ol/source/rastersource.js b/src/ol/source/rastersource.js index 16d918b076..3e3090327a 100644 --- a/src/ol/source/rastersource.js +++ b/src/ol/source/rastersource.js @@ -3,18 +3,18 @@ goog.provide('ol.source.RasterEvent'); goog.provide('ol.source.RasterEventType'); goog.require('goog.asserts'); -goog.require('ol.events'); -goog.require('ol.events.Event'); -goog.require('ol.events.EventType'); -goog.require('goog.object'); goog.require('goog.vec.Mat4'); goog.require('ol.ImageCanvas'); goog.require('ol.TileQueue'); goog.require('ol.dom'); +goog.require('ol.events'); +goog.require('ol.events.Event'); +goog.require('ol.events.EventType'); goog.require('ol.ext.pixelworks'); goog.require('ol.extent'); goog.require('ol.layer.Image'); goog.require('ol.layer.Tile'); +goog.require('ol.object'); goog.require('ol.raster.OperationType'); goog.require('ol.renderer.canvas.ImageLayer'); goog.require('ol.renderer.canvas.TileLayer'); @@ -171,10 +171,10 @@ ol.source.Raster.prototype.setOperation = function(operation, opt_lib) { ol.source.Raster.prototype.updateFrameState_ = function(extent, resolution, projection) { var frameState = /** @type {olx.FrameState} */ ( - goog.object.clone(this.frameState_)); + ol.object.assign({}, this.frameState_)); frameState.viewState = /** @type {olx.ViewState} */ ( - goog.object.clone(frameState.viewState)); + ol.object.assign({}, frameState.viewState)); var center = ol.extent.getCenter(extent); var width = Math.round(ol.extent.getWidth(extent) / resolution); From 3c0ef430db8220beb78a360c01074e2257780f53 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 09:37:38 -0700 Subject: [PATCH 04/16] Use ol.object.assign() instead of goog.object.extend() --- src/ol/format/gml/gml3format.js | 5 ++--- src/ol/format/gml/gmlbaseformat.js | 3 ++- src/ol/format/wfsformat.js | 7 +++---- src/ol/format/wmsgetfeatureinfoformat.js | 4 ++-- src/ol/source/imagemapguidesource.js | 10 +++++----- src/ol/source/imagewmssource.js | 11 ++++++----- src/ol/source/tilearcgisrestsource.js | 12 +++++------- src/ol/source/tilewmssource.js | 11 ++++++----- src/ol/source/wmtssource.js | 8 ++++---- src/ol/tilegrid/tilegrid.js | 4 ++-- test/spec/ol/pointer/touchsource.test.js | 7 +++---- test_rendering/spec/ol/layer/image.test.js | 6 +++--- test_rendering/spec/ol/layer/tile.test.js | 6 +++--- test_rendering/spec/ol/layer/vectortile.test.js | 6 +++--- 14 files changed, 49 insertions(+), 51 deletions(-) diff --git a/src/ol/format/gml/gml3format.js b/src/ol/format/gml/gml3format.js index e6f548b3a1..61dbd5dd5a 100644 --- a/src/ol/format/gml/gml3format.js +++ b/src/ol/format/gml/gml3format.js @@ -3,7 +3,6 @@ goog.provide('ol.format.GML3'); goog.require('goog.asserts'); goog.require('goog.dom.NodeType'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.array'); goog.require('ol.Feature'); @@ -1270,7 +1269,7 @@ ol.format.GML3.prototype.writeGeometryNode = function(geometry, opt_options) { curve: this.curve_, surface: this.surface_, multiSurface: this.multiSurface_, multiCurve: this.multiCurve_}; if (opt_options) { - goog.object.extend(context, opt_options); + ol.object.assign(context, opt_options); } this.writeGeometryElement(geom, geometry, [context]); return geom; @@ -1313,7 +1312,7 @@ ol.format.GML3.prototype.writeFeaturesNode = function(features, opt_options) { featureType: this.featureType }; if (opt_options) { - goog.object.extend(context, opt_options); + ol.object.assign(context, opt_options); } this.writeFeatureMembers_(node, features, [context]); return node; diff --git a/src/ol/format/gml/gmlbaseformat.js b/src/ol/format/gml/gmlbaseformat.js index 55ca4c5187..4d4d7809e0 100644 --- a/src/ol/format/gml/gmlbaseformat.js +++ b/src/ol/format/gml/gmlbaseformat.js @@ -20,6 +20,7 @@ goog.require('ol.geom.MultiPoint'); goog.require('ol.geom.MultiPolygon'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); +goog.require('ol.object'); goog.require('ol.proj'); goog.require('ol.xml'); @@ -607,7 +608,7 @@ ol.format.GMLBase.prototype.readFeaturesFromNode = function(node, opt_options) { featureNS: this.featureNS }; if (opt_options) { - goog.object.extend(options, this.getReadOptions(node, opt_options)); + ol.object.assign(options, this.getReadOptions(node, opt_options)); } return this.readFeaturesInternal(node, [options]); }; diff --git a/src/ol/format/wfsformat.js b/src/ol/format/wfsformat.js index a8caa61168..325e5a9bf6 100644 --- a/src/ol/format/wfsformat.js +++ b/src/ol/format/wfsformat.js @@ -2,7 +2,6 @@ goog.provide('ol.format.WFS'); goog.require('goog.asserts'); goog.require('goog.dom.NodeType'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.format.GML3'); goog.require('ol.format.GMLBase'); @@ -123,7 +122,7 @@ ol.format.WFS.prototype.readFeaturesFromNode = function(node, opt_options) { 'featureType': this.featureType_, 'featureNS': this.featureNS_ }; - goog.object.extend(context, this.getReadOptions(node, + ol.object.assign(context, this.getReadOptions(node, opt_options ? opt_options : {})); var objectStack = [context]; this.gmlFormat_.FEATURE_COLLECTION_PARSERS[ol.format.GMLBase.GMLNS][ @@ -699,7 +698,7 @@ ol.format.WFS.prototype.writeTransaction = function(inserts, updates, deletes, if (inserts) { obj = {node: node, featureNS: options.featureNS, featureType: options.featureType, featurePrefix: options.featurePrefix}; - goog.object.extend(obj, baseObj); + ol.object.assign(obj, baseObj); ol.xml.pushSerializeAndPop(obj, ol.format.WFS.TRANSACTION_SERIALIZERS_, ol.xml.makeSimpleNodeFactory('Insert'), inserts, @@ -708,7 +707,7 @@ ol.format.WFS.prototype.writeTransaction = function(inserts, updates, deletes, if (updates) { obj = {node: node, featureNS: options.featureNS, featureType: options.featureType, featurePrefix: options.featurePrefix}; - goog.object.extend(obj, baseObj); + ol.object.assign(obj, baseObj); ol.xml.pushSerializeAndPop(obj, ol.format.WFS.TRANSACTION_SERIALIZERS_, ol.xml.makeSimpleNodeFactory('Update'), updates, diff --git a/src/ol/format/wmsgetfeatureinfoformat.js b/src/ol/format/wmsgetfeatureinfoformat.js index 5f3d7c04c1..6b669742a6 100644 --- a/src/ol/format/wmsgetfeatureinfoformat.js +++ b/src/ol/format/wmsgetfeatureinfoformat.js @@ -2,10 +2,10 @@ goog.provide('ol.format.WMSGetFeatureInfo'); goog.require('goog.asserts'); goog.require('goog.dom.NodeType'); -goog.require('goog.object'); goog.require('ol.array'); goog.require('ol.format.GML2'); goog.require('ol.format.XMLFeature'); +goog.require('ol.object'); goog.require('ol.xml'); @@ -154,7 +154,7 @@ ol.format.WMSGetFeatureInfo.prototype.readFeaturesFromNode = function(node, opt_ 'featureNS': this.featureNS }; if (opt_options) { - goog.object.extend(options, this.getReadOptions(node, opt_options)); + ol.object.assign(options, this.getReadOptions(node, opt_options)); } return this.readFeatures_(node, [options]); }; diff --git a/src/ol/source/imagemapguidesource.js b/src/ol/source/imagemapguidesource.js index 270093f08d..628550a4d5 100644 --- a/src/ol/source/imagemapguidesource.js +++ b/src/ol/source/imagemapguidesource.js @@ -2,11 +2,11 @@ goog.provide('ol.source.ImageMapGuide'); goog.require('ol.events'); goog.require('ol.events.EventType'); -goog.require('goog.object'); goog.require('goog.uri.utils'); goog.require('ol.Image'); goog.require('ol.ImageLoadFunctionType'); goog.require('ol.extent'); +goog.require('ol.object'); goog.require('ol.source.Image'); @@ -43,9 +43,9 @@ ol.source.ImageMapGuide = function(options) { /** * @private - * @type {Object} + * @type {!Object} */ - this.params_ = options.params !== undefined ? options.params : {}; + this.params_ = options.params || {}; /** * @private @@ -192,7 +192,7 @@ ol.source.ImageMapGuide.getScale = function(extent, size, metersPerUnit, dpi) { * @api stable */ ol.source.ImageMapGuide.prototype.updateParams = function(params) { - goog.object.extend(this.params_, params); + ol.object.assign(this.params_, params); this.changed(); }; @@ -222,7 +222,7 @@ ol.source.ImageMapGuide.prototype.getUrl = function(baseUrl, params, extent, siz 'SETVIEWCENTERX': center[0], 'SETVIEWCENTERY': center[1] }; - goog.object.extend(baseParams, params); + ol.object.assign(baseParams, params); return goog.uri.utils.appendParamsFromMap(baseUrl, baseParams); }; diff --git a/src/ol/source/imagewmssource.js b/src/ol/source/imagewmssource.js index 211ca6d33c..9fc3d80de3 100644 --- a/src/ol/source/imagewmssource.js +++ b/src/ol/source/imagewmssource.js @@ -12,6 +12,7 @@ goog.require('ol'); goog.require('ol.Image'); goog.require('ol.ImageLoadFunctionType'); goog.require('ol.extent'); +goog.require('ol.object'); goog.require('ol.proj'); goog.require('ol.source.Image'); goog.require('ol.source.wms'); @@ -61,9 +62,9 @@ ol.source.ImageWMS = function(opt_options) { /** * @private - * @type {Object} + * @type {!Object} */ - this.params_ = options.params; + this.params_ = options.params || {}; /** * @private @@ -156,7 +157,7 @@ ol.source.ImageWMS.prototype.getGetFeatureInfoUrl = function(coordinate, resolut 'TRANSPARENT': true, 'QUERY_LAYERS': this.params_['LAYERS'] }; - goog.object.extend(baseParams, this.params_, params); + ol.object.assign(baseParams, this.params_, params); var x = Math.floor((coordinate[0] - extent[0]) / resolution); var y = Math.floor((extent[3] - coordinate[1]) / resolution); @@ -228,7 +229,7 @@ ol.source.ImageWMS.prototype.getImageInternal = function(extent, resolution, pix 'FORMAT': 'image/png', 'TRANSPARENT': true }; - goog.object.extend(params, this.params_); + ol.object.assign(params, this.params_); this.imageSize_[0] = Math.ceil(imageWidth * this.ratio_); this.imageSize_[1] = Math.ceil(imageHeight * this.ratio_); @@ -360,7 +361,7 @@ ol.source.ImageWMS.prototype.setUrl = function(url) { * @api stable */ ol.source.ImageWMS.prototype.updateParams = function(params) { - goog.object.extend(this.params_, params); + ol.object.assign(this.params_, params); this.updateV13_(); this.image_ = null; this.changed(); diff --git a/src/ol/source/tilearcgisrestsource.js b/src/ol/source/tilearcgisrestsource.js index 17ab1ff7c0..451d4d3800 100644 --- a/src/ol/source/tilearcgisrestsource.js +++ b/src/ol/source/tilearcgisrestsource.js @@ -2,12 +2,12 @@ goog.provide('ol.source.TileArcGISRest'); goog.require('goog.asserts'); goog.require('goog.math'); -goog.require('goog.object'); goog.require('goog.string'); goog.require('goog.uri.utils'); goog.require('ol'); goog.require('ol.TileCoord'); goog.require('ol.extent'); +goog.require('ol.object'); goog.require('ol.proj'); goog.require('ol.size'); goog.require('ol.source.TileImage'); @@ -32,8 +32,6 @@ ol.source.TileArcGISRest = function(opt_options) { var options = opt_options || {}; - var params = options.params !== undefined ? options.params : {}; - goog.base(this, { attributions: options.attributions, crossOrigin: options.crossOrigin, @@ -49,9 +47,9 @@ ol.source.TileArcGISRest = function(opt_options) { /** * @private - * @type {Object} + * @type {!Object} */ - this.params_ = params; + this.params_ = options.params || {}; /** * @private @@ -165,7 +163,7 @@ ol.source.TileArcGISRest.prototype.fixedTileUrlFunction = function(tileCoord, pi 'FORMAT': 'PNG32', 'TRANSPARENT': true }; - goog.object.extend(baseParams, this.params_); + ol.object.assign(baseParams, this.params_); return this.getRequestUrl_(tileCoord, tileSize, tileExtent, pixelRatio, projection, baseParams); @@ -178,6 +176,6 @@ ol.source.TileArcGISRest.prototype.fixedTileUrlFunction = function(tileCoord, pi * @api stable */ ol.source.TileArcGISRest.prototype.updateParams = function(params) { - goog.object.extend(this.params_, params); + ol.object.assign(this.params_, params); this.changed(); }; diff --git a/src/ol/source/tilewmssource.js b/src/ol/source/tilewmssource.js index 48fb3b3c44..4ba0730b2d 100644 --- a/src/ol/source/tilewmssource.js +++ b/src/ol/source/tilewmssource.js @@ -12,6 +12,7 @@ goog.require('goog.uri.utils'); goog.require('ol'); goog.require('ol.TileCoord'); goog.require('ol.extent'); +goog.require('ol.object'); goog.require('ol.proj'); goog.require('ol.size'); goog.require('ol.source.TileImage'); @@ -33,7 +34,7 @@ ol.source.TileWMS = function(opt_options) { var options = opt_options || {}; - var params = options.params !== undefined ? options.params : {}; + var params = options.params || {}; var transparent = goog.object.get(params, 'TRANSPARENT', true); @@ -59,7 +60,7 @@ ol.source.TileWMS = function(opt_options) { /** * @private - * @type {Object} + * @type {!Object} */ this.params_ = params; @@ -161,7 +162,7 @@ ol.source.TileWMS.prototype.getGetFeatureInfoUrl = function(coordinate, resoluti 'TRANSPARENT': true, 'QUERY_LAYERS': this.params_['LAYERS'] }; - goog.object.extend(baseParams, this.params_, params); + ol.object.assign(baseParams, this.params_, params); var x = Math.floor((coordinate[0] - tileExtent[0]) / tileResolution); var y = Math.floor((tileExtent[3] - coordinate[1]) / tileResolution); @@ -363,7 +364,7 @@ ol.source.TileWMS.prototype.fixedTileUrlFunction = function(tileCoord, pixelRati 'FORMAT': 'image/png', 'TRANSPARENT': true }; - goog.object.extend(baseParams, this.params_); + ol.object.assign(baseParams, this.params_); return this.getRequestUrl_(tileCoord, tileSize, tileExtent, pixelRatio, projection, baseParams); @@ -376,7 +377,7 @@ ol.source.TileWMS.prototype.fixedTileUrlFunction = function(tileCoord, pixelRati * @api stable */ ol.source.TileWMS.prototype.updateParams = function(params) { - goog.object.extend(this.params_, params); + ol.object.assign(this.params_, params); this.resetCoordKeyPrefix_(); this.resetParamsKey_(); this.updateV13_(); diff --git a/src/ol/source/wmtssource.js b/src/ol/source/wmtssource.js index 8284404296..8b4ecdce35 100644 --- a/src/ol/source/wmtssource.js +++ b/src/ol/source/wmtssource.js @@ -2,12 +2,12 @@ goog.provide('ol.source.WMTS'); goog.provide('ol.source.WMTSRequestEncoding'); goog.require('goog.asserts'); -goog.require('goog.object'); goog.require('goog.uri.utils'); goog.require('ol.TileUrlFunction'); goog.require('ol.TileUrlFunctionType'); goog.require('ol.array'); goog.require('ol.extent'); +goog.require('ol.object'); goog.require('ol.proj'); goog.require('ol.source.TileImage'); goog.require('ol.tilegrid.WMTS'); @@ -111,7 +111,7 @@ ol.source.WMTS = function(options) { }; if (requestEncoding == ol.source.WMTSRequestEncoding.KVP) { - goog.object.extend(context, { + ol.object.assign(context, { 'Service': 'WMTS', 'Request': 'GetTile', 'Version': this.version_, @@ -153,7 +153,7 @@ ol.source.WMTS = function(options) { 'TileCol': tileCoord[1], 'TileRow': -tileCoord[2] - 1 }; - goog.object.extend(localContext, dimensions); + ol.object.assign(localContext, dimensions); var url = template; if (requestEncoding == ol.source.WMTSRequestEncoding.KVP) { url = goog.uri.utils.appendParamsFromMap(url, localContext); @@ -290,7 +290,7 @@ ol.source.WMTS.prototype.resetDimensionsKey_ = function() { * @api */ ol.source.WMTS.prototype.updateDimensions = function(dimensions) { - goog.object.extend(this.dimensions_, dimensions); + ol.object.assign(this.dimensions_, dimensions); this.resetDimensionsKey_(); this.changed(); }; diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 41ebf2d3c2..589b1178f4 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -1,7 +1,6 @@ goog.provide('ol.tilegrid.TileGrid'); goog.require('goog.asserts'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.Coordinate'); goog.require('ol.TileCoord'); @@ -10,6 +9,7 @@ goog.require('ol.array'); goog.require('ol.extent'); goog.require('ol.extent.Corner'); goog.require('ol.math'); +goog.require('ol.object'); goog.require('ol.proj'); goog.require('ol.proj.METERS_PER_UNIT'); goog.require('ol.proj.Projection'); @@ -542,7 +542,7 @@ ol.tilegrid.createForExtent = function(extent, opt_maxZoom, opt_tileSize, opt_co */ ol.tilegrid.createXYZ = function(opt_options) { var options = /** @type {olx.tilegrid.TileGridOptions} */ ({}); - goog.object.extend(options, opt_options !== undefined ? + ol.object.assign(options, opt_options !== undefined ? opt_options : /** @type {olx.tilegrid.XYZOptions} */ ({})); if (options.extent === undefined) { options.extent = ol.proj.get('EPSG:3857').getExtent(); diff --git a/test/spec/ol/pointer/touchsource.test.js b/test/spec/ol/pointer/touchsource.test.js index 304ec45a91..dba05424bc 100644 --- a/test/spec/ol/pointer/touchsource.test.js +++ b/test/spec/ol/pointer/touchsource.test.js @@ -1,7 +1,5 @@ goog.provide('ol.test.pointer.TouchSource'); -goog.require('goog.object'); - describe('ol.pointer.TouchSource', function() { var handler; var target; @@ -121,7 +119,7 @@ describe('ol.pointer.TouchSource', function() { touches = touches !== undefined ? touches : changedTouches; var event = new ol.events.Event(type); - goog.object.extend(event, { + ol.object.assign(event, { touches: touches, changedTouches: changedTouches }); @@ -129,11 +127,12 @@ describe('ol.pointer.TouchSource', function() { } }); -goog.require('goog.dom'); +goog.require('goog.object'); goog.require('ol.events'); goog.require('ol.events.Event'); goog.require('ol.events.EventTarget'); goog.require('ol.has'); +goog.require('ol.object'); goog.require('ol.pointer.PointerEvent'); goog.require('ol.pointer.PointerEventHandler'); goog.require('ol.pointer.TouchSource'); diff --git a/test_rendering/spec/ol/layer/image.test.js b/test_rendering/spec/ol/layer/image.test.js index 18166be2b6..079c956a52 100644 --- a/test_rendering/spec/ol/layer/image.test.js +++ b/test_rendering/spec/ol/layer/image.test.js @@ -44,7 +44,7 @@ describe('ol.rendering.layer.Image', function() { var options = { source: source }; - goog.object.extend(options, layerOptions); + ol.object.assign(options, layerOptions); map.addLayer(new ol.layer.Image(options)); }); } @@ -109,9 +109,9 @@ describe('ol.rendering.layer.Image', function() { }); -goog.require('goog.object'); -goog.require('ol.proj'); goog.require('ol.Map'); goog.require('ol.View'); goog.require('ol.layer.Image'); +goog.require('ol.object'); +goog.require('ol.proj'); goog.require('ol.source.ImageStatic'); diff --git a/test_rendering/spec/ol/layer/tile.test.js b/test_rendering/spec/ol/layer/tile.test.js index 310621d708..d41d6cf560 100644 --- a/test_rendering/spec/ol/layer/tile.test.js +++ b/test_rendering/spec/ol/layer/tile.test.js @@ -44,7 +44,7 @@ describe('ol.rendering.layer.Tile', function() { var options = { source: source }; - goog.object.extend(options, layerOptions); + ol.object.assign(options, layerOptions); map.addLayer(new ol.layer.Tile(options)); }); } @@ -190,11 +190,11 @@ describe('ol.rendering.layer.Tile', function() { }); -goog.require('goog.object'); -goog.require('ol.proj'); goog.require('ol.Map'); goog.require('ol.View'); goog.require('ol.layer.Tile'); +goog.require('ol.object'); +goog.require('ol.proj'); goog.require('ol.source.TileImage'); goog.require('ol.source.XYZ'); goog.require('ol.tilegrid.TileGrid'); diff --git a/test_rendering/spec/ol/layer/vectortile.test.js b/test_rendering/spec/ol/layer/vectortile.test.js index 9beddd4a22..86dc75e7fb 100644 --- a/test_rendering/spec/ol/layer/vectortile.test.js +++ b/test_rendering/spec/ol/layer/vectortile.test.js @@ -42,7 +42,7 @@ describe('ol.rendering.layer.VectorTile', function() { var options = { source: source }; - goog.object.extend(options, layerOptions); + ol.object.assign(options, layerOptions); map.addLayer(new ol.layer.VectorTile(options)); } @@ -74,9 +74,9 @@ describe('ol.rendering.layer.VectorTile', function() { }); -goog.require('goog.object'); -goog.require('ol.format.MVT'); goog.require('ol.Map'); goog.require('ol.View'); +goog.require('ol.format.MVT'); goog.require('ol.layer.VectorTile'); +goog.require('ol.object'); goog.require('ol.source.VectorTile'); From 554887ae140ace5c3fba49abdb64032355ad203d Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 10:10:16 -0700 Subject: [PATCH 05/16] Remove use of goog.object.forEach() --- src/ol/layer/layergroup.js | 6 ++--- src/ol/renderer/maprenderer.js | 11 ++++---- src/ol/renderer/webgl/webglmaprenderer.js | 22 ++++++---------- src/ol/source/tileimagesource.js | 15 ++++++----- src/ol/source/vectorsource.js | 13 +++++----- src/ol/webgl/context.js | 31 ++++++++++++----------- 6 files changed, 48 insertions(+), 50 deletions(-) diff --git a/src/ol/layer/layergroup.js b/src/ol/layer/layergroup.js index daa3db3524..deaff7a9b1 100644 --- a/src/ol/layer/layergroup.js +++ b/src/ol/layer/layergroup.js @@ -104,9 +104,9 @@ ol.layer.Group.prototype.handleLayersChanged_ = function(event) { ol.events.listen(layers, ol.CollectionEventType.REMOVE, this.handleLayersRemove_, this)); - goog.object.forEach(this.listenerKeys_, function(keys) { - keys.forEach(ol.events.unlistenByKey); - }); + for (var id in this.listenerKeys_) { + this.listenerKeys_[id].forEach(ol.events.unlistenByKey); + } goog.object.clear(this.listenerKeys_); var layersArray = layers.getArray(); diff --git a/src/ol/renderer/maprenderer.js b/src/ol/renderer/maprenderer.js index 3e3530fab6..49393f0898 100644 --- a/src/ol/renderer/maprenderer.js +++ b/src/ol/renderer/maprenderer.js @@ -4,12 +4,11 @@ goog.provide('ol.renderer.Map'); goog.require('goog.Disposable'); goog.require('goog.asserts'); goog.require('goog.dispose'); -goog.require('ol.events'); -goog.require('ol.events.EventType'); goog.require('goog.functions'); -goog.require('goog.object'); goog.require('goog.vec.Mat4'); goog.require('ol'); +goog.require('ol.events'); +goog.require('ol.events.EventType'); goog.require('ol.extent'); goog.require('ol.layer.Layer'); goog.require('ol.renderer.Layer'); @@ -95,7 +94,9 @@ ol.renderer.Map.prototype.createLayerRenderer = goog.abstractMethod; * @inheritDoc */ ol.renderer.Map.prototype.disposeInternal = function() { - goog.object.forEach(this.layerRenderers_, goog.dispose); + for (var id in this.layerRenderers_) { + goog.dispose(this.layerRenderers_[id]); + } goog.base(this, 'disposeInternal'); }; @@ -277,7 +278,7 @@ ol.renderer.Map.prototype.getLayerRendererByKey = function(layerKey) { /** * @protected - * @return {Object.} Layer renderers. + * @return {Object.} Layer renderers. */ ol.renderer.Map.prototype.getLayerRenderers = function() { return this.layerRenderers_; diff --git a/src/ol/renderer/webgl/webglmaprenderer.js b/src/ol/renderer/webgl/webglmaprenderer.js index 8bb50fd2db..fed3f58ee8 100644 --- a/src/ol/renderer/webgl/webglmaprenderer.js +++ b/src/ol/renderer/webgl/webglmaprenderer.js @@ -4,11 +4,8 @@ goog.provide('ol.renderer.webgl.Map'); goog.require('goog.asserts'); goog.require('goog.dom'); -goog.require('ol.events'); -goog.require('ol.events.Event'); goog.require('goog.log'); goog.require('goog.log.Logger'); -goog.require('goog.object'); goog.require('goog.style'); goog.require('goog.webgl'); goog.require('ol'); @@ -16,6 +13,8 @@ goog.require('ol.RendererType'); goog.require('ol.array'); goog.require('ol.css'); goog.require('ol.dom'); +goog.require('ol.events'); +goog.require('ol.events.Event'); goog.require('ol.layer.Image'); goog.require('ol.layer.Layer'); goog.require('ol.layer.Tile'); @@ -384,17 +383,12 @@ ol.renderer.webgl.Map.prototype.handleWebGLContextLost = function(event) { event.preventDefault(); this.textureCache_.clear(); this.textureCacheFrameMarkerCount_ = 0; - goog.object.forEach(this.getLayerRenderers(), - /** - * @param {ol.renderer.Layer} layerRenderer Layer renderer. - * @param {string} key Key. - * @param {Object.} object Object. - */ - function(layerRenderer, key, object) { - goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer, - 'renderer is an instance of ol.renderer.webgl.Layer'); - layerRenderer.handleWebGLContextLost(); - }); + + var renderers = this.getLayerRenderers(); + for (var id in renderers) { + var renderer = /** @type {ol.renderer.webgl.Layer} */ (renderers[id]); + renderer.handleWebGLContextLost(); + } }; diff --git a/src/ol/source/tileimagesource.js b/src/ol/source/tileimagesource.js index 23d9218199..9d2e6ea666 100644 --- a/src/ol/source/tileimagesource.js +++ b/src/ol/source/tileimagesource.js @@ -1,12 +1,12 @@ goog.provide('ol.source.TileImage'); goog.require('goog.asserts'); -goog.require('ol.events'); -goog.require('ol.events.EventType'); goog.require('goog.object'); goog.require('ol.ImageTile'); goog.require('ol.TileCache'); goog.require('ol.TileState'); +goog.require('ol.events'); +goog.require('ol.events.EventType'); goog.require('ol.proj'); goog.require('ol.reproj.Tile'); goog.require('ol.source.UrlTile'); @@ -112,9 +112,10 @@ ol.source.TileImage.prototype.expireCache = function(projection, usedTiles) { var usedTileCache = this.getTileCacheForProjection(projection); this.tileCache.expireCache(this.tileCache == usedTileCache ? usedTiles : {}); - goog.object.forEach(this.tileCacheForProjection, function(tileCache) { + for (var id in this.tileCacheForProjection) { + var tileCache = this.tileCacheForProjection[id]; tileCache.expireCache(tileCache == usedTileCache ? usedTiles : {}); - }); + } }; @@ -303,9 +304,9 @@ ol.source.TileImage.prototype.setRenderReprojectionEdges = function(render) { return; } this.renderReprojectionEdges_ = render; - goog.object.forEach(this.tileCacheForProjection, function(tileCache) { - tileCache.clear(); - }); + for (var id in this.tileCacheForProjection) { + this.tileCacheForProjection[id].clear(); + } this.changed(); }; diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js index a5f60642b4..fd0bfd3602 100644 --- a/src/ol/source/vectorsource.js +++ b/src/ol/source/vectorsource.js @@ -6,9 +6,6 @@ goog.provide('ol.source.VectorEvent'); goog.provide('ol.source.VectorEventType'); goog.require('goog.asserts'); -goog.require('ol.events'); -goog.require('ol.events.Event'); -goog.require('ol.events.EventType'); goog.require('goog.object'); goog.require('ol'); goog.require('ol.Collection'); @@ -19,6 +16,9 @@ goog.require('ol.FeatureLoader'); goog.require('ol.LoadingStrategy'); goog.require('ol.ObjectEventType'); goog.require('ol.array'); +goog.require('ol.events'); +goog.require('ol.events.Event'); +goog.require('ol.events.EventType'); goog.require('ol.extent'); goog.require('ol.featureloader'); goog.require('ol.loadingstrategy'); @@ -382,10 +382,11 @@ ol.source.Vector.prototype.clear = function(opt_fast) { this.undefIdIndex_ = {}; } } else { - var rmFeatureInternal = this.removeFeatureInternal; if (this.featuresRtree_) { - this.featuresRtree_.forEach(rmFeatureInternal, this); - goog.object.forEach(this.nullGeometryFeatures_, rmFeatureInternal, this); + this.featuresRtree_.forEach(this.removeFeatureInternal, this); + for (var id in this.nullGeometryFeatures_) { + this.removeFeatureInternal(this.nullGeometryFeatures_[id]); + } } } if (this.featuresCollection_) { diff --git a/src/ol/webgl/context.js b/src/ol/webgl/context.js index 3790647b1f..dda073019d 100644 --- a/src/ol/webgl/context.js +++ b/src/ol/webgl/context.js @@ -1,11 +1,11 @@ goog.provide('ol.webgl.Context'); goog.require('goog.asserts'); -goog.require('ol.events'); goog.require('goog.log'); goog.require('goog.object'); goog.require('ol'); goog.require('ol.array'); +goog.require('ol.events'); goog.require('ol.webgl.Buffer'); goog.require('ol.webgl.WebGLContextEventType'); @@ -42,13 +42,13 @@ ol.webgl.Context = function(canvas, gl) { /** * @private - * @type {Object.} + * @type {Object.} */ this.bufferCache_ = {}; /** * @private - * @type {Object.} + * @type {Object.} */ this.shaderCache_ = {}; @@ -113,7 +113,7 @@ ol.webgl.Context = function(canvas, gl) { ol.webgl.Context.prototype.bindBuffer = function(target, buf) { var gl = this.getGL(); var arr = buf.getArray(); - var bufferKey = goog.getUid(buf); + var bufferKey = String(goog.getUid(buf)); if (bufferKey in this.bufferCache_) { var bufferCacheEntry = this.bufferCache_[bufferKey]; gl.bindBuffer(target, bufferCacheEntry.buffer); @@ -146,7 +146,7 @@ ol.webgl.Context.prototype.bindBuffer = function(target, buf) { */ ol.webgl.Context.prototype.deleteBuffer = function(buf) { var gl = this.getGL(); - var bufferKey = goog.getUid(buf); + var bufferKey = String(goog.getUid(buf)); goog.asserts.assert(bufferKey in this.bufferCache_, 'attempted to delete uncached buffer'); var bufferCacheEntry = this.bufferCache_[bufferKey]; @@ -163,15 +163,16 @@ ol.webgl.Context.prototype.deleteBuffer = function(buf) { ol.webgl.Context.prototype.disposeInternal = function() { var gl = this.getGL(); if (!gl.isContextLost()) { - goog.object.forEach(this.bufferCache_, function(bufferCacheEntry) { - gl.deleteBuffer(bufferCacheEntry.buffer); - }); - goog.object.forEach(this.programCache_, function(program) { - gl.deleteProgram(program); - }); - goog.object.forEach(this.shaderCache_, function(shader) { - gl.deleteShader(shader); - }); + var key; + for (key in this.bufferCache_) { + gl.deleteBuffer(this.bufferCache_[key].buffer); + } + for (key in this.programCache_) { + gl.deleteProgram(this.programCache_[key]); + } + for (key in this.shaderCache_) { + gl.deleteShader(this.shaderCache_[key]); + } // delete objects for hit-detection gl.deleteFramebuffer(this.hitDetectionFramebuffer_); gl.deleteRenderbuffer(this.hitDetectionRenderbuffer_); @@ -217,7 +218,7 @@ ol.webgl.Context.prototype.getHitDetectionFramebuffer = function() { * @return {WebGLShader} Shader. */ ol.webgl.Context.prototype.getShader = function(shaderObject) { - var shaderKey = goog.getUid(shaderObject); + var shaderKey = String(goog.getUid(shaderObject)); if (shaderKey in this.shaderCache_) { return this.shaderCache_[shaderKey]; } else { From 1a9367228d536b5c800a85530d873c1f9334c240 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 10:19:47 -0700 Subject: [PATCH 06/16] Remove use of goog.object.contains() and findKey() --- src/ol/format/gml/gmlbaseformat.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/ol/format/gml/gmlbaseformat.js b/src/ol/format/gml/gmlbaseformat.js index 4d4d7809e0..77cd3aeb9f 100644 --- a/src/ol/format/gml/gmlbaseformat.js +++ b/src/ol/format/gml/gmlbaseformat.js @@ -5,7 +5,6 @@ goog.provide('ol.format.GMLBase'); goog.require('goog.asserts'); goog.require('goog.dom.NodeType'); -goog.require('goog.object'); goog.require('goog.string'); goog.require('ol.array'); goog.require('ol.Feature'); @@ -123,14 +122,19 @@ ol.format.GMLBase.prototype.readFeaturesInternal = function(node, objectStack) { if (child.nodeType === 1) { var ft = child.nodeName.split(':').pop(); if (featureType.indexOf(ft) === -1) { - var key; - if (!goog.object.contains(featureNS, child.namespaceURI)) { - key = prefix + goog.object.getCount(featureNS); - featureNS[key] = child.namespaceURI; - } else { - key = goog.object.findKey(featureNS, function(value) { - return value === child.namespaceURI; - }); + var key = ''; + var count = 0; + var uri = child.namespaceURI; + for (var candidate in featureNS) { + if (featureNS[candidate] === uri) { + key = candidate; + break; + } + ++count; + } + if (!key) { + key = prefix + count; + featureNS[key] = uri; } featureType.push(key + ':' + ft); } From 0dce343d4f625f3d30898369b03e8722426872af Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 20:54:52 -0700 Subject: [PATCH 07/16] Remove use of goog.object.getCount() --- externs/olx.js | 2 +- src/ol/map.js | 3 +-- src/ol/mapbrowserevent.js | 11 +++++------ src/ol/pointer/touchsource.js | 5 ++--- src/ol/source/clustersource.js | 7 +++---- src/ol/structs/lrucache.js | 4 ++-- 6 files changed, 14 insertions(+), 18 deletions(-) diff --git a/externs/olx.js b/externs/olx.js index 9689d9e241..827f4485d4 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -7012,7 +7012,7 @@ olx.view.FitOptions.prototype.maxZoom; * usedTiles: Object.>, * viewState: olx.ViewState, * viewHints: Array., - * wantedTiles: Object.>}} + * wantedTiles: !Object.>}} * @api */ olx.FrameState; diff --git a/src/ol/map.js b/src/ol/map.js index ecd7aa41c7..0ea3ae32c6 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -13,7 +13,6 @@ goog.require('goog.dom.classlist'); goog.require('goog.functions'); goog.require('goog.log'); goog.require('goog.log.Level'); -goog.require('goog.object'); goog.require('goog.style'); goog.require('goog.vec.Mat4'); goog.require('ol.Collection'); @@ -1028,7 +1027,7 @@ ol.Map.prototype.handlePostRender = function() { maxTotalLoading = this.loadTilesWhileInteracting_ ? 8 : 0; maxNewLoads = 2; } - tileSourceCount = goog.object.getCount(frameState.wantedTiles); + tileSourceCount = Object.keys(frameState.wantedTiles).length; } maxTotalLoading *= tileSourceCount; maxNewLoads *= tileSourceCount; diff --git a/src/ol/mapbrowserevent.js b/src/ol/mapbrowserevent.js index f6eef67ffd..7efa027cbe 100644 --- a/src/ol/mapbrowserevent.js +++ b/src/ol/mapbrowserevent.js @@ -4,14 +4,13 @@ goog.provide('ol.MapBrowserEventHandler'); goog.provide('ol.MapBrowserPointerEvent'); goog.require('goog.asserts'); -goog.require('ol.events'); -goog.require('ol.events.EventTarget'); -goog.require('ol.events.EventType'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.Coordinate'); goog.require('ol.MapEvent'); goog.require('ol.Pixel'); +goog.require('ol.events'); +goog.require('ol.events.EventTarget'); +goog.require('ol.events.EventType'); goog.require('ol.pointer.PointerEvent'); goog.require('ol.pointer.PointerEventHandler'); @@ -176,7 +175,7 @@ ol.MapBrowserEventHandler = function(map) { this.activePointers_ = 0; /** - * @type {Object.} + * @type {!Object.} * @private */ this.trackedTouches_ = {}; @@ -254,7 +253,7 @@ ol.MapBrowserEventHandler.prototype.updateActivePointers_ = function(pointerEven } else if (event.type == ol.MapBrowserEvent.EventType.POINTERDOWN) { this.trackedTouches_[event.pointerId] = true; } - this.activePointers_ = goog.object.getCount(this.trackedTouches_); + this.activePointers_ = Object.keys(this.trackedTouches_).length; }; diff --git a/src/ol/pointer/touchsource.js b/src/ol/pointer/touchsource.js index 80098c1d1c..d73786eca1 100644 --- a/src/ol/pointer/touchsource.js +++ b/src/ol/pointer/touchsource.js @@ -30,11 +30,10 @@ goog.provide('ol.pointer.TouchSource'); -goog.require('goog.object'); goog.require('ol'); +goog.require('ol.array'); goog.require('ol.pointer.EventSource'); goog.require('ol.pointer.MouseSource'); -goog.require('ol.array'); /** @@ -124,7 +123,7 @@ ol.pointer.TouchSource.prototype.isPrimaryTouch_ = function(inTouch) { * @private */ ol.pointer.TouchSource.prototype.setPrimaryTouch_ = function(inTouch) { - var count = goog.object.getCount(this.pointerMap); + var count = Object.keys(this.pointerMap).length; if (count === 0 || (count === 1 && ol.pointer.MouseSource.POINTER_ID.toString() in this.pointerMap)) { this.firstTouchId_ = inTouch.identifier; diff --git a/src/ol/source/clustersource.js b/src/ol/source/clustersource.js index 115cec297c..45a80283f1 100644 --- a/src/ol/source/clustersource.js +++ b/src/ol/source/clustersource.js @@ -4,10 +4,9 @@ goog.provide('ol.source.Cluster'); goog.require('goog.asserts'); -goog.require('ol.events.EventType'); -goog.require('goog.object'); goog.require('ol.Feature'); goog.require('ol.coordinate'); +goog.require('ol.events.EventType'); goog.require('ol.extent'); goog.require('ol.geom.Point'); goog.require('ol.source.Vector'); @@ -111,7 +110,7 @@ ol.source.Cluster.prototype.cluster_ = function() { var features = this.source_.getFeatures(); /** - * @type {Object.} + * @type {!Object.} */ var clustered = {}; @@ -140,7 +139,7 @@ ol.source.Cluster.prototype.cluster_ = function() { } } goog.asserts.assert( - goog.object.getCount(clustered) == this.source_.getFeatures().length, + Object.keys(clustered).length == this.source_.getFeatures().length, 'number of clustered equals number of features in the source'); }; diff --git a/src/ol/structs/lrucache.js b/src/ol/structs/lrucache.js index 93ef30907d..780c525da7 100644 --- a/src/ol/structs/lrucache.js +++ b/src/ol/structs/lrucache.js @@ -22,7 +22,7 @@ ol.structs.LRUCache = function() { /** * @private - * @type {Object.} + * @type {!Object.} */ this.entries_ = {}; @@ -53,7 +53,7 @@ ol.structs.LRUCache.prototype.assertValid = function() { goog.asserts.assert(!this.newest_, 'newest must be null (count = 0)'); } else { - goog.asserts.assert(goog.object.getCount(this.entries_) == this.count_, + goog.asserts.assert(Object.keys(this.entries_).length == this.count_, 'number of entries matches count'); goog.asserts.assert(this.oldest_, 'we have an oldest entry'); From 8aecb3270c40884752e03c20d2f79b293e5e4c67 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 21:17:32 -0700 Subject: [PATCH 08/16] Replace goog.object.isEmpty() with ol.object.isEmpty() --- src/ol/control/attributioncontrol.js | 13 ++++++------- src/ol/format/esrijsonformat.js | 5 ++--- src/ol/format/geojsonformat.js | 4 ++-- src/ol/format/kmlformat.js | 3 ++- src/ol/format/osmxmlformat.js | 4 ++-- src/ol/image.js | 8 ++++---- src/ol/imagetile.js | 8 ++++---- src/ol/object.js | 14 ++++++++++++++ src/ol/proj/proj.js | 4 ++-- src/ol/render/canvas/canvasreplay.js | 6 +++--- src/ol/render/webgl/webglreplay.js | 6 +++--- src/ol/reproj/tile.js | 8 ++++---- src/ol/source/vectorsource.js | 11 ++++++----- src/ol/structs/lrucache.js | 4 ++-- src/ol/structs/rbush.js | 4 ++-- test/spec/ol/feature.test.js | 5 ++--- test/spec/ol/object.test.js | 11 +++++++++++ 17 files changed, 71 insertions(+), 47 deletions(-) diff --git a/src/ol/control/attributioncontrol.js b/src/ol/control/attributioncontrol.js index 8da0c15e8d..d583bbfca8 100644 --- a/src/ol/control/attributioncontrol.js +++ b/src/ol/control/attributioncontrol.js @@ -5,14 +5,13 @@ goog.provide('ol.control.Attribution'); goog.require('goog.asserts'); goog.require('goog.dom'); goog.require('goog.dom.classlist'); -goog.require('ol.events'); -goog.require('ol.events.EventType'); -goog.require('goog.object'); goog.require('goog.style'); goog.require('ol'); goog.require('ol.Attribution'); goog.require('ol.control.Control'); goog.require('ol.css'); +goog.require('ol.events'); +goog.require('ol.events.EventType'); goog.require('ol.object'); goog.require('ol.source.Tile'); @@ -268,14 +267,14 @@ ol.control.Attribution.prototype.updateElement_ = function(frameState) { } var renderVisible = - !goog.object.isEmpty(this.attributionElementRenderedVisible_) || - !goog.object.isEmpty(frameState.logos); + !ol.object.isEmpty(this.attributionElementRenderedVisible_) || + !ol.object.isEmpty(frameState.logos); if (this.renderedVisible_ != renderVisible) { goog.style.setElementShown(this.element, renderVisible); this.renderedVisible_ = renderVisible; } if (renderVisible && - goog.object.isEmpty(this.attributionElementRenderedVisible_)) { + ol.object.isEmpty(this.attributionElementRenderedVisible_)) { goog.dom.classlist.add(this.element, 'ol-logo-only'); } else { goog.dom.classlist.remove(this.element, 'ol-logo-only'); @@ -322,7 +321,7 @@ ol.control.Attribution.prototype.insertLogos_ = function(frameState) { } } - goog.style.setElementShown(this.logoLi_, !goog.object.isEmpty(logos)); + goog.style.setElementShown(this.logoLi_, !ol.object.isEmpty(logos)); }; diff --git a/src/ol/format/esrijsonformat.js b/src/ol/format/esrijsonformat.js index 670f062d22..ccc57cbf6c 100644 --- a/src/ol/format/esrijsonformat.js +++ b/src/ol/format/esrijsonformat.js @@ -1,9 +1,8 @@ goog.provide('ol.format.EsriJSON'); goog.require('goog.asserts'); -goog.require('goog.object'); -goog.require('ol.array'); goog.require('ol.Feature'); +goog.require('ol.array'); goog.require('ol.extent'); goog.require('ol.format.Feature'); goog.require('ol.format.JSONFeature'); @@ -652,7 +651,7 @@ ol.format.EsriJSON.prototype.writeFeatureObject = function( } var properties = feature.getProperties(); delete properties[feature.getGeometryName()]; - if (!goog.object.isEmpty(properties)) { + if (!ol.object.isEmpty(properties)) { object['attributes'] = properties; } else { object['attributes'] = {}; diff --git a/src/ol/format/geojsonformat.js b/src/ol/format/geojsonformat.js index a92cb63c69..3c09b3e1cb 100644 --- a/src/ol/format/geojsonformat.js +++ b/src/ol/format/geojsonformat.js @@ -4,7 +4,6 @@ goog.provide('ol.format.GeoJSON'); goog.require('goog.asserts'); -goog.require('goog.object'); goog.require('ol.Feature'); goog.require('ol.format.Feature'); goog.require('ol.format.JSONFeature'); @@ -15,6 +14,7 @@ goog.require('ol.geom.MultiPoint'); goog.require('ol.geom.MultiPolygon'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); +goog.require('ol.object'); goog.require('ol.proj'); @@ -541,7 +541,7 @@ ol.format.GeoJSON.prototype.writeFeatureObject = function( } var properties = feature.getProperties(); delete properties[feature.getGeometryName()]; - if (!goog.object.isEmpty(properties)) { + if (!ol.object.isEmpty(properties)) { object.properties = properties; } else { object.properties = null; diff --git a/src/ol/format/kmlformat.js b/src/ol/format/kmlformat.js index c9fdd07651..79af2fa670 100644 --- a/src/ol/format/kmlformat.js +++ b/src/ol/format/kmlformat.js @@ -30,6 +30,7 @@ goog.require('ol.geom.MultiPolygon'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); goog.require('ol.math'); +goog.require('ol.object'); goog.require('ol.proj'); goog.require('ol.style.Fill'); goog.require('ol.style.Icon'); @@ -331,7 +332,7 @@ ol.format.KML.createNameStyleFunction_ = function(foundStyle, name) { textAlign = 'left'; } } - if (!goog.object.isEmpty(foundStyle.getText())) { + if (!ol.object.isEmpty(foundStyle.getText())) { textStyle = /** @type {ol.style.Text} */ (goog.object.clone(foundStyle.getText())); textStyle.setText(name); diff --git a/src/ol/format/osmxmlformat.js b/src/ol/format/osmxmlformat.js index d4a351e1ae..b5c9a4c619 100644 --- a/src/ol/format/osmxmlformat.js +++ b/src/ol/format/osmxmlformat.js @@ -3,7 +3,6 @@ goog.provide('ol.format.OSMXML'); goog.require('goog.asserts'); goog.require('goog.dom.NodeType'); -goog.require('goog.object'); goog.require('ol.array'); goog.require('ol.Feature'); goog.require('ol.format.Feature'); @@ -12,6 +11,7 @@ goog.require('ol.geom.GeometryLayout'); goog.require('ol.geom.LineString'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); +goog.require('ol.object'); goog.require('ol.proj'); goog.require('ol.xml'); @@ -74,7 +74,7 @@ ol.format.OSMXML.readNode_ = function(node, objectStack) { var values = ol.xml.pushParseAndPop({ tags: {} }, ol.format.OSMXML.NODE_PARSERS_, node, objectStack); - if (!goog.object.isEmpty(values.tags)) { + if (!ol.object.isEmpty(values.tags)) { var geometry = new ol.geom.Point(coordinates); ol.format.Feature.transformWithOptions(geometry, false, options); var feature = new ol.Feature(geometry); diff --git a/src/ol/image.js b/src/ol/image.js index 36d1036e03..845bd9a572 100644 --- a/src/ol/image.js +++ b/src/ol/image.js @@ -1,12 +1,12 @@ goog.provide('ol.Image'); goog.require('goog.asserts'); -goog.require('ol.events'); -goog.require('ol.events.EventType'); -goog.require('goog.object'); goog.require('ol.ImageBase'); goog.require('ol.ImageState'); +goog.require('ol.events'); +goog.require('ol.events.EventType'); goog.require('ol.extent'); +goog.require('ol.object'); /** @@ -81,7 +81,7 @@ ol.Image.prototype.getImage = function(opt_context) { var key = goog.getUid(opt_context); if (key in this.imageByContext_) { return this.imageByContext_[key]; - } else if (goog.object.isEmpty(this.imageByContext_)) { + } else if (ol.object.isEmpty(this.imageByContext_)) { image = this.image_; } else { image = /** @type {Image} */ (this.image_.cloneNode(false)); diff --git a/src/ol/imagetile.js b/src/ol/imagetile.js index c92037f553..03c8042a93 100644 --- a/src/ol/imagetile.js +++ b/src/ol/imagetile.js @@ -1,13 +1,13 @@ goog.provide('ol.ImageTile'); goog.require('goog.asserts'); -goog.require('ol.events'); -goog.require('ol.events.EventType'); -goog.require('goog.object'); goog.require('ol.Tile'); goog.require('ol.TileCoord'); goog.require('ol.TileLoadFunctionType'); goog.require('ol.TileState'); +goog.require('ol.events'); +goog.require('ol.events.EventType'); +goog.require('ol.object'); /** @@ -87,7 +87,7 @@ ol.ImageTile.prototype.getImage = function(opt_context) { var key = goog.getUid(opt_context); if (key in this.imageByContext_) { return this.imageByContext_[key]; - } else if (goog.object.isEmpty(this.imageByContext_)) { + } else if (ol.object.isEmpty(this.imageByContext_)) { image = this.image_; } else { image = /** @type {Image} */ (this.image_.cloneNode(false)); diff --git a/src/ol/object.js b/src/ol/object.js index b0abb8c402..04b85f9a84 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -37,6 +37,20 @@ ol.object.assign = (typeof Object.assign === 'function') ? Object.assign : funct }; +/** + * Determine if an object has any properties. + * @param {Object} object The object to check. + * @return {boolean} The object is empty. + */ +ol.object.isEmpty = function(object) { + var property; + for (property in object) { + return false; + } + return !property; +}; + + /** * @enum {string} */ diff --git a/src/ol/proj/proj.js b/src/ol/proj/proj.js index e4f0d13ce2..1c49ded408 100644 --- a/src/ol/proj/proj.js +++ b/src/ol/proj/proj.js @@ -5,11 +5,11 @@ goog.provide('ol.proj.ProjectionLike'); goog.provide('ol.proj.Units'); goog.require('goog.asserts'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.Extent'); goog.require('ol.TransformFunction'); goog.require('ol.extent'); +goog.require('ol.object'); goog.require('ol.sphere.NORMAL'); @@ -630,7 +630,7 @@ ol.proj.removeTransform = function(source, destination) { 'destinationCode should be in transforms of sourceCode'); var transform = transforms[sourceCode][destinationCode]; delete transforms[sourceCode][destinationCode]; - if (goog.object.isEmpty(transforms[sourceCode])) { + if (ol.object.isEmpty(transforms[sourceCode])) { delete transforms[sourceCode]; } return transform; diff --git a/src/ol/render/canvas/canvasreplay.js b/src/ol/render/canvas/canvasreplay.js index 5bd011f948..6b014add32 100644 --- a/src/ol/render/canvas/canvasreplay.js +++ b/src/ol/render/canvas/canvasreplay.js @@ -9,7 +9,6 @@ goog.provide('ol.render.canvas.ReplayGroup'); goog.provide('ol.render.canvas.TextReplay'); goog.require('goog.asserts'); -goog.require('goog.object'); goog.require('goog.vec.Mat4'); goog.require('ol'); goog.require('ol.array'); @@ -20,6 +19,7 @@ goog.require('ol.extent.Relationship'); goog.require('ol.geom.flat.simplify'); goog.require('ol.geom.flat.transform'); goog.require('ol.has'); +goog.require('ol.object'); goog.require('ol.render.IReplayGroup'); goog.require('ol.render.VectorContext'); goog.require('ol.render.canvas'); @@ -249,7 +249,7 @@ ol.render.canvas.Replay.prototype.replay_ = function( goog.asserts.assert(pixelCoordinates === this.pixelCoordinates_, 'pixelCoordinates should be the same as this.pixelCoordinates_'); } - var skipFeatures = !goog.object.isEmpty(skippedFeaturesHash); + var skipFeatures = !ol.object.isEmpty(skippedFeaturesHash); var i = 0; // instruction index var ii = instructions.length; // end of instructions var d = 0; // data index @@ -1981,7 +1981,7 @@ ol.render.canvas.ReplayGroup.prototype.getReplay = function(zIndex, replayType) * @inheritDoc */ ol.render.canvas.ReplayGroup.prototype.isEmpty = function() { - return goog.object.isEmpty(this.replaysByZIndex_); + return ol.object.isEmpty(this.replaysByZIndex_); }; diff --git a/src/ol/render/webgl/webglreplay.js b/src/ol/render/webgl/webglreplay.js index fcccf2e457..dcad3e245f 100644 --- a/src/ol/render/webgl/webglreplay.js +++ b/src/ol/render/webgl/webglreplay.js @@ -3,9 +3,9 @@ goog.provide('ol.render.webgl.ReplayGroup'); goog.require('goog.asserts'); goog.require('goog.functions'); -goog.require('goog.object'); goog.require('goog.vec.Mat4'); goog.require('ol.extent'); +goog.require('ol.object'); goog.require('ol.render.IReplayGroup'); goog.require('ol.render.VectorContext'); goog.require('ol.render.webgl.imagereplay.shader.Default'); @@ -620,7 +620,7 @@ ol.render.webgl.ImageReplay.prototype.drawReplay_ = function(gl, context, skippe goog.webgl.UNSIGNED_INT : goog.webgl.UNSIGNED_SHORT; var elementSize = context.hasOESElementIndexUint ? 4 : 2; - if (!goog.object.isEmpty(skippedFeaturesHash)) { + if (!ol.object.isEmpty(skippedFeaturesHash)) { this.drawReplaySkipping_( gl, skippedFeaturesHash, textures, groupIndices, elementType, elementSize); @@ -996,7 +996,7 @@ ol.render.webgl.ReplayGroup.prototype.getReplay = function(zIndex, replayType) { * @inheritDoc */ ol.render.webgl.ReplayGroup.prototype.isEmpty = function() { - return goog.object.isEmpty(this.replays_); + return ol.object.isEmpty(this.replays_); }; diff --git a/src/ol/reproj/tile.js b/src/ol/reproj/tile.js index 730ba6b007..75331bf6f5 100644 --- a/src/ol/reproj/tile.js +++ b/src/ol/reproj/tile.js @@ -2,14 +2,14 @@ goog.provide('ol.reproj.Tile'); goog.provide('ol.reproj.TileFunctionType'); goog.require('goog.asserts'); -goog.require('ol.events'); -goog.require('ol.events.EventType'); goog.require('goog.math'); -goog.require('goog.object'); goog.require('ol.Tile'); goog.require('ol.TileState'); +goog.require('ol.events'); +goog.require('ol.events.EventType'); goog.require('ol.extent'); goog.require('ol.math'); +goog.require('ol.object'); goog.require('ol.proj'); goog.require('ol.reproj'); goog.require('ol.reproj.Triangulation'); @@ -226,7 +226,7 @@ ol.reproj.Tile.prototype.getImage = function(opt_context) { var key = goog.getUid(opt_context); if (key in this.canvasByContext_) { return this.canvasByContext_[key]; - } else if (goog.object.isEmpty(this.canvasByContext_)) { + } else if (ol.object.isEmpty(this.canvasByContext_)) { image = this.canvas_; } else { image = /** @type {HTMLCanvasElement} */ (this.canvas_.cloneNode(false)); diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js index fd0bfd3602..449e3ae4cc 100644 --- a/src/ol/source/vectorsource.js +++ b/src/ol/source/vectorsource.js @@ -22,6 +22,7 @@ goog.require('ol.events.EventType'); goog.require('ol.extent'); goog.require('ol.featureloader'); goog.require('ol.loadingstrategy'); +goog.require('ol.object'); goog.require('ol.proj'); goog.require('ol.source.Source'); goog.require('ol.source.State'); @@ -392,11 +393,11 @@ ol.source.Vector.prototype.clear = function(opt_fast) { if (this.featuresCollection_) { this.featuresCollection_.clear(); } - goog.asserts.assert(goog.object.isEmpty(this.featureChangeKeys_), + goog.asserts.assert(ol.object.isEmpty(this.featureChangeKeys_), 'featureChangeKeys is an empty object now'); - goog.asserts.assert(goog.object.isEmpty(this.idIndex_), + goog.asserts.assert(ol.object.isEmpty(this.idIndex_), 'idIndex is an empty object now'); - goog.asserts.assert(goog.object.isEmpty(this.undefIdIndex_), + goog.asserts.assert(ol.object.isEmpty(this.undefIdIndex_), 'undefIdIndex is an empty object now'); if (this.featuresRtree_) { @@ -550,7 +551,7 @@ ol.source.Vector.prototype.getFeatures = function() { features = this.featuresCollection_.getArray(); } else if (this.featuresRtree_) { features = this.featuresRtree_.getAll(); - if (!goog.object.isEmpty(this.nullGeometryFeatures_)) { + if (!ol.object.isEmpty(this.nullGeometryFeatures_)) { ol.array.extend( features, goog.object.getValues(this.nullGeometryFeatures_)); } @@ -753,7 +754,7 @@ ol.source.Vector.prototype.hasFeature = function(feature) { */ ol.source.Vector.prototype.isEmpty = function() { return this.featuresRtree_.isEmpty() && - goog.object.isEmpty(this.nullGeometryFeatures_); + ol.object.isEmpty(this.nullGeometryFeatures_); }; diff --git a/src/ol/structs/lrucache.js b/src/ol/structs/lrucache.js index 780c525da7..9cdcf49bda 100644 --- a/src/ol/structs/lrucache.js +++ b/src/ol/structs/lrucache.js @@ -1,7 +1,7 @@ goog.provide('ol.structs.LRUCache'); goog.require('goog.asserts'); -goog.require('goog.object'); +goog.require('ol.object'); /** @@ -46,7 +46,7 @@ ol.structs.LRUCache = function() { */ ol.structs.LRUCache.prototype.assertValid = function() { if (this.count_ === 0) { - goog.asserts.assert(goog.object.isEmpty(this.entries_), + goog.asserts.assert(ol.object.isEmpty(this.entries_), 'entries must be an empty object (count = 0)'); goog.asserts.assert(!this.oldest_, 'oldest must be null (count = 0)'); diff --git a/src/ol/structs/rbush.js b/src/ol/structs/rbush.js index e1b2e59dc9..2d77e5f3de 100644 --- a/src/ol/structs/rbush.js +++ b/src/ol/structs/rbush.js @@ -1,9 +1,9 @@ goog.provide('ol.structs.RBush'); goog.require('goog.asserts'); -goog.require('goog.object'); goog.require('ol.ext.rbush'); goog.require('ol.extent'); +goog.require('ol.object'); /** @@ -234,7 +234,7 @@ ol.structs.RBush.prototype.forEach_ = function(values, callback, opt_this) { * @return {boolean} Is empty. */ ol.structs.RBush.prototype.isEmpty = function() { - return goog.object.isEmpty(this.items_); + return ol.object.isEmpty(this.items_); }; diff --git a/test/spec/ol/feature.test.js b/test/spec/ol/feature.test.js index 9369e41696..6612064cf8 100644 --- a/test/spec/ol/feature.test.js +++ b/test/spec/ol/feature.test.js @@ -81,7 +81,7 @@ describe('ol.Feature', function() { it('is empty by default', function() { var feature = new ol.Feature(); var properties = feature.getProperties(); - expect(goog.object.isEmpty(properties)).to.be(true); + expect(ol.object.isEmpty(properties)).to.be(true); }); }); @@ -462,8 +462,7 @@ describe('ol.Feature.createStyleFunction()', function() { }); -goog.require('ol.events'); -goog.require('goog.object'); goog.require('ol.Feature'); goog.require('ol.geom.Point'); +goog.require('ol.object'); goog.require('ol.style.Style'); diff --git a/test/spec/ol/object.test.js b/test/spec/ol/object.test.js index 5d22b167a9..69f9b3dd27 100644 --- a/test/spec/ol/object.test.js +++ b/test/spec/ol/object.test.js @@ -268,6 +268,17 @@ describe('ol.object.assign()', function() { }); +describe('ol.object.isEmpty()', function() { + + it('checks if an object has any properties', function() { + expect(ol.object.isEmpty({})).to.be(true); + expect(ol.object.isEmpty(null)).to.be(true); + expect(ol.object.isEmpty({foo: 'bar'})).to.be(false); + expect(ol.object.isEmpty({foo: false})).to.be(false); + }); + +}); + goog.require('ol.Object'); goog.require('ol.ObjectEventType'); goog.require('ol.events'); From 8b9c393820c3c94684667604496e45769f83825b Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 21:23:46 -0700 Subject: [PATCH 09/16] Remove use of goog.object.some() --- src/ol/source/tileimagesource.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ol/source/tileimagesource.js b/src/ol/source/tileimagesource.js index 9d2e6ea666..d860aa5260 100644 --- a/src/ol/source/tileimagesource.js +++ b/src/ol/source/tileimagesource.js @@ -1,7 +1,6 @@ goog.provide('ol.source.TileImage'); goog.require('goog.asserts'); -goog.require('goog.object'); goog.require('ol.ImageTile'); goog.require('ol.TileCache'); goog.require('ol.TileState'); @@ -90,14 +89,16 @@ ol.source.TileImage.prototype.canExpireCache = function() { if (!ol.ENABLE_RASTER_REPROJECTION) { return goog.base(this, 'canExpireCache'); } - var canExpire = this.tileCache.canExpireCache(); - if (canExpire) { + if (this.tileCache.canExpireCache()) { return true; } else { - return goog.object.some(this.tileCacheForProjection, function(tileCache) { - return tileCache.canExpireCache(); - }); + for (var key in this.tileCacheForProjection) { + if (this.tileCacheForProjection[key].canExpireCache()) { + return true; + } + } } + return false; }; From f38d8bf824ba12b7bdf3ed405fb927b19b55dd07 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 21:37:26 -0700 Subject: [PATCH 10/16] Remove use of goog.object.get() --- src/ol/source/imagewmssource.js | 8 +++----- src/ol/source/tilewmssource.js | 6 ++---- src/ol/style/atlasmanager.js | 4 +--- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/ol/source/imagewmssource.js b/src/ol/source/imagewmssource.js index 9fc3d80de3..ea9184dcba 100644 --- a/src/ol/source/imagewmssource.js +++ b/src/ol/source/imagewmssource.js @@ -3,14 +3,13 @@ goog.provide('ol.source.ImageWMS'); goog.require('goog.asserts'); -goog.require('ol.events'); -goog.require('ol.events.EventType'); -goog.require('goog.object'); goog.require('goog.string'); goog.require('goog.uri.utils'); goog.require('ol'); goog.require('ol.Image'); goog.require('ol.ImageLoadFunctionType'); +goog.require('ol.events'); +goog.require('ol.events.EventType'); goog.require('ol.extent'); goog.require('ol.object'); goog.require('ol.proj'); @@ -372,7 +371,6 @@ ol.source.ImageWMS.prototype.updateParams = function(params) { * @private */ ol.source.ImageWMS.prototype.updateV13_ = function() { - var version = - goog.object.get(this.params_, 'VERSION', ol.DEFAULT_WMS_VERSION); + var version = this.params_['VERSION'] || ol.DEFAULT_WMS_VERSION; this.v13_ = goog.string.compareVersions(version, '1.3') >= 0; }; diff --git a/src/ol/source/tilewmssource.js b/src/ol/source/tilewmssource.js index 4ba0730b2d..b35a17b2f7 100644 --- a/src/ol/source/tilewmssource.js +++ b/src/ol/source/tilewmssource.js @@ -6,7 +6,6 @@ goog.provide('ol.source.TileWMS'); goog.require('goog.asserts'); goog.require('goog.math'); -goog.require('goog.object'); goog.require('goog.string'); goog.require('goog.uri.utils'); goog.require('ol'); @@ -36,7 +35,7 @@ ol.source.TileWMS = function(opt_options) { var params = options.params || {}; - var transparent = goog.object.get(params, 'TRANSPARENT', true); + var transparent = 'TRANSPARENT' in params ? params['TRANSPARENT'] : true; goog.base(this, { attributions: options.attributions, @@ -389,7 +388,6 @@ ol.source.TileWMS.prototype.updateParams = function(params) { * @private */ ol.source.TileWMS.prototype.updateV13_ = function() { - var version = - goog.object.get(this.params_, 'VERSION', ol.DEFAULT_WMS_VERSION); + var version = this.params_['VERSION'] || ol.DEFAULT_WMS_VERSION; this.v13_ = goog.string.compareVersions(version, '1.3') >= 0; }; diff --git a/src/ol/style/atlasmanager.js b/src/ol/style/atlasmanager.js index 3a0a18ce7e..ef1759fc8e 100644 --- a/src/ol/style/atlasmanager.js +++ b/src/ol/style/atlasmanager.js @@ -3,7 +3,6 @@ goog.provide('ol.style.AtlasManager'); goog.require('goog.asserts'); goog.require('goog.functions'); -goog.require('goog.object'); goog.require('ol'); @@ -310,8 +309,7 @@ ol.style.Atlas = function(size, space) { * @return {?ol.style.AtlasInfo} The atlas info. */ ol.style.Atlas.prototype.get = function(id) { - return /** @type {?ol.style.AtlasInfo} */ ( - goog.object.get(this.entries_, id, null)); + return this.entries_[id] || null; }; From fd394151fd9e7b85b1eaf2c5280b242168d583c8 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 21:56:18 -0700 Subject: [PATCH 11/16] Replace goog.object.clear() with ol.object.clear() --- src/ol/events.js | 6 +-- src/ol/geom/geometrycollection.js | 4 +- src/ol/geom/simplegeometry.js | 4 +- src/ol/interaction/selectinteraction.js | 8 ++-- src/ol/layer/layergroup.js | 7 ++- src/ol/object.js | 47 +------------------- src/ol/objectutil.js | 55 ++++++++++++++++++++++++ src/ol/structs/priorityqueue.js | 4 +- src/ol/webgl/context.js | 8 ++-- test/spec/ol/object.test.js | 41 ------------------ test/spec/ol/objectutil.test.js | 57 +++++++++++++++++++++++++ 11 files changed, 134 insertions(+), 107 deletions(-) create mode 100644 src/ol/objectutil.js create mode 100644 test/spec/ol/objectutil.test.js diff --git a/src/ol/events.js b/src/ol/events.js index c10975e29f..c07373bd30 100644 --- a/src/ol/events.js +++ b/src/ol/events.js @@ -2,7 +2,7 @@ goog.provide('ol.events'); goog.provide('ol.events.EventType'); goog.provide('ol.events.KeyCode'); -goog.require('goog.object'); +goog.require('ol.object'); /** @@ -188,7 +188,7 @@ ol.events.removeListeners_ = function(target, type) { if (listeners) { for (var i = 0, ii = listeners.length; i < ii; ++i) { target.removeEventListener(type, listeners[i].boundListener); - goog.object.clear(listeners[i]) + ol.object.clear(listeners[i]) } listeners.length = 0; var listenerMap = target[ol.events.LISTENER_MAP_PROP_]; @@ -318,7 +318,7 @@ ol.events.unlistenByKey = function(key) { ol.events.removeListeners_(key.target, key.type); } } - goog.object.clear(key); + ol.object.clear(key); } }; diff --git a/src/ol/geom/geometrycollection.js b/src/ol/geom/geometrycollection.js index 02063c551b..4dca505004 100644 --- a/src/ol/geom/geometrycollection.js +++ b/src/ol/geom/geometrycollection.js @@ -2,10 +2,10 @@ goog.provide('ol.geom.GeometryCollection'); goog.require('ol.events'); goog.require('ol.events.EventType'); -goog.require('goog.object'); goog.require('ol.extent'); goog.require('ol.geom.Geometry'); goog.require('ol.geom.GeometryType'); +goog.require('ol.object'); /** @@ -160,7 +160,7 @@ ol.geom.GeometryCollection.prototype.getGeometriesArray = function() { */ ol.geom.GeometryCollection.prototype.getSimplifiedGeometry = function(squaredTolerance) { if (this.simplifiedGeometryRevision != this.getRevision()) { - goog.object.clear(this.simplifiedGeometryCache); + ol.object.clear(this.simplifiedGeometryCache); this.simplifiedGeometryMaxMinSquaredTolerance = 0; this.simplifiedGeometryRevision = this.getRevision(); } diff --git a/src/ol/geom/simplegeometry.js b/src/ol/geom/simplegeometry.js index af14789c47..66f3fe6f9e 100644 --- a/src/ol/geom/simplegeometry.js +++ b/src/ol/geom/simplegeometry.js @@ -2,11 +2,11 @@ goog.provide('ol.geom.SimpleGeometry'); goog.require('goog.asserts'); goog.require('goog.functions'); -goog.require('goog.object'); goog.require('ol.extent'); goog.require('ol.geom.Geometry'); goog.require('ol.geom.GeometryLayout'); goog.require('ol.geom.flat.transform'); +goog.require('ol.object'); /** @@ -146,7 +146,7 @@ ol.geom.SimpleGeometry.prototype.getLayout = function() { */ ol.geom.SimpleGeometry.prototype.getSimplifiedGeometry = function(squaredTolerance) { if (this.simplifiedGeometryRevision != this.getRevision()) { - goog.object.clear(this.simplifiedGeometryCache); + ol.object.clear(this.simplifiedGeometryCache); this.simplifiedGeometryMaxMinSquaredTolerance = 0; this.simplifiedGeometryRevision = this.getRevision(); } diff --git a/src/ol/interaction/selectinteraction.js b/src/ol/interaction/selectinteraction.js index 47247ce55b..d1bda17fb0 100644 --- a/src/ol/interaction/selectinteraction.js +++ b/src/ol/interaction/selectinteraction.js @@ -4,17 +4,17 @@ goog.provide('ol.interaction.SelectEventType'); goog.provide('ol.interaction.SelectFilterFunction'); goog.require('goog.asserts'); -goog.require('ol.events'); -goog.require('ol.events.Event'); goog.require('goog.functions'); -goog.require('goog.object'); goog.require('ol.CollectionEventType'); goog.require('ol.Feature'); goog.require('ol.array'); +goog.require('ol.events'); +goog.require('ol.events.Event'); goog.require('ol.events.condition'); goog.require('ol.geom.GeometryType'); goog.require('ol.interaction.Interaction'); goog.require('ol.layer.Vector'); +goog.require('ol.object'); goog.require('ol.source.Vector'); @@ -305,7 +305,7 @@ ol.interaction.Select.handleEvent = function(mapBrowserEvent) { features.extend(selected); // Modify object this.featureLayerAssociation_ if (selected.length === 0) { - goog.object.clear(this.featureLayerAssociation_); + ol.object.clear(this.featureLayerAssociation_); } else { if (deselected.length > 0) { deselected.forEach(function(feature) { diff --git a/src/ol/layer/layergroup.js b/src/ol/layer/layergroup.js index deaff7a9b1..3307a0ae82 100644 --- a/src/ol/layer/layergroup.js +++ b/src/ol/layer/layergroup.js @@ -1,14 +1,13 @@ goog.provide('ol.layer.Group'); goog.require('goog.asserts'); -goog.require('goog.object'); -goog.require('ol.events'); -goog.require('ol.events.EventType'); goog.require('ol.Collection'); goog.require('ol.CollectionEvent'); goog.require('ol.CollectionEventType'); goog.require('ol.Object'); goog.require('ol.ObjectEventType'); +goog.require('ol.events'); +goog.require('ol.events.EventType'); goog.require('ol.extent'); goog.require('ol.layer.Base'); goog.require('ol.object'); @@ -107,7 +106,7 @@ ol.layer.Group.prototype.handleLayersChanged_ = function(event) { for (var id in this.listenerKeys_) { this.listenerKeys_[id].forEach(ol.events.unlistenByKey); } - goog.object.clear(this.listenerKeys_); + ol.object.clear(this.listenerKeys_); var layersArray = layers.getArray(); var i, ii, layer; diff --git a/src/ol/object.js b/src/ol/object.js index 04b85f9a84..ab2ac546ac 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -1,54 +1,11 @@ goog.provide('ol.Object'); goog.provide('ol.ObjectEvent'); goog.provide('ol.ObjectEventType'); -goog.provide('ol.object'); +goog.require('ol.Observable'); goog.require('ol.events'); goog.require('ol.events.Event'); -goog.require('ol.Observable'); - - -/** - * Polyfill for Object.assign(). Assigns enumerable and own properties from - * one or more source objects to a target object. - * - * @see https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign - * @param {!Object} target The target object. - * @param {...Object} var_sources The source object(s). - * @return {!Object} The modified target object. - */ -ol.object.assign = (typeof Object.assign === 'function') ? Object.assign : function(target, var_sources) { - if (target === undefined || target === null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - - var output = Object(target); - for (var i = 1, ii = arguments.length; i < ii; ++i) { - var source = arguments[i]; - if (source !== undefined && source !== null) { - for (var key in source) { - if (source.hasOwnProperty(key)) { - output[key] = source[key]; - } - } - } - } - return output; -}; - - -/** - * Determine if an object has any properties. - * @param {Object} object The object to check. - * @return {boolean} The object is empty. - */ -ol.object.isEmpty = function(object) { - var property; - for (property in object) { - return false; - } - return !property; -}; +goog.require('ol.object'); /** diff --git a/src/ol/objectutil.js b/src/ol/objectutil.js new file mode 100644 index 0000000000..abb3633eb3 --- /dev/null +++ b/src/ol/objectutil.js @@ -0,0 +1,55 @@ +goog.provide('ol.object'); + + +/** + * Polyfill for Object.assign(). Assigns enumerable and own properties from + * one or more source objects to a target object. + * + * @see https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + * @param {!Object} target The target object. + * @param {...Object} var_sources The source object(s). + * @return {!Object} The modified target object. + */ +ol.object.assign = (typeof Object.assign === 'function') ? Object.assign : function(target, var_sources) { + if (target === undefined || target === null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + + var output = Object(target); + for (var i = 1, ii = arguments.length; i < ii; ++i) { + var source = arguments[i]; + if (source !== undefined && source !== null) { + for (var key in source) { + if (source.hasOwnProperty(key)) { + output[key] = source[key]; + } + } + } + } + return output; +}; + + +/** + * Removes all properties from an object. + * @param {Object} object The object to clear. + */ +ol.object.clear = function(object) { + for (var property in object) { + delete object[property]; + } +}; + + +/** + * Determine if an object has any properties. + * @param {Object} object The object to check. + * @return {boolean} The object is empty. + */ +ol.object.isEmpty = function(object) { + var property; + for (property in object) { + return false; + } + return !property; +}; diff --git a/src/ol/structs/priorityqueue.js b/src/ol/structs/priorityqueue.js index ce370b985d..d2c7702c26 100644 --- a/src/ol/structs/priorityqueue.js +++ b/src/ol/structs/priorityqueue.js @@ -1,7 +1,7 @@ goog.provide('ol.structs.PriorityQueue'); goog.require('goog.asserts'); -goog.require('goog.object'); +goog.require('ol.object'); /** @@ -88,7 +88,7 @@ ol.structs.PriorityQueue.prototype.assertValid = function() { ol.structs.PriorityQueue.prototype.clear = function() { this.elements_.length = 0; this.priorities_.length = 0; - goog.object.clear(this.queuedElements_); + ol.object.clear(this.queuedElements_); }; diff --git a/src/ol/webgl/context.js b/src/ol/webgl/context.js index dda073019d..dd91964e6b 100644 --- a/src/ol/webgl/context.js +++ b/src/ol/webgl/context.js @@ -2,10 +2,10 @@ goog.provide('ol.webgl.Context'); goog.require('goog.asserts'); goog.require('goog.log'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.array'); goog.require('ol.events'); +goog.require('ol.object'); goog.require('ol.webgl.Buffer'); goog.require('ol.webgl.WebGLContextEventType'); @@ -282,9 +282,9 @@ ol.webgl.Context.prototype.getProgram = function( * FIXME empy description for jsdoc */ ol.webgl.Context.prototype.handleWebGLContextLost = function() { - goog.object.clear(this.bufferCache_); - goog.object.clear(this.shaderCache_); - goog.object.clear(this.programCache_); + ol.object.clear(this.bufferCache_); + ol.object.clear(this.shaderCache_); + ol.object.clear(this.programCache_); this.currentProgram_ = null; this.hitDetectionFramebuffer_ = null; this.hitDetectionTexture_ = null; diff --git a/test/spec/ol/object.test.js b/test/spec/ol/object.test.js index 69f9b3dd27..acbf2f9040 100644 --- a/test/spec/ol/object.test.js +++ b/test/spec/ol/object.test.js @@ -238,48 +238,7 @@ describe('ol.Object', function() { }); -describe('ol.object.assign()', function() { - - it('is an alias for Object.assign() where available', function() { - if (typeof Object.assign === 'function') { - expect(ol.object.assign).to.be(Object.assign); - } - }); - - it('assigns properties from a source object to a target object', function() { - - var source = { - sourceProp1: 'sourceValue1', - sourceProp2: 'sourceValue2' - }; - - var target = { - sourceProp1: 'overridden', - targetProp1: 'targetValue1' - }; - - var assigned = ol.object.assign(target, source); - expect(assigned).to.be(target); - expect(assigned.sourceProp1).to.be('sourceValue1'); - expect(assigned.sourceProp2).to.be('sourceValue2'); - expect(assigned.targetProp1).to.be('targetValue1'); - - }); - -}); - -describe('ol.object.isEmpty()', function() { - - it('checks if an object has any properties', function() { - expect(ol.object.isEmpty({})).to.be(true); - expect(ol.object.isEmpty(null)).to.be(true); - expect(ol.object.isEmpty({foo: 'bar'})).to.be(false); - expect(ol.object.isEmpty({foo: false})).to.be(false); - }); - -}); goog.require('ol.Object'); goog.require('ol.ObjectEventType'); goog.require('ol.events'); -goog.require('ol.object'); diff --git a/test/spec/ol/objectutil.test.js b/test/spec/ol/objectutil.test.js new file mode 100644 index 0000000000..5435648b54 --- /dev/null +++ b/test/spec/ol/objectutil.test.js @@ -0,0 +1,57 @@ +goog.provide('ol.test.object'); + +describe('ol.object.assign()', function() { + + it('is an alias for Object.assign() where available', function() { + if (typeof Object.assign === 'function') { + expect(ol.object.assign).to.be(Object.assign); + } + }); + + it('assigns properties from a source object to a target object', function() { + + var source = { + sourceProp1: 'sourceValue1', + sourceProp2: 'sourceValue2' + }; + + var target = { + sourceProp1: 'overridden', + targetProp1: 'targetValue1' + }; + + var assigned = ol.object.assign(target, source); + expect(assigned).to.be(target); + expect(assigned.sourceProp1).to.be('sourceValue1'); + expect(assigned.sourceProp2).to.be('sourceValue2'); + expect(assigned.targetProp1).to.be('targetValue1'); + + }); + +}); + +describe('ol.object.clear()', function() { + + it('removes all properties from an object', function() { + var clear = ol.object.clear; + var isEmpty = ol.object.isEmpty; + expect(isEmpty(clear({foo: 'bar'}))).to.be(true); + expect(isEmpty(clear({foo: 'bar', num: 42}))).to.be(true); + expect(isEmpty(clear({}))).to.be(true); + expect(isEmpty(clear(null))).to.be(true); + }); + +}); + +describe('ol.object.isEmpty()', function() { + + it('checks if an object has any properties', function() { + expect(ol.object.isEmpty({})).to.be(true); + expect(ol.object.isEmpty(null)).to.be(true); + expect(ol.object.isEmpty({foo: 'bar'})).to.be(false); + expect(ol.object.isEmpty({foo: false})).to.be(false); + }); + +}); + +goog.require('ol.object'); From 417dbf36c89fd4f8afd08009f65c5a7cb671449b Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 22:07:26 -0700 Subject: [PATCH 12/16] Remove use of goog.object.setIfUndefined() --- src/ol/format/wmscapabilitiesformat.js | 6 ++---- src/ol/xml.js | 8 ++++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/ol/format/wmscapabilitiesformat.js b/src/ol/format/wmscapabilitiesformat.js index b9ae3f5bb5..1ee65a4067 100644 --- a/src/ol/format/wmscapabilitiesformat.js +++ b/src/ol/format/wmscapabilitiesformat.js @@ -2,7 +2,6 @@ goog.provide('ol.format.WMSCapabilities'); goog.require('goog.asserts'); goog.require('goog.dom.NodeType'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.format.XLink'); goog.require('ol.format.XML'); @@ -339,9 +338,8 @@ ol.format.WMSCapabilities.readLayer_ = function(node, objectStack) { var addKeys = ['Style', 'CRS', 'AuthorityURL']; addKeys.forEach(function(key) { if (key in parentLayerObject) { - var childValue = goog.object.setIfUndefined(layerObject, key, []); - childValue = childValue.concat(parentLayerObject[key]); - layerObject[key] = childValue; + var childValue = layerObject[key] || []; + layerObject[key] = childValue.concat(parentLayerObject[key]); } }); diff --git a/src/ol/xml.js b/src/ol/xml.js index 780a9be248..2d86b031b5 100644 --- a/src/ol/xml.js +++ b/src/ol/xml.js @@ -3,7 +3,6 @@ goog.provide('ol.xml'); goog.require('goog.asserts'); goog.require('goog.dom.NodeType'); goog.require('goog.dom.xml'); -goog.require('goog.object'); goog.require('goog.userAgent'); goog.require('ol.array'); @@ -454,7 +453,12 @@ ol.xml.makeObjectPropertyPusher = function(valueReader, opt_property, opt_this) opt_property : node.localName; goog.asserts.assert(goog.isObject(object), 'entity from stack was not an object'); - var array = goog.object.setIfUndefined(object, property, []); + var array; + if (property in object) { + array = object[property]; + } else { + array = object[property] = []; + } array.push(value); } }); From e2fe89781108dd558a25b182542505fd15f0c6e3 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 22:20:03 -0700 Subject: [PATCH 13/16] Replace goog.object.getValues() with ol.object.getValues() --- src/ol/format/topojsonformat.js | 4 ++-- src/ol/interaction/pointerinteraction.js | 4 ++-- src/ol/interaction/snapinteraction.js | 8 ++++---- src/ol/objectutil.js | 15 +++++++++++++++ src/ol/source/vectorsource.js | 3 +-- test/spec/ol/objectutil.test.js | 9 +++++++++ 6 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/ol/format/topojsonformat.js b/src/ol/format/topojsonformat.js index cd63908115..a458d8f9d0 100644 --- a/src/ol/format/topojsonformat.js +++ b/src/ol/format/topojsonformat.js @@ -1,7 +1,6 @@ goog.provide('ol.format.TopoJSON'); goog.require('goog.asserts'); -goog.require('goog.object'); goog.require('ol.Feature'); goog.require('ol.format.Feature'); goog.require('ol.format.JSONFeature'); @@ -11,6 +10,7 @@ goog.require('ol.geom.MultiPoint'); goog.require('ol.geom.MultiPolygon'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); +goog.require('ol.object'); goog.require('ol.proj'); @@ -299,7 +299,7 @@ ol.format.TopoJSON.prototype.readFeaturesFromObject = function( } /** @type {Array.} */ var features = []; - var topoJSONFeatures = goog.object.getValues(topoJSONTopology.objects); + var topoJSONFeatures = ol.object.getValues(topoJSONTopology.objects); var i, ii; var feature; for (i = 0, ii = topoJSONFeatures.length; i < ii; ++i) { diff --git a/src/ol/interaction/pointerinteraction.js b/src/ol/interaction/pointerinteraction.js index ceeede2a59..9595649d19 100644 --- a/src/ol/interaction/pointerinteraction.js +++ b/src/ol/interaction/pointerinteraction.js @@ -1,12 +1,12 @@ goog.provide('ol.interaction.Pointer'); goog.require('goog.functions'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.MapBrowserEvent.EventType'); goog.require('ol.MapBrowserPointerEvent'); goog.require('ol.Pixel'); goog.require('ol.interaction.Interaction'); +goog.require('ol.object'); /** @@ -133,7 +133,7 @@ ol.interaction.Pointer.prototype.updateTrackedPointers_ = function(mapBrowserEve // update only when there was a pointerdown event for this pointer this.trackedPointers_[event.pointerId] = event; } - this.targetPointers = goog.object.getValues(this.trackedPointers_); + this.targetPointers = ol.object.getValues(this.trackedPointers_); } }; diff --git a/src/ol/interaction/snapinteraction.js b/src/ol/interaction/snapinteraction.js index eb8598ade6..ceb92583b1 100644 --- a/src/ol/interaction/snapinteraction.js +++ b/src/ol/interaction/snapinteraction.js @@ -2,9 +2,6 @@ goog.provide('ol.interaction.Snap'); goog.provide('ol.interaction.SnapProperty'); goog.require('goog.asserts'); -goog.require('ol.events'); -goog.require('ol.events.EventType'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.Collection'); goog.require('ol.CollectionEvent'); @@ -14,9 +11,12 @@ goog.require('ol.Feature'); goog.require('ol.Object'); goog.require('ol.Observable'); goog.require('ol.coordinate'); +goog.require('ol.events'); +goog.require('ol.events.EventType'); goog.require('ol.extent'); goog.require('ol.geom.Geometry'); goog.require('ol.interaction.Pointer'); +goog.require('ol.object'); goog.require('ol.source.Vector'); goog.require('ol.source.VectorEvent'); goog.require('ol.source.VectorEventType'); @@ -591,7 +591,7 @@ ol.interaction.Snap.handleEvent_ = function(evt) { * @private */ ol.interaction.Snap.handleUpEvent_ = function(evt) { - var featuresToUpdate = goog.object.getValues(this.pendingFeatures_); + var featuresToUpdate = ol.object.getValues(this.pendingFeatures_); if (featuresToUpdate.length) { featuresToUpdate.forEach(this.updateFeature_, this); this.pendingFeatures_ = {}; diff --git a/src/ol/objectutil.js b/src/ol/objectutil.js index abb3633eb3..8ada4e7996 100644 --- a/src/ol/objectutil.js +++ b/src/ol/objectutil.js @@ -41,6 +41,21 @@ ol.object.clear = function(object) { }; +/** + * Get an array of property values from an object. + * @param {Object} object The object from which to get the values. + * @return {!Array} The property values. + * @template K,V + */ +ol.object.getValues = function(object) { + var values = []; + for (var property in object) { + values.push(object[property]); + } + return values; +}; + + /** * Determine if an object has any properties. * @param {Object} object The object to check. diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js index 449e3ae4cc..1faaa14d2a 100644 --- a/src/ol/source/vectorsource.js +++ b/src/ol/source/vectorsource.js @@ -6,7 +6,6 @@ goog.provide('ol.source.VectorEvent'); goog.provide('ol.source.VectorEventType'); goog.require('goog.asserts'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.Collection'); goog.require('ol.CollectionEventType'); @@ -553,7 +552,7 @@ ol.source.Vector.prototype.getFeatures = function() { features = this.featuresRtree_.getAll(); if (!ol.object.isEmpty(this.nullGeometryFeatures_)) { ol.array.extend( - features, goog.object.getValues(this.nullGeometryFeatures_)); + features, ol.object.getValues(this.nullGeometryFeatures_)); } } goog.asserts.assert(features !== undefined, diff --git a/test/spec/ol/objectutil.test.js b/test/spec/ol/objectutil.test.js index 5435648b54..e3a91c0a6c 100644 --- a/test/spec/ol/objectutil.test.js +++ b/test/spec/ol/objectutil.test.js @@ -43,6 +43,15 @@ describe('ol.object.clear()', function() { }); +describe('ol.object.getValues()', function() { + + it('gets a list of property values from an object', function() { + expect(ol.object.getValues({foo: 'bar', num: 42}).sort()).to.eql([42, 'bar']); + expect(ol.object.getValues(null)).to.eql([]); + }); + +}); + describe('ol.object.isEmpty()', function() { it('checks if an object has any properties', function() { From d67f33bcd66a8dd9152e6be91043548a0c661d81 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 22:26:59 -0700 Subject: [PATCH 14/16] Remove use of goog.object.unsafeClone() --- src/ol/geom/multipolygon.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ol/geom/multipolygon.js b/src/ol/geom/multipolygon.js index 5e943c03f9..c06abed26f 100644 --- a/src/ol/geom/multipolygon.js +++ b/src/ol/geom/multipolygon.js @@ -1,7 +1,6 @@ goog.provide('ol.geom.MultiPolygon'); goog.require('goog.asserts'); -goog.require('goog.object'); goog.require('ol'); goog.require('ol.array'); goog.require('ol.extent'); @@ -119,8 +118,13 @@ ol.geom.MultiPolygon.prototype.appendPolygon = function(polygon) { */ ol.geom.MultiPolygon.prototype.clone = function() { var multiPolygon = new ol.geom.MultiPolygon(null); - var newEndss = /** @type {Array.>} */ - (goog.object.unsafeClone(this.endss_)); + + var len = this.endss_.length; + var newEndss = new Array(len); + for (var i = 0; i < len; ++i) { + newEndss[i] = this.endss_.slice(); + } + multiPolygon.setFlatCoordinates( this.layout, this.flatCoordinates.slice(), newEndss); return multiPolygon; From 72ea0ecfd87b083e1e10f1ac5568116667cc834a Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 3 Feb 2016 22:34:58 -0700 Subject: [PATCH 15/16] Remove remaining goog.object use from tests --- .../keyboardpaninteraction.test.js | 1 - .../keyboardzoominteraction.test.js | 1 - .../mousewheelzoominteraction.test.js | 1 - test/spec/ol/layer/layergroup.test.js | 24 +++++++++---------- test/spec/ol/pointer/touchsource.test.js | 13 +++++----- test/spec/ol/source/tilesource.test.js | 1 - 6 files changed, 18 insertions(+), 23 deletions(-) diff --git a/test/spec/ol/interaction/keyboardpaninteraction.test.js b/test/spec/ol/interaction/keyboardpaninteraction.test.js index 303c81e576..bdec982f5a 100644 --- a/test/spec/ol/interaction/keyboardpaninteraction.test.js +++ b/test/spec/ol/interaction/keyboardpaninteraction.test.js @@ -47,7 +47,6 @@ describe('ol.interaction.KeyboardPan', function() { }); -goog.require('goog.object'); goog.require('ol.Map'); goog.require('ol.MapBrowserEvent'); goog.require('ol.View'); diff --git a/test/spec/ol/interaction/keyboardzoominteraction.test.js b/test/spec/ol/interaction/keyboardzoominteraction.test.js index 94ec0c9888..7dc2c08bf2 100644 --- a/test/spec/ol/interaction/keyboardzoominteraction.test.js +++ b/test/spec/ol/interaction/keyboardzoominteraction.test.js @@ -41,7 +41,6 @@ describe('ol.interaction.KeyboardZoom', function() { }); -goog.require('goog.object'); goog.require('ol.Map'); goog.require('ol.MapBrowserEvent'); goog.require('ol.View'); diff --git a/test/spec/ol/interaction/mousewheelzoominteraction.test.js b/test/spec/ol/interaction/mousewheelzoominteraction.test.js index 79e52d90dc..22a983aa68 100644 --- a/test/spec/ol/interaction/mousewheelzoominteraction.test.js +++ b/test/spec/ol/interaction/mousewheelzoominteraction.test.js @@ -126,7 +126,6 @@ describe('ol.interaction.MouseWheelZoom', function() { }); -goog.require('goog.object'); goog.require('ol.Map'); goog.require('ol.MapBrowserEvent'); goog.require('ol.View'); diff --git a/test/spec/ol/layer/layergroup.test.js b/test/spec/ol/layer/layergroup.test.js index 8d357b76d4..a285ed23c6 100644 --- a/test/spec/ol/layer/layergroup.test.js +++ b/test/spec/ol/layer/layergroup.test.js @@ -279,10 +279,10 @@ describe('ol.layer.Group', function() { var layerGroup = new ol.layer.Group({ layers: layers }); - expect(goog.object.getCount(layerGroup.listenerKeys_)).to.eql(0); + expect(Object.keys(layerGroup.listenerKeys_).length).to.eql(0); var layer = new ol.layer.Layer({}); layers.push(layer); - expect(goog.object.getCount(layerGroup.listenerKeys_)).to.eql(1); + expect(Object.keys(layerGroup.listenerKeys_).length).to.eql(1); var listeners = layerGroup.listenerKeys_[goog.getUid(layer)]; expect(listeners.length).to.eql(2); @@ -291,7 +291,7 @@ describe('ol.layer.Group', function() { // remove the layer from the group layers.pop(); - expect(goog.object.getCount(layerGroup.listenerKeys_)).to.eql(0); + expect(Object.keys(layerGroup.listenerKeys_).length).to.eql(0); expect(listeners[0].listener).to.be(undefined); expect(listeners[1].listener).to.be(undefined); }); @@ -364,9 +364,9 @@ describe('ol.layer.Group', function() { expect(layerStatesArray[0]).to.eql(layer1.getLayerState()); // layer state should match except for layer reference - var layerState = goog.object.clone(layerStatesArray[0]); + var layerState = ol.object.assign({}, layerStatesArray[0]); delete layerState.layer; - var groupState = goog.object.clone(layerGroup.getLayerState()); + var groupState = ol.object.assign({}, layerGroup.getLayerState()); delete groupState.layer; expect(layerState).to.eql(groupState); @@ -413,14 +413,14 @@ describe('ol.layer.Group', function() { var groupState, layerState; // layer state should match except for layer reference - layerState = goog.object.clone(layerStatesArray[0]); + layerState = ol.object.assign({}, layerStatesArray[0]); delete layerState.layer; - groupState = goog.object.clone(layerGroup.getLayerState()); + groupState = ol.object.assign({}, layerGroup.getLayerState()); delete groupState.layer; expect(layerState).to.eql(groupState); // layer state should be transformed (and we ignore layer reference) - layerState = goog.object.clone(layerStatesArray[1]); + layerState = ol.object.assign({}, layerStatesArray[1]); delete layerState.layer; expect(layerState).to.eql({ opacity: 0.25, @@ -491,14 +491,14 @@ describe('ol.layer.Group', function() { goog.require('ol.array'); goog.require('goog.dispose'); +goog.require('ol.Collection'); +goog.require('ol.ObjectEventType'); goog.require('ol.events'); goog.require('ol.events.EventType'); -goog.require('goog.object'); -goog.require('ol.ObjectEventType'); goog.require('ol.extent'); -goog.require('ol.layer.Layer'); goog.require('ol.layer.Group'); +goog.require('ol.layer.Layer'); +goog.require('ol.object'); goog.require('ol.renderer.Map'); goog.require('ol.source.Source'); goog.require('ol.source.State'); -goog.require('ol.Collection'); diff --git a/test/spec/ol/pointer/touchsource.test.js b/test/spec/ol/pointer/touchsource.test.js index dba05424bc..d4eec899b4 100644 --- a/test/spec/ol/pointer/touchsource.test.js +++ b/test/spec/ol/pointer/touchsource.test.js @@ -46,7 +46,7 @@ describe('ol.pointer.TouchSource', function() { expect(pointerEvent2.clientX).to.be(30); expect(pointerEvent2.clientY).to.be(45); - expect(goog.object.getCount(handler.pointerMap)).to.be(2); + expect(Object.keys(handler.pointerMap).length).to.be(2); }); it('creates the right pointer events', function() { @@ -57,7 +57,7 @@ describe('ol.pointer.TouchSource', function() { {identifier: 3, clientX: 10, clientY: 11} ]); expect(eventSpy.calledOnce).to.be.ok(); - expect(goog.object.getCount(handler.pointerMap)).to.be(1); + expect(Object.keys(handler.pointerMap).length).to.be(1); // second touch (first touch still down) simulateTouchEvent('touchstart', [ @@ -65,7 +65,7 @@ describe('ol.pointer.TouchSource', function() { ], [{identifier: 3}, {identifier: 4}] ); expect(eventSpy.calledTwice).to.be.ok(); - expect(goog.object.getCount(handler.pointerMap)).to.be(2); + expect(Object.keys(handler.pointerMap).length).to.be(2); // first touch moves var moveEventSpy = sinon.spy(); @@ -87,7 +87,7 @@ describe('ol.pointer.TouchSource', function() { ], [{identifier: 3}, {identifier: 4}] ); expect(upEventSpy.calledTwice).to.be.ok(); - expect(goog.object.getCount(handler.pointerMap)).to.be(0); + expect(Object.keys(handler.pointerMap).length).to.be(0); }); it('handles flawed touches', function() { @@ -98,7 +98,7 @@ describe('ol.pointer.TouchSource', function() { {identifier: 3, clientX: 10, clientY: 11} ]); expect(eventSpy.calledOnce).to.be.ok(); - expect(goog.object.getCount(handler.pointerMap)).to.be(1); + expect(Object.keys(handler.pointerMap).length).to.be(1); // second touch, but the first touch has disappeared var cancelEventSpy = sinon.spy(); @@ -111,7 +111,7 @@ describe('ol.pointer.TouchSource', function() { // the first (broken) touch is canceled expect(cancelEventSpy.calledOnce).to.be.ok(); - expect(goog.object.getCount(handler.pointerMap)).to.be(1); + expect(Object.keys(handler.pointerMap).length).to.be(1); }); }); @@ -127,7 +127,6 @@ describe('ol.pointer.TouchSource', function() { } }); -goog.require('goog.object'); goog.require('ol.events'); goog.require('ol.events.Event'); goog.require('ol.events.EventTarget'); diff --git a/test/spec/ol/source/tilesource.test.js b/test/spec/ol/source/tilesource.test.js index 1155964481..2ec75b645c 100644 --- a/test/spec/ol/source/tilesource.test.js +++ b/test/spec/ol/source/tilesource.test.js @@ -255,7 +255,6 @@ describe('ol.test.source.TileMock', function() { }); -goog.require('goog.object'); goog.require('ol.Tile'); goog.require('ol.TileRange'); goog.require('ol.TileState'); From 0c23d9a7ff3ba2300b9246236f19593eb4d405cc Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 4 Feb 2016 13:55:56 +0100 Subject: [PATCH 16/16] Keep track of tile source count --- externs/olx.js | 1 + src/ol/map.js | 3 ++- src/ol/renderer/layerrenderer.js | 1 + src/ol/source/rastersource.js | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/externs/olx.js b/externs/olx.js index 827f4485d4..5d858c0d40 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -7008,6 +7008,7 @@ olx.view.FitOptions.prototype.maxZoom; * size: ol.Size, * skippedFeatureUids: Object., * tileQueue: ol.TileQueue, + * tileSourceCount: number, * time: number, * usedTiles: Object.>, * viewState: olx.ViewState, diff --git a/src/ol/map.js b/src/ol/map.js index 0ea3ae32c6..fe05b5bf50 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -1027,7 +1027,7 @@ ol.Map.prototype.handlePostRender = function() { maxTotalLoading = this.loadTilesWhileInteracting_ ? 8 : 0; maxNewLoads = 2; } - tileSourceCount = Object.keys(frameState.wantedTiles).length; + tileSourceCount = frameState.tileSourceCount; } maxTotalLoading *= tileSourceCount; maxNewLoads *= tileSourceCount; @@ -1332,6 +1332,7 @@ ol.Map.prototype.renderFrame_ = function(time) { size: size, skippedFeatureUids: this.skippedFeatureUids_, tileQueue: this.tileQueue_, + tileSourceCount: 0, time: time, usedTiles: {}, viewState: viewState, diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js index 67902b8fae..6bb4ba492a 100644 --- a/src/ol/renderer/layerrenderer.js +++ b/src/ol/renderer/layerrenderer.js @@ -298,6 +298,7 @@ ol.renderer.Layer.prototype.manageTilePyramid = function( var tileSourceKey = goog.getUid(tileSource).toString(); if (!(tileSourceKey in frameState.wantedTiles)) { frameState.wantedTiles[tileSourceKey] = {}; + ++frameState.tileSourceCount; } var wantedTiles = frameState.wantedTiles[tileSourceKey]; var tileQueue = frameState.tileQueue; diff --git a/src/ol/source/rastersource.js b/src/ol/source/rastersource.js index 3e3090327a..ec11a98e30 100644 --- a/src/ol/source/rastersource.js +++ b/src/ol/source/rastersource.js @@ -122,6 +122,7 @@ ol.source.Raster = function(options) { size: [0, 0], skippedFeatureUids: {}, tileQueue: this.tileQueue_, + tileSourceCount: 0, time: Date.now(), usedTiles: {}, viewState: /** @type {olx.ViewState} */ ({