Skip to content

xmlns-prefixed attribute on root element is lost #569

Description

@jdm
<!-- before -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd">
    <sodipodi:namedview>
        ...
    </sodipodi:namedview>

    <path d="..." sodipodi:nodetypes="cccc"/>
</svg>

<!-- after: xmlns:sodipodi moved to child -->
<svg xmlns="http://www.w3.org/2000/svg">
    <sodipodi:namedview xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd">
        ...
    </sodipodi:namedview>

    <path d="..." sodipodi:nodetypes="cccc"></path>
</svg>
<!-- before -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd">
    <path d="..." sodipodi:nodetypes="cccc"/>
</svg>

<!-- after: xmlns:sodipodi removed entirely -->
<svg xmlns="http://www.w3.org/2000/svg">
    <path d="..." sodipodi:nodetypes="cccc"></path>
</svg>

Originally posted by @noahbald in #538 (comment)

Activity

  1. changed the title [-]Root xmlns attribute is lost[/-] [+]xmlns-prefixed attribute on root element is lost[/+] on Jan 12, 2025
  2. jdm commented on Jan 12, 2025

    @jdm
    MemberAuthor

    It looks like the parsing code stores the namespace data for the node in the treebuilder's namespace stack, but the data about which tag declares a namespace is thrown away. Instead we store the namespace uri for child tags; this is why the xmlns-prefixed attribute jumps to the first child that uses the namespace.

  3. jdm commented on Jan 12, 2025

    @jdm
    MemberAuthor

    Parsing code that strips out the xmlns attribute:

    self.declare_ns(attr);

    Parsing code that stores the namespace URI on child tags:
    name.ns = ns_uri;

    Serialization code that uses the namespace URI:
    self.find_or_insert_ns(name);

  4. jdm commented on Jan 12, 2025

    @jdm
    MemberAuthor

    Testcase in rcdom/tests/xml-driver.rs:

    #[test]
    fn weird() {
        assert_serialization(
           r##"<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd">
        <sodipodi:namedview>
            ...
        </sodipodi:namedview>
    
        <path d="..." sodipodi:nodetypes="cccc"/>
    </svg>"##,
            driver::parse_document(RcDom::default(), Default::default())
                .from_utf8()
                .one(r##"<svg xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd">
        <sodipodi:namedview>
            ...
        </sodipodi:namedview>
    
        <path d="..." sodipodi:nodetypes="cccc"/>
    </svg>"##.as_bytes()),
        );
    }
  5. jdm commented on Jan 12, 2025

    @jdm
    MemberAuthor

    Current status: I have changes that allow these testcases to pass. However, they cause a lot of xml5lib namespace tests to fail, and Ygg01/xml5lib-tests@3fb8d2b suggests that the current behaviour is intentional. I'm hoping to get in touch with @Ygg01 to better understand what the right behaviour here is.

  6. jdm commented on Jan 12, 2025

    @jdm
    MemberAuthor
  7. Ygg01 commented on Jan 12, 2025

    @Ygg01
    Contributor

    Current status: I have changes that allow these testcases to pass. However, they cause a lot of xml5lib namespace tests to fail, and Ygg01/xml5lib-tests@3fb8d2b suggests that the current behaviour is intentional. I'm hoping to get in touch with @Ygg01 to better understand what the right behaviour here is.

    Hi Josh. To be honest I don't quite remember the motivation. It's been like 8 years.

    The important question is does it goes against XML namespace spec? If not, just change the tests. I'm open to PRs on xml5lib-tests

  8. Ygg01 commented on Jan 22, 2025

    @Ygg01
    Contributor

    @jdm what are the next steps to close this?

    • Do you want me to fix the xml5lib-tests?
    • Move xml5lib-tests to the Servo repository, so you can take control over it?
    • Make PRs to Ygg01/xm5lib-tests for me to review?
  9. noahbald commented on Feb 15, 2025

    @noahbald
    Contributor

    Hey if it helps I've found a few documents which will become invalid/broken after parsing and serializing and then viewing in Firefox. Perhaps these can help?

    Arch Linux Logo
    Blobs
    Isometric Madness
    tldr-pages Banner
    Wikipedia Logo

  10. Ygg01 commented on Feb 16, 2025

    @Ygg01
    Contributor

    @jdm I've updated the xml5lib tests. New commit. Might require submodule update.

    Looking back I think I'm starting to remember why I did it like that. And why I was wrong.

    1. When converting XML ⇾ tree, the prefixes aren't kept. In fact, they are completely arbitrary. They are like temporary variables that are discarded after parsing, e.g. svg:width = "10" becomes {http://www.w3.org/2000/svg}width = "10" in tree.
    2. When converting namespaces, the namespace definitions could be used by simplistic libs, to match on prefix, by scanning for namespace definitions, which is something that should never be done. You search by namespaces, not prefix. I omitted them to prevent such use cases. Trying to be correct by design.
    3. I didn't consider someone would serialize and deserialize and expect similar/same results.
  11. devongovett commented on Mar 23, 2025

    @devongovett
    Contributor

    I opened #586, which is @jdm's branch plus a submodule update for xml5lib-tests. Looks like everything is passing.

  12. nicoburns commented on Mar 26, 2025

    @nicoburns
    Contributor

    @Ygg01 In the new xml5lib test commit. I notice that the tags been renamed from <a> to <aN> where N is some number. For some of the tests the corresponding </a> has also been renamed to </aN> but for some of them the </a> is still just </a>. Was that intentional / does it matter? I just thought I'd raise the inconsistency as it looks like it could be a potential bug.

  13. Ygg01 commented on Mar 26, 2025

    @Ygg01
    Contributor

    I notice that the tags been renamed from <a> to <aN>

    @nicoburns Yes. It made it easier to find which of the tests failed. I had to debug most of them and getting error to show which test failed helped, what could happen is that I missed some end tag.

    EDIT: Updated tags to and created a new commit Ygg01/xml5lib-tests@a6d626e

  14. jdm commented on Apr 8, 2025

    @jdm
    MemberAuthor

    Reverted. We'll need to investigate test failures in Servo with #586 applied before it can merge again (servo/servo#36284 (comment)).

  15. reopened this on Apr 8, 2025
  16. Ygg01 commented on Apr 8, 2025

    @Ygg01
    Contributor

    Reverted. We'll need to investigate test failures in Servo with #586 applied before it can merge again (servo/servo#36284 (comment)).

    To copy my reply from there, it seems now nodes were serializing the namespaces when they didn't need to😕 Maybe a default setting mismatch.

    BCompare_WyFmG3VoqV

    Also builds passed on Servo. I assume that's done by removing it from the merge queue.

  17. jdm commented on Apr 8, 2025

    @jdm
    MemberAuthor

    Yeah, I published a new version of xml5ever that reverted the problem change.

  18. Ygg01 commented on Apr 9, 2025

    @Ygg01
    Contributor

    I'm not too familiar with the servo setup, why would we see namespaces serialized in these tests?

  19. Ygg01 commented on Jul 19, 2025

    @Ygg01
    Contributor

    Is this issue still open? Didn't changes to markup5ever fix it?

  20. added 3 commits that reference this issue on Aug 17, 2026
    22a16f9
    f91c7c4
    b4bb28c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions