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/
This commit is contained in:
Andreas Kling 2024-02-23 20:50:19 +01:00
parent 8586897928
commit 8addfc14af
3 changed files with 27 additions and 3 deletions

View file

@ -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>

View file

@ -11,6 +11,7 @@
#include <LibWeb/HTML/TraversableNavigable.h>
#include <LibWeb/HTML/Window.h>
#include <LibWeb/IntersectionObserver/IntersectionObserver.h>
#include <LibWeb/Page/Page.h>
namespace Web::IntersectionObserver {
@ -156,11 +157,16 @@ Variant<JS::Handle<DOM::Element>, JS::Handle<DOM::Document>, Empty> Intersection
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
{
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 contexts 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