ladybird/Userland/Libraries/LibWeb/DOM/Utils.cpp
circl 37f93e4be1 LibWeb: Replace templated retarget function with a regular one
The templating is not necessary anywhere and was effectively just a cast
2024-07-21 16:01:32 -06:00

41 lines
1.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2020, Luke Wilde <lukew@serenityos.org>
* Copyright (c) 2024, circl <circl.lastname@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/DOM/EventTarget.h>
#include <LibWeb/DOM/Node.h>
#include <LibWeb/DOM/ShadowRoot.h>
#include <LibWeb/DOM/Utils.h>
namespace Web::DOM {
// https://dom.spec.whatwg.org/#retarget
EventTarget* retarget(EventTarget* a, EventTarget* b)
{
// To retarget an object A against an object B, repeat these steps until they return an object:
for (;;) {
// 1. If one of the following is true then return A.
// - A is not a node
if (!is<Node>(a))
return a;
// - As root is not a shadow root
auto* a_node = verify_cast<Node>(a);
auto& a_root = a_node->root();
if (!is<ShadowRoot>(a_root))
return a;
// - B is a node and As root is a shadow-including inclusive ancestor of B
if (is<Node>(b) && a_root.is_shadow_including_inclusive_ancestor_of(verify_cast<Node>(*b)))
return a;
// 2. Set A to As roots host.
auto& a_shadow_root = verify_cast<ShadowRoot>(a_root);
a = a_shadow_root.host();
}
}
}