[librsvg] element: rename NodeTrait to ElementTrait



commit 0a70c46b0efc25ecba43aa7ca44820793ffa9d08
Author: Paolo Borelli <pborelli gnome org>
Date:   Tue Mar 17 09:42:02 2020 +0100

    element: rename NodeTrait to ElementTrait

 rsvg_internals/src/element.rs                    | 60 ++++++++++++++++++++----
 rsvg_internals/src/filter.rs                     |  6 +--
 rsvg_internals/src/filters/blend.rs              |  6 +--
 rsvg_internals/src/filters/color_matrix.rs       |  6 +--
 rsvg_internals/src/filters/component_transfer.rs | 10 ++--
 rsvg_internals/src/filters/composite.rs          |  6 +--
 rsvg_internals/src/filters/convolve_matrix.rs    |  6 +--
 rsvg_internals/src/filters/displacement_map.rs   |  6 +--
 rsvg_internals/src/filters/flood.rs              |  6 +--
 rsvg_internals/src/filters/gaussian_blur.rs      |  6 +--
 rsvg_internals/src/filters/image.rs              |  6 +--
 rsvg_internals/src/filters/light/light_source.rs | 10 ++--
 rsvg_internals/src/filters/light/lighting.rs     |  8 ++--
 rsvg_internals/src/filters/merge.rs              |  8 ++--
 rsvg_internals/src/filters/mod.rs                | 14 +++---
 rsvg_internals/src/filters/morphology.rs         |  6 +--
 rsvg_internals/src/filters/offset.rs             |  6 +--
 rsvg_internals/src/filters/tile.rs               |  6 +--
 rsvg_internals/src/filters/turbulence.rs         |  6 +--
 rsvg_internals/src/gradient.rs                   | 10 ++--
 rsvg_internals/src/image.rs                      |  6 +--
 rsvg_internals/src/lib.rs                        |  4 +-
 rsvg_internals/src/marker.rs                     |  6 +--
 rsvg_internals/src/node.rs                       | 45 ++----------------
 rsvg_internals/src/pattern.rs                    |  6 +--
 rsvg_internals/src/shapes.rs                     | 18 +++----
 rsvg_internals/src/structure.rs                  | 22 ++++-----
 rsvg_internals/src/style.rs                      |  6 +--
 rsvg_internals/src/text.rs                       | 10 ++--
 29 files changed, 162 insertions(+), 159 deletions(-)
---
diff --git a/rsvg_internals/src/element.rs b/rsvg_internals/src/element.rs
index de11afee..44d7098c 100644
--- a/rsvg_internals/src/element.rs
+++ b/rsvg_internals/src/element.rs
@@ -5,14 +5,18 @@
 //!
 //! [`create_element`]: fn.create_element.html
 
+use downcast_rs::*;
 use locale_config::Locale;
 use markup5ever::{expanded_name, local_name, namespace_url, ns, QualName};
 use once_cell::sync::Lazy;
 use std::collections::{HashMap, HashSet};
 use std::fmt;
 
+use crate::bbox::BoundingBox;
 use crate::cond::{RequiredExtensions, RequiredFeatures, SystemLanguage};
 use crate::css::Declaration;
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
 use crate::error::*;
 use crate::filter::Filter;
 use crate::filters::{
@@ -34,6 +38,7 @@ use crate::filters::{
     offset::FeOffset,
     tile::FeTile,
     turbulence::FeTurbulence,
+    FilterEffect,
 };
 use crate::gradient::{LinearGradient, RadialGradient, Stop};
 use crate::image::Image;
@@ -129,6 +134,43 @@ pub enum ElementType {
 // validator, not a renderer like librsvg is.
 pub type ElementResult = Result<(), ElementError>;
 
+/// The basic trait that all elements must implement
+pub trait ElementTrait: Downcast {
+    /// Sets per-element attributes from the `pbag`
+    ///
+    /// Each element is supposed to iterate the `pbag`, and parse any attributes it needs.
+    fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult;
+
+    /// Sets any special-cased properties that the element may have, that are different
+    /// from defaults in the element's `SpecifiedValues`.
+    fn set_overridden_properties(&self, _values: &mut SpecifiedValues) {}
+
+    /// Whether this element has overflow:hidden.
+    /// https://www.w3.org/TR/SVG/styling.html#UAStyleSheet
+    fn overflow_hidden(&self) -> bool {
+        false
+    }
+
+    fn draw(
+        &self,
+        _node: &Node,
+        _acquired_nodes: &mut AcquiredNodes,
+        _cascaded: &CascadedValues<'_>,
+        draw_ctx: &mut DrawingCtx,
+        _clipping: bool,
+    ) -> Result<BoundingBox, RenderingError> {
+        // by default elements don't draw themselves
+        Ok(draw_ctx.empty_bbox())
+    }
+
+    /// Returns the FilterEffect trait if this element is a filter primitive
+    fn as_filter_effect(&self) -> Option<&dyn FilterEffect> {
+        None
+    }
+}
+
+impl_downcast!(ElementTrait);
+
 /// Contents of an element node in the DOM
 pub struct Element {
     element_type: ElementType,
@@ -142,7 +184,7 @@ pub struct Element {
     values: ComputedValues,
     cond: bool,
     style_attr: String,
-    node_impl: Box<dyn NodeTrait>,
+    element_impl: Box<dyn ElementTrait>,
 }
 
 impl Element {
@@ -150,12 +192,12 @@ impl Element {
         self.element_type
     }
 
-    pub fn get_node_trait(&self) -> &dyn NodeTrait {
-        self.node_impl.as_ref()
+    pub fn get_element_trait(&self) -> &dyn ElementTrait {
+        self.element_impl.as_ref()
     }
 
-    pub fn get_impl<T: NodeTrait>(&self) -> &T {
-        if let Some(t) = (&self.node_impl).downcast_ref::<T>() {
+    pub fn get_impl<T: ElementTrait>(&self) -> &T {
+        if let Some(t) = (&self.element_impl).downcast_ref::<T>() {
             t
         } else {
             panic!("could not downcast");
@@ -199,7 +241,7 @@ impl Element {
     }
 
     pub fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>, locale: &Locale) {
-        if self.node_impl.overflow_hidden() {
+        if self.element_impl.overflow_hidden() {
             self.specified_values.overflow = SpecifiedValue::Specified(Overflow::Hidden);
         }
 
@@ -208,13 +250,13 @@ impl Element {
         if let Err(e) = self
             .set_transform_attribute(pbag)
             .and_then(|_| self.set_conditional_processing_attributes(pbag, locale))
-            .and_then(|_| self.node_impl.set_atts(parent, pbag))
+            .and_then(|_| self.element_impl.set_atts(parent, pbag))
             .and_then(|_| self.set_presentation_attributes(pbag))
         {
             self.set_error(e);
         }
 
-        self.node_impl
+        self.element_impl
             .set_overridden_properties(&mut self.specified_values);
     }
 
@@ -358,7 +400,7 @@ macro_rules! e {
                 values: ComputedValues::default(),
                 cond: true,
                 style_attr: String::new(),
-                node_impl: Box::new(<$element_type>::default()),
+                element_impl: Box::new(<$element_type>::default()),
             }
         }
     };
diff --git a/rsvg_internals/src/filter.rs b/rsvg_internals/src/filter.rs
index 52af7900..5553010d 100644
--- a/rsvg_internals/src/filter.rs
+++ b/rsvg_internals/src/filter.rs
@@ -5,10 +5,10 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 use crate::bbox::BoundingBox;
 use crate::coord_units::CoordUnits;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::ValueErrorKind;
 use crate::length::*;
-use crate::node::{Node, NodeTrait};
+use crate::node::Node;
 use crate::parsers::{Parse, ParseValue};
 use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
@@ -111,7 +111,7 @@ impl Filter {
     }
 }
 
-impl NodeTrait for Filter {
+impl ElementTrait for Filter {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         // Parse filterUnits first as it affects x, y, width, height checks.
         for (attr, value) in pbag.iter() {
diff --git a/rsvg_internals/src/filters/blend.rs b/rsvg_internals/src/filters/blend.rs
index 0107953c..13b05181 100755
--- a/rsvg_internals/src/filters/blend.rs
+++ b/rsvg_internals/src/filters/blend.rs
@@ -3,9 +3,9 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::*;
-use crate::node::{Node, NodeTrait};
+use crate::node::Node;
 use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 
@@ -53,7 +53,7 @@ impl Default for FeBlend {
     }
 }
 
-impl NodeTrait for FeBlend {
+impl ElementTrait for FeBlend {
     impl_node_as_filter_effect!();
 
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
diff --git a/rsvg_internals/src/filters/color_matrix.rs b/rsvg_internals/src/filters/color_matrix.rs
index e4c0547a..f26be941 100644
--- a/rsvg_internals/src/filters/color_matrix.rs
+++ b/rsvg_internals/src/filters/color_matrix.rs
@@ -4,9 +4,9 @@ use nalgebra::{Matrix3, Matrix4x5, Matrix5, Vector5};
 
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::*;
-use crate::node::{Node, NodeTrait};
+use crate::node::Node;
 use crate::number_list::{NumberList, NumberListLength};
 use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
@@ -51,7 +51,7 @@ impl Default for FeColorMatrix {
 }
 
 #[rustfmt::skip]
-impl NodeTrait for FeColorMatrix {
+impl ElementTrait for FeColorMatrix {
     impl_node_as_filter_effect!();
 
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
diff --git a/rsvg_internals/src/filters/component_transfer.rs 
b/rsvg_internals/src/filters/component_transfer.rs
index 78b5f10d..a4711ea6 100644
--- a/rsvg_internals/src/filters/component_transfer.rs
+++ b/rsvg_internals/src/filters/component_transfer.rs
@@ -5,9 +5,9 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::{ElementResult, ElementType};
+use crate::element::{ElementResult, ElementTrait, ElementType};
 use crate::error::*;
-use crate::node::{Node, NodeBorrow, NodeTrait};
+use crate::node::{Node, NodeBorrow};
 use crate::number_list::{NumberList, NumberListLength};
 use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
@@ -34,7 +34,7 @@ impl Default for FeComponentTransfer {
     }
 }
 
-impl NodeTrait for FeComponentTransfer {
+impl ElementTrait for FeComponentTransfer {
     impl_node_as_filter_effect!();
 
     #[inline]
@@ -199,7 +199,7 @@ macro_rules! func_x {
             }
         }
 
-        impl NodeTrait for $func_name {
+        impl ElementTrait for $func_name {
             #[inline]
             fn set_atts(
                 &mut self,
@@ -291,7 +291,7 @@ impl FilterEffect for FeComponentTransfer {
         // Get a node for every pixel component.
         fn get_node<F>(node: &Node, element_type: ElementType, channel: Channel) -> Option<Node>
         where
-            F: FeComponentTransferFunc + NodeTrait,
+            F: FeComponentTransferFunc + ElementTrait,
         {
             node.children()
                 .rev()
diff --git a/rsvg_internals/src/filters/composite.rs b/rsvg_internals/src/filters/composite.rs
index 87cdf6d2..5e7babac 100644
--- a/rsvg_internals/src/filters/composite.rs
+++ b/rsvg_internals/src/filters/composite.rs
@@ -3,9 +3,9 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::*;
-use crate::node::{Node, NodeTrait};
+use crate::node::Node;
 use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 
@@ -51,7 +51,7 @@ impl Default for FeComposite {
     }
 }
 
-impl NodeTrait for FeComposite {
+impl ElementTrait for FeComposite {
     impl_node_as_filter_effect!();
 
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
diff --git a/rsvg_internals/src/filters/convolve_matrix.rs b/rsvg_internals/src/filters/convolve_matrix.rs
index 0ffa9a90..5491a30c 100644
--- a/rsvg_internals/src/filters/convolve_matrix.rs
+++ b/rsvg_internals/src/filters/convolve_matrix.rs
@@ -4,9 +4,9 @@ use nalgebra::{DMatrix, Dynamic, VecStorage};
 
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::*;
-use crate::node::{Node, NodeTrait};
+use crate::node::Node;
 use crate::number_list::{NumberList, NumberListLength};
 use crate::parsers::{NumberOptionalNumber, Parse, ParseValue};
 use crate::property_bag::PropertyBag;
@@ -54,7 +54,7 @@ impl Default for FeConvolveMatrix {
     }
 }
 
-impl NodeTrait for FeConvolveMatrix {
+impl ElementTrait for FeConvolveMatrix {
     impl_node_as_filter_effect!();
 
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
diff --git a/rsvg_internals/src/filters/displacement_map.rs b/rsvg_internals/src/filters/displacement_map.rs
index 94dd57ff..e9ce7ade 100644
--- a/rsvg_internals/src/filters/displacement_map.rs
+++ b/rsvg_internals/src/filters/displacement_map.rs
@@ -3,9 +3,9 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::*;
-use crate::node::{Node, NodeTrait};
+use crate::node::Node;
 use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::surface_utils::{iterators::Pixels, shared_surface::ExclusiveImageSurface};
@@ -45,7 +45,7 @@ impl Default for FeDisplacementMap {
     }
 }
 
-impl NodeTrait for FeDisplacementMap {
+impl ElementTrait for FeDisplacementMap {
     impl_node_as_filter_effect!();
 
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
diff --git a/rsvg_internals/src/filters/flood.rs b/rsvg_internals/src/filters/flood.rs
index c5922fb6..9ff8d942 100644
--- a/rsvg_internals/src/filters/flood.rs
+++ b/rsvg_internals/src/filters/flood.rs
@@ -1,7 +1,7 @@
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
-use crate::node::{CascadedValues, Node, NodeTrait};
+use crate::element::{ElementResult, ElementTrait};
+use crate::node::{CascadedValues, Node};
 use crate::property_bag::PropertyBag;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
@@ -22,7 +22,7 @@ impl Default for FeFlood {
     }
 }
 
-impl NodeTrait for FeFlood {
+impl ElementTrait for FeFlood {
     impl_node_as_filter_effect!();
 
     #[inline]
diff --git a/rsvg_internals/src/filters/gaussian_blur.rs b/rsvg_internals/src/filters/gaussian_blur.rs
index 62520f17..13570360 100644
--- a/rsvg_internals/src/filters/gaussian_blur.rs
+++ b/rsvg_internals/src/filters/gaussian_blur.rs
@@ -6,9 +6,9 @@ use nalgebra::{DMatrix, Dynamic, VecStorage};
 
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::*;
-use crate::node::{Node, NodeTrait};
+use crate::node::Node;
 use crate::parsers::{NumberOptionalNumber, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::rect::IRect;
@@ -42,7 +42,7 @@ impl Default for FeGaussianBlur {
     }
 }
 
-impl NodeTrait for FeGaussianBlur {
+impl ElementTrait for FeGaussianBlur {
     impl_node_as_filter_effect!();
 
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
diff --git a/rsvg_internals/src/filters/image.rs b/rsvg_internals/src/filters/image.rs
index 927cdcb3..7beb15f2 100644
--- a/rsvg_internals/src/filters/image.rs
+++ b/rsvg_internals/src/filters/image.rs
@@ -4,9 +4,9 @@ use crate::allowed_url::{Fragment, Href};
 use crate::aspect_ratio::AspectRatio;
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::*;
-use crate::node::{CascadedValues, Node, NodeTrait};
+use crate::node::{CascadedValues, Node};
 use crate::parsers::ParseValue;
 use crate::property_bag::PropertyBag;
 use crate::rect::Rect;
@@ -110,7 +110,7 @@ impl FeImage {
     }
 }
 
-impl NodeTrait for FeImage {
+impl ElementTrait for FeImage {
     impl_node_as_filter_effect!();
 
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
diff --git a/rsvg_internals/src/filters/light/light_source.rs 
b/rsvg_internals/src/filters/light/light_source.rs
index c0b18738..665523b5 100644
--- a/rsvg_internals/src/filters/light/light_source.rs
+++ b/rsvg_internals/src/filters/light/light_source.rs
@@ -2,9 +2,9 @@ use cssparser;
 use markup5ever::{expanded_name, local_name, namespace_url, ns};
 use nalgebra::Vector3;
 
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::filters::context::FilterContext;
-use crate::node::{Node, NodeTrait};
+use crate::node::Node;
 use crate::parsers::ParseValue;
 use crate::property_bag::PropertyBag;
 use crate::util::clamp;
@@ -103,7 +103,7 @@ impl FeDistantLight {
     }
 }
 
-impl NodeTrait for FeDistantLight {
+impl ElementTrait for FeDistantLight {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
@@ -135,7 +135,7 @@ impl FePointLight {
     }
 }
 
-impl NodeTrait for FePointLight {
+impl ElementTrait for FePointLight {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
@@ -184,7 +184,7 @@ impl FeSpotLight {
     }
 }
 
-impl NodeTrait for FeSpotLight {
+impl ElementTrait for FeSpotLight {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
diff --git a/rsvg_internals/src/filters/light/lighting.rs b/rsvg_internals/src/filters/light/lighting.rs
index 2541d4f4..97f51f73 100644
--- a/rsvg_internals/src/filters/light/lighting.rs
+++ b/rsvg_internals/src/filters/light/lighting.rs
@@ -7,7 +7,7 @@ use rayon::prelude::*;
 
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::{ElementResult, ElementType};
+use crate::element::{ElementResult, ElementTrait, ElementType};
 use crate::error::*;
 use crate::filters::{
     context::{FilterContext, FilterOutput, FilterResult},
@@ -19,7 +19,7 @@ use crate::filters::{
     },
     FilterEffect, FilterError, PrimitiveWithInput,
 };
-use crate::node::{CascadedValues, Node, NodeBorrow, NodeTrait};
+use crate::node::{CascadedValues, Node, NodeBorrow};
 use crate::parsers::{NumberOptionalNumber, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::surface_utils::{
@@ -93,7 +93,7 @@ impl Default for FeDiffuseLighting {
     }
 }
 
-impl NodeTrait for FeDiffuseLighting {
+impl ElementTrait for FeDiffuseLighting {
     impl_node_as_filter_effect!();
 
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
@@ -162,7 +162,7 @@ impl Default for FeSpecularLighting {
     }
 }
 
-impl NodeTrait for FeSpecularLighting {
+impl ElementTrait for FeSpecularLighting {
     impl_node_as_filter_effect!();
 
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
diff --git a/rsvg_internals/src/filters/merge.rs b/rsvg_internals/src/filters/merge.rs
index 2970b24b..fc32c54e 100644
--- a/rsvg_internals/src/filters/merge.rs
+++ b/rsvg_internals/src/filters/merge.rs
@@ -2,8 +2,8 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::{ElementResult, ElementType};
-use crate::node::{Node, NodeBorrow, NodeTrait};
+use crate::element::{ElementResult, ElementTrait, ElementType};
+use crate::node::{Node, NodeBorrow};
 use crate::parsers::ParseValue;
 use crate::property_bag::PropertyBag;
 use crate::rect::IRect;
@@ -34,7 +34,7 @@ impl Default for FeMerge {
     }
 }
 
-impl NodeTrait for FeMerge {
+impl ElementTrait for FeMerge {
     impl_node_as_filter_effect!();
 
     #[inline]
@@ -43,7 +43,7 @@ impl NodeTrait for FeMerge {
     }
 }
 
-impl NodeTrait for FeMergeNode {
+impl ElementTrait for FeMergeNode {
     #[inline]
     fn set_atts(&mut self, _parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
diff --git a/rsvg_internals/src/filters/mod.rs b/rsvg_internals/src/filters/mod.rs
index 45046e65..6952a767 100644
--- a/rsvg_internals/src/filters/mod.rs
+++ b/rsvg_internals/src/filters/mod.rs
@@ -9,11 +9,11 @@ use crate::bbox::BoundingBox;
 use crate::coord_units::CoordUnits;
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::{ElementResult, ElementType};
+use crate::element::{ElementResult, ElementTrait, ElementType};
 use crate::error::{RenderingError, ValueErrorKind};
 use crate::filter::Filter;
 use crate::length::*;
-use crate::node::{CascadedValues, Node, NodeBorrow, NodeTrait};
+use crate::node::{CascadedValues, Node, NodeBorrow};
 use crate::parsers::ParseValue;
 use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
@@ -33,7 +33,7 @@ mod input;
 use self::input::{CustomIdent, Input};
 
 /// A filter primitive interface.
-pub trait FilterEffect: NodeTrait {
+pub trait FilterEffect: ElementTrait {
     /// Renders this filter primitive.
     ///
     /// If this filter primitive can't be rendered for whatever reason (for instance, a required
@@ -113,7 +113,7 @@ impl Primitive {
     }
 }
 
-impl NodeTrait for Primitive {
+impl ElementTrait for Primitive {
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         // With ObjectBoundingBox, only fractions and percents are allowed.
         let primitiveunits = parent
@@ -218,7 +218,7 @@ impl PrimitiveWithInput {
     }
 }
 
-impl NodeTrait for PrimitiveWithInput {
+impl ElementTrait for PrimitiveWithInput {
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         self.base.set_atts(parent, pbag)?;
 
@@ -285,7 +285,7 @@ pub fn render(
         // Keep only filter primitives (those that implement the Filter trait)
         .filter(|c| {
             c.borrow_element()
-                .get_node_trait()
+                .get_element_trait()
                 .as_filter_effect()
                 .is_some()
         })
@@ -303,7 +303,7 @@ pub fn render(
 
     for (c, linear_rgb) in primitives {
         let elt = c.borrow_element();
-        let filter = elt.get_node_trait().as_filter_effect().unwrap();
+        let filter = elt.get_element_trait().as_filter_effect().unwrap();
 
         let mut render = |filter_ctx: &mut FilterContext| {
             if let Err(err) = filter
diff --git a/rsvg_internals/src/filters/morphology.rs b/rsvg_internals/src/filters/morphology.rs
index 3c636ed1..7c4b252e 100644
--- a/rsvg_internals/src/filters/morphology.rs
+++ b/rsvg_internals/src/filters/morphology.rs
@@ -5,9 +5,9 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::*;
-use crate::node::{Node, NodeTrait};
+use crate::node::Node;
 use crate::parsers::{NumberOptionalNumber, Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::rect::IRect;
@@ -45,7 +45,7 @@ impl Default for FeMorphology {
     }
 }
 
-impl NodeTrait for FeMorphology {
+impl ElementTrait for FeMorphology {
     impl_node_as_filter_effect!();
 
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
diff --git a/rsvg_internals/src/filters/offset.rs b/rsvg_internals/src/filters/offset.rs
index 4e2c0c26..0994a9b2 100644
--- a/rsvg_internals/src/filters/offset.rs
+++ b/rsvg_internals/src/filters/offset.rs
@@ -2,8 +2,8 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
-use crate::node::{Node, NodeTrait};
+use crate::element::{ElementResult, ElementTrait};
+use crate::node::Node;
 use crate::parsers::ParseValue;
 use crate::property_bag::PropertyBag;
 
@@ -29,7 +29,7 @@ impl Default for FeOffset {
     }
 }
 
-impl NodeTrait for FeOffset {
+impl ElementTrait for FeOffset {
     impl_node_as_filter_effect!();
 
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
diff --git a/rsvg_internals/src/filters/tile.rs b/rsvg_internals/src/filters/tile.rs
index c08af56d..574d29ee 100644
--- a/rsvg_internals/src/filters/tile.rs
+++ b/rsvg_internals/src/filters/tile.rs
@@ -1,7 +1,7 @@
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
-use crate::node::{Node, NodeTrait};
+use crate::element::{ElementResult, ElementTrait};
+use crate::node::Node;
 use crate::property_bag::PropertyBag;
 
 use super::context::{FilterContext, FilterInput, FilterOutput, FilterResult};
@@ -22,7 +22,7 @@ impl Default for FeTile {
     }
 }
 
-impl NodeTrait for FeTile {
+impl ElementTrait for FeTile {
     impl_node_as_filter_effect!();
 
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
diff --git a/rsvg_internals/src/filters/turbulence.rs b/rsvg_internals/src/filters/turbulence.rs
index 839d02d2..549332a8 100644
--- a/rsvg_internals/src/filters/turbulence.rs
+++ b/rsvg_internals/src/filters/turbulence.rs
@@ -3,9 +3,9 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::*;
-use crate::node::{CascadedValues, Node, NodeTrait};
+use crate::node::{CascadedValues, Node};
 use crate::parsers::{NumberOptionalNumber, Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::surface_utils::{
@@ -56,7 +56,7 @@ impl Default for FeTurbulence {
     }
 }
 
-impl NodeTrait for FeTurbulence {
+impl ElementTrait for FeTurbulence {
     impl_node_as_filter_effect!();
 
     #[inline]
diff --git a/rsvg_internals/src/gradient.rs b/rsvg_internals/src/gradient.rs
index 11658fb1..47b556be 100644
--- a/rsvg_internals/src/gradient.rs
+++ b/rsvg_internals/src/gradient.rs
@@ -9,10 +9,10 @@ use crate::bbox::*;
 use crate::coord_units::CoordUnits;
 use crate::document::{AcquiredNode, AcquiredNodes, NodeStack};
 use crate::drawing_ctx::{DrawingCtx, ViewParams};
-use crate::element::{ElementResult, ElementType};
+use crate::element::{ElementResult, ElementTrait, ElementType};
 use crate::error::*;
 use crate::length::*;
-use crate::node::{CascadedValues, Node, NodeBorrow, NodeTrait};
+use crate::node::{CascadedValues, Node, NodeBorrow};
 use crate::paint_server::{AsPaintSource, PaintSource};
 use crate::parsers::{Parse, ParseValue};
 use crate::properties::ComputedValues;
@@ -129,7 +129,7 @@ fn validate_offset(length: Length<Both>) -> Result<Length<Both>, ValueErrorKind>
     }
 }
 
-impl NodeTrait for Stop {
+impl ElementTrait for Stop {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
@@ -595,7 +595,7 @@ impl Common {
     }
 }
 
-impl NodeTrait for LinearGradient {
+impl ElementTrait for LinearGradient {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         self.common.set_atts(pbag)?;
 
@@ -614,7 +614,7 @@ impl NodeTrait for LinearGradient {
     }
 }
 
-impl NodeTrait for RadialGradient {
+impl ElementTrait for RadialGradient {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         self.common.set_atts(pbag)?;
 
diff --git a/rsvg_internals/src/image.rs b/rsvg_internals/src/image.rs
index 49b09fab..247355ac 100644
--- a/rsvg_internals/src/image.rs
+++ b/rsvg_internals/src/image.rs
@@ -7,10 +7,10 @@ use crate::aspect_ratio::AspectRatio;
 use crate::bbox::BoundingBox;
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::{ClipMode, DrawingCtx, ViewParams};
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::*;
 use crate::length::*;
-use crate::node::{CascadedValues, Node, NodeTrait};
+use crate::node::{CascadedValues, Node};
 use crate::parsers::ParseValue;
 use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
@@ -27,7 +27,7 @@ pub struct Image {
     href: Option<Href>,
 }
 
-impl NodeTrait for Image {
+impl ElementTrait for Image {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
diff --git a/rsvg_internals/src/lib.rs b/rsvg_internals/src/lib.rs
index 06076244..668bd730 100644
--- a/rsvg_internals/src/lib.rs
+++ b/rsvg_internals/src/lib.rs
@@ -19,7 +19,7 @@
 //! to the corresponding element nodes.
 //!
 //! * [The `node` module](node/index.html) provides the [`Node`] struct and
-//! [`NodeTrait`], which form the basis for the tree of SVG elements.
+//! [`ElementTrait`], which form the basis for the tree of SVG elements.
 //!
 //! * [The `xml` module](xml/index.html) receives events from the XML parser, and builds a
 //! [`Document`] as a tree of [`Node`].
@@ -32,7 +32,7 @@
 //!
 //! [`Document`]: document/struct.Document.html
 //! [`Node`]: node/type.Node.html
-//! [`NodeTrait`]: node/trait.NodeTrait.html
+//! [`ElementTrait`]: node/trait.ElementTrait.html
 
 #![allow(clippy::clone_on_ref_ptr)]
 #![allow(clippy::not_unsafe_ptr_arg_deref)]
diff --git a/rsvg_internals/src/marker.rs b/rsvg_internals/src/marker.rs
index 3a34c189..3c49725a 100644
--- a/rsvg_internals/src/marker.rs
+++ b/rsvg_internals/src/marker.rs
@@ -12,12 +12,12 @@ use crate::aspect_ratio::*;
 use crate::bbox::BoundingBox;
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::{ElementResult, ElementType};
+use crate::element::{ElementResult, ElementTrait, ElementType};
 use crate::error::*;
 use crate::float_eq_cairo::ApproxEqCairo;
 use crate::iri::IRI;
 use crate::length::*;
-use crate::node::{CascadedValues, Node, NodeBorrow, NodeDraw, NodeTrait};
+use crate::node::{CascadedValues, Node, NodeBorrow, NodeDraw};
 use crate::parsers::{Parse, ParseValue};
 use crate::path_builder::*;
 use crate::properties::{ComputedValues, SpecifiedValue, SpecifiedValues};
@@ -175,7 +175,7 @@ impl Marker {
     }
 }
 
-impl NodeTrait for Marker {
+impl ElementTrait for Marker {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
diff --git a/rsvg_internals/src/node.rs b/rsvg_internals/src/node.rs
index 8c4bdb7b..54579fd5 100644
--- a/rsvg_internals/src/node.rs
+++ b/rsvg_internals/src/node.rs
@@ -11,7 +11,6 @@
 //! [`Node`]: ../../rctree/struct.Node.html
 //! [`NodeData`]: struct.NodeData.html
 
-use downcast_rs::*;
 use markup5ever::QualName;
 use std::cell::{Ref, RefMut};
 use std::fmt;
@@ -21,8 +20,7 @@ use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
 use crate::element::*;
 use crate::error::*;
-use crate::filters::FilterEffect;
-use crate::properties::{ComputedValues, SpecifiedValues};
+use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
 use crate::text::Chars;
 
@@ -164,7 +162,7 @@ impl<'a> CascadedValues<'a> {
 
     /// Returns the cascaded `ComputedValues`.
     ///
-    /// Nodes should use this from their `NodeTrait::draw()` implementation to get the
+    /// Nodes should use this from their `ElementTrait::draw()` implementation to get the
     /// `ComputedValues` from the `CascadedValues` that got passed to `draw()`.
     pub fn get(&'a self) -> &'a ComputedValues {
         match self.inner {
@@ -174,43 +172,6 @@ impl<'a> CascadedValues<'a> {
     }
 }
 
-/// The basic trait that all nodes must implement
-pub trait NodeTrait: Downcast {
-    /// Sets per-node attributes from the `pbag`
-    ///
-    /// Each node is supposed to iterate the `pbag`, and parse any attributes it needs.
-    fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult;
-
-    /// Sets any special-cased properties that the node may have, that are different
-    /// from defaults in the node's `SpecifiedValues`.
-    fn set_overridden_properties(&self, _values: &mut SpecifiedValues) {}
-
-    /// Whether this node has overflow:hidden.
-    /// https://www.w3.org/TR/SVG/styling.html#UAStyleSheet
-    fn overflow_hidden(&self) -> bool {
-        false
-    }
-
-    fn draw(
-        &self,
-        _node: &Node,
-        _acquired_nodes: &mut AcquiredNodes,
-        _cascaded: &CascadedValues<'_>,
-        draw_ctx: &mut DrawingCtx,
-        _clipping: bool,
-    ) -> Result<BoundingBox, RenderingError> {
-        // by default nodes don't draw themselves
-        Ok(draw_ctx.empty_bbox())
-    }
-
-    /// Returns the FilterEffect trait if this node is a filter primitive
-    fn as_filter_effect(&self) -> Option<&dyn FilterEffect> {
-        None
-    }
-}
-
-impl_downcast!(NodeTrait);
-
 /// Helper trait to get different NodeData variants
 pub trait NodeBorrow {
     /// Returns `false` for NodeData::Text, `true` otherwise.
@@ -326,7 +287,7 @@ impl NodeDraw for Node {
                 if !e.is_in_error() {
                     let transform = e.get_transform();
                     draw_ctx.with_saved_transform(Some(transform), &mut |dc| {
-                        e.get_node_trait()
+                        e.get_element_trait()
                             .draw(self, acquired_nodes, cascaded, dc, clipping)
                     })
                 } else {
diff --git a/rsvg_internals/src/pattern.rs b/rsvg_internals/src/pattern.rs
index 26ccef30..0cbedb87 100644
--- a/rsvg_internals/src/pattern.rs
+++ b/rsvg_internals/src/pattern.rs
@@ -10,11 +10,11 @@ use crate::bbox::*;
 use crate::coord_units::CoordUnits;
 use crate::document::{AcquiredNodes, NodeStack};
 use crate::drawing_ctx::{DrawingCtx, ViewParams};
-use crate::element::{ElementResult, ElementType};
+use crate::element::{ElementResult, ElementTrait, ElementType};
 use crate::error::*;
 use crate::float_eq_cairo::ApproxEqCairo;
 use crate::length::*;
-use crate::node::{CascadedValues, Node, NodeBorrow, NodeDraw, NodeTrait, WeakNode};
+use crate::node::{CascadedValues, Node, NodeBorrow, NodeDraw, WeakNode};
 use crate::paint_server::{AsPaintSource, PaintSource};
 use crate::parsers::ParseValue;
 use crate::properties::ComputedValues;
@@ -118,7 +118,7 @@ pub struct Pattern {
     resolved: RefCell<Option<ResolvedPattern>>,
 }
 
-impl NodeTrait for Pattern {
+impl ElementTrait for Pattern {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
diff --git a/rsvg_internals/src/shapes.rs b/rsvg_internals/src/shapes.rs
index 5401a5ca..94802917 100644
--- a/rsvg_internals/src/shapes.rs
+++ b/rsvg_internals/src/shapes.rs
@@ -8,10 +8,10 @@ use std::rc::Rc;
 use crate::bbox::BoundingBox;
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::*;
 use crate::length::*;
-use crate::node::{CascadedValues, Node, NodeTrait};
+use crate::node::{CascadedValues, Node};
 use crate::parsers::{optional_comma, Parse, ParseValue};
 use crate::path_builder::*;
 use crate::path_parser;
@@ -115,7 +115,7 @@ pub struct Path {
     builder: Option<Rc<PathBuilder>>,
 }
 
-impl NodeTrait for Path {
+impl ElementTrait for Path {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             if attr.expanded() == expanded_name!("", "d") {
@@ -219,7 +219,7 @@ pub struct Polygon {
     points: Option<Points>,
 }
 
-impl NodeTrait for Polygon {
+impl ElementTrait for Polygon {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             if attr.expanded() == expanded_name!("", "points") {
@@ -254,7 +254,7 @@ pub struct Polyline {
     points: Option<Points>,
 }
 
-impl NodeTrait for Polyline {
+impl ElementTrait for Polyline {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             if attr.expanded() == expanded_name!("", "points") {
@@ -290,7 +290,7 @@ pub struct Line {
     y2: Length<Vertical>,
 }
 
-impl NodeTrait for Line {
+impl ElementTrait for Line {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
@@ -352,7 +352,7 @@ pub struct Rect {
     ry: Option<Length<Vertical>>,
 }
 
-impl NodeTrait for Rect {
+impl ElementTrait for Rect {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
@@ -580,7 +580,7 @@ pub struct Circle {
     r: Length<Both>,
 }
 
-impl NodeTrait for Circle {
+impl ElementTrait for Circle {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
@@ -633,7 +633,7 @@ pub struct Ellipse {
     ry: Length<Vertical>,
 }
 
-impl NodeTrait for Ellipse {
+impl ElementTrait for Ellipse {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
diff --git a/rsvg_internals/src/structure.rs b/rsvg_internals/src/structure.rs
index 87e91b03..c25784ad 100644
--- a/rsvg_internals/src/structure.rs
+++ b/rsvg_internals/src/structure.rs
@@ -9,10 +9,10 @@ use crate::coord_units::CoordUnits;
 use crate::document::AcquiredNodes;
 use crate::dpi::Dpi;
 use crate::drawing_ctx::{ClipMode, DrawingCtx, ViewParams};
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::*;
 use crate::length::*;
-use crate::node::{CascadedValues, Node, NodeBorrow, NodeDraw, NodeTrait};
+use crate::node::{CascadedValues, Node, NodeBorrow, NodeDraw};
 use crate::parsers::{Parse, ParseValue};
 use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
@@ -22,7 +22,7 @@ use crate::viewbox::*;
 #[derive(Default)]
 pub struct Group();
 
-impl NodeTrait for Group {
+impl ElementTrait for Group {
     fn set_atts(&mut self, _: Option<&Node>, _: &PropertyBag<'_>) -> ElementResult {
         Ok(())
     }
@@ -50,7 +50,7 @@ impl NodeTrait for Group {
 #[derive(Default)]
 pub struct NonRendering;
 
-impl NodeTrait for NonRendering {
+impl ElementTrait for NonRendering {
     fn set_atts(&mut self, _: Option<&Node>, _: &PropertyBag<'_>) -> ElementResult {
         Ok(())
     }
@@ -59,7 +59,7 @@ impl NodeTrait for NonRendering {
 #[derive(Default)]
 pub struct Switch();
 
-impl NodeTrait for Switch {
+impl ElementTrait for Switch {
     fn set_atts(&mut self, _: Option<&Node>, _: &PropertyBag<'_>) -> ElementResult {
         Ok(())
     }
@@ -183,7 +183,7 @@ impl Svg {
     }
 }
 
-impl NodeTrait for Svg {
+impl ElementTrait for Svg {
     fn set_atts(&mut self, parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         // x & y attributes have no effect on outermost svg
         // http://www.w3.org/TR/SVG/struct.html#SVGElement
@@ -308,7 +308,7 @@ impl Use {
     }
 }
 
-impl NodeTrait for Use {
+impl ElementTrait for Use {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
@@ -362,7 +362,7 @@ impl Symbol {
     }
 }
 
-impl NodeTrait for Symbol {
+impl ElementTrait for Symbol {
     fn set_atts(&mut self, _parent: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
@@ -395,7 +395,7 @@ impl ClipPath {
     }
 }
 
-impl NodeTrait for ClipPath {
+impl ElementTrait for ClipPath {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
@@ -455,7 +455,7 @@ impl Mask {
     }
 }
 
-impl NodeTrait for Mask {
+impl ElementTrait for Mask {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
@@ -484,7 +484,7 @@ pub struct Link {
     link: Option<String>,
 }
 
-impl NodeTrait for Link {
+impl ElementTrait for Link {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
diff --git a/rsvg_internals/src/style.rs b/rsvg_internals/src/style.rs
index 9b27c587..8c40d381 100644
--- a/rsvg_internals/src/style.rs
+++ b/rsvg_internals/src/style.rs
@@ -2,9 +2,9 @@
 
 use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
-use crate::element::ElementResult;
+use crate::element::{ElementResult, ElementTrait};
 use crate::error::*;
-use crate::node::{Node, NodeTrait};
+use crate::node::Node;
 use crate::property_bag::PropertyBag;
 
 /// Represents the syntax used in the <style> node.
@@ -51,7 +51,7 @@ impl Style {
     }
 }
 
-impl NodeTrait for Style {
+impl ElementTrait for Style {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             if attr.expanded() == expanded_name!("", "type") {
diff --git a/rsvg_internals/src/text.rs b/rsvg_internals/src/text.rs
index a83562e0..84af72fb 100644
--- a/rsvg_internals/src/text.rs
+++ b/rsvg_internals/src/text.rs
@@ -8,12 +8,12 @@ use crate::allowed_url::Fragment;
 use crate::bbox::BoundingBox;
 use crate::document::AcquiredNodes;
 use crate::drawing_ctx::DrawingCtx;
-use crate::element::{ElementResult, ElementType};
+use crate::element::{ElementResult, ElementTrait, ElementType};
 use crate::error::*;
 use crate::float_eq_cairo::ApproxEqCairo;
 use crate::font_props::FontWeightSpec;
 use crate::length::*;
-use crate::node::{CascadedValues, Node, NodeBorrow, NodeTrait};
+use crate::node::{CascadedValues, Node, NodeBorrow};
 use crate::parsers::ParseValue;
 use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
@@ -604,7 +604,7 @@ impl Text {
     }
 }
 
-impl NodeTrait for Text {
+impl ElementTrait for Text {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
@@ -723,7 +723,7 @@ fn extract_chars_children_to_chunks_recursively(
     }
 }
 
-impl NodeTrait for TRef {
+impl ElementTrait for TRef {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {
@@ -775,7 +775,7 @@ impl TSpan {
     }
 }
 
-impl NodeTrait for TSpan {
+impl ElementTrait for TSpan {
     fn set_atts(&mut self, _: Option<&Node>, pbag: &PropertyBag<'_>) -> ElementResult {
         for (attr, value) in pbag.iter() {
             match attr.expanded() {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]