[core] continue loading style even if we mutate it

When we load a stale style from cache, and the user immediately starts mutating it, we should continue loading the style so that we'll get a fresh copy of the data into our cache and avoid perpetually showing the stale style.
This commit is contained in:
Konstantin Käfer
2018-02-21 12:35:44 +01:00
parent b79a1cc82e
commit dfeb5b25d3
2 changed files with 16 additions and 10 deletions

View File

@@ -55,11 +55,6 @@ void Style::Impl::loadURL(const std::string& url_) {
url = url_;
styleRequest = fileSource.request(Resource::style(url), [this](Response res) {
// Once we get a fresh style, or the style is mutated, stop revalidating.
if (res.isFresh() || mutated) {
styleRequest.reset();
}
// Don't allow a loaded, mutated style to be overwritten with a new version.
if (mutated && loaded) {
return;

View File

@@ -252,7 +252,7 @@ TEST(Map, DoubleStyleLoad) {
}
TEST(Map, StyleFresh) {
// The map should not revalidate fresh styles.
// The map should continue to revalidate fresh styles.
MapTest<FakeFileSource> test;
@@ -264,11 +264,11 @@ TEST(Map, StyleFresh) {
response.expires = Timestamp::max();
test.fileSource.respond(Resource::Style, response);
EXPECT_EQ(0u, test.fileSource.requests.size());
EXPECT_EQ(1u, test.fileSource.requests.size());
}
TEST(Map, StyleExpired) {
// The map should allow expired styles to be revalidated, so long as no mutations are made.
// The map should allow expired styles to be revalidated until we get a fresh style.
using namespace std::chrono_literals;
@@ -284,11 +284,22 @@ TEST(Map, StyleExpired) {
test.fileSource.respond(Resource::Style, response);
EXPECT_EQ(1u, test.fileSource.requests.size());
// Mutate layer. From now on, sending a response to the style won't overwrite it anymore, but
// we should continue to wait for a fresh response.
test.map.getStyle().addLayer(std::make_unique<style::BackgroundLayer>("bg"));
EXPECT_EQ(1u, test.fileSource.requests.size());
// Send another expired response, and confirm that we didn't overwrite the style, but continue
// to wait for a fresh response.
test.fileSource.respond(Resource::Style, response);
EXPECT_EQ(0u, test.fileSource.requests.size());
EXPECT_EQ(1u, test.fileSource.requests.size());
EXPECT_NE(nullptr, test.map.getStyle().getLayer("bg"));
// Send a fresh response, and confirm that we didn't overwrite the style, but continue to wait
// for a fresh response.
response.expires = util::now() + 1h;
test.fileSource.respond(Resource::Style, response);
EXPECT_EQ(1u, test.fileSource.requests.size());
EXPECT_NE(nullptr, test.map.getStyle().getLayer("bg"));
}
@@ -352,7 +363,7 @@ TEST(Map, StyleEarlyMutation) {
response.data = std::make_shared<std::string>(util::read_file("test/fixtures/api/water.json"));
test.fileSource.respond(Resource::Style, response);
EXPECT_EQ(0u, test.fileSource.requests.size());
EXPECT_EQ(1u, test.fileSource.requests.size());
EXPECT_NE(nullptr, test.map.getStyle().getLayer("water"));
}