From 08579ca76d35785605257921619f08d33dac4ac0 Mon Sep 17 00:00:00 2001 From: Andrew Calcutt Date: Wed, 8 Jul 2026 18:33:22 -0400 Subject: [PATCH] fix(core): notify layer observer when source-layer or source-id changes (#4372) Co-authored-by: Claude Sonnet 4.6 --- src/mbgl/style/layer.cpp | 2 ++ test/style/style_layer.test.cpp | 38 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/mbgl/style/layer.cpp b/src/mbgl/style/layer.cpp index eb263a14f..a27d474f8 100644 --- a/src/mbgl/style/layer.cpp +++ b/src/mbgl/style/layer.cpp @@ -54,6 +54,7 @@ void Layer::setSourceLayer(const std::string& sourceLayer) { auto impl_ = mutableBaseImpl(); impl_->sourceLayer = sourceLayer; baseImpl = std::move(impl_); + observer->onLayerChanged(*this); } void Layer::setSourceID(const std::string& sourceID) { @@ -61,6 +62,7 @@ void Layer::setSourceID(const std::string& sourceID) { auto impl_ = mutableBaseImpl(); impl_->source = sourceID; baseImpl = std::move(impl_); + observer->onLayerChanged(*this); }; const Filter& Layer::getFilter() const { diff --git a/test/style/style_layer.test.cpp b/test/style/style_layer.test.cpp index 7cb9ea178..d13452f34 100644 --- a/test/style/style_layer.test.cpp +++ b/test/style/style_layer.test.cpp @@ -285,6 +285,44 @@ TEST(Layer, Observer) { }; layer->setLineCap(lineCap); EXPECT_FALSE(layoutPropertyChanged); + + // Notifies observer on source-layer change. + // This is required so that the render orchestrator re-evaluates already-loaded + // tiles when a layer's source-layer is changed at runtime (e.g. after addLayer). + bool sourceLayerChanged = false; + observer.layerChanged = [&](Layer& layer_) { + EXPECT_EQ(layer.get(), &layer_); + sourceLayerChanged = true; + }; + layer->setSourceLayer("roads"); + EXPECT_TRUE(sourceLayerChanged); + + // Does not notify observer on no-op source-layer change. + sourceLayerChanged = false; + observer.layerChanged = [&](Layer& layer_) { + EXPECT_EQ(layer.get(), &layer_); + sourceLayerChanged = true; + }; + layer->setSourceLayer("roads"); + EXPECT_FALSE(sourceLayerChanged); + + // Notifies observer on source ID change. + bool sourceIDChanged = false; + observer.layerChanged = [&](Layer& layer_) { + EXPECT_EQ(layer.get(), &layer_); + sourceIDChanged = true; + }; + layer->setSourceID("other-source"); + EXPECT_TRUE(sourceIDChanged); + + // Does not notify observer on no-op source ID change. + sourceIDChanged = false; + observer.layerChanged = [&](Layer& layer_) { + EXPECT_EQ(layer.get(), &layer_); + sourceIDChanged = true; + }; + layer->setSourceID("other-source"); + EXPECT_FALSE(sourceIDChanged); } TEST(Layer, DuplicateLayer) {