#36348: ManifestStaticFilesStorage breaks CSS containing data: URIs with multiple
nested url()s
-------------------------------------+-------------------------------------
Reporter: Samuel Cormier- | Owner: Samuel
Iijima | Cormier-Iijima
Type: Bug | Status: closed
Component: contrib.staticfiles | Version: 5.2
Severity: Normal | Resolution: invalid
Keywords: | Triage Stage:
| Unreviewed
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Comment (by Samuel Cormier-Iijima):
Sure, I had shortened the example to make the issue clearer, but this
happens with valid SVGs. Here's a
[
https://editsvgcode.com/9sw9316mzb9m9vjjz4t sample valid SVG file]:
{{{
<svg width="100" height="100" xmlns="
http://www.w3.org/2000/svg">
<filter id="blur1">
<feGaussianBlur stdDeviation="2" />
</filter>
<filter id="blur2">
<feGaussianBlur stdDeviation="5" />
</filter>
<rect width="50" height="50" x="10" y="10" fill="red"
filter="url(#blur1)" />
<rect width="50" height="50" x="40" y="40" fill="blue"
filter="url(#blur2)" />
</svg>
}}}
If this gets inlined into CSS with a data: URI, the resulting CSS file
looks like this:
{{{
#example {
background-image: url("data:image/svg+xml,%3Csvg width='100'
height='100' xmlns='
http://www.w3.org/2000/svg'%3E%3Cfilter
id='blur1'%3E%3CfeGaussianBlur stdDeviation='2' /%3E%3C/filter%3E%3Cfilter
id='blur2'%3E%3CfeGaussianBlur stdDeviation='5' /%3E%3C/filter%3E%3Crect
width='50' height='50' x='10' y='10' fill='red' filter='url(%23blur1)'
/%3E%3Crect width='50' height='50' x='40' y='40' fill='blue'
filter='url(%23blur2)' /%3E%3C/svg%3E");
}
}}}
When this then gets processed by Django's collectstatic, the output is
this:
{{{
#example {
background-image: url("data:image/svg+xml,%3Csvg width='100'
height='100' xmlns='
http://www.w3.org/2000/svg'%3E%3Cfilter
id='blur1'%3E%3CfeGaussianBlur stdDeviation='2' /%3E%3C/filter%3E%3Cfilter
id='blur2'%3E%3CfeGaussianBlur stdDeviation='5' /%3E%3C/filter%3E%3Crect
width='50' height='50' x='10' y='10' fill='red' filter='url(%23blur1)'
/%3E%3Crect width='50' height='50' x='40' y='40' fill='blue'
filter='url("#blur2")' /%3E%3C/svg%3E");
}
}}}
Notice that the second use of filter has been changed to `url("#blur2")` -
because this has the double quotes this CSS is invalid.
--
Ticket URL: <
https://code.djangoproject.com/ticket/36348#comment:5>