123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- /*
- * Copyright (c) 2020, Matthew Olsson <mattco@serenityos.org>
- * Copyright (c) 2023, Preston Taylor <95388976+PrestonLTaylor@users.noreply.github.com>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
- #include <LibWeb/Bindings/ExceptionOrUtils.h>
- #include <LibWeb/Bindings/Intrinsics.h>
- #include <LibWeb/DOM/Document.h>
- #include <LibWeb/DOM/ShadowRoot.h>
- #include <LibWeb/HTML/DOMStringMap.h>
- #include <LibWeb/SVG/SVGElement.h>
- #include <LibWeb/SVG/SVGUseElement.h>
- namespace Web::SVG {
- SVGElement::SVGElement(DOM::Document& document, DOM::QualifiedName qualified_name)
- : Element(document, move(qualified_name))
- {
- }
- void SVGElement::initialize(JS::Realm& realm)
- {
- Base::initialize(realm);
- WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGElement);
- m_dataset = HTML::DOMStringMap::create(*this);
- }
- void SVGElement::visit_edges(Cell::Visitor& visitor)
- {
- Base::visit_edges(visitor);
- visitor.visit(m_dataset);
- }
- void SVGElement::attribute_changed(FlyString const& name, Optional<String> const& value)
- {
- Base::attribute_changed(name, value);
- update_use_elements_that_reference_this();
- }
- void SVGElement::inserted()
- {
- Base::inserted();
- update_use_elements_that_reference_this();
- }
- void SVGElement::children_changed()
- {
- Base::children_changed();
- update_use_elements_that_reference_this();
- }
- void SVGElement::update_use_elements_that_reference_this()
- {
- if (is<SVGUseElement>(this)
- // If this element is in a shadow root, it already represents a clone and is not itself referenced.
- || is<DOM::ShadowRoot>(this->root())
- // If this does not have an id it cannot be referenced, no point in searching the entire DOM tree.
- || !id().has_value()
- // An unconnected node cannot have valid references.
- // This also prevents searches for elements that are in the process of being constructed - as clones.
- || !this->is_connected()
- // Each use element already listens for the completely_loaded event and then clones its referece,
- // we do not have to also clone it in the process of initial DOM building.
- || !document().is_completely_loaded()) {
- return;
- }
- document().for_each_in_subtree_of_type<SVGUseElement>([this](SVGUseElement& use_element) {
- use_element.svg_element_changed(*this);
- return IterationDecision::Continue;
- });
- }
- void SVGElement::removed_from(Node* parent)
- {
- Base::removed_from(parent);
- remove_from_use_element_that_reference_this();
- }
- void SVGElement::remove_from_use_element_that_reference_this()
- {
- if (is<SVGUseElement>(this) || !id().has_value()) {
- return;
- }
- document().for_each_in_subtree_of_type<SVGUseElement>([this](SVGUseElement& use_element) {
- use_element.svg_element_removed(*this);
- return IterationDecision::Continue;
- });
- }
- void SVGElement::focus()
- {
- dbgln("(STUBBED) SVGElement::focus()");
- }
- void SVGElement::blur()
- {
- dbgln("(STUBBED) SVGElement::blur()");
- }
- }
|