From 49dd5a4fd803e62209dc06636c82ec3335acb194 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Tue, 9 Jul 2013 01:51:04 -0700 Subject: [PATCH] Merge pull request #1019 from ahocevar/chrome-optimized Deal with recent Chrome optimizations to avoid failing TileManager and tests --- lib/OpenLayers/Tile/Image.js | 8 ++++++- lib/OpenLayers/TileManager.js | 41 +++++++++++++++-------------------- tests/Layer/Grid.html | 41 +++++++++++++++++------------------ tests/Tile/Image.html | 9 +++----- tests/list-tests.html | 2 +- 5 files changed, 49 insertions(+), 52 deletions(-) diff --git a/lib/OpenLayers/Tile/Image.js b/lib/OpenLayers/Tile/Image.js index 4db5ff8440..2fdffb3d25 100644 --- a/lib/OpenLayers/Tile/Image.js +++ b/lib/OpenLayers/Tile/Image.js @@ -314,11 +314,17 @@ OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile, { * Creates the content for the frame on the tile. */ initImage: function() { + if (!this.url && !this.imgDiv) { + // fast path out - if there is no tile url and no previous image + this.isLoading = false; + return; + } this.events.triggerEvent('beforeload'); this.layer.div.appendChild(this.getTile()); this.events.triggerEvent(this._loadEvent); var img = this.getImage(); - if (this.url && OpenLayers.Util.isEquivalentUrl(img.src, this.url)) { + var src = img.getAttribute('src') || ''; + if (this.url && OpenLayers.Util.isEquivalentUrl(src, this.url)) { this._loadTimeout = window.setTimeout( OpenLayers.Function.bind(this.onImageLoad, this), 0 ); diff --git a/lib/OpenLayers/TileManager.js b/lib/OpenLayers/TileManager.js index 8e9fc020ce..5ae1666a9c 100644 --- a/lib/OpenLayers/TileManager.js +++ b/lib/OpenLayers/TileManager.js @@ -223,7 +223,7 @@ OpenLayers.TileManager = OpenLayers.Class({ for (j=layer.grid[i].length-1; j>=0; --j) { tile = layer.grid[i][j]; this.addTile({tile: tile}); - if (tile.url) { + if (tile.url && !tile.imgDiv) { this.manageTileCache({object: tile}); } } @@ -255,9 +255,6 @@ OpenLayers.TileManager = OpenLayers.Class({ for (j=layer.grid[i].length-1; j>=0; --j) { tile = layer.grid[i][j]; this.unloadTile({object: tile}); - if (tile.url) { - this.manageTileCache({object: tile}); - } } } } @@ -390,25 +387,23 @@ OpenLayers.TileManager = OpenLayers.Class({ manageTileCache: function(evt) { var tile = evt.object; var img = this.tileCache[tile.url]; - // only use image from cache if it is not on a layer already - if (img && (!img.parentNode || - OpenLayers.Element.hasClass(img.parentNode, 'olBackBuffer'))) { - if (tile.layer.backBuffer) { - if (tile.layer.backBuffer === img.parentNode) { - // cached image is on the target layer's backbuffer already, - // so nothing to do here - return; - } - img.style.opacity = 0; - img.style.visibility = 'hidden'; - } - // Only backbuffer tiles have an id, so we don't want one here - img.id = null; - tile.setImage(img); - // LRU - move tile to the end of the array to mark it as the most - // recently used - OpenLayers.Util.removeItem(this.tileCacheIndex, tile.url); - this.tileCacheIndex.push(tile.url); + if (img) { + // if image is on its layer's backbuffer, remove it from backbuffer + if (img.parentNode && + OpenLayers.Element.hasClass(img.parentNode, 'olBackBuffer')) { + img.parentNode.removeChild(img); + img.id = null; + } + // only use image from cache if it is not on a layer already + if (!img.parentNode) { + img.style.visibility = 'hidden'; + img.style.opacity = 0; + tile.setImage(img); + // LRU - move tile to the end of the array to mark it as the most + // recently used + OpenLayers.Util.removeItem(this.tileCacheIndex, tile.url); + this.tileCacheIndex.push(tile.url); + } } }, diff --git a/tests/Layer/Grid.html b/tests/Layer/Grid.html index 61670b9c27..495a9ab764 100644 --- a/tests/Layer/Grid.html +++ b/tests/Layer/Grid.html @@ -1135,27 +1135,26 @@ map.addLayer(layer); map.zoomToMaxExtent(); - t.delay_call(1, function() { - layer.mergeNewParams({foo: 'bar'}); - var tile = layer.grid[1][1]; - t.ok(OpenLayers.Element.hasClass(tile.imgDiv, 'olTileReplacing'), 'tile is marked for being replaced'); - t.ok(document.getElementById(tile.id + '_bb'), 'backbuffer created for tile'); - // simulate a css declaration where '.olTileReplacing' sets display - // to none. - tile.imgDiv.style.display = 'none'; - tile.onImageLoad(); - t.ok(!OpenLayers.Element.hasClass(tile.imgDiv, 'olTileReplacing'), 'tile replaced, no longer marked'); - t.ok(!document.getElementById(tile.id + '_bb'), 'backbuffer removed for tile'); - - layer.mergeNewParams({foo: 'baz'}); - tile = layer.grid[1][1]; - // simulate a css declaration where '.olTileReplacing' does not set - // display to none. - tile.imgDiv.style.display = 'block'; - tile.onImageLoad(); - t.ok(!OpenLayers.Element.hasClass(tile.imgDiv, 'olTileReplacing'), 'tile replaced, no longer marked'); - t.ok(document.getElementById(tile.id + '_bb'), 'backbuffer not removed for visible tile'); - }); + layer.grid[1][1].onImageLoad(); + layer.mergeNewParams({foo: 'bar'}); + var tile = layer.grid[1][1]; + t.ok(OpenLayers.Element.hasClass(tile.imgDiv, 'olTileReplacing'), 'tile is marked for being replaced'); + t.ok(document.getElementById(tile.id + '_bb'), 'backbuffer created for tile'); + // simulate a css declaration where '.olTileReplacing' sets display + // to none. + tile.imgDiv.style.display = 'none'; + tile.onImageLoad(); + t.ok(!OpenLayers.Element.hasClass(tile.imgDiv, 'olTileReplacing'), 'tile replaced, no longer marked'); + t.ok(!document.getElementById(tile.id + '_bb'), 'backbuffer removed for tile'); + + layer.mergeNewParams({foo: 'baz'}); + tile = layer.grid[1][1]; + // simulate a css declaration where '.olTileReplacing' does not set + // display to none. + tile.imgDiv.style.display = 'block'; + tile.onImageLoad(); + t.ok(!OpenLayers.Element.hasClass(tile.imgDiv, 'olTileReplacing'), 'tile replaced, no longer marked'); + t.ok(document.getElementById(tile.id + '_bb'), 'backbuffer not removed for visible tile'); } function test_backbuffer_replace_singleTile(t) { diff --git a/tests/Tile/Image.html b/tests/Tile/Image.html index 5e4d61148a..825c18708a 100644 --- a/tests/Tile/Image.html +++ b/tests/Tile/Image.html @@ -382,12 +382,9 @@ t.delay_call(5, function() { var tile = layer.grid[0][0]; - if (tile.isLoading) { - t.ok(false, "test_getCanvasContext timeout"); - } else { - t.ok(tile.getCanvasContext() instanceof CanvasRenderingContext2D, - "getCanvasContext() returns CanvasRenderingContext2D instance"); - } + tile.onImageLoad(); + t.ok(tile.getCanvasContext() instanceof CanvasRenderingContext2D, + "getCanvasContext() returns CanvasRenderingContext2D instance"); map.destroy(); }); } diff --git a/tests/list-tests.html b/tests/list-tests.html index c353755091..f59c477b40 100644 --- a/tests/list-tests.html +++ b/tests/list-tests.html @@ -231,7 +231,7 @@
  • Tile/Image.html
  • Tile/Image/IFrame.html
  • Tile/UTFGrid.html
  • -
  • TileManager.html?visible
  • +
  • TileManager.html
  • Tween.html
  • Kinetic.html
  • Util.html?visible