diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js index c8e8e243..273c50f1 100644 --- a/spec/suites/layer/tile/GridLayerSpec.js +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -599,46 +599,84 @@ describe('GridLayer', function () { // browsers due to CSS animations! it.skipInPhantom("Loads 32, unloads 16 tiles zooming in 10-11", function (done) { - // grid.on('tileload tileunload tileloadstart load', logTiles); + // Advance the time to !== 0 otherwise `tile.loaded` timestamp will appear to be falsy. + clock.tick(1); + // Date.now() is 1. - grid.on('load', function () { - expect(counts.tileloadstart).to.be(16); + // grid.on('tileload tileunload tileloadstart load loading', logTiles); + + // Use "once" to automatically detach the listener, + // and avoid removing the above logTiles + // (which would happen when calling "grid.off('load')"). + grid.once('load', function () { expect(counts.tileload).to.be(16); expect(counts.tileunload).to.be(0); - grid.off('load'); - - // grid.on('load', logTiles); - grid.on('load', function () { - - // We're one frame into the zoom animation, there are - // 16 tiles for z10 plus 16 tiles for z11 covering the - // bounds at the *end* of the zoom-*in* anim - expect(counts.tileloadstart).to.be(32); - expect(counts.tileload).to.be(32); - expect(counts.tileunload).to.be(0); + // Wait for a frame to let _updateOpacity starting. + L.Util.requestAnimFrame(function () { // Wait > 250msec for the tile fade-in animation to complete, // which triggers the tile pruning clock.tick(300); + // At 251ms, the pruneTile from the end of the z10 tiles fade-in animation executes. + // Date.now() is 301. - // After the zoom-in, the 'outside' 12 tiles (not the 4 - // at the center, still in bounds) have been unloaded. - expect(counts.tileunload).to.be(12); - - L.Util.requestAnimFrame(function () { - expect(counts.tileloadstart).to.be(32); + grid.once('load', function () { expect(counts.tileload).to.be(32); - expect(counts.tileunload).to.be(16); - done(); - }); - }); - map.setZoom(11, {animate: true}); - clock.tick(250); + // We're one frame into the zoom animation, + // so GridLayer._setView with noPrune === undefined is not called yet + // No tile should be unloaded yet. + expect(counts.tileunload).to.be(0); + + // Wait > 250msec for the zoom animation to complete, + // which triggers the tile pruning + // Animated zoom takes 1 frame + 250ms before firing "zoom" event + // => GridLayer._resetView => GridLayer._setView => _pruneTiles + // However, this "load" event callback executes synchronously, + // i.e. _tileReady still did not have a chance to prepare the + // setTimeout(250) for pruning after the end of the fade-in animation. + clock.tick(300); + // At 301 + 250 = 551ms, the pruneTile from the end of the zoom animation executes. + // It unloads the 'outside' 12 tiles from z10, but not the 4 tiles in the center, + // since _updateOpacity did not have a chance yet to flag the 16 new z11 tiles as "active". + expect(counts.tileunload).to.be(12); + // Date.now() is 601. + + // Wait for a frame to let _updateOpacity starting + // + _tileReady to be able to prepare its setTimeout(250) + // for pruning after the end of the fade-in animation. + // Since we are already > 200ms since the 'load' event fired, + // _updateOpacity should directly set the current tiles as "active", + // so the remaining 4 tiles from z10 can then be pruned. + // However we have skipped any pruning from _updateOpacity, + // so we will have to rely on the setTimeout from _tileReady. + L.Util.requestAnimFrame(function () { + // Wait > 250msec for the tile fade-in animation to complete, + // which triggers the tile pruning + clock.tick(300); + // At 851ms, the pruneTile from the end of the z11 tiles fade-in animation executes. + // It unloads the remaining 4 tiles from z10. + expect(counts.tileunload).to.be(16); + // Date.now() is 901. + done(); + }); + }); + + map.setZoom(11, {animate: true}); + // Animation (and new tiles loading) starts after 1 frame. + L.Util.requestAnimFrame(function () { + // 16 extra tiles from z11 being loaded. Total 16 + 16 = 32. + expect(counts.tileloadstart).to.be(32); + }); + + }); }); map.addLayer(grid).setView([0, 0], 10); - clock.tick(250); + // The first setView does not animated, therefore it starts loading tiles immediately. + // 16 tiles from z10 being loaded. + expect(counts.tileloadstart).to.be(16); + // At 1ms, first pruneTile (map fires "viewreset" event => GridLayer._resetView => GridLayer._setView => _pruneTiles). }); it("Loads 32, unloads 16 tiles zooming in 10-18", function (done) {