[librsvg: 6/22] handle::load_css(): Return some errors, at least



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]