From 335bfadd61fca9934e2fe39be69805e6fd48d171 Mon Sep 17 00:00:00 2001 From: Katherina Lim Date: Fri, 6 Nov 2015 11:22:55 -0500 Subject: [PATCH 1/4] Added readyPromise property and tests --- .../Scene/ArcGisMapServerImageryProvider.js | 15 +++++++++++++ Source/Scene/BingMapsImageryProvider.js | 14 ++++++++++++ Source/Scene/GoogleEarthImageryProvider.js | 14 ++++++++++++ Source/Scene/GridImageryProvider.js | 18 +++++++++++++-- Source/Scene/ImageryProvider.js | 10 +++++++++ Source/Scene/MapboxImageryProvider.js | 12 ++++++++++ Source/Scene/OpenStreetMapImageryProvider.js | 15 +++++++++++++ Source/Scene/SingleTileImageryProvider.js | 14 ++++++++++++ .../Scene/TileCoordinatesImageryProvider.js | 18 +++++++++++++-- Source/Scene/TileMapServiceImageryProvider.js | 15 +++++++++++++ Source/Scene/UrlTemplateImageryProvider.js | 16 ++++++++++++-- Source/Scene/WebMapServiceImageryProvider.js | 14 ++++++++++++ .../Scene/WebMapTileServiceImageryProvider.js | 14 ++++++++++++ .../ArcGisMapServerImageryProviderSpec.js | 15 +++++++++++++ Specs/Scene/BingMapsImageryProviderSpec.js | 18 +++++++++++++++ Specs/Scene/GoogleEarthImageryProviderSpec.js | 22 +++++++++++++++++++ Specs/Scene/GridImageryProviderSpec.js | 9 ++++++++ Specs/Scene/MapboxImageryProviderSpec.js | 12 ++++++++++ .../Scene/OpenStreetMapImageryProviderSpec.js | 11 ++++++++++ Specs/Scene/SingleTileImageryProviderSpec.js | 11 ++++++++++ .../TileCoordinatesImageryProviderSpec.js | 9 ++++++++ .../TileMapServiceImageryProviderSpec.js | 11 ++++++++++ Specs/Scene/UrlTemplateImageryProviderSpec.js | 11 ++++++++++ .../Scene/WebMapServiceImageryProviderSpec.js | 12 ++++++++++ .../WebMapTileServiceImageryProviderSpec.js | 14 ++++++++++++ 25 files changed, 338 insertions(+), 6 deletions(-) diff --git a/Source/Scene/ArcGisMapServerImageryProvider.js b/Source/Scene/ArcGisMapServerImageryProvider.js index b81ecc122a9e..3b840d0d0824 100644 --- a/Source/Scene/ArcGisMapServerImageryProvider.js +++ b/Source/Scene/ArcGisMapServerImageryProvider.js @@ -135,6 +135,7 @@ define([ this._errorEvent = new Event(); this._ready = false; + this._readyPromise = when.defer(); // Grab the details of this MapServer. var that = this; @@ -198,6 +199,7 @@ define([ } that._ready = true; + that._readyPromise.resolve(true); TileProviderError.handleSuccess(metadataError); } @@ -226,6 +228,7 @@ define([ requestMetadata(); } else { this._ready = true; + this._readyPromise.resolve(true); } }; @@ -469,6 +472,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; + } + }, + /** * 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..549095607688 100644 --- a/Source/Scene/BingMapsImageryProvider.js +++ b/Source/Scene/BingMapsImageryProvider.js @@ -140,6 +140,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,6 +197,7 @@ define([ } that._ready = true; + that._readyPromise.resolve(true); TileProviderError.handleSuccess(metadataError); } @@ -441,6 +443,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; + } + }, + /** * 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..7458a6ee94d4 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,6 +205,7 @@ define([ .replace('{channel}', that._channel).replace('{version}', that._version); that._ready = true; + that._readyPromise.resolve(true); TileProviderError.handleSuccess(metadataError); } @@ -470,6 +472,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; + } + }, + /** * 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..7bc006f68230 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); @@ -194,6 +196,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 when.resolve(true); + } + }, + /** * 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/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..87933b9347bc 100644 --- a/Source/Scene/SingleTileImageryProvider.js +++ b/Source/Scene/SingleTileImageryProvider.js @@ -80,6 +80,7 @@ define([ this._errorEvent = new Event(); this._ready = false; + this._readyPromise = when.defer(); var imageUrl = url; if (defined(proxy)) { @@ -100,6 +101,7 @@ define([ that._tileWidth = image.width; that._tileHeight = image.height; that._ready = true; + that._readyPromise.resolve(true); TileProviderError.handleSuccess(that._errorEvent); } @@ -303,6 +305,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; + } + }, + /** * 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..d80987c5a324 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"; /** @@ -174,6 +176,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 when.resolve(true); + } + }, + /** * 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..3f9d6a252f57 100644 --- a/Source/Scene/TileMapServiceImageryProvider.js +++ b/Source/Scene/TileMapServiceImageryProvider.js @@ -99,6 +99,7 @@ define([ this._url = url; this._ready = false; + this._readyPromise = when.defer(); this._proxy = options.proxy; this._tileDiscardPolicy = options.tileDiscardPolicy; this._errorEvent = new Event(); @@ -241,6 +242,7 @@ define([ that._tilingScheme = tilingScheme; that._ready = true; + that._readyPromise.resolve(true); } function metadataFailure(error) { @@ -253,6 +255,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 +470,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; + } + }, + /** * 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..df258a3f029a 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(); @@ -388,6 +388,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 when.resolve(true); + } + }, + /** * 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..aed70be8c4f7 100644 --- a/Source/Scene/WebMapServiceImageryProvider.js +++ b/Source/Scene/WebMapServiceImageryProvider.js @@ -12,6 +12,7 @@ define([ '../Core/queryToObject', '../Core/WebMercatorTilingScheme', '../ThirdParty/Uri', + '../ThirdParty/when', './GetFeatureInfoFormat', './UrlTemplateImageryProvider' ], function( @@ -27,6 +28,7 @@ define([ queryToObject, WebMercatorTilingScheme, Uri, + when, GetFeatureInfoFormat, UrlTemplateImageryProvider) { "use strict"; @@ -340,6 +342,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..61c0a47e0ad1 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"; @@ -358,6 +360,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 when.resolve(true); + } + }, + /** * 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/Scene/ArcGisMapServerImageryProviderSpec.js b/Specs/Scene/ArcGisMapServerImageryProviderSpec.js index 61e55453d469..150a369862c6 100644 --- a/Specs/Scene/ArcGisMapServerImageryProviderSpec.js +++ b/Specs/Scene/ArcGisMapServerImageryProviderSpec.js @@ -128,6 +128,21 @@ 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('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..43fd4a1f5191 100644 --- a/Specs/Scene/BingMapsImageryProviderSpec.js +++ b/Specs/Scene/BingMapsImageryProviderSpec.js @@ -181,6 +181,24 @@ 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('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..7931b131aca8 100644 --- a/Specs/Scene/GoogleEarthImageryProviderSpec.js +++ b/Specs/Scene/GoogleEarthImageryProviderSpec.js @@ -57,6 +57,28 @@ 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('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..a2ff32391b3d 100644 --- a/Specs/Scene/SingleTileImageryProviderSpec.js +++ b/Specs/Scene/SingleTileImageryProviderSpec.js @@ -36,6 +36,17 @@ 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('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..91499e4a206e 100644 --- a/Specs/Scene/TileMapServiceImageryProviderSpec.js +++ b/Specs/Scene/TileMapServiceImageryProviderSpec.js @@ -51,6 +51,17 @@ 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('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({ From 183468ad63e1b83184509b257cc47350a720dbe7 Mon Sep 17 00:00:00 2001 From: Katherina Lim Date: Fri, 6 Nov 2015 13:42:35 -0500 Subject: [PATCH 2/4] Added readyPromise property to TerrainProviders --- Source/Core/ArcGisImageServerTerrainProvider.js | 12 ++++++++++++ Source/Core/CesiumTerrainProvider.js | 14 ++++++++++++++ Source/Core/EllipsoidTerrainProvider.js | 14 ++++++++++++++ Source/Core/TerrainProvider.js | 12 ++++++++++++ Source/Core/VRTheWorldTerrainProvider.js | 14 ++++++++++++++ Specs/Core/ArcGisImageServerTerrainProviderSpec.js | 11 +++++++++++ Specs/Core/CesiumTerrainProviderSpec.js | 11 +++++++++++ Specs/Core/EllipsoidTerrainProviderSpec.js | 9 +++++++++ Specs/Core/VRTheWorldTerrainProviderSpec.js | 11 +++++++++++ 9 files changed, 108 insertions(+) diff --git a/Source/Core/ArcGisImageServerTerrainProvider.js b/Source/Core/ArcGisImageServerTerrainProvider.js index e7aeb0c78a54..824cfcee5f4d 100644 --- a/Source/Core/ArcGisImageServerTerrainProvider.js +++ b/Source/Core/ArcGisImageServerTerrainProvider.js @@ -151,6 +151,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 when.resolve(true); + } + }, + /** * 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..5d3489e88026 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; + } + }, + /** * 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..637846895751 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, @@ -110,6 +112,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 when.resolve(true); + } + }, + /** * 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..4c5d0778ddbd 100644 --- a/Source/Core/TerrainProvider.js +++ b/Source/Core/TerrainProvider.js @@ -1,10 +1,12 @@ /*global define*/ define([ + '../ThirdParty/when', './defined', './defineProperties', './DeveloperError', './Math' ], function( + when, defined, defineProperties, DeveloperError, @@ -69,6 +71,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..97e59fec1fc2 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; + } + }, + /** * 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/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' From 022815b3fe313e1f1048d36749377a350f8fedd4 Mon Sep 17 00:00:00 2001 From: Katherina Lim Date: Fri, 6 Nov 2015 15:19:10 -0500 Subject: [PATCH 3/4] Moved promise resolve to constructor and added reject upon failure --- Source/Core/ArcGisImageServerTerrainProvider.js | 3 ++- Source/Core/CesiumTerrainProvider.js | 2 +- Source/Core/EllipsoidTerrainProvider.js | 3 ++- Source/Core/TerrainProvider.js | 2 -- Source/Core/VRTheWorldTerrainProvider.js | 2 +- Source/Scene/ArcGisMapServerImageryProvider.js | 5 ++++- Source/Scene/BingMapsImageryProvider.js | 5 ++++- Source/Scene/GoogleEarthImageryProvider.js | 3 ++- Source/Scene/GridImageryProvider.js | 4 +++- Source/Scene/Model.js | 4 ++-- Source/Scene/SingleTileImageryProvider.js | 5 ++++- Source/Scene/TileCoordinatesImageryProvider.js | 3 ++- Source/Scene/TileMapServiceImageryProvider.js | 5 ++++- Source/Scene/UrlTemplateImageryProvider.js | 4 +++- Source/Scene/WebMapServiceImageryProvider.js | 2 -- Source/Scene/WebMapTileServiceImageryProvider.js | 4 +++- 16 files changed, 37 insertions(+), 19 deletions(-) diff --git a/Source/Core/ArcGisImageServerTerrainProvider.js b/Source/Core/ArcGisImageServerTerrainProvider.js index 824cfcee5f4d..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, { @@ -159,7 +160,7 @@ define([ */ readyPromise : { get : function() { - return when.resolve(true); + return this._readyPromise; } }, diff --git a/Source/Core/CesiumTerrainProvider.js b/Source/Core/CesiumTerrainProvider.js index 5d3489e88026..d2c7d255ce83 100644 --- a/Source/Core/CesiumTerrainProvider.js +++ b/Source/Core/CesiumTerrainProvider.js @@ -610,7 +610,7 @@ define([ */ readyPromise : { get : function() { - return this._readyPromise; + return this._readyPromise.promise; } }, diff --git a/Source/Core/EllipsoidTerrainProvider.js b/Source/Core/EllipsoidTerrainProvider.js index 637846895751..5c1f37b24a76 100644 --- a/Source/Core/EllipsoidTerrainProvider.js +++ b/Source/Core/EllipsoidTerrainProvider.js @@ -61,6 +61,7 @@ define([ }); this._errorEvent = new Event(); + this._readyPromise = when.resolve(true); }; defineProperties(EllipsoidTerrainProvider.prototype, { @@ -120,7 +121,7 @@ define([ */ readyPromise : { get : function() { - return when.resolve(true); + return this._readyPromise; } }, diff --git a/Source/Core/TerrainProvider.js b/Source/Core/TerrainProvider.js index 4c5d0778ddbd..ce2cf99c51ba 100644 --- a/Source/Core/TerrainProvider.js +++ b/Source/Core/TerrainProvider.js @@ -1,12 +1,10 @@ /*global define*/ define([ - '../ThirdParty/when', './defined', './defineProperties', './DeveloperError', './Math' ], function( - when, defined, defineProperties, DeveloperError, diff --git a/Source/Core/VRTheWorldTerrainProvider.js b/Source/Core/VRTheWorldTerrainProvider.js index 97e59fec1fc2..2d48a7d9f94c 100644 --- a/Source/Core/VRTheWorldTerrainProvider.js +++ b/Source/Core/VRTheWorldTerrainProvider.js @@ -210,7 +210,7 @@ define([ */ readyPromise : { get : function() { - return this._readyPromise; + return this._readyPromise.promise; } }, diff --git a/Source/Scene/ArcGisMapServerImageryProvider.js b/Source/Scene/ArcGisMapServerImageryProvider.js index 3b840d0d0824..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, @@ -206,6 +208,7 @@ define([ 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() { @@ -480,7 +483,7 @@ define([ */ readyPromise : { get : function() { - return this._readyPromise; + return this._readyPromise.promise; } }, diff --git a/Source/Scene/BingMapsImageryProvider.js b/Source/Scene/BingMapsImageryProvider.js index 549095607688..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, @@ -204,6 +206,7 @@ define([ 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() { @@ -451,7 +454,7 @@ define([ */ readyPromise : { get : function() { - return this._readyPromise; + return this._readyPromise.promise; } }, diff --git a/Source/Scene/GoogleEarthImageryProvider.js b/Source/Scene/GoogleEarthImageryProvider.js index 7458a6ee94d4..736942848349 100644 --- a/Source/Scene/GoogleEarthImageryProvider.js +++ b/Source/Scene/GoogleEarthImageryProvider.js @@ -212,6 +212,7 @@ define([ 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() { @@ -480,7 +481,7 @@ define([ */ readyPromise : { get : function() { - return this._readyPromise; + return this._readyPromise.promise; } }, diff --git a/Source/Scene/GridImageryProvider.js b/Source/Scene/GridImageryProvider.js index 7bc006f68230..bb5eaa500339 100644 --- a/Source/Scene/GridImageryProvider.js +++ b/Source/Scene/GridImageryProvider.js @@ -62,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, { @@ -204,7 +206,7 @@ define([ */ readyPromise : { get : function() { - return when.resolve(true); + return this._readyPromise; } }, 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/SingleTileImageryProvider.js b/Source/Scene/SingleTileImageryProvider.js index 87933b9347bc..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"; @@ -115,6 +117,7 @@ define([ 0, 0, 0, doRequest, e); + that._readyPromise.reject(new RuntimeError(message)); } function doRequest() { @@ -313,7 +316,7 @@ define([ */ readyPromise : { get : function() { - return this._readyPromise; + return this._readyPromise.promise; } }, diff --git a/Source/Scene/TileCoordinatesImageryProvider.js b/Source/Scene/TileCoordinatesImageryProvider.js index d80987c5a324..8c4b6f731456 100644 --- a/Source/Scene/TileCoordinatesImageryProvider.js +++ b/Source/Scene/TileCoordinatesImageryProvider.js @@ -42,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, { @@ -184,7 +185,7 @@ define([ */ readyPromise : { get : function() { - return when.resolve(true); + return this._readyPromise; } }, diff --git a/Source/Scene/TileMapServiceImageryProvider.js b/Source/Scene/TileMapServiceImageryProvider.js index 3f9d6a252f57..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, @@ -178,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; } } @@ -478,7 +481,7 @@ define([ */ readyPromise : { get : function() { - return this._readyPromise; + return this._readyPromise.promise; } }, diff --git a/Source/Scene/UrlTemplateImageryProvider.js b/Source/Scene/UrlTemplateImageryProvider.js index df258a3f029a..8e874bdd3ff0 100644 --- a/Source/Scene/UrlTemplateImageryProvider.js +++ b/Source/Scene/UrlTemplateImageryProvider.js @@ -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, { @@ -396,7 +398,7 @@ define([ */ readyPromise : { get : function() { - return when.resolve(true); + return this._readyPromise; } }, diff --git a/Source/Scene/WebMapServiceImageryProvider.js b/Source/Scene/WebMapServiceImageryProvider.js index aed70be8c4f7..f2dc96d83a3f 100644 --- a/Source/Scene/WebMapServiceImageryProvider.js +++ b/Source/Scene/WebMapServiceImageryProvider.js @@ -12,7 +12,6 @@ define([ '../Core/queryToObject', '../Core/WebMercatorTilingScheme', '../ThirdParty/Uri', - '../ThirdParty/when', './GetFeatureInfoFormat', './UrlTemplateImageryProvider' ], function( @@ -28,7 +27,6 @@ define([ queryToObject, WebMercatorTilingScheme, Uri, - when, GetFeatureInfoFormat, UrlTemplateImageryProvider) { "use strict"; diff --git a/Source/Scene/WebMapTileServiceImageryProvider.js b/Source/Scene/WebMapTileServiceImageryProvider.js index 61c0a47e0ad1..a1492d6d9e96 100644 --- a/Source/Scene/WebMapTileServiceImageryProvider.js +++ b/Source/Scene/WebMapTileServiceImageryProvider.js @@ -130,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. @@ -368,7 +370,7 @@ define([ */ readyPromise : { get : function() { - return when.resolve(true); + return this._readyPromise; } }, From c9497defe0a1c720f34fe35a7e474e470d83f351 Mon Sep 17 00:00:00 2001 From: Katherina Lim Date: Mon, 9 Nov 2015 10:20:54 -0500 Subject: [PATCH 4/4] Added tests for promise reject --- .../ArcGisMapServerImageryProviderSpec.js | 15 ++++++++ Specs/Scene/BingMapsImageryProviderSpec.js | 16 +++++++- Specs/Scene/GoogleEarthImageryProviderSpec.js | 17 ++++++++- Specs/Scene/SingleTileImageryProviderSpec.js | 15 +++++++- .../TileMapServiceImageryProviderSpec.js | 38 ++++++++++++++++++- 5 files changed, 97 insertions(+), 4 deletions(-) diff --git a/Specs/Scene/ArcGisMapServerImageryProviderSpec.js b/Specs/Scene/ArcGisMapServerImageryProviderSpec.js index 150a369862c6..ab78ffd9795d 100644 --- a/Specs/Scene/ArcGisMapServerImageryProviderSpec.js +++ b/Specs/Scene/ArcGisMapServerImageryProviderSpec.js @@ -143,6 +143,21 @@ defineSuite([ }); }); + 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 43fd4a1f5191..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; @@ -199,6 +199,20 @@ defineSuite([ }); }); + 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 7931b131aca8..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; @@ -79,6 +79,21 @@ defineSuite([ }); }); + 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/SingleTileImageryProviderSpec.js b/Specs/Scene/SingleTileImageryProviderSpec.js index a2ff32391b3d..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; @@ -47,6 +47,19 @@ defineSuite([ }); }); + 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/TileMapServiceImageryProviderSpec.js b/Specs/Scene/TileMapServiceImageryProviderSpec.js index 91499e4a206e..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; @@ -62,6 +62,42 @@ defineSuite([ }); }); + 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({});