diff --git a/Source/Core/ArcGisImageServerTerrainProvider.js b/Source/Core/ArcGisImageServerTerrainProvider.js index e7aeb0c78a54..0d355e760a64 100644 --- a/Source/Core/ArcGisImageServerTerrainProvider.js +++ b/Source/Core/ArcGisImageServerTerrainProvider.js @@ -100,6 +100,7 @@ define([ credit = new Credit(credit); } this._credit = credit; + this._readyPromise = when.resolve(true); }; defineProperties(ArcGisImageServerTerrainProvider.prototype, { @@ -151,6 +152,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof ArcGisImageServerTerrainProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise; + } + }, + /** * Gets a value indicating whether or not the provider includes a water mask. The water mask * indicates which areas of the globe are water rather than land, so they can be rendered diff --git a/Source/Core/CesiumTerrainProvider.js b/Source/Core/CesiumTerrainProvider.js index 222a22941eae..d2c7d255ce83 100644 --- a/Source/Core/CesiumTerrainProvider.js +++ b/Source/Core/CesiumTerrainProvider.js @@ -147,6 +147,7 @@ define([ this._credit = credit; this._ready = false; + this._readyPromise = when.defer(); var metadataUrl = joinUrls(this._url, 'layer.json'); if (defined(this._proxy)) { @@ -222,6 +223,7 @@ define([ } that._ready = true; + that._readyPromise.resolve(true); } function metadataFailure(data) { @@ -600,6 +602,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof CesiumTerrainProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise.promise; + } + }, + /** * Gets a value indicating whether or not the provider includes a water mask. The water mask * indicates which areas of the globe are water rather than land, so they can be rendered diff --git a/Source/Core/EllipsoidTerrainProvider.js b/Source/Core/EllipsoidTerrainProvider.js index 27e13a1367e6..5c1f37b24a76 100644 --- a/Source/Core/EllipsoidTerrainProvider.js +++ b/Source/Core/EllipsoidTerrainProvider.js @@ -1,5 +1,6 @@ /*global define*/ define([ + '../ThirdParty/when', './defaultValue', './defined', './defineProperties', @@ -9,6 +10,7 @@ define([ './HeightmapTerrainData', './TerrainProvider' ], function( + when, defaultValue, defined, defineProperties, @@ -59,6 +61,7 @@ define([ }); this._errorEvent = new Event(); + this._readyPromise = when.resolve(true); }; defineProperties(EllipsoidTerrainProvider.prototype, { @@ -110,6 +113,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof EllipsoidTerrainProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise; + } + }, + /** * Gets a value indicating whether or not the provider includes a water mask. The water mask * indicates which areas of the globe are water rather than land, so they can be rendered diff --git a/Source/Core/TerrainProvider.js b/Source/Core/TerrainProvider.js index abae7d998e89..ce2cf99c51ba 100644 --- a/Source/Core/TerrainProvider.js +++ b/Source/Core/TerrainProvider.js @@ -69,6 +69,16 @@ define([ get : DeveloperError.throwInstantiationError }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof TerrainProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : DeveloperError.throwInstantiationError + }, + /** * Gets a value indicating whether or not the provider includes a water mask. The water mask * indicates which areas of the globe are water rather than land, so they can be rendered diff --git a/Source/Core/VRTheWorldTerrainProvider.js b/Source/Core/VRTheWorldTerrainProvider.js index 584783f517b1..2d48a7d9f94c 100644 --- a/Source/Core/VRTheWorldTerrainProvider.js +++ b/Source/Core/VRTheWorldTerrainProvider.js @@ -79,6 +79,7 @@ define([ this._errorEvent = new Event(); this._ready = false; + this._readyPromise = when.defer(); this._proxy = options.proxy; @@ -133,6 +134,7 @@ define([ } that._ready = true; + that._readyPromise.resolve(true); } function metadataFailure(e) { @@ -200,6 +202,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof VRTheWorldTerrainProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise.promise; + } + }, + /** * Gets a value indicating whether or not the provider includes a water mask. The water mask * indicates which areas of the globe are water rather than land, so they can be rendered diff --git a/Source/Scene/ArcGisMapServerImageryProvider.js b/Source/Scene/ArcGisMapServerImageryProvider.js index b81ecc122a9e..a4646ab698eb 100644 --- a/Source/Scene/ArcGisMapServerImageryProvider.js +++ b/Source/Scene/ArcGisMapServerImageryProvider.js @@ -15,6 +15,7 @@ define([ '../Core/loadJsonp', '../Core/Math', '../Core/Rectangle', + '../Core/RuntimeError', '../Core/TileProviderError', '../Core/WebMercatorProjection', '../Core/WebMercatorTilingScheme', @@ -38,6 +39,7 @@ define([ loadJsonp, CesiumMath, Rectangle, + RuntimeError, TileProviderError, WebMercatorProjection, WebMercatorTilingScheme, @@ -135,6 +137,7 @@ define([ this._errorEvent = new Event(); this._ready = false; + this._readyPromise = when.defer(); // Grab the details of this MapServer. var that = this; @@ -198,12 +201,14 @@ define([ } that._ready = true; + that._readyPromise.resolve(true); TileProviderError.handleSuccess(metadataError); } function metadataFailure(e) { var message = 'An error occurred while accessing ' + that._url + '.'; metadataError = TileProviderError.handleError(metadataError, that, that._errorEvent, message, undefined, undefined, undefined, requestMetadata); + that._readyPromise.reject(new RuntimeError(message)); } function requestMetadata() { @@ -226,6 +231,7 @@ define([ requestMetadata(); } else { this._ready = true; + this._readyPromise.resolve(true); } }; @@ -469,6 +475,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof ArcGisMapServerImageryProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise.promise; + } + }, + /** * Gets the credit to display when this imagery provider is active. Typically this is used to credit * the source of the imagery. This function should not be called before {@link ArcGisMapServerImageryProvider#ready} returns true. diff --git a/Source/Scene/BingMapsImageryProvider.js b/Source/Scene/BingMapsImageryProvider.js index 2d9e729a1123..55efd9d0a941 100644 --- a/Source/Scene/BingMapsImageryProvider.js +++ b/Source/Scene/BingMapsImageryProvider.js @@ -11,6 +11,7 @@ define([ '../Core/loadJsonp', '../Core/Math', '../Core/Rectangle', + '../Core/RuntimeError', '../Core/TileProviderError', '../Core/WebMercatorTilingScheme', '../ThirdParty/when', @@ -29,6 +30,7 @@ define([ loadJsonp, CesiumMath, Rectangle, + RuntimeError, TileProviderError, WebMercatorTilingScheme, when, @@ -140,6 +142,7 @@ define([ this._errorEvent = new Event(); this._ready = false; + this._readyPromise = when.defer(); var metadataUrl = this._url + '/REST/v1/Imagery/Metadata/' + this._mapStyle + '?incl=ImageryProviders&key=' + this._key; var that = this; @@ -196,12 +199,14 @@ define([ } that._ready = true; + that._readyPromise.resolve(true); TileProviderError.handleSuccess(metadataError); } function metadataFailure(e) { var message = 'An error occurred while accessing ' + metadataUrl + '.'; metadataError = TileProviderError.handleError(metadataError, that, that._errorEvent, message, undefined, undefined, undefined, requestMetadata); + that._readyPromise.reject(new RuntimeError(message)); } function requestMetadata() { @@ -441,6 +446,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof BingMapsImageryProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise.promise; + } + }, + /** * Gets the credit to display when this imagery provider is active. Typically this is used to credit * the source of the imagery. This function should not be called before {@link BingMapsImageryProvider#ready} returns true. diff --git a/Source/Scene/GoogleEarthImageryProvider.js b/Source/Scene/GoogleEarthImageryProvider.js index f78507529fe5..736942848349 100644 --- a/Source/Scene/GoogleEarthImageryProvider.js +++ b/Source/Scene/GoogleEarthImageryProvider.js @@ -140,6 +140,7 @@ define([ this._errorEvent = new Event(); this._ready = false; + this._readyPromise = when.defer(); var metadataUrl = this._url + this._path + '/query?request=Json&vars=geeServerDefs&is2d=t'; var that = this; @@ -204,12 +205,14 @@ define([ .replace('{channel}', that._channel).replace('{version}', that._version); that._ready = true; + that._readyPromise.resolve(true); TileProviderError.handleSuccess(metadataError); } function metadataFailure(e) { var message = 'An error occurred while accessing ' + metadataUrl + '.'; metadataError = TileProviderError.handleError(metadataError, that, that._errorEvent, message, undefined, undefined, undefined, requestMetadata); + that._readyPromise.reject(new RuntimeError(message)); } function requestMetadata() { @@ -470,6 +473,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof GoogleEarthImageryProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise.promise; + } + }, + /** * Gets the credit to display when this imagery provider is active. Typically this is used to credit * the source of the imagery. This function should not be called before {@link GoogleEarthImageryProvider#ready} returns true. diff --git a/Source/Scene/GridImageryProvider.js b/Source/Scene/GridImageryProvider.js index 1fd0192a3a14..bb5eaa500339 100644 --- a/Source/Scene/GridImageryProvider.js +++ b/Source/Scene/GridImageryProvider.js @@ -5,14 +5,16 @@ define([ '../Core/defined', '../Core/defineProperties', '../Core/Event', - '../Core/GeographicTilingScheme' + '../Core/GeographicTilingScheme', + '../ThirdParty/when' ], function( Color, defaultValue, defined, defineProperties, Event, - GeographicTilingScheme) { + GeographicTilingScheme, + when) { "use strict"; var defaultColor = new Color(1.0, 1.0, 1.0, 0.4); @@ -60,6 +62,8 @@ define([ // We only need a single canvas since all tiles will be the same this._canvas = this._createGridCanvas(); + + this._readyPromise = when.resolve(true); }; defineProperties(GridImageryProvider.prototype, { @@ -194,6 +198,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof GridImageryProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise; + } + }, + /** * Gets the credit to display when this imagery provider is active. Typically this is used to credit * the source of the imagery. This function should not be called before {@link GridImageryProvider#ready} returns true. diff --git a/Source/Scene/ImageryProvider.js b/Source/Scene/ImageryProvider.js index d92e657caf0b..59aeade6062e 100644 --- a/Source/Scene/ImageryProvider.js +++ b/Source/Scene/ImageryProvider.js @@ -101,6 +101,16 @@ define([ get : DeveloperError.throwInstantiationError }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof ImageryProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : DeveloperError.throwInstantiationError + }, + /** * Gets the rectangle, in radians, of the imagery provided by the instance. This function should * not be called before {@link ImageryProvider#ready} returns true. diff --git a/Source/Scene/MapboxImageryProvider.js b/Source/Scene/MapboxImageryProvider.js index ba046d154eba..8b0acffbafbd 100644 --- a/Source/Scene/MapboxImageryProvider.js +++ b/Source/Scene/MapboxImageryProvider.js @@ -121,6 +121,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof MapboxImageryProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._imageryProvider.readyPromise; + } + }, + /** * Gets the rectangle, in radians, of the imagery provided by the instance. This function should * not be called before {@link MapboxImageryProvider#ready} returns true. diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index c277f27bf21d..30c982736617 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -417,10 +417,10 @@ define([ this._minimumPixelSize = this.minimumPixelSize; /** - * The maximum scale size for a model. This can be used to give + * The maximum scale size for a model. This can be used to give * an upper limit to the {@link Model#minimumPixelSize}, ensuring that the model * is never an unreasonable scale. - * + * * @type {Number} */ this.maximumScale = options.maximumScale; diff --git a/Source/Scene/OpenStreetMapImageryProvider.js b/Source/Scene/OpenStreetMapImageryProvider.js index 1831f5942b7f..d7610ea758cc 100644 --- a/Source/Scene/OpenStreetMapImageryProvider.js +++ b/Source/Scene/OpenStreetMapImageryProvider.js @@ -8,6 +8,7 @@ define([ '../Core/Event', '../Core/Rectangle', '../Core/WebMercatorTilingScheme', + '../ThirdParty/when', './ImageryProvider' ], function( Credit, @@ -18,6 +19,7 @@ define([ Event, Rectangle, WebMercatorTilingScheme, + when, ImageryProvider) { "use strict"; @@ -98,6 +100,7 @@ define([ this._errorEvent = new Event(); this._ready = true; + this._readyPromise = when.resolve(true); var credit = defaultValue(options.credit, defaultCredit); if (typeof credit === 'string') { @@ -303,6 +306,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof OpenStreetMapImageryProvider.prototype + * @type {Boolean} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise; + } + }, + /** * Gets the credit to display when this imagery provider is active. Typically this is used to credit * the source of the imagery. This function should not be called before {@link OpenStreetMapImageryProvider#ready} returns true. diff --git a/Source/Scene/SingleTileImageryProvider.js b/Source/Scene/SingleTileImageryProvider.js index 04ff1b908e90..7bdb44ee8d7e 100644 --- a/Source/Scene/SingleTileImageryProvider.js +++ b/Source/Scene/SingleTileImageryProvider.js @@ -9,6 +9,7 @@ define([ '../Core/GeographicTilingScheme', '../Core/loadImage', '../Core/Rectangle', + '../Core/RuntimeError', '../Core/TileProviderError', '../ThirdParty/when' ], function( @@ -21,6 +22,7 @@ define([ GeographicTilingScheme, loadImage, Rectangle, + RuntimeError, TileProviderError, when) { "use strict"; @@ -80,6 +82,7 @@ define([ this._errorEvent = new Event(); this._ready = false; + this._readyPromise = when.defer(); var imageUrl = url; if (defined(proxy)) { @@ -100,6 +103,7 @@ define([ that._tileWidth = image.width; that._tileHeight = image.height; that._ready = true; + that._readyPromise.resolve(true); TileProviderError.handleSuccess(that._errorEvent); } @@ -113,6 +117,7 @@ define([ 0, 0, 0, doRequest, e); + that._readyPromise.reject(new RuntimeError(message)); } function doRequest() { @@ -303,6 +308,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof SingleTileImageryProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise.promise; + } + }, + /** * Gets the credit to display when this imagery provider is active. Typically this is used to credit * the source of the imagery. This function should not be called before {@link SingleTileImageryProvider#ready} returns true. diff --git a/Source/Scene/TileCoordinatesImageryProvider.js b/Source/Scene/TileCoordinatesImageryProvider.js index faa3a1d4ed24..8c4b6f731456 100644 --- a/Source/Scene/TileCoordinatesImageryProvider.js +++ b/Source/Scene/TileCoordinatesImageryProvider.js @@ -5,14 +5,16 @@ define([ '../Core/defined', '../Core/defineProperties', '../Core/Event', - '../Core/GeographicTilingScheme' + '../Core/GeographicTilingScheme', + '../ThirdParty/when' ], function( Color, defaultValue, defined, defineProperties, Event, - GeographicTilingScheme) { + GeographicTilingScheme, + when) { "use strict"; /** @@ -40,6 +42,7 @@ define([ this._errorEvent = new Event(); this._tileWidth = defaultValue(options.tileWidth, 256); this._tileHeight = defaultValue(options.tileHeight, 256); + this._readyPromise = when.resolve(true); }; defineProperties(TileCoordinatesImageryProvider.prototype, { @@ -174,6 +177,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof TileCoordinatesImageryProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise; + } + }, + /** * Gets the credit to display when this imagery provider is active. Typically this is used to credit * the source of the imagery. This function should not be called before {@link TileCoordinatesImageryProvider#ready} returns true. diff --git a/Source/Scene/TileMapServiceImageryProvider.js b/Source/Scene/TileMapServiceImageryProvider.js index c2fac96f305c..8233fcb7a975 100644 --- a/Source/Scene/TileMapServiceImageryProvider.js +++ b/Source/Scene/TileMapServiceImageryProvider.js @@ -12,6 +12,7 @@ define([ '../Core/joinUrls', '../Core/loadXML', '../Core/Rectangle', + '../Core/RuntimeError', '../Core/TileProviderError', '../Core/WebMercatorTilingScheme', '../ThirdParty/when', @@ -29,6 +30,7 @@ define([ joinUrls, loadXML, Rectangle, + RuntimeError, TileProviderError, WebMercatorTilingScheme, when, @@ -99,6 +101,7 @@ define([ this._url = url; this._ready = false; + this._readyPromise = when.defer(); this._proxy = options.proxy; this._tileDiscardPolicy = options.tileDiscardPolicy; this._errorEvent = new Event(); @@ -177,6 +180,7 @@ define([ } else { var message = joinUrls(url, 'tilemapresource.xml') + 'specifies an unsupported profile attribute, ' + tilingSchemeName + '.'; metadataError = TileProviderError.handleError(metadataError, that, that._errorEvent, message, undefined, undefined, undefined, requestMetadata); + that._readyPromise.reject(new RuntimeError(message)); return; } } @@ -241,6 +245,7 @@ define([ that._tilingScheme = tilingScheme; that._ready = true; + that._readyPromise.resolve(true); } function metadataFailure(error) { @@ -253,6 +258,7 @@ define([ that._tilingScheme = defined(options.tilingScheme) ? options.tilingScheme : new WebMercatorTilingScheme({ ellipsoid : options.ellipsoid }); that._rectangle = defaultValue(options.rectangle, that._tilingScheme.rectangle); that._ready = true; + that._readyPromise.resolve(true); } function requestMetadata() { @@ -467,6 +473,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof TileMapServiceImageryProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise.promise; + } + }, + /** * Gets the credit to display when this imagery provider is active. Typically this is used to credit * the source of the imagery. This function should not be called before {@link TileMapServiceImageryProvider#ready} returns true. diff --git a/Source/Scene/UrlTemplateImageryProvider.js b/Source/Scene/UrlTemplateImageryProvider.js index c9a8870b0106..8e874bdd3ff0 100644 --- a/Source/Scene/UrlTemplateImageryProvider.js +++ b/Source/Scene/UrlTemplateImageryProvider.js @@ -161,9 +161,9 @@ define([ this._proxy = options.proxy; this._tileDiscardPolicy = options.tileDiscardPolicy; this._getFeatureInfoFormats = options.getFeatureInfoFormats; - + this._errorEvent = new Event(); - + this._subdomains = options.subdomains; if (Array.isArray(this._subdomains)) { this._subdomains = this._subdomains.slice(); @@ -190,6 +190,8 @@ define([ this._urlParts = urlTemplateToParts(this._url, tags); this._pickFeaturesUrlParts = urlTemplateToParts(this._pickFeaturesUrl, pickFeaturesTags); + + this._readyPromise = when.resolve(true); }; defineProperties(UrlTemplateImageryProvider.prototype, { @@ -388,6 +390,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof UrlTemplateImageryProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise; + } + }, + /** * Gets the credit to display when this imagery provider is active. Typically this is used to credit * the source of the imagery. This function should not be called before {@link UrlTemplateImageryProvider#ready} returns true. diff --git a/Source/Scene/WebMapServiceImageryProvider.js b/Source/Scene/WebMapServiceImageryProvider.js index 351fed2759de..f2dc96d83a3f 100644 --- a/Source/Scene/WebMapServiceImageryProvider.js +++ b/Source/Scene/WebMapServiceImageryProvider.js @@ -340,6 +340,18 @@ define([ } }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof WebMapServiceImageryProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._tileProvider.readyPromise; + } + }, + /** * Gets the credit to display when this imagery provider is active. Typically this is used to credit * the source of the imagery. This function should not be called before {@link WebMapServiceImageryProvider#ready} returns true. diff --git a/Source/Scene/WebMapTileServiceImageryProvider.js b/Source/Scene/WebMapTileServiceImageryProvider.js index 9c6a5f855626..a1492d6d9e96 100644 --- a/Source/Scene/WebMapTileServiceImageryProvider.js +++ b/Source/Scene/WebMapTileServiceImageryProvider.js @@ -13,6 +13,7 @@ define([ '../Core/Rectangle', '../Core/WebMercatorTilingScheme', '../ThirdParty/Uri', + '../ThirdParty/when', './ImageryProvider' ], function( combine, @@ -28,6 +29,7 @@ define([ Rectangle, WebMercatorTilingScheme, Uri, + when, ImageryProvider) { "use strict"; @@ -128,6 +130,8 @@ define([ this._rectangle = defaultValue(options.rectangle, this._tilingScheme.rectangle); + this._readyPromise = when.resolve(true); + // Check the number of tiles at the minimum level. If it's more than four, // throw an exception, because starting at the higher minimum // level will cause too many tiles to be downloaded and rendered. @@ -358,6 +362,18 @@ define([ value: true }, + /** + * Gets a promise that resolves to true when the provider is ready for use. + * @memberof WebMapTileServiceImageryProvider.prototype + * @type {Promise.} + * @readonly + */ + readyPromise : { + get : function() { + return this._readyPromise; + } + }, + /** * Gets the credit to display when this imagery provider is active. Typically this is used to credit * the source of the imagery. This function should not be called before {@link WebMapTileServiceImageryProvider#ready} returns true. diff --git a/Specs/Core/ArcGisImageServerTerrainProviderSpec.js b/Specs/Core/ArcGisImageServerTerrainProviderSpec.js index ab91bf201bc6..ccb770052b0e 100644 --- a/Specs/Core/ArcGisImageServerTerrainProviderSpec.js +++ b/Specs/Core/ArcGisImageServerTerrainProviderSpec.js @@ -44,6 +44,17 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('resolves readyPromise', function() { + var provider = new ArcGisImageServerTerrainProvider({ + url : 'made/up/url' + }); + + return provider.readyPromise.then(function (result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + it('uses geographic tiling scheme by default', function() { var provider = new ArcGisImageServerTerrainProvider({ url : 'made/up/url' diff --git a/Specs/Core/CesiumTerrainProviderSpec.js b/Specs/Core/CesiumTerrainProviderSpec.js index 64390ac01892..3cc9336accb3 100644 --- a/Specs/Core/CesiumTerrainProviderSpec.js +++ b/Specs/Core/CesiumTerrainProviderSpec.js @@ -110,6 +110,17 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('resolves readyPromise', function() { + var provider = new CesiumTerrainProvider({ + url : 'made/up/url' + }); + + return provider.readyPromise.then(function (result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + it('uses geographic tiling scheme by default', function() { returnHeightmapTileJson(); diff --git a/Specs/Core/EllipsoidTerrainProviderSpec.js b/Specs/Core/EllipsoidTerrainProviderSpec.js index 621946571ec5..00736886b266 100644 --- a/Specs/Core/EllipsoidTerrainProviderSpec.js +++ b/Specs/Core/EllipsoidTerrainProviderSpec.js @@ -24,6 +24,15 @@ defineSuite([ expect(EllipsoidTerrainProvider).toConformToInterface(TerrainProvider); }); + it('resolves readyPromise', function() { + var provider = new EllipsoidTerrainProvider(); + + return provider.readyPromise.then(function (result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + it('requestTileGeometry creates terrain data.', function() { var terrain = new EllipsoidTerrainProvider(); var terrainData = terrain.requestTileGeometry(0, 0, 0); diff --git a/Specs/Core/VRTheWorldTerrainProviderSpec.js b/Specs/Core/VRTheWorldTerrainProviderSpec.js index 7d898f60daf6..cf40d9e0fb44 100644 --- a/Specs/Core/VRTheWorldTerrainProviderSpec.js +++ b/Specs/Core/VRTheWorldTerrainProviderSpec.js @@ -76,6 +76,17 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('resolves readyPromise', function() { + var provider = new VRTheWorldTerrainProvider({ + url : 'made/up/url' + }); + + return provider.readyPromise.then(function (result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + it('has error event', function() { var provider = new VRTheWorldTerrainProvider({ url : 'made/up/url' diff --git a/Specs/Scene/ArcGisMapServerImageryProviderSpec.js b/Specs/Scene/ArcGisMapServerImageryProviderSpec.js index 61e55453d469..ab78ffd9795d 100644 --- a/Specs/Scene/ArcGisMapServerImageryProviderSpec.js +++ b/Specs/Scene/ArcGisMapServerImageryProviderSpec.js @@ -128,6 +128,36 @@ defineSuite([ } }; + it('resolves readyPromise', function() { + var baseUrl = '//tiledArcGisMapServer.invalid'; + + stubJSONPCall(baseUrl, webMercatorResult); + + var provider = new ArcGisMapServerImageryProvider({ + url : baseUrl + }); + + return provider.readyPromise.then(function(result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + + it('rejects readyPromise on error', function() { + var baseUrl = '//tiledArcGisMapServer.invalid'; + + var provider = new ArcGisMapServerImageryProvider({ + url : baseUrl + }); + + return provider.readyPromise.then(function () { + fail('should not resolve'); + }).otherwise(function (e) { + expect(e.message).toContain(baseUrl); + expect(provider.ready).toBe(false); + }); + }); + it('supports tiled servers in web mercator projection', function() { var baseUrl = '//tiledArcGisMapServer.invalid'; diff --git a/Specs/Scene/BingMapsImageryProviderSpec.js b/Specs/Scene/BingMapsImageryProviderSpec.js index ea7cedcb22e7..ad125181f609 100644 --- a/Specs/Scene/BingMapsImageryProviderSpec.js +++ b/Specs/Scene/BingMapsImageryProviderSpec.js @@ -30,7 +30,7 @@ defineSuite([ ImageryState, pollToPromise) { "use strict"; - /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn*/ + /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn,fail*/ afterEach(function() { loadJsonp.loadAndExecuteScript = loadJsonp.defaultLoadAndExecuteScript; @@ -181,6 +181,38 @@ defineSuite([ }; } + it('resolves readyPromise', function() { + var url = 'http://fake.fake.invalid'; + var mapStyle = BingMapsStyle.ROAD; + + installFakeMetadataRequest(url, mapStyle); + installFakeImageRequest(); + + var provider = new BingMapsImageryProvider({ + url : url, + mapStyle : mapStyle + }); + + return provider.readyPromise.then(function(result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + + it('rejects readyPromise on error', function() { + var url = 'host.invalid'; + var provider = new BingMapsImageryProvider({ + url : url + }); + + return provider.readyPromise.then(function () { + fail('should not resolve'); + }).otherwise(function (e) { + expect(provider.ready).toBe(false); + expect(e.message).toContain(url); + }); + }); + it('returns valid value for hasAlphaChannel', function() { var url = 'http://fake.fake.invalid'; var mapStyle = BingMapsStyle.AERIAL; diff --git a/Specs/Scene/GoogleEarthImageryProviderSpec.js b/Specs/Scene/GoogleEarthImageryProviderSpec.js index 9c7e0cabd217..8bcfce8a1db9 100644 --- a/Specs/Scene/GoogleEarthImageryProviderSpec.js +++ b/Specs/Scene/GoogleEarthImageryProviderSpec.js @@ -28,7 +28,7 @@ defineSuite([ ImageryState, pollToPromise) { "use strict"; - /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn*/ + /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn,fail*/ afterEach(function() { loadImage.createImage = loadImage.defaultCreateImage; @@ -57,6 +57,43 @@ defineSuite([ expect(constructWithoutChannel).toThrowDeveloperError(); }); + it('resolves readyPromise', function() { + var path = ''; + var url = 'http://example.invalid'; + var channel = 1234; + var version = 1; + + loadWithXhr.load = function(url, responseType, method, data, headers, deferred, overrideMimeType) { + loadWithXhr.defaultLoad('Data/GoogleEarthImageryProvider/good.json', responseType, method, data, headers, deferred); + }; + + var provider = new GoogleEarthImageryProvider({ + url : url, + channel : channel, + path : path + }); + + return provider.readyPromise.then(function (result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + + it('rejects readyPromise on error', function() { + var url = 'invalid.localhost'; + var provider = new GoogleEarthImageryProvider({ + url : url, + channel : 1234 + }); + + return provider.readyPromise.then(function () { + fail('should not resolve'); + }).otherwise(function (e) { + expect(provider.ready).toBe(false); + expect(e.message).toContain(url); + }); + }); + it('returns valid value for hasAlphaChannel', function() { var path = ''; var url = 'http://example.invalid'; diff --git a/Specs/Scene/GridImageryProviderSpec.js b/Specs/Scene/GridImageryProviderSpec.js index 0a07ea410953..779e03850297 100644 --- a/Specs/Scene/GridImageryProviderSpec.js +++ b/Specs/Scene/GridImageryProviderSpec.js @@ -22,6 +22,15 @@ defineSuite([ expect(GridImageryProvider).toConformToInterface(ImageryProvider); }); + it('resolves readyPromise', function() { + var provider = new GridImageryProvider(); + + return provider.readyPromise.then(function (result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + it('returns valid value for hasAlphaChannel', function() { var provider = new GridImageryProvider(); diff --git a/Specs/Scene/MapboxImageryProviderSpec.js b/Specs/Scene/MapboxImageryProviderSpec.js index 92c3bbfa78d0..537d1bde75dc 100644 --- a/Specs/Scene/MapboxImageryProviderSpec.js +++ b/Specs/Scene/MapboxImageryProviderSpec.js @@ -40,6 +40,18 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('resolves readyPromise', function() { + var provider = new MapboxImageryProvider({ + url : 'made/up/mapbox/server/', + mapId: 'test-id' + }); + + return provider.readyPromise.then(function (result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + it('returns valid value for hasAlphaChannel', function() { var provider = new MapboxImageryProvider({ url : 'made/up/mapbox/server/', diff --git a/Specs/Scene/OpenStreetMapImageryProviderSpec.js b/Specs/Scene/OpenStreetMapImageryProviderSpec.js index 03b524421733..65bbdc23371d 100644 --- a/Specs/Scene/OpenStreetMapImageryProviderSpec.js +++ b/Specs/Scene/OpenStreetMapImageryProviderSpec.js @@ -36,6 +36,17 @@ defineSuite([ return new OpenStreetMapImageryProvider(); }); + it('resolves readyPromise', function() { + var provider = new OpenStreetMapImageryProvider({ + url : 'made/up/osm/server/' + }); + + return provider.readyPromise.then(function(result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + it('returns valid value for hasAlphaChannel', function() { var provider = new OpenStreetMapImageryProvider({ url : 'made/up/osm/server/' diff --git a/Specs/Scene/SingleTileImageryProviderSpec.js b/Specs/Scene/SingleTileImageryProviderSpec.js index 37e0892a3d8c..92be8a2e9032 100644 --- a/Specs/Scene/SingleTileImageryProviderSpec.js +++ b/Specs/Scene/SingleTileImageryProviderSpec.js @@ -26,7 +26,7 @@ defineSuite([ pollToPromise, when) { "use strict"; - /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn*/ + /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn,fail*/ afterEach(function() { loadImage.createImage = loadImage.defaultCreateImage; @@ -36,6 +36,30 @@ defineSuite([ expect(SingleTileImageryProvider).toConformToInterface(ImageryProvider); }); + it('resolves readyPromise', function() { + var provider = new SingleTileImageryProvider({ + url : 'Data/Images/Red16x16.png' + }); + + return provider.readyPromise.then(function(result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + + it('rejects readyPromise on error', function() { + var provider = new SingleTileImageryProvider({ + url : 'invalid.image.url' + }); + + return provider.readyPromise.then(function() { + fail('should not resolve'); + }).otherwise(function (e) { + expect(provider.ready).toBe(false); + expect(e.message).toContain(provider.url); + }); + }); + it('returns valid value for hasAlphaChannel', function() { var provider = new SingleTileImageryProvider({ url : 'Data/Images/Red16x16.png' diff --git a/Specs/Scene/TileCoordinatesImageryProviderSpec.js b/Specs/Scene/TileCoordinatesImageryProviderSpec.js index 9708187e0e8c..331b16b4c868 100644 --- a/Specs/Scene/TileCoordinatesImageryProviderSpec.js +++ b/Specs/Scene/TileCoordinatesImageryProviderSpec.js @@ -24,6 +24,15 @@ defineSuite([ expect(TileCoordinatesImageryProvider).toConformToInterface(ImageryProvider); }); + it('resolves readyPromise', function() { + var provider = new TileCoordinatesImageryProvider(); + + return provider.readyPromise.then(function(result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + it('returns valid value for hasAlphaChannel', function() { var provider = new TileCoordinatesImageryProvider(); diff --git a/Specs/Scene/TileMapServiceImageryProviderSpec.js b/Specs/Scene/TileMapServiceImageryProviderSpec.js index e700c8a9851f..a7a1c2ecd793 100644 --- a/Specs/Scene/TileMapServiceImageryProviderSpec.js +++ b/Specs/Scene/TileMapServiceImageryProviderSpec.js @@ -40,7 +40,7 @@ defineSuite([ pollToPromise, when) { "use strict"; - /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn*/ + /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn,fail*/ afterEach(function() { loadImage.createImage = loadImage.defaultCreateImage; @@ -51,6 +51,53 @@ defineSuite([ expect(TileMapServiceImageryProvider).toConformToInterface(ImageryProvider); }); + it('resolves readyPromise', function() { + var provider = new TileMapServiceImageryProvider({ + url : 'made/up/tms/server/' + }); + + return provider.readyPromise.then(function(result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + + it('rejects readyPromise on error', function() { + loadWithXhr.load = function(url, responseType, method, data, headers, deferred, overrideMimeType) { + // We can't resolve the promise immediately, because then the error would be raised + // before we could subscribe to it. This a problem particular to tests. + setTimeout(function() { + var parser = new DOMParser(); + var xmlString = + '' + + ' ' + + ' <Abstract/>' + + ' <SRS>EPSG:4326</SRS>' + + ' <BoundingBox minx="-10.0" miny="-123.0" maxx="11.0" maxy="-110.0"/>' + + ' <Origin x="-90.0" y="-180.0"/>' + + ' <TileFormat width="256" height="256" mime-type="image/png" extension="png"/>' + + ' <TileSets profile="foobar">' + + ' <TileSet href="2" units-per-pixel="39135.75848201024200" order="2"/>' + + ' <TileSet href="3" units-per-pixel="19567.87924100512100" order="3"/>' + + ' </TileSets>' + + '</TileMap>'; + var xml = parser.parseFromString(xmlString, "text/xml"); + deferred.resolve(xml); + }, 1); + }; + + var provider = new TileMapServiceImageryProvider({ + url : 'made/up/tms/server' + }); + + return provider.readyPromise.then(function() { + fail('should not resolve'); + }).otherwise(function (e) { + expect(provider.ready).toBe(false); + expect(e.message).toContain('unsupported profile'); + }); + }); + it('requires the url to be specified', function() { function createWithoutUrl() { return new TileMapServiceImageryProvider({}); diff --git a/Specs/Scene/UrlTemplateImageryProviderSpec.js b/Specs/Scene/UrlTemplateImageryProviderSpec.js index ae6787127cbe..a6400cd25ae1 100644 --- a/Specs/Scene/UrlTemplateImageryProviderSpec.js +++ b/Specs/Scene/UrlTemplateImageryProviderSpec.js @@ -49,6 +49,17 @@ defineSuite([ expect(createWithoutUrl).toThrowDeveloperError(); }); + it('resolves readyPromise', function() { + var provider = new UrlTemplateImageryProvider({ + url: 'made/up/tms/server/' + }); + + return provider.readyPromise.then(function(result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + it('returns valid value for hasAlphaChannel', function() { var provider = new UrlTemplateImageryProvider({ url: 'made/up/tms/server/' diff --git a/Specs/Scene/WebMapServiceImageryProviderSpec.js b/Specs/Scene/WebMapServiceImageryProviderSpec.js index 0eb1d6dfa908..7c8e996aa78c 100644 --- a/Specs/Scene/WebMapServiceImageryProviderSpec.js +++ b/Specs/Scene/WebMapServiceImageryProviderSpec.js @@ -73,6 +73,18 @@ defineSuite([ expect(createWithoutUrl).toThrowDeveloperError(); }); + it('resolves readyPromise', function() { + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server', + layers : 'someLayer' + }); + + return provider.readyPromise.then(function(result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + it('returns valid value for hasAlphaChannel', function() { var provider = new WebMapServiceImageryProvider({ url : 'made/up/wms/server', diff --git a/Specs/Scene/WebMapTileServiceImageryProviderSpec.js b/Specs/Scene/WebMapTileServiceImageryProviderSpec.js index 4b8dd97d1a33..7067789bbdc1 100644 --- a/Specs/Scene/WebMapTileServiceImageryProviderSpec.js +++ b/Specs/Scene/WebMapTileServiceImageryProviderSpec.js @@ -199,6 +199,20 @@ defineSuite([ expect(createWithoutTMS).toThrowDeveloperError(); }); + it('resolves readyPromise', function() { + var provider = new WebMapTileServiceImageryProvider({ + layer : 'someLayer', + style : 'someStyle', + url : 'http://wmts.invalid', + tileMatrixSetID : 'someTMS' + }); + + return provider.readyPromise.then(function(result) { + expect(result).toBe(true); + expect(provider.ready).toBe(true); + }); + }); + // default parameters values it('uses default values for undefined parameters', function() { var provider = new WebMapTileServiceImageryProvider({