Selaa lähdekoodia

LibWeb: Implement IntersectionObserver "intersection roots" per spec

In particular, get the implicit root correctly for intersection
observers that don't have an explicit root specified.

This makes it possible to load the Terminal app on https://puter.com/
Andreas Kling 1 vuosi sitten
vanhempi
commit
8addfc14af

+ 1 - 0
Tests/LibWeb/Text/expected/IntersectionObserver/implicit-root-after-originating-iframe-is-removed-from-dom.txt

@@ -0,0 +1 @@
+    PASS if we didn't crash!

+ 17 - 0
Tests/LibWeb/Text/input/IntersectionObserver/implicit-root-after-originating-iframe-is-removed-from-dom.html

@@ -0,0 +1,17 @@
+<body>
+<iframe></iframe>
+<script src="../include.js"></script>
+<script>
+    asyncTest(done => {
+        let iframe = document.querySelector("iframe");
+        iframe.src =
+            "data:text/html," +
+            encodeURI("<script>new IntersectionObserver(function() { }, { })<" + "/script>");
+        iframe.onload = function () {
+            iframe.remove();
+            done();
+            println("PASS if we didn't crash!");
+        };
+    });
+</script>
+</body>

+ 9 - 3
Userland/Libraries/LibWeb/IntersectionObserver/IntersectionObserver.cpp

@@ -11,6 +11,7 @@
 #include <LibWeb/HTML/TraversableNavigable.h>
 #include <LibWeb/HTML/TraversableNavigable.h>
 #include <LibWeb/HTML/Window.h>
 #include <LibWeb/HTML/Window.h>
 #include <LibWeb/IntersectionObserver/IntersectionObserver.h>
 #include <LibWeb/IntersectionObserver/IntersectionObserver.h>
+#include <LibWeb/Page/Page.h>
 
 
 namespace Web::IntersectionObserver {
 namespace Web::IntersectionObserver {
 
 
@@ -156,11 +157,16 @@ Variant<JS::Handle<DOM::Element>, JS::Handle<DOM::Document>, Empty> Intersection
     return m_root.value();
     return m_root.value();
 }
 }
 
 
+// https://www.w3.org/TR/intersection-observer/#intersectionobserver-intersection-root
 Variant<JS::Handle<DOM::Element>, JS::Handle<DOM::Document>> IntersectionObserver::intersection_root() const
 Variant<JS::Handle<DOM::Element>, JS::Handle<DOM::Document>> IntersectionObserver::intersection_root() const
 {
 {
-    if (!m_root.has_value())
-        return JS::make_handle(global_object().navigable()->traversable_navigable()->active_document());
-    return m_root.value();
+    // The intersection root for an IntersectionObserver is the value of its root attribute
+    // if the attribute is non-null;
+    if (m_root.has_value())
+        return m_root.value();
+
+    // otherwise, it is the top-level browsing context’s document node, referred to as the implicit root.
+    return JS::make_handle(global_object().page().top_level_browsing_context().active_document());
 }
 }
 
 
 // https://www.w3.org/TR/intersection-observer/#intersectionobserver-root-intersection-rectangle
 // https://www.w3.org/TR/intersection-observer/#intersectionobserver-root-intersection-rectangle