diff --git a/Tests/LibWeb/Text/expected/hit_testing/basic.txt b/Tests/LibWeb/Text/expected/hit_testing/basic.txt new file mode 100644 index 00000000000..cbe03600fd7 --- /dev/null +++ b/Tests/LibWeb/Text/expected/hit_testing/basic.txt @@ -0,0 +1 @@ + true diff --git a/Tests/LibWeb/Text/expected/hit_testing/text.txt b/Tests/LibWeb/Text/expected/hit_testing/text.txt new file mode 100644 index 00000000000..be483b517aa --- /dev/null +++ b/Tests/LibWeb/Text/expected/hit_testing/text.txt @@ -0,0 +1 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu ante est. Integer ipsum sem, tincidunt quis felis quis, efficitur fringilla neque. Aliquam erat volutpat. Donec feugiat euismod sapien. Donec vel egestas arcu. Suspendisse luctus rhoncus mi quis elementum. Maecenas vel nisi maximus, viverra tellus quis, ultrices elit. Quisque congue velit quis lectus congue, ut consectetur nulla pharetra. Nullam euismod leo eget magna auctor, et bibendum urna tincidunt. Morbi molestie gravida ex ac consectetur. Duis pretium gravida augue eu sagittis. 193 \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/hit_testing/basic.html b/Tests/LibWeb/Text/input/hit_testing/basic.html new file mode 100644 index 00000000000..ab18d4cdee7 --- /dev/null +++ b/Tests/LibWeb/Text/input/hit_testing/basic.html @@ -0,0 +1,17 @@ + +
+ + diff --git a/Tests/LibWeb/Text/input/hit_testing/text.html b/Tests/LibWeb/Text/input/hit_testing/text.html new file mode 100644 index 00000000000..85a1e921a6b --- /dev/null +++ b/Tests/LibWeb/Text/input/hit_testing/text.html @@ -0,0 +1,18 @@ + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu ante est. Integer ipsum sem, +tincidunt quis felis quis, efficitur fringilla neque. Aliquam erat volutpat. Donec feugiat euismod +sapien. Donec vel egestas arcu. Suspendisse luctus rhoncus mi quis elementum. Maecenas vel nisi +maximus, viverra tellus quis, ultrices elit. Quisque congue velit quis lectus congue, ut consectetur +nulla pharetra. Nullam euismod leo eget magna auctor, et bibendum urna tincidunt. Morbi molestie +gravida ex ac consectetur. Duis pretium gravida augue eu sagittis. + + diff --git a/Userland/Libraries/LibWeb/Internals/Internals.cpp b/Userland/Libraries/LibWeb/Internals/Internals.cpp index 503ff09a2e9..01f6a7acb09 100644 --- a/Userland/Libraries/LibWeb/Internals/Internals.cpp +++ b/Userland/Libraries/LibWeb/Internals/Internals.cpp @@ -7,7 +7,11 @@ #include #include #include +#include +#include +#include #include +#include namespace Web::Internals { @@ -29,4 +33,21 @@ void Internals::gc() vm().heap().collect_garbage(); } +JS::Object* Internals::hit_test(double x, double y) +{ + auto* active_document = global_object().browsing_context()->top_level_browsing_context().active_document(); + // NOTE: Force a layout update just before hit testing. This is because the current layout tree, which is required + // for stacking context traversal, might not exist if this call occurs between the tear_down_layout_tree() + // and update_layout() calls + active_document->update_layout(); + auto result = active_document->paintable_box()->hit_test({ x, y }, Painting::HitTestType::Exact); + if (result.has_value()) { + auto hit_tеsting_result = JS::Object::create(realm(), nullptr); + hit_tеsting_result->define_direct_property("node", result->dom_node(), JS::default_attributes); + hit_tеsting_result->define_direct_property("indexInNode", JS::Value(result->index_in_node), JS::default_attributes); + return hit_tеsting_result; + } + return nullptr; +} + } diff --git a/Userland/Libraries/LibWeb/Internals/Internals.h b/Userland/Libraries/LibWeb/Internals/Internals.h index cc584014892..0a15417edf3 100644 --- a/Userland/Libraries/LibWeb/Internals/Internals.h +++ b/Userland/Libraries/LibWeb/Internals/Internals.h @@ -17,6 +17,7 @@ public: virtual ~Internals() override; void gc(); + JS::Object* hit_test(double x, double y); private: explicit Internals(JS::Realm&); diff --git a/Userland/Libraries/LibWeb/Internals/Internals.idl b/Userland/Libraries/LibWeb/Internals/Internals.idl index 423e8e76432..769e5482425 100644 --- a/Userland/Libraries/LibWeb/Internals/Internals.idl +++ b/Userland/Libraries/LibWeb/Internals/Internals.idl @@ -1,5 +1,6 @@ [Exposed=Nobody] interface Internals { undefined gc(); + object hitTest(double x, double y); };