geckolib: Add FFI functions for color parsing.
draft
--- a/servo/ports/geckolib/glue.rs
+++ b/servo/ports/geckolib/glue.rs
@@ -39,17 +39,17 @@ use style::gecko_bindings::bindings::{Ra
use style::gecko_bindings::bindings::{RawServoImportRule, RawServoImportRuleBorrowed};
use style::gecko_bindings::bindings::{RawServoKeyframe, RawServoKeyframeBorrowed, RawServoKeyframeStrong};
use style::gecko_bindings::bindings::{RawServoKeyframesRule, RawServoKeyframesRuleBorrowed};
use style::gecko_bindings::bindings::{RawServoMediaListBorrowed, RawServoMediaListStrong};
use style::gecko_bindings::bindings::{RawServoMediaRule, RawServoMediaRuleBorrowed};
use style::gecko_bindings::bindings::{RawServoNamespaceRule, RawServoNamespaceRuleBorrowed};
use style::gecko_bindings::bindings::{RawServoPageRule, RawServoPageRuleBorrowed};
use style::gecko_bindings::bindings::{RawServoSelectorListBorrowed, RawServoSelectorListOwned};
-use style::gecko_bindings::bindings::{RawServoStyleSetBorrowed, RawServoStyleSetOwned};
+use style::gecko_bindings::bindings::{RawServoStyleSetBorrowed, RawServoStyleSetBorrowedOrNull, RawServoStyleSetOwned};
use style::gecko_bindings::bindings::{RawServoStyleSheetContentsBorrowed, ServoComputedDataBorrowed};
use style::gecko_bindings::bindings::{RawServoStyleSheetContentsStrong, ServoStyleContextBorrowed};
use style::gecko_bindings::bindings::{RawServoSupportsRule, RawServoSupportsRuleBorrowed};
use style::gecko_bindings::bindings::{ServoCssRulesBorrowed, ServoCssRulesStrong};
use style::gecko_bindings::bindings::{nsACString, nsAString, nsCSSPropertyIDSetBorrowedMut};
use style::gecko_bindings::bindings::Gecko_AddPropertyToSet;
use style::gecko_bindings::bindings::Gecko_AppendPropertyValuePair;
use style::gecko_bindings::bindings::Gecko_ConstructFontFeatureValueSet;
@@ -4201,8 +4201,79 @@ pub unsafe extern "C" fn Servo_SelectorL
Box::into_raw(Box::new(selector_list)) as *mut RawServoSelectorList
}
#[no_mangle]
pub unsafe extern "C" fn Servo_SelectorList_Drop(list: RawServoSelectorListOwned) {
let _ = list.into_box::<::selectors::SelectorList<SelectorImpl>>();
}
+
+#[no_mangle]
+pub unsafe extern "C" fn Servo_IsValidCSSColor(
+ value: *const nsAString,
+) -> bool {
+ use cssparser::{Parser, ParserInput};
+ use style::values::specified;
+
+ let value = (*value).to_string();
+
+ let mut input = ParserInput::new(&value);
+ let mut parser = Parser::new(&mut input);
+
+ let result = parser.parse_entirely(specified::Color::parse_color);
+ result.is_ok()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn Servo_ComputeColor(
+ raw_data: RawServoStyleSetBorrowedOrNull,
+ current_color: structs::nscolor,
+ value: *const nsAString,
+ result_color: *mut structs::nscolor,
+) -> bool {
+ use cssparser::{Parser, ParserInput};
+ use style::gecko;
+ use style::values::specified;
+
+ let current_color = gecko::values::convert_nscolor_to_rgba(current_color);
+ let value = (*value).to_string();
+ let result_color = result_color.as_mut().unwrap();
+
+ let mut input = ParserInput::new(&value);
+ let mut parser = Parser::new(&mut input);
+
+ let result = parser.parse_entirely(specified::Color::parse_color);
+ match result {
+ Ok(specified_color) => {
+ let computed_color = match raw_data {
+ Some(raw_data) => {
+ let data = PerDocumentStyleData::from_ffi(raw_data).borrow();
+ let metrics = get_metrics_provider_for_product();
+ let mut conditions = Default::default();
+ let context = create_context(
+ &data,
+ &metrics,
+ data.stylist.device().default_computed_values(),
+ /* parent_style = */ None,
+ /* pseudo = */ None,
+ /* for_smil_animation = */ false,
+ &mut conditions,
+ );
+ specified_color.to_computed_color(Some(&context))
+ }
+ None => {
+ specified_color.to_computed_color(None)
+ }
+ };
+
+ match computed_color {
+ Some(computed_color) => {
+ let rgba = computed_color.to_rgba(current_color);
+ *result_color = gecko::values::convert_rgba_to_nscolor(&rgba);
+ true
+ }
+ None => false,
+ }
+ }
+ Err(_) => false,
+ }
+}