diff options
author | Federico Mena Quintero <federico@gnome.org> | 2022-08-29 12:47:35 -0500 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2022-08-29 12:47:52 -0500 |
commit | d5110dd291ec7ef28218fffea57a2f43be0f2284 (patch) | |
tree | 17d0e3d0069893e413f83dfc8d3d543aab423928 | |
parent | 24bf24a8bc1c3b7e02380406d0b65febdd98dd1b (diff) | |
download | librsvg-d5110dd291ec7ef28218fffea57a2f43be0f2284.tar.gz |
Stylesheet::load - take an AllowedUrl instead of validating it here
Part-of: <https://gitlab.gnome.org/GNOME/librsvg/-/merge_requests/738>
-rw-r--r-- | src/css.rs | 38 |
1 files changed, 21 insertions, 17 deletions
@@ -94,7 +94,7 @@ use crate::io::{self, BinaryData}; use crate::node::{Node, NodeBorrow, NodeCascade}; use crate::properties::{parse_value, ComputedValues, ParseAs, ParsedProperty}; use crate::session::Session; -use crate::url_resolver::UrlResolver; +use crate::url_resolver::{AllowedUrl, UrlResolver}; /// A parsed CSS declaration /// @@ -820,7 +820,10 @@ impl Stylesheet { session: Session, ) -> Result<Self, LoadingError> { let mut stylesheet = Stylesheet::new(origin); - stylesheet.load(href, url_resolver, session)?; + let aurl = url_resolver + .resolve_href(href) + .map_err(|_| LoadingError::BadUrl)?; + stylesheet.load(&aurl, session)?; Ok(stylesheet) } @@ -849,10 +852,17 @@ impl Stylesheet { } }) .for_each(|rule| match rule { - Rule::AtRule(AtRule::Import(url)) => { - // ignore invalid imports - let _ = self.load(&url, url_resolver, session.clone()); - } + Rule::AtRule(AtRule::Import(url)) => match url_resolver.resolve_href(&url) { + Ok(aurl) => { + // ignore invalid imports + let _ = self.load(&aurl, session.clone()); + } + + Err(e) => { + rsvg_log!(session, "Not loading stylesheet from \"{}\": {}", url, e); + } + }, + Rule::QualifiedRule(qr) => self.qualified_rules.push(qr), }); @@ -860,16 +870,7 @@ impl Stylesheet { } /// Parses a stylesheet referenced by an URL - fn load( - &mut self, - href: &str, - url_resolver: &UrlResolver, - session: Session, - ) -> Result<(), LoadingError> { - let aurl = url_resolver - .resolve_href(href) - .map_err(|_| LoadingError::BadUrl)?; - + fn load(&mut self, aurl: &AllowedUrl, session: Session) -> Result<(), LoadingError> { io::acquire_data(&aurl, None) .map_err(LoadingError::from) .and_then(|data| { @@ -895,7 +896,10 @@ impl Stylesheet { LoadingError::BadCss }) }) - .and_then(|utf8| self.parse(&utf8, &UrlResolver::new(Some((*aurl).clone())), session)) + .and_then(|utf8| { + let url = (**aurl).clone(); + self.parse(&utf8, &UrlResolver::new(Some(url)), session) + }) } /// Appends the style declarations that match a specified node to a given vector |