From 8a964fb9313e57b71c64b8c0739ec84f163dc537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Thu, 7 Jan 2016 10:22:20 +0100 Subject: [PATCH] [core] use stale and refreshing TileJSON/GeoJSON data We're now supporting using stale TileJSON and GeoJSON data. When we receive a new answer with an updated TileJSON file, we're replacing the Source's metadata with the new one and trigger updates to make sure we're loading the correct tiles. Similarly, GeoJSON data will be reparsed. --- src/mbgl/map/source.cpp | 41 +++++++++++++++--- .../stale_style_and_tilejson/expected.png | Bin 0 -> 13447 bytes test/fixtures/stale/style_and_tilejson.json | 25 +++++++++++ test/storage/cache_stale.cpp | 23 ++++++++++ 4 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 test/fixtures/stale/stale_style_and_tilejson/expected.png create mode 100644 test/fixtures/stale/style_and_tilejson.json diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index ed57ddce0..4432b3a49 100644 --- a/src/mbgl/map/source.cpp +++ b/src/mbgl/map/source.cpp @@ -90,17 +90,16 @@ void Source::load() { // URL may either be a TileJSON file, or a GeoJSON file. FileSource* fs = util::ThreadContext::getFileSource(); req = fs->request({ Resource::Kind::Source, url }, [this](Response res) { - if (res.stale) { - // Only handle fresh responses. - return; - } - req = nullptr; - if (res.error) { observer->onSourceError(*this, std::make_exception_ptr(std::runtime_error(res.error->message))); return; } + if (res.notModified) { + // We got the same data back as last time. Abort early. + return; + } + rapidjson::GenericDocument, rapidjson::CrtAllocator> d; d.Parse<0>(res.data->c_str()); @@ -111,6 +110,7 @@ void Source::load() { return; } + bool reloadTiles = false; if (type == SourceType::Vector || type == SourceType::Raster) { // Create a new copy of the SourceInfo object that holds the base values we've parsed // from the stylesheet. Then merge in the values parsed from the TileJSON we retrieved @@ -124,10 +124,39 @@ void Source::load() { std::transform(newInfo->tiles.begin(), newInfo->tiles.end(), newInfo->tiles.begin(), util::mapbox::normalizeRasterTileURL); } + + // Check whether previous information specifies different tile + if (info && info->tiles != newInfo->tiles) { + reloadTiles = true; + + // Tile size changed: We need to recalculate the tiles we need to load because we + // might have to load tiles for a different zoom level + // This is done automatically when we trigger the onSourceLoaded observer below. + + // Min/Max zoom changed: We need to recalculate what tiles to load, if we have tiles + // loaded that are outside the new zoom range + // This is done automatically when we trigger the onSourceLoaded observer below. + + // Attribution changed: We need to notify the embedding application that this + // changed. See https://github.com/mapbox/mapbox-gl-native/issues/2723 + // This is not yet implemented. + + // Center/bounds changed: We're not using these values currently + } + info = std::move(newInfo); } else if (type == SourceType::GeoJSON) { info = std::make_unique(); geojsonvt = StyleParser::parseGeoJSON(d); + reloadTiles = true; + } + + if (reloadTiles) { + // Tile information changed because we got new GeoJSON data, or a new tile URL. + tilePtrs.clear(); + tileDataMap.clear(); + tiles.clear(); + cache.clear(); } loaded = true; diff --git a/test/fixtures/stale/stale_style_and_tilejson/expected.png b/test/fixtures/stale/stale_style_and_tilejson/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..d3c6ef3cd541bcb0a0dcbd37285ab9256bf929a6 GIT binary patch literal 13447 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 Q0=!@HGAhzFl4ha*2R)9RZU6uP literal 0 HcmV?d00001 diff --git a/test/fixtures/stale/style_and_tilejson.json b/test/fixtures/stale/style_and_tilejson.json new file mode 100644 index 000000000..f2a4fddd0 --- /dev/null +++ b/test/fixtures/stale/style_and_tilejson.json @@ -0,0 +1,25 @@ +{ + "version": 8, + "name": "Water", + "sources": { + "mapbox": { + "type": "vector", + "url": "http://127.0.0.1:3000/stale/streets.json" + } + }, + "layers": [{ + "id": "background", + "type": "background", + "paint": { + "background-color": "red" + } + }, { + "id": "water", + "type": "fill", + "source": "mapbox", + "source-layer": "water", + "paint": { + "fill-color": "blue" + } + }] +} diff --git a/test/storage/cache_stale.cpp b/test/storage/cache_stale.cpp index cc421f7c3..7f379b78a 100644 --- a/test/storage/cache_stale.cpp +++ b/test/storage/cache_stale.cpp @@ -49,3 +49,26 @@ TEST_F(Storage, CacheStaleStyle) { checkRendering(map, "stale_style", 1000ms); } + +TEST_F(Storage, CacheStaleStyleAndTileJSON) { + HeadlessView view(display, 1); + + auto cache = SQLiteCache::getShared(":memory:"); + + // Rig the cache with an expired stylesheet. + const std::string stylePath = "stale/style_and_tilejson.json"; + const Resource styleResource{ Resource::Kind::Style, prefix + "/" + stylePath }; + cache->put(styleResource, expiredItem(stylePath)); + + // Rig the cache with an expired TileJSON. + const std::string tilejsonPath = "stale/streets.json"; + const Resource tilejsonResource{ Resource::Kind::Source, prefix + "/" + tilejsonPath }; + cache->put(tilejsonResource, expiredItem(tilejsonPath)); + + DefaultFileSource fileSource(":memory:", "."); + + Map map(view, fileSource, MapMode::Still); + map.setStyleURL(styleResource.url); + + checkRendering(map, "stale_style_and_tilejson", 1000ms); +}