[librsvg: 6/22] handle::load_css(): Return some errors, at least
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 6/22] handle::load_css(): Return some errors, at least
- Date: Tue, 8 Jan 2019 17:53:42 +0000 (UTC)
commit 47956f24863170e6cb350b939eec9631aecded93
Author: Federico Mena Quintero <federico gnome org>
Date: Mon Jan 7 19:16:56 2019 -0600
handle::load_css(): Return some errors, at least
rsvg_internals/src/css.rs | 3 +-
rsvg_internals/src/error.rs | 3 ++
rsvg_internals/src/handle.rs | 72 +++++++++++++++++++++++---------------------
rsvg_internals/src/xml.rs | 3 +-
4 files changed, 44 insertions(+), 37 deletions(-)
---
diff --git a/rsvg_internals/src/css.rs b/rsvg_internals/src/css.rs
index 9c6d0163..9777eaa7 100644
--- a/rsvg_internals/src/css.rs
+++ b/rsvg_internals/src/css.rs
@@ -151,7 +151,8 @@ unsafe extern "C" fn css_import_style(
let raw_uri = cr_string_peek_raw_str(a_uri);
let uri = utf8_cstr(raw_uri);
- handle::load_css(handler_data.css_styles, handler_data.handle, uri);
+ // FIXME: handle CSS errors
+ let _ = handle::load_css(handler_data.css_styles, handler_data.handle, uri);
}
unsafe extern "C" fn css_start_selector(
diff --git a/rsvg_internals/src/error.rs b/rsvg_internals/src/error.rs
index 4ff45e86..58537172 100644
--- a/rsvg_internals/src/error.rs
+++ b/rsvg_internals/src/error.rs
@@ -155,6 +155,7 @@ pub enum LoadingError {
CouldNotCreateXmlParser,
BadUrl,
BadDataUrl,
+ BadCss,
Cairo(cairo::Status),
EmptyData,
SvgHasNoElements,
@@ -171,6 +172,7 @@ impl error::Error for LoadingError {
LoadingError::XmlParseError(_) => "XML parse error",
LoadingError::BadUrl => "invalid URL",
LoadingError::BadDataUrl => "invalid data: URL",
+ LoadingError::BadCss => "invalid CSS",
LoadingError::Cairo(_) => "cairo error",
LoadingError::EmptyData => "empty data",
LoadingError::SvgHasNoElements => "SVG has no elements",
@@ -190,6 +192,7 @@ impl fmt::Display for LoadingError {
| LoadingError::CouldNotCreateXmlParser
| LoadingError::BadUrl
| LoadingError::BadDataUrl
+ | LoadingError::BadCss
| LoadingError::EmptyData
| LoadingError::SvgHasNoElements
| LoadingError::RootElementIsNotSvg
diff --git a/rsvg_internals/src/handle.rs b/rsvg_internals/src/handle.rs
index e5c70920..cb2d7b20 100644
--- a/rsvg_internals/src/handle.rs
+++ b/rsvg_internals/src/handle.rs
@@ -9,7 +9,7 @@ use cairo::{self, ImageSurface, Status};
use cairo_sys;
use gdk_pixbuf::{Colorspace, Pixbuf, PixbufLoader, PixbufLoaderExt};
use gdk_pixbuf_sys;
-use gio::{File as GFile};
+use gio::File as GFile;
use gio_sys;
use glib::translate::*;
use glib_sys;
@@ -670,44 +670,46 @@ pub fn load_image_to_surface(
// This function just slurps CSS data from a possibly-relative href
// and parses it. We'll move it to a better place in the end.
-pub fn load_css(css_styles: &mut CssStyles, handle: *mut RsvgHandle, href_str: &str) {
+pub fn load_css(
+ css_styles: &mut CssStyles,
+ handle: *mut RsvgHandle,
+ href_str: &str,
+) -> Result<(), LoadingError> {
let rhandle = get_rust_handle(handle);
- let aurl = match AllowedUrl::from_href(href_str, rhandle.base_url.borrow().as_ref()) {
- Ok(a) => a,
- Err(_) => {
+ let aurl =
+ AllowedUrl::from_href(href_str, rhandle.base_url.borrow().as_ref()).map_err(|_| {
rsvg_log!("Could not load \"{}\" for CSS data", href_str);
- // FIXME: report errors; this should be a fatal error
- return;
- }
- };
-
- if let Ok(data) = io::acquire_data(&aurl, None) {
- let BinaryData {
- data: bytes,
- content_type,
- } = data;
-
- if content_type.as_ref().map(String::as_ref) != Some("text/css") {
- rsvg_log!("\"{}\" is not of type text/css; ignoring", href_str);
- // FIXME: report errors
- return;
- }
-
- if let Ok(utf8) = String::from_utf8(bytes) {
+ LoadingError::BadUrl
+ })?;
+
+ io::acquire_data(&aurl, None)
+ .and_then(|data| {
+ let BinaryData {
+ data: bytes,
+ content_type,
+ } = data;
+
+ if content_type.as_ref().map(String::as_ref) == Some("text/css") {
+ Ok(bytes)
+ } else {
+ rsvg_log!("\"{}\" is not of type text/css; ignoring", href_str);
+ Err(LoadingError::BadCss)
+ }
+ })
+ .and_then(|bytes| {
+ String::from_utf8(bytes).map_err(|_| {
+ rsvg_log!(
+ "\"{}\" does not contain valid UTF-8 CSS data; ignoring",
+ href_str
+ );
+ LoadingError::BadCss
+ })
+ })
+ .and_then(|utf8| {
css::parse_into_css_styles(css_styles, handle, &utf8);
- } else {
- rsvg_log!(
- "\"{}\" does not contain valid UTF-8 CSS data; ignoring",
- href_str
- );
- // FIXME: report errors
- return;
- }
- } else {
- rsvg_log!("Could not load \"{}\" for CSS data", href_str);
- // FIXME: report errors from not being to acquire data; this should be a fatal error
- }
+ Ok(()) // FIXME: return CSS parsing errors
+ })
}
#[no_mangle]
diff --git a/rsvg_internals/src/xml.rs b/rsvg_internals/src/xml.rs
index 787c0977..02be735f 100644
--- a/rsvg_internals/src/xml.rs
+++ b/rsvg_internals/src/xml.rs
@@ -220,7 +220,8 @@ impl XmlState {
&& type_.as_ref().map(String::as_str) == Some("text/css")
&& href.is_some()
{
- handle::load_css(
+ // FIXME: handle CSS errors
+ let _ = handle::load_css(
self.css_styles.as_mut().unwrap(),
self.handle,
&href.unwrap(),
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]