aboutsummaryrefslogtreecommitdiffstats
path: root/ports
diff options
context:
space:
mode:
authorCameron McCormack <cam@mcc.id.au>2017-12-04 12:53:13 +0800
committerCameron McCormack <cam@mcc.id.au>2017-12-05 13:22:22 +0800
commit9a31d0d8d82ae907f29bdbfa131da7197472b5e9 (patch)
tree0a5de50dc28c7bfe6377293c630d3d8929047314 /ports
parent7015d5b22e8157450677cf0e01d83e8afc8c0d1d (diff)
downloadservo-9a31d0d8d82ae907f29bdbfa131da7197472b5e9.tar.gz
servo-9a31d0d8d82ae907f29bdbfa131da7197472b5e9.zip
geckolib: Allow Servo_ComputeColor to report errors to the console.
Diffstat (limited to 'ports')
-rw-r--r--ports/geckolib/glue.rs41
1 files changed, 34 insertions, 7 deletions
diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs
index 94c3ea6efcb..a4c12642623 100644
--- a/ports/geckolib/glue.rs
+++ b/ports/geckolib/glue.rs
@@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use cssparser::{Parser, ParserInput};
+use cssparser::{ParseErrorKind, Parser, ParserInput};
use cssparser::ToCss as ParserToCss;
use env_logger::LogBuilder;
use malloc_size_of::MallocSizeOfOps;
@@ -23,7 +23,7 @@ use style::data::{ElementStyles, self};
use style::dom::{ShowSubtreeData, TDocument, TElement, TNode};
use style::driver;
use style::element_state::{DocumentState, ElementState};
-use style::error_reporting::{NullReporter, ParseErrorReporter};
+use style::error_reporting::{ContextualParseError, NullReporter, ParseErrorReporter};
use style::font_metrics::{FontMetricsProvider, get_metrics_provider_for_product};
use style::gecko::data::{GeckoStyleSheet, PerDocumentStyleData, PerDocumentStyleDataImpl};
use style::gecko::global_style_data::{GLOBAL_STYLE_DATA, GlobalStyleData, STYLE_THREAD_POOL};
@@ -153,7 +153,7 @@ use style::values::distance::ComputeSquaredDistance;
use style::values::specified;
use style::values::specified::gecko::IntersectionObserverRootMargin;
use style::values::specified::source_size_list::SourceSizeList;
-use style_traits::{ParsingMode, ToCss};
+use style_traits::{ParsingMode, StyleParseErrorKind, ToCss};
use super::error_reporter::ErrorReporter;
use super::stylesheet_loader::StylesheetLoader;
@@ -4557,10 +4557,31 @@ pub unsafe extern "C" fn Servo_SelectorList_Drop(list: RawServoSelectorListOwned
let _ = list.into_box::<::selectors::SelectorList<SelectorImpl>>();
}
-fn parse_color(value: &str) -> Result<specified::Color, ()> {
+fn parse_color(
+ value: &str,
+ error_reporter: Option<&ErrorReporter>,
+) -> Result<specified::Color, ()> {
let mut input = ParserInput::new(value);
let mut parser = Parser::new(&mut input);
- parser.parse_entirely(specified::Color::parse_color).map_err(|_| ())
+ let start_position = parser.position();
+ parser.parse_entirely(specified::Color::parse_color).map_err(|err| {
+ if let Some(error_reporter) = error_reporter {
+ match err.kind {
+ ParseErrorKind::Custom(StyleParseErrorKind::ValueError(..)) => {
+ let location = err.location.clone();
+ let error = ContextualParseError::UnsupportedValue(
+ parser.slice_from(start_position),
+ err,
+ );
+ error_reporter.report(location, error);
+ }
+ // Ignore other kinds of errors that might be reported, such as
+ // ParseErrorKind::Basic(BasicParseErrorKind::UnexpectedToken),
+ // since Gecko doesn't report those to the error console.
+ _ => {}
+ }
+ }
+ })
}
#[no_mangle]
@@ -4568,7 +4589,7 @@ pub extern "C" fn Servo_IsValidCSSColor(
value: *const nsAString,
) -> bool {
let value = unsafe { (*value).to_string() };
- parse_color(&value).is_ok()
+ parse_color(&value, None).is_ok()
}
#[no_mangle]
@@ -4578,6 +4599,7 @@ pub extern "C" fn Servo_ComputeColor(
value: *const nsAString,
result_color: *mut structs::nscolor,
was_current_color: *mut bool,
+ loader: *mut Loader,
) -> bool {
use style::gecko;
@@ -4585,7 +4607,12 @@ pub extern "C" fn Servo_ComputeColor(
let value = unsafe { (*value).to_string() };
let result_color = unsafe { result_color.as_mut().unwrap() };
- match parse_color(&value) {
+ let reporter = unsafe { loader.as_mut() }.map(|loader| {
+ // Make an ErrorReporter that will report errors as being "from DOM".
+ ErrorReporter::new(ptr::null_mut(), loader, ptr::null_mut())
+ });
+
+ match parse_color(&value, reporter.as_ref()) {
Ok(specified_color) => {
let computed_color = match raw_data {
Some(raw_data) => {