diff --git a/src/tile.js b/src/tile.js index a6d40fd8..582ccb67 100644 --- a/src/tile.js +++ b/src/tile.js @@ -54,8 +54,9 @@ * with HTML the entire tile is always used. * @param {String} postData HTTP POST data (usually but not necessarily in k=v&k2=v2... form, * see TileSrouce::getPostData) or null + * @param {String} cacheKey key to act as a tile cache, must be unique for tiles with unique image data */ -$.Tile = function(level, x, y, bounds, exists, url, context2D, loadWithAjax, ajaxHeaders, sourceBounds, postData) { +$.Tile = function(level, x, y, bounds, exists, url, context2D, loadWithAjax, ajaxHeaders, sourceBounds, postData, cacheKey) { /** * The zoom level this tile belongs to. * @member {Number} level @@ -131,11 +132,7 @@ $.Tile = function(level, x, y, bounds, exists, url, context2D, loadWithAjax, aja * @member {String} cacheKey * @memberof OpenSeadragon.Tile# */ - if (this.ajaxHeaders) { - this.cacheKey = this.url + "+" + JSON.stringify(this.ajaxHeaders); - } else { - this.cacheKey = this.url; - } + this.cacheKey = cacheKey; /** * Is this tile loaded? * @member {Boolean} loaded diff --git a/src/tiledimage.js b/src/tiledimage.js index afb5d48c..f1737425 100644 --- a/src/tiledimage.js +++ b/src/tiledimage.js @@ -1530,7 +1530,8 @@ $.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadrag this.loadTilesWithAjax, ajaxHeaders, sourceBounds, - post + post, + tileSource.getTileHashKey(level, xMod, yMod, url, ajaxHeaders, post) ); if (this.getFlip()) { diff --git a/src/tilesource.js b/src/tilesource.js index 48cfe851..7a7e991c 100644 --- a/src/tilesource.js +++ b/src/tilesource.js @@ -639,7 +639,11 @@ $.TileSource.prototype = { * let result = new FormData(); * result.append("data", myData); * return result; - + * + * IMPORTANT: in case you move all the logic on image fetching + * to post data, you must re-define 'getTileHashKey(...)' to + * stay unique for different tile images. + * * @param level * @param x * @param y @@ -666,6 +670,29 @@ $.TileSource.prototype = { return {}; }, + /** + * Most tiles are cached because their 'context2D' property is null (otherwise no caching occurs). + * Then, their cache is uniquely determined by this key: this key should be different if images + * are different! Note: default behaviour does not take into account post data. + * + * A tile can have either context2D defined (TileSource.prototype.getContext2D) + * or it's context2D is set manually. In those cases cache is not used and this function + * is irrelevant. + * @param level tile level it was fetched with + * @param x x-coordinate in the pyramid level + * @param y y-coordinate in the pyramid level + * @param url the tile was fetched with + * @param ajaxHeaders the tile was fetched with + * @param post data the tile was fetched with + */ + getTileHashKey: function(level, x, y, url, ajaxHeaders, post) { + if (ajaxHeaders) { + return url + "+" + JSON.stringify(ajaxHeaders); + } else { + return url; + } + }, + /** * @function * @param {Number} level