diff --git a/src/source/vector_tile_worker_source.js b/src/source/vector_tile_worker_source.js index c580aab8ca8..2ccc9349747 100644 --- a/src/source/vector_tile_worker_source.js +++ b/src/source/vector_tile_worker_source.js @@ -110,6 +110,8 @@ class VectorTileWorkerSource implements WorkerSource { delete this.loading[uid]; if (err || !response) { + workerTile.status = 'done'; + this.loaded[uid] = workerTile; return callback(err); } @@ -163,7 +165,12 @@ class VectorTileWorkerSource implements WorkerSource { if (workerTile.status === 'parsing') { workerTile.reloadCallback = done; } else if (workerTile.status === 'done') { - workerTile.parse(workerTile.vectorTile, this.layerIndex, this.actor, done); + // if there was no vector tile data on the initial load, don't try and re-parse tile + if (workerTile.vectorTile) { + workerTile.parse(workerTile.vectorTile, this.layerIndex, this.actor, done); + } else { + done(); + } } } } diff --git a/test/unit/source/vector_tile_worker_source.test.js b/test/unit/source/vector_tile_worker_source.test.js index 6b0a310bd7a..3eae05e1292 100644 --- a/test/unit/source/vector_tile_worker_source.test.js +++ b/test/unit/source/vector_tile_worker_source.test.js @@ -58,6 +58,7 @@ test('VectorTileWorkerSource#reloadTile reloads a previously-loaded tile', (t) = source.loaded = { '0': { status: 'done', + vectorTile: {}, parse } }; @@ -79,6 +80,7 @@ test('VectorTileWorkerSource#reloadTile queues a reload when parsing is in progr source.loaded = { '0': { status: 'done', + vectorTile: {}, parse } }; @@ -112,6 +114,7 @@ test('VectorTileWorkerSource#reloadTile handles multiple pending reloads', (t) = source.loaded = { '0': { status: 'done', + vectorTile: {}, parse } }; @@ -152,6 +155,27 @@ test('VectorTileWorkerSource#reloadTile handles multiple pending reloads', (t) = t.end(); }); +test('VectorTileWorkerSource#reloadTile does not reparse tiles with no vectorTile data but does call callback', (t) => { + const source = new VectorTileWorkerSource(null, new StyleLayerIndex()); + const parse = t.spy(); + + source.loaded = { + '0': { + status: 'done', + parse + } + }; + + const callback = t.spy(); + + source.reloadTile({ uid: 0 }, callback); + t.ok(parse.notCalled); + t.ok(callback.calledOnce); + + t.end(); +}); + + test('VectorTileWorkerSource provides resource timing information', (t) => { const rawTileData = fs.readFileSync(path.join(__dirname, '/../../fixtures/mbsv5-6-18-23.vector.pbf'));