diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observation.cc b/third_party/blink/renderer/core/intersection_observer/intersection_observation.cc index 68adefc19b389..f83bf49c095fd 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_observation.cc +++ b/third_party/blink/renderer/core/intersection_observer/intersection_observation.cc @@ -92,8 +92,14 @@ void IntersectionObservation::TakeRecords( void IntersectionObservation::Disconnect() { DCHECK(Observer()); - if (target_) + if (target_) { Target()->EnsureIntersectionObserverData().RemoveObservation(*Observer()); + if (target_->isConnected()) { + target_->GetDocument() + .EnsureIntersectionObserverController() + .RemoveTrackedTarget(*target_); + } + } entries_.clear(); observer_.Clear(); } diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer_controller.cc b/third_party/blink/renderer/core/intersection_observer/intersection_observer_controller.cc index d64e1340bba7c..df11be7341d8d 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_observer_controller.cc +++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer_controller.cc @@ -89,7 +89,6 @@ void IntersectionObserverController::AddTrackedTarget(Element& target) { } void IntersectionObserverController::RemoveTrackedTarget(Element& target) { - target.ComputeIntersectionObservations(false); tracked_observation_targets_.erase(&target); } diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer_controller.h b/third_party/blink/renderer/core/intersection_observer/intersection_observer_controller.h index 7eb4650d2292f..9abfda8b31058 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_observer_controller.h +++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer_controller.h @@ -49,6 +49,9 @@ class IntersectionObserverController const char* NameInHeapSnapshot() const override { return "IntersectionObserverController"; } + unsigned GetTrackedTargetCountForTesting() const { + return tracked_observation_targets_.size(); + } private: void PostTaskToDeliverObservations(); diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc b/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc index bb96b982f3378..b4c099e60d234 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc +++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc @@ -7,6 +7,7 @@ #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/exported/web_view_impl.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" +#include "third_party/blink/renderer/core/intersection_observer/intersection_observer_controller.h" #include "third_party/blink/renderer/core/intersection_observer/intersection_observer_delegate.h" #include "third_party/blink/renderer/core/intersection_observer/intersection_observer_init.h" #include "third_party/blink/renderer/core/layout/layout_view.h" @@ -339,6 +340,10 @@ TEST_F(IntersectionObserverTest, DisconnectClearsNotifications) { Element* target = GetDocument().getElementById("target"); ASSERT_TRUE(target); observer->observe(target, exception_state); + EXPECT_EQ(GetDocument() + .EnsureIntersectionObserverController() + .GetTrackedTargetCountForTesting(), + 1u); Compositor().BeginFrame(); test::RunPendingTasks(); @@ -350,6 +355,10 @@ TEST_F(IntersectionObserverTest, DisconnectClearsNotifications) { kProgrammaticScroll); Compositor().BeginFrame(); observer->disconnect(); + EXPECT_EQ(GetDocument() + .EnsureIntersectionObserverController() + .GetTrackedTargetCountForTesting(), + 0u); test::RunPendingTasks(); EXPECT_EQ(observer_delegate->CallCount(), 1); }