diff --git a/examples/flight-animation.js b/examples/flight-animation.js index 552172bb8b..d6c5fd5a56 100644 --- a/examples/flight-animation.js +++ b/examples/flight-animation.js @@ -76,10 +76,8 @@ var animateFlights = function(event) { flightsSource = new ol.source.Vector({ wrapX: false, - attributions: [new ol.Attribution({ - html: 'Flight data by ' + - 'OpenFlights,' - })], + attributions: 'Flight data by ' + + 'OpenFlights,', loader: function() { var url = 'data/openflights/flights.json'; fetch(url).then(function(response) { diff --git a/examples/igc.js b/examples/igc.js index 521b0923ee..fabe56dad5 100644 --- a/examples/igc.js +++ b/examples/igc.js @@ -86,10 +86,7 @@ var map = new ol.Map({ new ol.layer.Tile({ source: new ol.source.OSM({ attributions: [ - new ol.Attribution({ - html: 'All maps © ' + - 'OpenCycleMap' - }), + 'All maps © OpenCycleMap', ol.source.OSM.ATTRIBUTION ], url: 'http://{a-c}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png' diff --git a/examples/localized-openstreetmap.js b/examples/localized-openstreetmap.js index f02b27a019..e57397357d 100644 --- a/examples/localized-openstreetmap.js +++ b/examples/localized-openstreetmap.js @@ -9,10 +9,7 @@ goog.require('ol.source.OSM'); var openCycleMapLayer = new ol.layer.Tile({ source: new ol.source.OSM({ attributions: [ - new ol.Attribution({ - html: 'All maps © ' + - 'OpenCycleMap' - }), + 'All maps © OpenCycleMap', ol.source.OSM.ATTRIBUTION ], url: 'http://{a-c}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png' @@ -22,10 +19,7 @@ var openCycleMapLayer = new ol.layer.Tile({ var openSeaMapLayer = new ol.layer.Tile({ source: new ol.source.OSM({ attributions: [ - new ol.Attribution({ - html: 'All maps © ' + - 'OpenSeaMap' - }), + 'All maps © OpenSeaMap', ol.source.OSM.ATTRIBUTION ], opaque: false, diff --git a/examples/mapbox-vector-tiles-advanced.js b/examples/mapbox-vector-tiles-advanced.js index aaa0736fcc..4bda0c39c9 100644 --- a/examples/mapbox-vector-tiles-advanced.js +++ b/examples/mapbox-vector-tiles-advanced.js @@ -45,11 +45,9 @@ var map = new ol.Map({ new ol.layer.VectorTile({ preload: Infinity, source: new ol.source.VectorTile({ - attributions: [new ol.Attribution({ - html: '© Mapbox ' + - '© ' + - 'OpenStreetMap contributors' - })], + attributions: '© Mapbox ' + + '© ' + + 'OpenStreetMap contributors', format: new ol.format.MVT(), tileGrid: new ol.tilegrid.TileGrid({ extent: ol.proj.get('EPSG:3857').getExtent(), diff --git a/examples/mapbox-vector-tiles.js b/examples/mapbox-vector-tiles.js index 783e2462af..ed3688bd4e 100644 --- a/examples/mapbox-vector-tiles.js +++ b/examples/mapbox-vector-tiles.js @@ -17,11 +17,9 @@ var map = new ol.Map({ layers: [ new ol.layer.VectorTile({ source: new ol.source.VectorTile({ - attributions: [new ol.Attribution({ - html: '© Mapbox ' + - '© ' + - 'OpenStreetMap contributors' - })], + attributions: '© Mapbox ' + + '© ' + + 'OpenStreetMap contributors', format: new ol.format.MVT(), tileGrid: ol.tilegrid.createXYZ({maxZoom: 22}), tilePixelRatio: 16, diff --git a/examples/reprojection.js b/examples/reprojection.js index 1e6a9f5881..e8aaca6fde 100644 --- a/examples/reprojection.js +++ b/examples/reprojection.js @@ -81,12 +81,8 @@ layers['wms4326'] = new ol.layer.Tile({ layers['wms21781'] = new ol.layer.Tile({ source: new ol.source.TileWMS({ - attributions: [new ol.Attribution({ - html: '© ' + - '' + - 'Pixelmap 1:1000000 / geo.admin.ch' - })], + attributions: '© Pixelmap 1:1000000 / geo.admin.ch', crossOrigin: 'anonymous', params: { 'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale', @@ -120,10 +116,8 @@ layers['grandcanyon'] = new ol.layer.Tile({ crossOrigin: '', tilePixelRatio: 2, maxZoom: 15, - attributions: [new ol.Attribution({ - html: 'Tiles © USGS, rendered with ' + - 'MapTiler' - })] + attributions: 'Tiles © USGS, rendered with ' + + 'MapTiler' }) }); diff --git a/examples/static-image.js b/examples/static-image.js index 41bbc77bab..b14da703cb 100644 --- a/examples/static-image.js +++ b/examples/static-image.js @@ -21,11 +21,7 @@ var map = new ol.Map({ layers: [ new ol.layer.Image({ source: new ol.source.ImageStatic({ - attributions: [ - new ol.Attribution({ - html: '© xkcd' - }) - ], + attributions: '© xkcd', url: 'http://imgs.xkcd.com/comics/online_communities.png', projection: projection, imageExtent: extent diff --git a/examples/vector-esri-edit.js b/examples/vector-esri-edit.js index 184ff5f85e..da05168994 100644 --- a/examples/vector-esri-edit.js +++ b/examples/vector-esri-edit.js @@ -53,14 +53,10 @@ var vector = new ol.layer.Vector({ source: vectorSource }); -var attribution = new ol.Attribution({ - html: 'Tiles © ArcGIS' -}); - var raster = new ol.layer.Tile({ source: new ol.source.XYZ({ - attributions: [attribution], + attributions: 'Tiles © ArcGIS', url: 'http://server.arcgisonline.com/ArcGIS/rest/services/' + 'World_Topo_Map/MapServer/tile/{z}/{y}/{x}' }) diff --git a/examples/vector-esri.js b/examples/vector-esri.js index 9875f67aa5..480d0bf729 100644 --- a/examples/vector-esri.js +++ b/examples/vector-esri.js @@ -95,15 +95,10 @@ var vector = new ol.layer.Vector({ } }); - -var attribution = new ol.Attribution({ - html: 'Tiles © ArcGIS' -}); - var raster = new ol.layer.Tile({ source: new ol.source.XYZ({ - attributions: [attribution], + attributions: 'Tiles © ArcGIS', url: 'http://server.arcgisonline.com/ArcGIS/rest/services/' + 'World_Topo_Map/MapServer/tile/{z}/{y}/{x}' }) diff --git a/examples/wms-custom-proj.js b/examples/wms-custom-proj.js index d01fdcd0ed..8ce9d94b4a 100644 --- a/examples/wms-custom-proj.js +++ b/examples/wms-custom-proj.js @@ -48,12 +48,8 @@ var layers = [ source: new ol.source.TileWMS({ url: 'http://wms.geo.admin.ch/', crossOrigin: 'anonymous', - attributions: [new ol.Attribution({ - html: '© ' + - '' + - 'Pixelmap 1:1000000 / geo.admin.ch' - })], + attributions: '© Pixelmap 1:1000000 / geo.admin.ch', params: { 'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale', 'FORMAT': 'image/jpeg' @@ -66,12 +62,8 @@ var layers = [ source: new ol.source.TileWMS({ url: 'http://wms.geo.admin.ch/', crossOrigin: 'anonymous', - attributions: [new ol.Attribution({ - html: '© ' + - '' + - 'National parks / geo.admin.ch' - })], + attributions: '© National parks / geo.admin.ch', params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'}, serverType: 'mapserver' }) diff --git a/examples/wms-image-custom-proj.js b/examples/wms-image-custom-proj.js index de5a33df6a..7a24533753 100644 --- a/examples/wms-image-custom-proj.js +++ b/examples/wms-image-custom-proj.js @@ -36,12 +36,8 @@ var layers = [ source: new ol.source.ImageWMS({ url: 'http://wms.geo.admin.ch/', crossOrigin: 'anonymous', - attributions: [new ol.Attribution({ - html: '© ' + - '' + - 'Pixelmap 1:1000000 / geo.admin.ch' - })], + attributions: '© Pixelmap 1:1000000 / geo.admin.ch', params: { 'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale', 'FORMAT': 'image/jpeg' @@ -54,12 +50,8 @@ var layers = [ source: new ol.source.ImageWMS({ url: 'http://wms.geo.admin.ch/', crossOrigin: 'anonymous', - attributions: [new ol.Attribution({ - html: '© ' + - '' + - 'National parks / geo.admin.ch' - })], + attributions: '© National parks / geo.admin.ch', params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'}, serverType: /** @type {ol.source.wms.ServerType} */ ('mapserver') }) diff --git a/examples/wms-no-proj.js b/examples/wms-no-proj.js index f9d9702fa9..e1652306a5 100644 --- a/examples/wms-no-proj.js +++ b/examples/wms-no-proj.js @@ -11,12 +11,8 @@ goog.require('ol.source.TileWMS'); var layers = [ new ol.layer.Tile({ source: new ol.source.TileWMS({ - attributions: [new ol.Attribution({ - html: '© ' + - '' + - 'Pixelmap 1:1000000 / geo.admin.ch' - })], + attributions: '© Pixelmap 1:1000000 / geo.admin.ch', crossOrigin: 'anonymous', params: { 'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale', @@ -27,12 +23,8 @@ var layers = [ }), new ol.layer.Image({ source: new ol.source.ImageWMS({ - attributions: [new ol.Attribution({ - html: '© ' + - '' + - 'National parks / geo.admin.ch' - })], + attributions: '© National parks / geo.admin.ch', crossOrigin: 'anonymous', params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'}, serverType: 'mapserver', diff --git a/examples/wmts-dimensions.js b/examples/wmts-dimensions.js index 9f5a62b711..2efe20835f 100644 --- a/examples/wmts-dimensions.js +++ b/examples/wmts-dimensions.js @@ -33,13 +33,9 @@ var wmtsSource = new ol.source.WMTS({ format: 'image/png', matrixSet: 'EPSG:3857', attributions: [ - new ol.Attribution({ - html: 'SCALGO' - }), - new ol.Attribution({ - html: 'CGIAR-CSI SRTM' - }) + 'SCALGO', + 'CGIAR-CSI SRTM' ], tileGrid: tileGrid, style: 'default', diff --git a/examples/wmts.js b/examples/wmts.js index 0b3d2bd456..0dedcff9fa 100644 --- a/examples/wmts.js +++ b/examples/wmts.js @@ -21,12 +21,6 @@ for (var z = 0; z < 14; ++z) { matrixIds[z] = z; } -var attribution = new ol.Attribution({ - html: 'Tiles © ArcGIS' -}); - - var map = new ol.Map({ layers: [ new ol.layer.Tile({ @@ -36,7 +30,8 @@ var map = new ol.Map({ new ol.layer.Tile({ opacity: 0.7, source: new ol.source.WMTS({ - attributions: [attribution], + attributions: 'Tiles © ArcGIS', url: 'http://services.arcgisonline.com/arcgis/rest/' + 'services/Demographics/USA_Population_Density/MapServer/WMTS/', layer: '0', diff --git a/examples/xyz-esri-4326-512.js b/examples/xyz-esri-4326-512.js index 7c76e54f5f..15c8ab0056 100644 --- a/examples/xyz-esri-4326-512.js +++ b/examples/xyz-esri-4326-512.js @@ -6,7 +6,7 @@ goog.require('ol.proj'); goog.require('ol.source.XYZ'); var attribution = new ol.Attribution({ - html: 'Copyright:© 2013 ESRI, i-cubed, GeoEye' + html: 'Copyright:© 2013 ESRI, i-cubed, GeoEye' }); var projection = ol.proj.get('EPSG:4326'); diff --git a/examples/xyz-esri.js b/examples/xyz-esri.js index f4dbae1a78..168f12ad65 100644 --- a/examples/xyz-esri.js +++ b/examples/xyz-esri.js @@ -7,7 +7,7 @@ goog.require('ol.source.XYZ'); var attribution = new ol.Attribution({ - html: 'Tiles © ArcGIS' }); diff --git a/examples/xyz-retina.js b/examples/xyz-retina.js index 1eecdfebe0..f5e6c46871 100644 --- a/examples/xyz-retina.js +++ b/examples/xyz-retina.js @@ -6,12 +6,6 @@ goog.require('ol.proj'); goog.require('ol.source.OSM'); goog.require('ol.source.XYZ'); - -var attribution = new ol.Attribution({ - html: 'Tiles © USGS, rendered with ' + - 'MapTiler' -}); - var mapMinZoom = 1; var mapMaxZoom = 15; var mapExtent = [-112.261791, 35.983744, -112.113981, 36.132062]; @@ -25,7 +19,8 @@ var map = new ol.Map({ new ol.layer.Tile({ extent: ol.proj.transformExtent(mapExtent, 'EPSG:4326', 'EPSG:3857'), source: new ol.source.XYZ({ - attributions: [attribution], + attributions: 'Tiles © USGS, rendered with ' + + 'MapTiler', url: 'http://tileserver.maptiler.com/grandcanyon@2x/{z}/{x}/{y}.png', tilePixelRatio: 2, // THIS IS IMPORTANT minZoom: mapMinZoom, diff --git a/externs/olx.js b/externs/olx.js index 4f634dbb1c..dbbe89847a 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -3903,6 +3903,13 @@ olx.render.ToContextOptions.prototype.pixelRatio; olx.source; +/** + * @typedef {string|Array.|ol.Attribution|Array.} + * @api + */ +olx.source.AttributionOption; + + /** * @typedef {{cacheSize: (number|undefined), * culture: (string|undefined), @@ -3989,7 +3996,7 @@ olx.source.BingMapsOptions.prototype.wrapX; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * distance: (number|undefined), * extent: (ol.Extent|undefined), * format: (ol.format.Feature|undefined), @@ -4005,7 +4012,7 @@ olx.source.ClusterOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api */ olx.source.ClusterOptions.prototype.attributions; @@ -4115,7 +4122,7 @@ olx.source.TileUTFGridOptions.prototype.url; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * cacheSize: (number|undefined), * crossOrigin: (null|string|undefined), * logo: (string|olx.LogoOptions|undefined), @@ -4140,7 +4147,7 @@ olx.source.TileImageOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api */ olx.source.TileImageOptions.prototype.attributions; @@ -4287,7 +4294,7 @@ olx.source.TileImageOptions.prototype.wrapX; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * cacheSize: (number|undefined), * format: (ol.format.Feature|undefined), * logo: (string|olx.LogoOptions|undefined), @@ -4311,13 +4318,12 @@ olx.source.VectorTileOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api */ olx.source.VectorTileOptions.prototype.attributions; - /** * Cache size. Default is `128`. * @type {number|undefined} @@ -4640,7 +4646,7 @@ olx.source.TileDebugOptions.prototype.wrapX; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * cacheSize: (number|undefined), * crossOrigin: (null|string|undefined), * maxZoom: (number|undefined), @@ -4656,7 +4662,7 @@ olx.source.OSMOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api stable */ olx.source.OSMOptions.prototype.attributions; @@ -4740,7 +4746,7 @@ olx.source.OSMOptions.prototype.wrapX; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * canvasFunction: ol.CanvasFunctionType, * logo: (string|olx.LogoOptions|undefined), * projection: ol.proj.ProjectionLike, @@ -4754,7 +4760,7 @@ olx.source.ImageCanvasOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api */ olx.source.ImageCanvasOptions.prototype.attributions; @@ -4819,7 +4825,7 @@ olx.source.ImageCanvasOptions.prototype.state; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * logo: (string|olx.LogoOptions|undefined), * projection: ol.proj.ProjectionLike, * ratio: (number|undefined), @@ -4833,7 +4839,7 @@ olx.source.ImageVectorOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api */ olx.source.ImageVectorOptions.prototype.attributions; @@ -4951,7 +4957,7 @@ olx.source.RasterOptions.prototype.operationType; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * crossOrigin: (null|string|undefined), * hidpi: (boolean|undefined), * serverType: (ol.source.wms.ServerType|string|undefined), @@ -4969,7 +4975,7 @@ olx.source.ImageWMSOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api stable */ olx.source.ImageWMSOptions.prototype.attributions; @@ -5149,7 +5155,7 @@ olx.source.StamenOptions.prototype.url; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * crossOrigin: (null|string|undefined), * imageExtent: (ol.Extent), * imageLoadFunction: (ol.ImageLoadFunctionType|undefined), @@ -5164,7 +5170,7 @@ olx.source.ImageStaticOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api stable */ olx.source.ImageStaticOptions.prototype.attributions; @@ -5233,7 +5239,7 @@ olx.source.ImageStaticOptions.prototype.url; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * cacheSize: (number|undefined), * crossOrigin: (null|string|undefined), * params: (Object.|undefined), @@ -5252,7 +5258,7 @@ olx.source.TileArcGISRestOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api */ olx.source.TileArcGISRestOptions.prototype.attributions; @@ -5369,7 +5375,7 @@ olx.source.TileArcGISRestOptions.prototype.urls; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * cacheSize: (number|undefined), * crossOrigin: (null|string|undefined), * jsonp: (boolean|undefined), @@ -5386,7 +5392,7 @@ olx.source.TileJSONOptions; * Optional attributions for the source. If provided, these will be used * instead of any attribution data advertised by the server. If not provided, * any attributions advertised by the server will be used. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api stable */ olx.source.TileJSONOptions.prototype.attributions; @@ -5460,7 +5466,7 @@ olx.source.TileJSONOptions.prototype.wrapX; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * cacheSize: (number|undefined), * params: Object., * crossOrigin: (null|string|undefined), @@ -5483,7 +5489,7 @@ olx.source.TileWMSOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api stable */ olx.source.TileWMSOptions.prototype.attributions; @@ -5639,7 +5645,7 @@ olx.source.TileWMSOptions.prototype.wrapX; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * features: (Array.|ol.Collection.|undefined), * format: (ol.format.Feature|undefined), * loader: (ol.FeatureLoader|undefined), @@ -5655,7 +5661,7 @@ olx.source.VectorOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api stable */ olx.source.VectorOptions.prototype.attributions; @@ -5759,7 +5765,7 @@ olx.source.VectorOptions.prototype.wrapX; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * cacheSize: (number|undefined), * crossOrigin: (string|null|undefined), * logo: (string|olx.LogoOptions|undefined), @@ -5789,7 +5795,7 @@ olx.source.WMTSOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api */ olx.source.WMTSOptions.prototype.attributions; @@ -5975,7 +5981,7 @@ olx.source.WMTSOptions.prototype.wrapX; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * cacheSize: (number|undefined), * crossOrigin: (null|string|undefined), * logo: (string|olx.LogoOptions|undefined), @@ -5999,7 +6005,7 @@ olx.source.XYZOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api stable */ olx.source.XYZOptions.prototype.attributions; @@ -6150,7 +6156,7 @@ olx.source.XYZOptions.prototype.wrapX; /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * cacheSize: (number|undefined), * crossOrigin: (null|string|undefined), * logo: (string|olx.LogoOptions|undefined), @@ -6165,7 +6171,7 @@ olx.source.ZoomifyOptions; /** * Attributions. - * @type {Array.|undefined} + * @type {olx.source.AttributionOption|undefined} * @api stable */ olx.source.ZoomifyOptions.prototype.attributions; diff --git a/src/ol/source/imagesource.js b/src/ol/source/imagesource.js index f6c4f52977..7f72b1f104 100644 --- a/src/ol/source/imagesource.js +++ b/src/ol/source/imagesource.js @@ -3,7 +3,6 @@ goog.provide('ol.source.ImageEvent'); goog.require('goog.asserts'); goog.require('ol.events.Event'); -goog.require('ol.Attribution'); goog.require('ol.ImageState'); goog.require('ol.array'); goog.require('ol.extent'); @@ -13,7 +12,7 @@ goog.require('ol.source.Source'); /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * extent: (null|ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), * projection: ol.proj.ProjectionLike, diff --git a/src/ol/source/imagestaticsource.js b/src/ol/source/imagestaticsource.js index d482f23ef1..2d046d1c17 100644 --- a/src/ol/source/imagestaticsource.js +++ b/src/ol/source/imagestaticsource.js @@ -20,10 +20,6 @@ goog.require('ol.source.Image'); * @api stable */ ol.source.ImageStatic = function(options) { - - var attributions = options.attributions !== undefined ? - options.attributions : null; - var imageExtent = options.imageExtent; var crossOrigin = options.crossOrigin !== undefined ? @@ -34,7 +30,7 @@ ol.source.ImageStatic = function(options) { options.imageLoadFunction : ol.source.Image.defaultImageLoadFunction; goog.base(this, { - attributions: attributions, + attributions: options.attributions, logo: options.logo, projection: ol.proj.get(options.projection) }); @@ -43,7 +39,7 @@ ol.source.ImageStatic = function(options) { * @private * @type {ol.Image} */ - this.image_ = new ol.Image(imageExtent, undefined, 1, attributions, + this.image_ = new ol.Image(imageExtent, undefined, 1, this.getAttributions(), options.url, crossOrigin, imageLoadFunction); /** diff --git a/src/ol/source/source.js b/src/ol/source/source.js index ed9e8a3d6a..792a0fb5b2 100644 --- a/src/ol/source/source.js +++ b/src/ol/source/source.js @@ -21,7 +21,7 @@ ol.source.State = { /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * logo: (string|olx.LogoOptions|undefined), * projection: ol.proj.ProjectionLike, * state: (ol.source.State|undefined), @@ -57,8 +57,7 @@ ol.source.Source = function(options) { * @private * @type {Array.} */ - this.attributions_ = options.attributions !== undefined ? - options.attributions : null; + this.attributions_ = ol.source.Source.toAttributionsArray_(options.attributions); /** * @private @@ -82,6 +81,37 @@ ol.source.Source = function(options) { }; goog.inherits(ol.source.Source, ol.Object); +/** + * Turns various ways of defining an attribution to an array of `ol.Attributions`. + * + * @param {olx.source.AttributionOption|undefined} + * attributionLike The attributions as string, array of strings, + * `ol.Attribution`, array of `ol.Attribution` or undefined. + * @return {Array.} The array of `ol.Attribution` or null if + * `undefined` was given. + */ +ol.source.Source.toAttributionsArray_ = function(attributionLike) { + if (typeof attributionLike === 'string') { + return [new ol.Attribution({html: attributionLike})]; + } else if (attributionLike instanceof ol.Attribution) { + return [attributionLike]; + } else if (Array.isArray(attributionLike)) { + var len = attributionLike.length; + var attributions = new Array(len); + for (var i = 0; i < len; i++) { + var item = attributionLike[i]; + if (typeof item === 'string') { + attributions[i] = new ol.Attribution({html: item}); + } else { + attributions[i] = item; + } + } + return attributions; + } else { + return null; + } +} + /** * @param {ol.Coordinate} coordinate Coordinate. @@ -161,11 +191,13 @@ ol.source.Source.prototype.refresh = function() { /** * Set the attributions of the source. - * @param {Array.} attributions Attributions. + * @param {olx.source.AttributionOption|undefined} attributions Attributions. + * Can be passed as `string`, `Array`, `{@link ol.Attribution}`, + * `Array<{@link ol.Attribution}>` or `undefined`. * @api */ ol.source.Source.prototype.setAttributions = function(attributions) { - this.attributions_ = attributions; + this.attributions_ = ol.source.Source.toAttributionsArray_(attributions); this.changed(); }; diff --git a/src/ol/source/tilesource.js b/src/ol/source/tilesource.js index 57d7f5099e..8ad0a4213d 100644 --- a/src/ol/source/tilesource.js +++ b/src/ol/source/tilesource.js @@ -5,7 +5,6 @@ goog.provide('ol.source.TileOptions'); goog.require('goog.asserts'); goog.require('ol.events.Event'); goog.require('ol'); -goog.require('ol.Attribution'); goog.require('ol.Extent'); goog.require('ol.TileCache'); goog.require('ol.TileRange'); @@ -18,7 +17,7 @@ goog.require('ol.tilegrid.TileGrid'); /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * cacheSize: (number|undefined), * extent: (ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), diff --git a/src/ol/source/urltilesource.js b/src/ol/source/urltilesource.js index 2a80ef9132..7745dc5078 100644 --- a/src/ol/source/urltilesource.js +++ b/src/ol/source/urltilesource.js @@ -11,7 +11,7 @@ goog.require('ol.source.TileEvent'); /** - * @typedef {{attributions: (Array.|undefined), + * @typedef {{attributions: (olx.source.AttributionOption|undefined), * cacheSize: (number|undefined), * extent: (ol.Extent|undefined), * logo: (string|olx.LogoOptions|undefined), diff --git a/test/spec/ol/source/source.test.js b/test/spec/ol/source/source.test.js index 49b5e523ed..fb1c4a2683 100644 --- a/test/spec/ol/source/source.test.js +++ b/test/spec/ol/source/source.test.js @@ -11,6 +11,74 @@ describe('ol.source.Source', function() { }); }); + describe('config option `attributions`', function() { + it('accepts undefined', function() { + var source = new ol.source.Source({}); + var attributions = source.getAttributions(); + expect(attributions).to.be(null); + }); + it('accepts a single string', function() { + var source = new ol.source.Source({ + attributions: 'Humpty' + }); + var attributions = source.getAttributions(); + expect(attributions).to.not.be(null); + expect(attributions).to.have.length(1); + expect(attributions[0]).to.be.an(ol.Attribution); + expect(attributions[0].getHTML()).to.be('Humpty'); + }); + it('accepts an array of strings', function() { + var source = new ol.source.Source({ + attributions: ['Humpty', 'Dumpty'] + }); + var attributions = source.getAttributions(); + expect(attributions).to.not.be(null); + expect(attributions).to.have.length(2); + expect(attributions[0]).to.be.an(ol.Attribution); + expect(attributions[0].getHTML()).to.be('Humpty'); + expect(attributions[1]).to.be.an(ol.Attribution); + expect(attributions[1].getHTML()).to.be('Dumpty'); + }); + it('accepts a single ol.Attribution', function() { + var passedAttribution = new ol.Attribution({html: 'Humpty'}); + var source = new ol.source.Source({ + attributions: passedAttribution + }); + var attributions = source.getAttributions(); + expect(attributions).to.not.be(null); + expect(attributions).to.have.length(1); + expect(attributions[0]).to.be.an(ol.Attribution); + expect(attributions[0]).to.be(passedAttribution); + }); + it('accepts an array of ol.Attribution', function() { + var firstAttribution = new ol.Attribution({html: 'Humpty'}); + var secondAttribution = new ol.Attribution({html: 'Dumpty'}); + var source = new ol.source.Source({ + attributions: [firstAttribution, secondAttribution] + }); + var attributions = source.getAttributions(); + expect(attributions).to.not.be(null); + expect(attributions).to.have.length(2); + expect(attributions[0]).to.be.an(ol.Attribution); + expect(attributions[0]).to.be(firstAttribution); + expect(attributions[1]).to.be.an(ol.Attribution); + expect(attributions[1]).to.be(secondAttribution); + }); + it('accepts an array with a string and an ol.Attribution', function() { + var attribution = new ol.Attribution({html: 'Dumpty'}); + var source = new ol.source.Source({ + attributions: ['Humpty', attribution] + }); + var attributions = source.getAttributions(); + expect(attributions).to.not.be(null); + expect(attributions).to.have.length(2); + expect(attributions[0]).to.be.an(ol.Attribution); + expect(attributions[0].getHTML()).to.be('Humpty'); + expect(attributions[1]).to.be.an(ol.Attribution); + expect(attributions[1]).to.be(attribution); + }); + }); + describe('#refresh()', function() { it('dispatches the change event', function() { var source = new ol.source.Source({ @@ -23,7 +91,77 @@ describe('ol.source.Source', function() { }); }); + describe('#setAttributions`', function() { + var source = null; + + beforeEach(function() { + source = new ol.source.Source({ + attributions: 'before' + }); + }); + afterEach(function() { + source = null; + }); + + it('accepts undefined', function() { + source.setAttributions(); + var attributions = source.getAttributions(); + expect(attributions).to.be(null); + }); + it('accepts a single string', function() { + source.setAttributions('Humpty'); + var attributions = source.getAttributions(); + expect(attributions).to.not.be(null); + expect(attributions).to.have.length(1); + expect(attributions[0]).to.be.an(ol.Attribution); + expect(attributions[0].getHTML()).to.be('Humpty'); + }); + it('accepts an array of strings', function() { + source.setAttributions(['Humpty', 'Dumpty']); + var attributions = source.getAttributions(); + expect(attributions).to.not.be(null); + expect(attributions).to.have.length(2); + expect(attributions[0]).to.be.an(ol.Attribution); + expect(attributions[0].getHTML()).to.be('Humpty'); + expect(attributions[1]).to.be.an(ol.Attribution); + expect(attributions[1].getHTML()).to.be('Dumpty'); + }); + it('accepts a single ol.Attribution', function() { + var passedAttribution = new ol.Attribution({html: 'Humpty'}); + source.setAttributions(passedAttribution); + var attributions = source.getAttributions(); + expect(attributions).to.not.be(null); + expect(attributions).to.have.length(1); + expect(attributions[0]).to.be.an(ol.Attribution); + expect(attributions[0]).to.be(passedAttribution); + }); + it('accepts an array of ol.Attribution', function() { + var firstAttribution = new ol.Attribution({html: 'Humpty'}); + var secondAttribution = new ol.Attribution({html: 'Dumpty'}); + source.setAttributions([firstAttribution, secondAttribution]); + var attributions = source.getAttributions(); + expect(attributions).to.not.be(null); + expect(attributions).to.have.length(2); + expect(attributions[0]).to.be.an(ol.Attribution); + expect(attributions[0]).to.be(firstAttribution); + expect(attributions[1]).to.be.an(ol.Attribution); + expect(attributions[1]).to.be(secondAttribution); + }); + it('accepts an array with a string and an ol.Attribution', function() { + var attribution = new ol.Attribution({html: 'Dumpty'}); + source.setAttributions(['Humpty', attribution]) + var attributions = source.getAttributions(); + expect(attributions).to.not.be(null); + expect(attributions).to.have.length(2); + expect(attributions[0]).to.be.an(ol.Attribution); + expect(attributions[0].getHTML()).to.be('Humpty'); + expect(attributions[1]).to.be.an(ol.Attribution); + expect(attributions[1]).to.be(attribution); + }); + }); + }); +goog.require('ol.Attribution'); goog.require('ol.proj'); goog.require('ol.source.Source');