[core] reload geojson source on url change
This commit is contained in:
committed by
Ivo van Dongen
parent
5527887c4b
commit
ab63a9494f
@@ -20,6 +20,9 @@ public:
|
||||
virtual void onSourceAttributionChanged(Source&, const std::string&) {}
|
||||
virtual void onSourceError(Source&, std::exception_ptr) {}
|
||||
|
||||
//Source description needs to be reloaded
|
||||
virtual void onSourceDescriptionChanged(Source&) {}
|
||||
|
||||
virtual void onTileChanged(Source&, const OverscaledTileID&) {}
|
||||
virtual void onTileError(Source&, const OverscaledTileID&, std::exception_ptr) {}
|
||||
};
|
||||
|
||||
@@ -38,6 +38,12 @@ GeoJSONSource::Impl::~Impl() = default;
|
||||
|
||||
void GeoJSONSource::Impl::setURL(std::string url_) {
|
||||
url = std::move(url_);
|
||||
|
||||
//Signal that the source description needs a reload
|
||||
if (loaded) {
|
||||
loaded = false;
|
||||
observer->onSourceDescriptionChanged(base);
|
||||
}
|
||||
}
|
||||
|
||||
optional<std::string> GeoJSONSource::Impl::getURL() {
|
||||
@@ -132,6 +138,7 @@ void GeoJSONSource::Impl::loadDescription(FileSource& fileSource) {
|
||||
|
||||
loaded = true;
|
||||
observer->onSourceLoaded(base);
|
||||
req.reset();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -491,6 +491,13 @@ void Style::onSourceError(Source& source, std::exception_ptr error) {
|
||||
observer->onResourceError(error);
|
||||
}
|
||||
|
||||
void Style::onSourceDescriptionChanged(Source& source) {
|
||||
observer->onSourceDescriptionChanged(source);
|
||||
if (!source.baseImpl->loaded) {
|
||||
source.baseImpl->loadDescription(fileSource);
|
||||
}
|
||||
}
|
||||
|
||||
void Style::onTileChanged(Source& source, const OverscaledTileID& tileID) {
|
||||
observer->onTileChanged(source, tileID);
|
||||
observer->onUpdate(Update::Repaint);
|
||||
|
||||
@@ -134,6 +134,7 @@ private:
|
||||
void onSourceLoaded(Source&) override;
|
||||
void onSourceAttributionChanged(Source&, const std::string&) override;
|
||||
void onSourceError(Source&, std::exception_ptr) override;
|
||||
void onSourceDescriptionChanged(Source&) override;
|
||||
void onTileChanged(Source&, const OverscaledTileID&) override;
|
||||
void onTileError(Source&, const OverscaledTileID&, std::exception_ptr) override;
|
||||
|
||||
|
||||
@@ -38,6 +38,10 @@ public:
|
||||
if (sourceError) sourceError(source, error);
|
||||
}
|
||||
|
||||
void onSourceDescriptionChanged(Source& source) override {
|
||||
if (sourceDescriptionChanged) sourceDescriptionChanged(source);
|
||||
}
|
||||
|
||||
void onTileChanged(Source& source, const OverscaledTileID& tileID) override {
|
||||
if (tileChanged) tileChanged(source, tileID);
|
||||
};
|
||||
@@ -58,6 +62,7 @@ public:
|
||||
std::function<void (Source&)> sourceLoaded;
|
||||
std::function<void (Source&, std::string)> sourceAttributionChanged;
|
||||
std::function<void (Source&, std::exception_ptr)> sourceError;
|
||||
std::function<void (Source&)> sourceDescriptionChanged;
|
||||
std::function<void (Source&, const OverscaledTileID&)> tileChanged;
|
||||
std::function<void (Source&, const OverscaledTileID&, std::exception_ptr)> tileError;
|
||||
std::function<void (std::exception_ptr)> resourceError;
|
||||
|
||||
@@ -381,3 +381,37 @@ TEST(Source, RasterTileAttribution) {
|
||||
|
||||
test.run();
|
||||
}
|
||||
|
||||
TEST(Source, GeoJSonSourceUrlUpdate) {
|
||||
SourceTest test;
|
||||
|
||||
test.fileSource.sourceResponse = [&] (const Resource& resource) {
|
||||
EXPECT_EQ("url", resource.url);
|
||||
Response response;
|
||||
response.data = std::make_unique<std::string>("{\"geometry\": {\"type\": \"Point\", \"coordinates\": [1.1, 1.1]}, \"type\": \"Feature\", \"properties\": {}}");
|
||||
return response;
|
||||
};
|
||||
|
||||
test.observer.sourceDescriptionChanged = [&] (Source&) {
|
||||
//Should be called (test will hang if it doesn't)
|
||||
test.end();
|
||||
};
|
||||
|
||||
test.observer.tileError = [&] (Source&, const OverscaledTileID&, std::exception_ptr) {
|
||||
FAIL() << "Should never be called";
|
||||
};
|
||||
|
||||
GeoJSONSource source("source");
|
||||
source.baseImpl->setObserver(&test.observer);
|
||||
|
||||
//Load initial, so the source state will be loaded=true
|
||||
source.baseImpl->loadDescription(test.fileSource);
|
||||
|
||||
//Schedule an update
|
||||
test.loop.invoke([&] () {
|
||||
//Update the url
|
||||
source.setURL(std::string("http://source-url.ext"));
|
||||
});
|
||||
|
||||
test.run();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user