Browse Source

LibWeb: Don't assume IO.unobserve() called on observed element

It's perfectly possible for JavaScript to call unobserve() on an element
that hasn't been observed. Let's stop asserting if that happens. :^)

Fixes #22020
Andreas Kling 1 year ago
parent
commit
ef809eea1e

+ 1 - 0
Tests/LibWeb/Text/expected/IntersectionObserver/unobserve-element-without-matching-observe.txt

@@ -0,0 +1 @@
+   PASS! (Didn't crash)

+ 10 - 0
Tests/LibWeb/Text/input/IntersectionObserver/unobserve-element-without-matching-observe.html

@@ -0,0 +1,10 @@
+<body>
+<script src="../include.js"></script>
+<script>
+    test(() => {
+        let observer = new IntersectionObserver(function() {});
+        let div = document.createElement("div");
+        observer.unobserve(div);
+        println("PASS! (Didn't crash)");
+    });
+</script>

+ 2 - 1
Userland/Libraries/LibWeb/DOM/Element.cpp

@@ -2086,7 +2086,8 @@ void Element::register_intersection_observer(Badge<IntersectionObserver::Interse
 
 void Element::unregister_intersection_observer(Badge<IntersectionObserver::IntersectionObserver>, JS::NonnullGCPtr<IntersectionObserver::IntersectionObserver> observer)
 {
-    VERIFY(m_registered_intersection_observers);
+    if (!m_registered_intersection_observers)
+        return;
     m_registered_intersection_observers->remove_first_matching([&observer](IntersectionObserver::IntersectionObserverRegistration const& entry) {
         return entry.observer == observer;
     });