summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnsis Brammanis <ansis.brammanis@gmail.com>2019-04-08 16:28:55 -0400
committerAnsis Brammanis <ansis@mapbox.com>2019-04-08 19:13:49 -0400
commitaf8ffa1b60ed5f4c26346f95b5598d86b93efb7b (patch)
tree06a5822f170999a5b778696e9d2071e7ad935706
parent4b63580c26b088c21fabb93cfc2e41f98deabaa7 (diff)
downloadqtlocation-mapboxgl-upstream/cp-missing-icon-fix.tar.gz
fix firing onStyleImageMissing after sprite has loaded (#14369)upstream/cp-missing-icon-fix
-rw-r--r--src/mbgl/renderer/image_manager.cpp13
-rw-r--r--test/renderer/image_manager.test.cpp75
2 files changed, 82 insertions, 6 deletions
diff --git a/src/mbgl/renderer/image_manager.cpp b/src/mbgl/renderer/image_manager.cpp
index d2994d6f2d..a1bcf7dbe7 100644
--- a/src/mbgl/renderer/image_manager.cpp
+++ b/src/mbgl/renderer/image_manager.cpp
@@ -90,19 +90,20 @@ void ImageManager::getImages(ImageRequestor& requestor, ImageRequestPair&& pair)
// if all icons are available. If any are missing, call `onStyleImageMissing`
// to give the user a chance to provide the icon. If they are not provided
// by the next frame we'll assume they are permanently missing.
- bool hasAllDependencies = true;
if (!isLoaded()) {
+ bool hasAllDependencies = true;
for (const auto& dependency : pair.first) {
if (images.find(dependency.first) == images.end()) {
hasAllDependencies = false;
+ break;
}
}
- }
- if (hasAllDependencies) {
- notify(requestor, pair);
- } else if (!isLoaded()) {
- requestors.emplace(&requestor, std::move(pair));
+ if (hasAllDependencies) {
+ notify(requestor, pair);
+ } else {
+ requestors.emplace(&requestor, std::move(pair));
+ }
} else {
checkMissingAndNotify(requestor, std::move(pair));
}
diff --git a/test/renderer/image_manager.test.cpp b/test/renderer/image_manager.test.cpp
index a9e935088c..496c249e96 100644
--- a/test/renderer/image_manager.test.cpp
+++ b/test/renderer/image_manager.test.cpp
@@ -158,3 +158,78 @@ TEST(ImageManager, NotifiesRequestorImmediatelyIfDependenciesAreSatisfied) {
ASSERT_TRUE(notified);
}
+
+
+class StubImageManagerObserver : public ImageManagerObserver {
+ public:
+ int count = 0;
+ virtual void onStyleImageMissing(const std::string&, std::function<void()> done) override {
+ count++;
+ done();
+ }
+};
+
+TEST(ImageManager, OnStyleImageMissingBeforeSpriteLoaded) {
+ ImageManager imageManager;
+ StubImageRequestor requestor;
+ StubImageManagerObserver observer;
+
+ imageManager.setObserver(&observer);
+
+ bool notified = false;
+
+ requestor.imagesAvailable = [&] (ImageMap, ImageMap, std::unordered_map<std::string, uint32_t>) {
+ notified = true;
+ };
+
+ uint64_t imageCorrelationID = 0;
+ ImageDependencies dependencies;
+ dependencies.emplace("pre", ImageType::Icon);
+ imageManager.getImages(requestor, std::make_pair(dependencies, imageCorrelationID));
+
+ EXPECT_EQ(observer.count, 0);
+ ASSERT_FALSE(notified);
+
+ imageManager.setLoaded(true);
+
+ EXPECT_EQ(observer.count, 1);
+ ASSERT_FALSE(notified);
+
+ imageManager.notifyIfMissingImageAdded();
+
+ EXPECT_EQ(observer.count, 1);
+ ASSERT_TRUE(notified);
+
+}
+
+TEST(ImageManager, OnStyleImageMissingAfterSpriteLoaded) {
+ ImageManager imageManager;
+ StubImageRequestor requestor;
+ StubImageManagerObserver observer;
+
+ imageManager.setObserver(&observer);
+
+ bool notified = false;
+
+ requestor.imagesAvailable = [&] (ImageMap, ImageMap, std::unordered_map<std::string, uint32_t>) {
+ notified = true;
+ };
+
+ EXPECT_EQ(observer.count, 0);
+ ASSERT_FALSE(notified);
+
+ imageManager.setLoaded(true);
+
+ uint64_t imageCorrelationID = 0;
+ ImageDependencies dependencies;
+ dependencies.emplace("after", ImageType::Icon);
+ imageManager.getImages(requestor, std::make_pair(dependencies, imageCorrelationID));
+
+ EXPECT_EQ(observer.count, 1);
+ ASSERT_FALSE(notified);
+
+ imageManager.notifyIfMissingImageAdded();
+
+ EXPECT_EQ(observer.count, 1);
+ ASSERT_TRUE(notified);
+}