LibWeb: Pass the old attribute value to Element::attribute_changed()

This commit is contained in:
Tim Ledbetter 2024-07-09 20:18:41 +01:00 committed by Andreas Kling
parent 190a419715
commit a552bda8d9
Notes: sideshowbarker 2024-07-17 18:13:59 +09:00
71 changed files with 132 additions and 132 deletions

View file

@ -445,13 +445,13 @@ void Element::run_attribute_change_steps(FlyString const& local_name, Optional<S
attribute_change_steps(local_name, old_value, value, namespace_); attribute_change_steps(local_name, old_value, value, namespace_);
// AD-HOC: Run our own internal attribute change handler. // AD-HOC: Run our own internal attribute change handler.
attribute_changed(local_name, value); attribute_changed(local_name, old_value, value);
invalidate_style_after_attribute_change(local_name); invalidate_style_after_attribute_change(local_name);
document().bump_dom_tree_version(); document().bump_dom_tree_version();
} }
void Element::attribute_changed(FlyString const& name, Optional<String> const& value) void Element::attribute_changed(FlyString const& name, Optional<String> const&, Optional<String> const& value)
{ {
auto value_or_empty = value.value_or(String {}); auto value_or_empty = value.value_or(String {});

View file

@ -161,7 +161,7 @@ public:
virtual void attribute_change_steps(FlyString const& local_name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_); virtual void attribute_change_steps(FlyString const& local_name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_);
void run_attribute_change_steps(FlyString const& local_name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_); void run_attribute_change_steps(FlyString const& local_name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_);
virtual void attribute_changed(FlyString const& name, Optional<String> const& value); virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value);
CSS::RequiredInvalidationAfterStyleChange recompute_style(); CSS::RequiredInvalidationAfterStyleChange recompute_style();

View file

@ -19,33 +19,33 @@ namespace Web::HTML {
// HTMLElement::inserted() -> Use form_associated_element_was_inserted() // HTMLElement::inserted() -> Use form_associated_element_was_inserted()
// HTMLElement::removed_from() -> Use form_associated_element_was_removed() // HTMLElement::removed_from() -> Use form_associated_element_was_removed()
// //
#define FORM_ASSOCIATED_ELEMENT(ElementBaseClass, ElementClass) \ #define FORM_ASSOCIATED_ELEMENT(ElementBaseClass, ElementClass) \
private: \ private: \
virtual HTMLElement& form_associated_element_to_html_element() override \ virtual HTMLElement& form_associated_element_to_html_element() override \
{ \ { \
static_assert(IsBaseOf<HTMLElement, ElementClass>); \ static_assert(IsBaseOf<HTMLElement, ElementClass>); \
return *this; \ return *this; \
} \ } \
\ \
virtual void inserted() override \ virtual void inserted() override \
{ \ { \
ElementBaseClass::inserted(); \ ElementBaseClass::inserted(); \
form_node_was_inserted(); \ form_node_was_inserted(); \
form_associated_element_was_inserted(); \ form_associated_element_was_inserted(); \
} \ } \
\ \
virtual void removed_from(DOM::Node* node) override \ virtual void removed_from(DOM::Node* node) override \
{ \ { \
ElementBaseClass::removed_from(node); \ ElementBaseClass::removed_from(node); \
form_node_was_removed(); \ form_node_was_removed(); \
form_associated_element_was_removed(node); \ form_associated_element_was_removed(node); \
} \ } \
\ \
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override \ virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override \
{ \ { \
ElementBaseClass::attribute_changed(name, value); \ ElementBaseClass::attribute_changed(name, old_value, value); \
form_node_attribute_changed(name, value); \ form_node_attribute_changed(name, value); \
form_associated_element_attribute_changed(name, value); \ form_associated_element_attribute_changed(name, value); \
} }
class FormAssociatedElement { class FormAssociatedElement {

View file

@ -40,9 +40,9 @@ void HTMLAnchorElement::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_rel_list); visitor.visit(m_rel_list);
} }
void HTMLAnchorElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLAnchorElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
HTMLElement::attribute_changed(name, value); HTMLElement::attribute_changed(name, old_value, value);
if (name == HTML::AttributeNames::href) { if (name == HTML::AttributeNames::href) {
set_the_url(); set_the_url();
} else if (name == HTML::AttributeNames::rel) { } else if (name == HTML::AttributeNames::rel) {

View file

@ -45,7 +45,7 @@ private:
virtual void activation_behavior(Web::DOM::Event const&) override; virtual void activation_behavior(Web::DOM::Event const&) override;
// ^DOM::Element // ^DOM::Element
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual i32 default_tab_index_value() const override; virtual i32 default_tab_index_value() const override;
// ^HTML::HTMLHyperlinkElementUtils // ^HTML::HTMLHyperlinkElementUtils

View file

@ -33,9 +33,9 @@ void HTMLAreaElement::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_rel_list); visitor.visit(m_rel_list);
} }
void HTMLAreaElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLAreaElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
HTMLElement::attribute_changed(name, value); HTMLElement::attribute_changed(name, old_value, value);
if (name == HTML::AttributeNames::href) { if (name == HTML::AttributeNames::href) {
set_the_url(); set_the_url();
} else if (name == HTML::AttributeNames::rel) { } else if (name == HTML::AttributeNames::rel) {

View file

@ -29,7 +29,7 @@ private:
virtual void visit_edges(Cell::Visitor&) override; virtual void visit_edges(Cell::Visitor&) override;
// ^DOM::Element // ^DOM::Element
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual i32 default_tab_index_value() const override; virtual i32 default_tab_index_value() const override;
// ^HTML::HTMLHyperlinkElementUtils // ^HTML::HTMLHyperlinkElementUtils

View file

@ -46,9 +46,9 @@ void HTMLBaseElement::removed_from(Node* parent)
document().update_base_element({}); document().update_base_element({});
} }
void HTMLBaseElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLBaseElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
HTMLElement::attribute_changed(name, value); HTMLElement::attribute_changed(name, old_value, value);
// The frozen base URL must be immediately set for an element whenever any of the following situations occur: // The frozen base URL must be immediately set for an element whenever any of the following situations occur:
// - The base element is the first base element in tree order with an href content attribute in its Document, and its href content attribute is changed. // - The base element is the first base element in tree order with an href content attribute in its Document, and its href content attribute is changed.

View file

@ -24,7 +24,7 @@ public:
virtual void inserted() override; virtual void inserted() override;
virtual void removed_from(Node*) override; virtual void removed_from(Node*) override;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
private: private:
HTMLBaseElement(DOM::Document&, DOM::QualifiedName); HTMLBaseElement(DOM::Document&, DOM::QualifiedName);

View file

@ -59,9 +59,9 @@ void HTMLBodyElement::apply_presentational_hints(CSS::StyleProperties& style) co
}); });
} }
void HTMLBodyElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLBodyElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
HTMLElement::attribute_changed(name, value); HTMLElement::attribute_changed(name, old_value, value);
if (name.equals_ignoring_ascii_case("link"sv)) { if (name.equals_ignoring_ascii_case("link"sv)) {
// https://html.spec.whatwg.org/multipage/rendering.html#the-page:rules-for-parsing-a-legacy-colour-value-3 // https://html.spec.whatwg.org/multipage/rendering.html#the-page:rules-for-parsing-a-legacy-colour-value-3
auto color = parse_legacy_color_value(value.value_or(String {})); auto color = parse_legacy_color_value(value.value_or(String {}));

View file

@ -21,7 +21,7 @@ class HTMLBodyElement final
public: public:
virtual ~HTMLBodyElement() override; virtual ~HTMLBodyElement() override;
virtual void attribute_changed(FlyString const&, Optional<String> const&) override; virtual void attribute_changed(FlyString const&, Optional<String> const& old_value, Optional<String> const&) override;
virtual void apply_presentational_hints(CSS::StyleProperties&) const override; virtual void apply_presentational_hints(CSS::StyleProperties&) const override;
// https://www.w3.org/TR/html-aria/#el-body // https://www.w3.org/TR/html-aria/#el-body

View file

@ -53,9 +53,9 @@ void HTMLDetailsElement::removed_from(DOM::Node*)
set_shadow_root(nullptr); set_shadow_root(nullptr);
} }
void HTMLDetailsElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLDetailsElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
Base::attribute_changed(name, value); Base::attribute_changed(name, old_value, value);
// https://html.spec.whatwg.org/multipage/interactive-elements.html#details-notification-task-steps // https://html.spec.whatwg.org/multipage/interactive-elements.html#details-notification-task-steps
if (name == HTML::AttributeNames::open) { if (name == HTML::AttributeNames::open) {

View file

@ -34,7 +34,7 @@ private:
virtual void inserted() override; virtual void inserted() override;
virtual void removed_from(DOM::Node*) override; virtual void removed_from(DOM::Node*) override;
virtual void children_changed() override; virtual void children_changed() override;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
void queue_a_details_toggle_event_task(String old_state, String new_state); void queue_a_details_toggle_event_task(String old_state, String new_state);

View file

@ -358,9 +358,9 @@ bool HTMLElement::cannot_navigate() const
return !is<HTML::HTMLAnchorElement>(this) && !is_connected(); return !is<HTML::HTMLAnchorElement>(this) && !is_connected();
} }
void HTMLElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
Element::attribute_changed(name, value); Element::attribute_changed(name, old_value, value);
if (name == HTML::AttributeNames::contenteditable) { if (name == HTML::AttributeNames::contenteditable) {
if (!value.has_value()) { if (!value.has_value()) {

View file

@ -85,7 +85,7 @@ protected:
virtual void initialize(JS::Realm&) override; virtual void initialize(JS::Realm&) override;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual void visit_edges(Cell::Visitor&) override; virtual void visit_edges(Cell::Visitor&) override;

View file

@ -622,9 +622,9 @@ WebIDL::ExceptionOr<void> HTMLFormElement::set_action(String const& value)
return set_attribute(AttributeNames::action, value); return set_attribute(AttributeNames::action, value);
} }
void HTMLFormElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLFormElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
HTMLElement::attribute_changed(name, value); HTMLElement::attribute_changed(name, old_value, value);
if (name == HTML::AttributeNames::rel) { if (name == HTML::AttributeNames::rel) {
if (m_rel_list) if (m_rel_list)
m_rel_list->associated_attribute_changed(value.value_or(String {})); m_rel_list->associated_attribute_changed(value.value_or(String {}));

View file

@ -111,7 +111,7 @@ private:
virtual Vector<FlyString> supported_property_names() const override; virtual Vector<FlyString> supported_property_names() const override;
virtual bool is_supported_property_index(u32) const override; virtual bool is_supported_property_index(u32) const override;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
ErrorOr<String> pick_an_encoding() const; ErrorOr<String> pick_an_encoding() const;

View file

@ -26,9 +26,9 @@ void HTMLFrameSetElement::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(HTMLFrameSetElement); WEB_SET_PROTOTYPE_FOR_INTERFACE(HTMLFrameSetElement);
} }
void HTMLFrameSetElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLFrameSetElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
HTMLElement::attribute_changed(name, value); HTMLElement::attribute_changed(name, old_value, value);
#undef __ENUMERATE #undef __ENUMERATE
#define __ENUMERATE(attribute_name, event_name) \ #define __ENUMERATE(attribute_name, event_name) \

View file

@ -25,7 +25,7 @@ private:
HTMLFrameSetElement(DOM::Document&, DOM::QualifiedName); HTMLFrameSetElement(DOM::Document&, DOM::QualifiedName);
virtual void initialize(JS::Realm&) override; virtual void initialize(JS::Realm&) override;
virtual void attribute_changed(FlyString const&, Optional<String> const&) override; virtual void attribute_changed(FlyString const&, Optional<String> const& old_value, Optional<String> const&) override;
// ^HTML::GlobalEventHandlers // ^HTML::GlobalEventHandlers
virtual JS::GCPtr<EventTarget> global_event_handlers_to_event_target(FlyString const& event_name) override; virtual JS::GCPtr<EventTarget> global_event_handlers_to_event_target(FlyString const& event_name) override;

View file

@ -37,9 +37,9 @@ JS::GCPtr<Layout::Node> HTMLIFrameElement::create_layout_node(NonnullRefPtr<CSS:
return heap().allocate_without_realm<Layout::FrameBox>(document(), *this, move(style)); return heap().allocate_without_realm<Layout::FrameBox>(document(), *this, move(style));
} }
void HTMLIFrameElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLIFrameElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
HTMLElement::attribute_changed(name, value); HTMLElement::attribute_changed(name, old_value, value);
// https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element:process-the-iframe-attributes-2 // https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element:process-the-iframe-attributes-2
// https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element:process-the-iframe-attributes-3 // https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element:process-the-iframe-attributes-3

View file

@ -40,7 +40,7 @@ private:
// ^DOM::Element // ^DOM::Element
virtual void inserted() override; virtual void inserted() override;
virtual void removed_from(Node*) override; virtual void removed_from(Node*) override;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual i32 default_tab_index_value() const override; virtual i32 default_tab_index_value() const override;
// https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element:dimension-attributes // https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element:dimension-attributes

View file

@ -128,9 +128,9 @@ bool HTMLLinkElement::has_loaded_icon() const
return m_relationship & Relationship::Icon && resource() && resource()->is_loaded() && resource()->has_encoded_data(); return m_relationship & Relationship::Icon && resource() && resource()->is_loaded() && resource()->has_encoded_data();
} }
void HTMLLinkElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLLinkElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
HTMLElement::attribute_changed(name, value); HTMLElement::attribute_changed(name, old_value, value);
// 4.6.7 Link types - https://html.spec.whatwg.org/multipage/links.html#linkTypes // 4.6.7 Link types - https://html.spec.whatwg.org/multipage/links.html#linkTypes
if (name == HTML::AttributeNames::rel) { if (name == HTML::AttributeNames::rel) {

View file

@ -47,7 +47,7 @@ private:
HTMLLinkElement(DOM::Document&, DOM::QualifiedName); HTMLLinkElement(DOM::Document&, DOM::QualifiedName);
virtual void initialize(JS::Realm&) override; virtual void initialize(JS::Realm&) override;
virtual void attribute_changed(FlyString const&, Optional<String> const&) override; virtual void attribute_changed(FlyString const&, Optional<String> const& old_value, Optional<String> const&) override;
// ^ResourceClient // ^ResourceClient
virtual void resource_did_fail() override; virtual void resource_did_fail() override;

View file

@ -98,9 +98,9 @@ void HTMLMediaElement::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_pending_play_promises); visitor.visit(m_pending_play_promises);
} }
void HTMLMediaElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLMediaElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
Base::attribute_changed(name, value); Base::attribute_changed(name, old_value, value);
if (name == HTML::AttributeNames::src) { if (name == HTML::AttributeNames::src) {
load_element().release_value_but_fixme_should_propagate_errors(); load_element().release_value_but_fixme_should_propagate_errors();

View file

@ -139,7 +139,7 @@ protected:
virtual void finalize() override; virtual void finalize() override;
virtual void visit_edges(Cell::Visitor&) override; virtual void visit_edges(Cell::Visitor&) override;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual void removed_from(DOM::Node*) override; virtual void removed_from(DOM::Node*) override;
virtual void children_changed() override; virtual void children_changed() override;

View file

@ -34,9 +34,9 @@ void HTMLOptionElement::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(HTMLOptionElement); WEB_SET_PROTOTYPE_FOR_INTERFACE(HTMLOptionElement);
} }
void HTMLOptionElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLOptionElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
HTMLElement::attribute_changed(name, value); HTMLElement::attribute_changed(name, old_value, value);
if (name == HTML::AttributeNames::selected) { if (name == HTML::AttributeNames::selected) {
if (!value.has_value()) { if (!value.has_value()) {

View file

@ -43,7 +43,7 @@ private:
virtual void initialize(JS::Realm&) override; virtual void initialize(JS::Realm&) override;
void attribute_changed(FlyString const& name, Optional<String> const& value) override; void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
void ask_for_a_reset(); void ask_for_a_reset();

View file

@ -50,9 +50,9 @@ void HTMLScriptElement::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_preparation_time_document); visitor.visit(m_preparation_time_document);
} }
void HTMLScriptElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLScriptElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
Base::attribute_changed(name, value); Base::attribute_changed(name, old_value, value);
if (name == HTML::AttributeNames::crossorigin) { if (name == HTML::AttributeNames::crossorigin) {
m_crossorigin = cors_setting_attribute_from_keyword(value); m_crossorigin = cors_setting_attribute_from_keyword(value);

View file

@ -70,7 +70,7 @@ private:
virtual void initialize(JS::Realm&) override; virtual void initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override; virtual void visit_edges(Cell::Visitor&) override;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
// https://html.spec.whatwg.org/multipage/scripting.html#prepare-the-script-element // https://html.spec.whatwg.org/multipage/scripting.html#prepare-the-script-element
void prepare_script(); void prepare_script();

View file

@ -102,9 +102,9 @@ void HTMLTableElement::apply_presentational_hints(CSS::StyleProperties& style) c
}); });
} }
void HTMLTableElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLTableElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
Base::attribute_changed(name, value); Base::attribute_changed(name, old_value, value);
if (name == HTML::AttributeNames::cellpadding) { if (name == HTML::AttributeNames::cellpadding) {
if (value.has_value()) if (value.has_value())
m_padding = max(0, parse_integer(value.value()).value_or(0)); m_padding = max(0, parse_integer(value.value()).value_or(0));

View file

@ -59,7 +59,7 @@ private:
virtual void visit_edges(Cell::Visitor&) override; virtual void visit_edges(Cell::Visitor&) override;
virtual void apply_presentational_hints(CSS::StyleProperties&) const override; virtual void apply_presentational_hints(CSS::StyleProperties&) const override;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
JS::GCPtr<DOM::HTMLCollection> mutable m_rows; JS::GCPtr<DOM::HTMLCollection> mutable m_rows;
JS::GCPtr<DOM::HTMLCollection> mutable m_t_bodies; JS::GCPtr<DOM::HTMLCollection> mutable m_t_bodies;

View file

@ -35,9 +35,9 @@ void HTMLTrackElement::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_track); visitor.visit(m_track);
} }
void HTMLTrackElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLTrackElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
HTMLElement::attribute_changed(name, value); HTMLElement::attribute_changed(name, old_value, value);
// https://html.spec.whatwg.org/multipage/media.html#sourcing-out-of-band-text-tracks // https://html.spec.whatwg.org/multipage/media.html#sourcing-out-of-band-text-tracks
// As the kind, label, and srclang attributes are set, changed, or removed, the text track must update accordingly, as per the definitions above. // As the kind, label, and srclang attributes are set, changed, or removed, the text track must update accordingly, as per the definitions above.

View file

@ -28,7 +28,7 @@ private:
virtual void visit_edges(Cell::Visitor&) override; virtual void visit_edges(Cell::Visitor&) override;
// ^DOM::Element // ^DOM::Element
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
JS::GCPtr<TextTrack> m_track; JS::GCPtr<TextTrack> m_track;
}; };

View file

@ -53,9 +53,9 @@ void HTMLVideoElement::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_fetch_controller); visitor.visit(m_fetch_controller);
} }
void HTMLVideoElement::attribute_changed(FlyString const& name, Optional<String> const& value) void HTMLVideoElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
Base::attribute_changed(name, value); Base::attribute_changed(name, old_value, value);
if (name == HTML::AttributeNames::poster) { if (name == HTML::AttributeNames::poster) {
determine_element_poster_frame(value).release_value_but_fixme_should_propagate_errors(); determine_element_poster_frame(value).release_value_but_fixme_should_propagate_errors();

View file

@ -49,7 +49,7 @@ private:
virtual void finalize() override; virtual void finalize() override;
virtual void visit_edges(Cell::Visitor&) override; virtual void visit_edges(Cell::Visitor&) override;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
// https://html.spec.whatwg.org/multipage/media.html#the-video-element:dimension-attributes // https://html.spec.whatwg.org/multipage/media.html#the-video-element:dimension-attributes
virtual bool supports_dimension_attributes() const override { return true; } virtual bool supports_dimension_attributes() const override { return true; }

View file

@ -28,9 +28,9 @@ void SVGClipPathElement::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGClipPathElement); WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGClipPathElement);
} }
void SVGClipPathElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGClipPathElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGElement::attribute_changed(name, value); SVGElement::attribute_changed(name, old_value, value);
if (name == AttributeNames::clipPathUnits) if (name == AttributeNames::clipPathUnits)
m_clip_path_units = AttributeParser::parse_units(value.value_or(String {})); m_clip_path_units = AttributeParser::parse_units(value.value_or(String {}));
} }

View file

@ -33,7 +33,7 @@ public:
return PreserveAspectRatio { PreserveAspectRatio::Align::None, {} }; return PreserveAspectRatio { PreserveAspectRatio::Align::None, {} };
} }
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
ClipPathUnits clip_path_units() const ClipPathUnits clip_path_units() const
{ {

View file

@ -41,9 +41,9 @@ JS::NonnullGCPtr<HTML::DOMStringMap> SVGElement::dataset()
return *m_dataset; return *m_dataset;
} }
void SVGElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
Base::attribute_changed(name, value); Base::attribute_changed(name, old_value, value);
update_use_elements_that_reference_this(); update_use_elements_that_reference_this();
} }

View file

@ -17,7 +17,7 @@ class SVGElement : public DOM::Element {
public: public:
virtual bool requires_svg_container() const override { return true; } virtual bool requires_svg_container() const override { return true; }
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual void children_changed() override; virtual void children_changed() override;
virtual void inserted() override; virtual void inserted() override;

View file

@ -25,9 +25,9 @@ void SVGEllipseElement::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGEllipseElement); WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGEllipseElement);
} }
void SVGEllipseElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGEllipseElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGGeometryElement::attribute_changed(name, value); SVGGeometryElement::attribute_changed(name, old_value, value);
if (name == SVG::AttributeNames::cx) { if (name == SVG::AttributeNames::cx) {
m_center_x = AttributeParser::parse_coordinate(value.value_or(String {})); m_center_x = AttributeParser::parse_coordinate(value.value_or(String {}));

View file

@ -18,7 +18,7 @@ class SVGEllipseElement final : public SVGGeometryElement {
public: public:
virtual ~SVGEllipseElement() override = default; virtual ~SVGEllipseElement() override = default;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual Gfx::Path get_path(CSSPixelSize viewport_size) override; virtual Gfx::Path get_path(CSSPixelSize viewport_size) override;

View file

@ -19,9 +19,9 @@ SVGGradientElement::SVGGradientElement(DOM::Document& document, DOM::QualifiedNa
{ {
} }
void SVGGradientElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGGradientElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGElement::attribute_changed(name, value); SVGElement::attribute_changed(name, old_value, value);
if (name == AttributeNames::gradientUnits) { if (name == AttributeNames::gradientUnits) {
m_gradient_units = AttributeParser::parse_units(value.value_or(String {})); m_gradient_units = AttributeParser::parse_units(value.value_or(String {}));
} else if (name == AttributeNames::spreadMethod) { } else if (name == AttributeNames::spreadMethod) {

View file

@ -41,7 +41,7 @@ class SVGGradientElement : public SVGElement {
public: public:
virtual ~SVGGradientElement() override = default; virtual ~SVGGradientElement() override = default;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual Optional<Painting::PaintStyle> to_gfx_paint_style(SVGPaintContext const&) const = 0; virtual Optional<Painting::PaintStyle> to_gfx_paint_style(SVGPaintContext const&) const = 0;

View file

@ -37,9 +37,9 @@ void SVGGraphicsElement::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGGraphicsElement); WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGGraphicsElement);
} }
void SVGGraphicsElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGGraphicsElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGElement::attribute_changed(name, value); SVGElement::attribute_changed(name, old_value, value);
if (name == "transform"sv) { if (name == "transform"sv) {
auto transform_list = AttributeParser::parse_transform(value.value_or(String {})); auto transform_list = AttributeParser::parse_transform(value.value_or(String {}));
if (transform_list.has_value()) if (transform_list.has_value())

View file

@ -32,7 +32,7 @@ class SVGGraphicsElement : public SVGElement {
public: public:
virtual void apply_presentational_hints(CSS::StyleProperties&) const override; virtual void apply_presentational_hints(CSS::StyleProperties&) const override;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
Optional<Gfx::Color> fill_color() const; Optional<Gfx::Color> fill_color() const;
Optional<Gfx::Color> stroke_color() const; Optional<Gfx::Color> stroke_color() const;

View file

@ -25,9 +25,9 @@ void SVGLineElement::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGLineElement); WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGLineElement);
} }
void SVGLineElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGLineElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGGeometryElement::attribute_changed(name, value); SVGGeometryElement::attribute_changed(name, old_value, value);
if (name == SVG::AttributeNames::x1) { if (name == SVG::AttributeNames::x1) {
m_x1 = AttributeParser::parse_coordinate(value.value_or(String {})); m_x1 = AttributeParser::parse_coordinate(value.value_or(String {}));

View file

@ -18,7 +18,7 @@ class SVGLineElement final : public SVGGeometryElement {
public: public:
virtual ~SVGLineElement() override = default; virtual ~SVGLineElement() override = default;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual Gfx::Path get_path(CSSPixelSize viewport_size) override; virtual Gfx::Path get_path(CSSPixelSize viewport_size) override;

View file

@ -28,9 +28,9 @@ void SVGLinearGradientElement::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGLinearGradientElement); WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGLinearGradientElement);
} }
void SVGLinearGradientElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGLinearGradientElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGGradientElement::attribute_changed(name, value); SVGGradientElement::attribute_changed(name, old_value, value);
// FIXME: Should allow for `<number-percentage> | <length>` for x1, x2, y1, y2 // FIXME: Should allow for `<number-percentage> | <length>` for x1, x2, y1, y2
if (name == SVG::AttributeNames::x1) { if (name == SVG::AttributeNames::x1) {

View file

@ -19,7 +19,7 @@ class SVGLinearGradientElement : public SVGGradientElement {
public: public:
virtual ~SVGLinearGradientElement() override = default; virtual ~SVGLinearGradientElement() override = default;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual Optional<Painting::PaintStyle> to_gfx_paint_style(SVGPaintContext const&) const override; virtual Optional<Painting::PaintStyle> to_gfx_paint_style(SVGPaintContext const&) const override;

View file

@ -33,9 +33,9 @@ JS::GCPtr<Layout::Node> SVGMaskElement::create_layout_node(NonnullRefPtr<CSS::St
return nullptr; return nullptr;
} }
void SVGMaskElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGMaskElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGGraphicsElement::attribute_changed(name, value); SVGGraphicsElement::attribute_changed(name, old_value, value);
if (name == AttributeNames::maskUnits) { if (name == AttributeNames::maskUnits) {
m_mask_units = AttributeParser::parse_units(value.value_or(String {})); m_mask_units = AttributeParser::parse_units(value.value_or(String {}));
} else if (name == AttributeNames::maskContentUnits) { } else if (name == AttributeNames::maskContentUnits) {

View file

@ -36,7 +36,7 @@ public:
return PreserveAspectRatio { PreserveAspectRatio::Align::None, {} }; return PreserveAspectRatio { PreserveAspectRatio::Align::None, {} };
} }
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual JS::GCPtr<Layout::Node> create_layout_node(NonnullRefPtr<CSS::StyleProperties>) override; virtual JS::GCPtr<Layout::Node> create_layout_node(NonnullRefPtr<CSS::StyleProperties>) override;

View file

@ -96,9 +96,9 @@ void SVGPathElement::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGPathElement); WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGPathElement);
} }
void SVGPathElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGPathElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGGeometryElement::attribute_changed(name, value); SVGGeometryElement::attribute_changed(name, old_value, value);
if (name == "d") if (name == "d")
m_instructions = AttributeParser::parse_path_data(value.value_or(String {})); m_instructions = AttributeParser::parse_path_data(value.value_or(String {}));

View file

@ -20,7 +20,7 @@ class SVGPathElement final : public SVGGeometryElement {
public: public:
virtual ~SVGPathElement() override = default; virtual ~SVGPathElement() override = default;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual Gfx::Path get_path(CSSPixelSize viewport_size) override; virtual Gfx::Path get_path(CSSPixelSize viewport_size) override;

View file

@ -25,9 +25,9 @@ void SVGPolygonElement::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGPolygonElement); WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGPolygonElement);
} }
void SVGPolygonElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGPolygonElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGGeometryElement::attribute_changed(name, value); SVGGeometryElement::attribute_changed(name, old_value, value);
if (name == SVG::AttributeNames::points) if (name == SVG::AttributeNames::points)
m_points = AttributeParser::parse_points(value.value_or(String {})); m_points = AttributeParser::parse_points(value.value_or(String {}));

View file

@ -17,7 +17,7 @@ class SVGPolygonElement final : public SVGGeometryElement {
public: public:
virtual ~SVGPolygonElement() override = default; virtual ~SVGPolygonElement() override = default;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual Gfx::Path get_path(CSSPixelSize viewport_size) override; virtual Gfx::Path get_path(CSSPixelSize viewport_size) override;

View file

@ -25,9 +25,9 @@ void SVGPolylineElement::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGPolylineElement); WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGPolylineElement);
} }
void SVGPolylineElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGPolylineElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGGeometryElement::attribute_changed(name, value); SVGGeometryElement::attribute_changed(name, old_value, value);
if (name == SVG::AttributeNames::points) if (name == SVG::AttributeNames::points)
m_points = AttributeParser::parse_points(value.value_or(String {})); m_points = AttributeParser::parse_points(value.value_or(String {}));

View file

@ -17,7 +17,7 @@ class SVGPolylineElement final : public SVGGeometryElement {
public: public:
virtual ~SVGPolylineElement() override = default; virtual ~SVGPolylineElement() override = default;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual Gfx::Path get_path(CSSPixelSize viewport_size) override; virtual Gfx::Path get_path(CSSPixelSize viewport_size) override;

View file

@ -25,9 +25,9 @@ void SVGRadialGradientElement::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGRadialGradientElement); WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGRadialGradientElement);
} }
void SVGRadialGradientElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGRadialGradientElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGGradientElement::attribute_changed(name, value); SVGGradientElement::attribute_changed(name, old_value, value);
// FIXME: These are <length> or <coordinate> in the spec, but all examples seem to allow percentages // FIXME: These are <length> or <coordinate> in the spec, but all examples seem to allow percentages
// and unitless values. // and unitless values.

View file

@ -19,7 +19,7 @@ class SVGRadialGradientElement : public SVGGradientElement {
public: public:
virtual ~SVGRadialGradientElement() override = default; virtual ~SVGRadialGradientElement() override = default;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual Optional<Painting::PaintStyle> to_gfx_paint_style(SVGPaintContext const&) const override; virtual Optional<Painting::PaintStyle> to_gfx_paint_style(SVGPaintContext const&) const override;

View file

@ -27,9 +27,9 @@ void SVGRectElement::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGRectElement); WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGRectElement);
} }
void SVGRectElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGRectElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGGeometryElement::attribute_changed(name, value); SVGGeometryElement::attribute_changed(name, old_value, value);
if (name == SVG::AttributeNames::x) { if (name == SVG::AttributeNames::x) {
m_x = AttributeParser::parse_coordinate(value.value_or(String {})); m_x = AttributeParser::parse_coordinate(value.value_or(String {}));

View file

@ -18,7 +18,7 @@ class SVGRectElement final : public SVGGeometryElement {
public: public:
virtual ~SVGRectElement() override = default; virtual ~SVGRectElement() override = default;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual Gfx::Path get_path(CSSPixelSize viewport_size) override; virtual Gfx::Path get_path(CSSPixelSize viewport_size) override;

View file

@ -84,9 +84,9 @@ void SVGSVGElement::apply_presentational_hints(CSS::StyleProperties& style) cons
} }
} }
void SVGSVGElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGSVGElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGGraphicsElement::attribute_changed(name, value); SVGGraphicsElement::attribute_changed(name, old_value, value);
if (name.equals_ignoring_ascii_case(SVG::AttributeNames::viewBox)) { if (name.equals_ignoring_ascii_case(SVG::AttributeNames::viewBox)) {
if (!value.has_value()) { if (!value.has_value()) {

View file

@ -88,7 +88,7 @@ private:
virtual bool is_svg_svg_element() const override { return true; } virtual bool is_svg_svg_element() const override { return true; }
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
void update_fallback_view_box_for_svg_as_image(); void update_fallback_view_box_for_svg_as_image();

View file

@ -21,9 +21,9 @@ SVGStopElement::SVGStopElement(DOM::Document& document, DOM::QualifiedName quali
{ {
} }
void SVGStopElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGStopElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGElement::attribute_changed(name, value); SVGElement::attribute_changed(name, old_value, value);
if (name == SVG::AttributeNames::offset) { if (name == SVG::AttributeNames::offset) {
m_offset = AttributeParser::parse_number_percentage(value.value_or(String {})); m_offset = AttributeParser::parse_number_percentage(value.value_or(String {}));
} }

View file

@ -20,7 +20,7 @@ class SVGStopElement final : public SVGElement {
public: public:
virtual ~SVGStopElement() override = default; virtual ~SVGStopElement() override = default;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
JS::NonnullGCPtr<SVGAnimatedNumber> offset() const; JS::NonnullGCPtr<SVGAnimatedNumber> offset() const;

View file

@ -42,9 +42,9 @@ void SVGSymbolElement::apply_presentational_hints(CSS::StyleProperties& style) c
} }
} }
void SVGSymbolElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGSymbolElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
Base::attribute_changed(name, value); Base::attribute_changed(name, old_value, value);
if (name.equals_ignoring_ascii_case(SVG::AttributeNames::viewBox)) if (name.equals_ignoring_ascii_case(SVG::AttributeNames::viewBox))
m_view_box = try_parse_view_box(value.value_or(String {})); m_view_box = try_parse_view_box(value.value_or(String {}));
} }

View file

@ -37,7 +37,7 @@ private:
bool is_direct_child_of_use_shadow_tree() const; bool is_direct_child_of_use_shadow_tree() const;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
Optional<ViewBox> m_view_box; Optional<ViewBox> m_view_box;
}; };

View file

@ -29,9 +29,9 @@ void SVGTextPositioningElement::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGTextPositioningElement); WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGTextPositioningElement);
} }
void SVGTextPositioningElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGTextPositioningElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
SVGGraphicsElement::attribute_changed(name, value); SVGGraphicsElement::attribute_changed(name, old_value, value);
if (name == SVG::AttributeNames::x) { if (name == SVG::AttributeNames::x) {
m_x = AttributeParser::parse_coordinate(value.value_or(String {})).value_or(m_x); m_x = AttributeParser::parse_coordinate(value.value_or(String {})).value_or(m_x);

View file

@ -16,7 +16,7 @@ class SVGTextPositioningElement : public SVGTextContentElement {
WEB_PLATFORM_OBJECT(SVGTextPositioningElement, SVGTextContentElement); WEB_PLATFORM_OBJECT(SVGTextPositioningElement, SVGTextContentElement);
public: public:
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
Gfx::FloatPoint get_offset() const; Gfx::FloatPoint get_offset() const;

View file

@ -50,9 +50,9 @@ void SVGUseElement::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_document_observer); visitor.visit(m_document_observer);
} }
void SVGUseElement::attribute_changed(FlyString const& name, Optional<String> const& value) void SVGUseElement::attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value)
{ {
Base::attribute_changed(name, value); Base::attribute_changed(name, old_value, value);
// https://svgwg.org/svg2-draft/struct.html#UseLayout // https://svgwg.org/svg2-draft/struct.html#UseLayout
if (name == SVG::AttributeNames::x) { if (name == SVG::AttributeNames::x) {

View file

@ -24,7 +24,7 @@ class SVGUseElement final
public: public:
virtual ~SVGUseElement() override = default; virtual ~SVGUseElement() override = default;
virtual void attribute_changed(FlyString const& name, Optional<String> const& value) override; virtual void attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value) override;
virtual void inserted() override; virtual void inserted() override;