From 47382e0c2c60fceabc7c9889c3722edb6543a6e6 Mon Sep 17 00:00:00 2001 From: webbeef Date: Mon, 29 Sep 2025 02:16:22 -0700 Subject: [PATCH] script: display top-level SVG image documents. (#39494) SVG images served with the image/svg+xml mime type were recognized as XML documents instead of images, so were not displayed. Testing: compare the results of `./mach run https://raw.githubusercontent.com/servo/servo/467821598b59bd84273d91c9d8a33651e10578b8/resources/resource_protocol/servo-color-negative-no-container.svg` Signed-off-by: webbeef --- components/script/dom/servoparser/mod.rs | 3 ++- components/shared/net/mime_classifier.rs | 9 +++++--- tests/wpt/meta/MANIFEST.json | 21 +++++++++++++++++++ .../Document-createElement-svg.svg.ini | 2 +- ...-create-an-element-for-a-token-svg.svg.ini | 2 +- ...interaction-editing-designMode-svg.svg.ini | 2 +- ...-image-document-svg-xml-mime-type-ref.html | 3 +++ ...-document-svg-xml-mime-type.tentative.html | 6 ++++++ 8 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 tests/wpt/tests/svg/top-level-document/svg-image-document-svg-xml-mime-type-ref.html create mode 100644 tests/wpt/tests/svg/top-level-document/svg-image-document-svg-xml-mime-type.tentative.html diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index ef894f6047e..f5a705a7273 100644 --- a/components/script/dom/servoparser/mod.rs +++ b/components/script/dom/servoparser/mod.rs @@ -1000,7 +1000,8 @@ impl ParserContext { }, // Return the result of loading a media document given navigationParams and type. MediaType::Image | MediaType::AudioVideo => { - self.load_media_document(parser, media_type, &mime_type) + self.load_media_document(parser, media_type, &mime_type); + return; }, MediaType::Font => { let page = format!( diff --git a/components/shared/net/mime_classifier.rs b/components/shared/net/mime_classifier.rs index b3404c6cd1d..aed4a0a1e23 100644 --- a/components/shared/net/mime_classifier.rs +++ b/components/shared/net/mime_classifier.rs @@ -238,10 +238,13 @@ impl MimeClassifier { } /// + /// SVG is worth distinguishing from other XML MIME types: + /// fn is_xml(mt: &Mime) -> bool { - mt.suffix() == Some(mime::XML) || - mt.essence_str() == "text/xml" || - mt.essence_str() == "application/xml" + !Self::is_image(mt) && + (mt.suffix() == Some(mime::XML) || + mt.essence_str() == "text/xml" || + mt.essence_str() == "application/xml") } /// diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index 1df888bedf6..30bae85f41e 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -380751,6 +380751,21 @@ ] ] } + }, + "top-level-document": { + "svg-image-document-svg-xml-mime-type.tentative.html": [ + "d5e09d234a4e6de481a43a05f2d8ce0b40af2f5f", + [ + null, + [ + [ + "/svg/top-level-document/svg-image-document-svg-xml-mime-type-ref.html", + "==" + ] + ], + {} + ] + ] } }, "visual-viewport": { @@ -517989,6 +518004,12 @@ ] } }, + "top-level-document": { + "svg-image-document-svg-xml-mime-type-ref.html": [ + "ce7462f10d87730479d5488fd9a98a453a342177", + [] + ] + }, "types": { "helper-SVGElement.ownerSVGElement-02.svg": [ "2335bb42c5142ca96a63a4ec457d67ea439638ab", diff --git a/tests/wpt/meta/custom-elements/Document-createElement-svg.svg.ini b/tests/wpt/meta/custom-elements/Document-createElement-svg.svg.ini index 37db081bcdd..9e4a4f96426 100644 --- a/tests/wpt/meta/custom-elements/Document-createElement-svg.svg.ini +++ b/tests/wpt/meta/custom-elements/Document-createElement-svg.svg.ini @@ -1,2 +1,2 @@ [Document-createElement-svg.svg] - expected: ERROR + expected: TIMEOUT diff --git a/tests/wpt/meta/custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg.ini b/tests/wpt/meta/custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg.ini index ef1cd212f7d..916fe7b6d09 100644 --- a/tests/wpt/meta/custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg.ini +++ b/tests/wpt/meta/custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg.ini @@ -1,2 +1,2 @@ [parser-uses-create-an-element-for-a-token-svg.svg] - expected: ERROR + expected: TIMEOUT diff --git a/tests/wpt/meta/html/editing/editing-0/making-entire-documents-editable-the-designmode-idl-attribute/user-interaction-editing-designMode-svg.svg.ini b/tests/wpt/meta/html/editing/editing-0/making-entire-documents-editable-the-designmode-idl-attribute/user-interaction-editing-designMode-svg.svg.ini index 0b37a49498b..61819f4a5b6 100644 --- a/tests/wpt/meta/html/editing/editing-0/making-entire-documents-editable-the-designmode-idl-attribute/user-interaction-editing-designMode-svg.svg.ini +++ b/tests/wpt/meta/html/editing/editing-0/making-entire-documents-editable-the-designmode-idl-attribute/user-interaction-editing-designMode-svg.svg.ini @@ -1,2 +1,2 @@ [user-interaction-editing-designMode-svg.svg] - expected: ERROR + expected: TIMEOUT diff --git a/tests/wpt/tests/svg/top-level-document/svg-image-document-svg-xml-mime-type-ref.html b/tests/wpt/tests/svg/top-level-document/svg-image-document-svg-xml-mime-type-ref.html new file mode 100644 index 00000000000..ce7462f10d8 --- /dev/null +++ b/tests/wpt/tests/svg/top-level-document/svg-image-document-svg-xml-mime-type-ref.html @@ -0,0 +1,3 @@ + + +