Add insertRule/deleteRule support for stylo

This commit is contained in:
Xidorn Quan 2016-11-29 23:02:05 +11:00
parent 22c8df150a
commit bddd467c0e
4 changed files with 54 additions and 3 deletions

View file

@ -277,7 +277,6 @@ COMPILATION_TARGETS = {
"StyleBasicShape", "StyleBasicShape",
"StyleBasicShapeType", "StyleBasicShapeType",
"StyleClipPath", "StyleClipPath",
"nscoord",
"nsCSSKeyword", "nsCSSKeyword",
"nsCSSShadowArray", "nsCSSShadowArray",
"nsCSSValue", "nsCSSValue",
@ -331,6 +330,8 @@ COMPILATION_TARGETS = {
"nsStyleVariables", "nsStyleVariables",
"nsStyleVisibility", "nsStyleVisibility",
"nsStyleXUL", "nsStyleXUL",
"nscoord",
"nsresult",
], ],
"array_types": { "array_types": {
"uintptr_t": "usize", "uintptr_t": "usize",

View file

@ -14,11 +14,12 @@ use gecko_bindings::bindings::{Gecko_CreateGradient, Gecko_SetGradientImageValue
use gecko_bindings::bindings::{RawServoStyleSheet, RawServoDeclarationBlock, RawServoStyleRule}; use gecko_bindings::bindings::{RawServoStyleSheet, RawServoDeclarationBlock, RawServoStyleRule};
use gecko_bindings::bindings::{ServoComputedValues, ServoCssRules}; use gecko_bindings::bindings::{ServoComputedValues, ServoCssRules};
use gecko_bindings::structs::{nsStyleCoord_CalcValue, nsStyleImage}; use gecko_bindings::structs::{nsStyleCoord_CalcValue, nsStyleImage};
use gecko_bindings::structs::nsresult;
use gecko_bindings::sugar::ns_style_coord::{CoordDataValue, CoordDataMut}; use gecko_bindings::sugar::ns_style_coord::{CoordDataValue, CoordDataMut};
use gecko_bindings::sugar::ownership::{HasArcFFI, HasFFI}; use gecko_bindings::sugar::ownership::{HasArcFFI, HasFFI};
use parking_lot::RwLock; use parking_lot::RwLock;
use properties::{ComputedValues, PropertyDeclarationBlock}; use properties::{ComputedValues, PropertyDeclarationBlock};
use stylesheets::{CssRules, Stylesheet, StyleRule}; use stylesheets::{CssRules, RulesMutateError, Stylesheet, StyleRule};
use values::computed::{CalcLengthOrPercentage, Gradient, Image, LengthOrPercentage, LengthOrPercentageOrAuto}; use values::computed::{CalcLengthOrPercentage, Gradient, Image, LengthOrPercentage, LengthOrPercentageOrAuto};
unsafe impl HasFFI for Stylesheet { unsafe impl HasFFI for Stylesheet {
@ -497,3 +498,14 @@ pub mod basic_shape {
} }
} }
} }
impl From<RulesMutateError> for nsresult {
fn from(other: RulesMutateError) -> Self {
match other {
RulesMutateError::Syntax => nsresult::NS_ERROR_DOM_SYNTAX_ERR,
RulesMutateError::IndexSize => nsresult::NS_ERROR_DOM_INDEX_SIZE_ERR,
RulesMutateError::HierarchyRequest => nsresult::NS_ERROR_DOM_HIERARCHY_REQUEST_ERR,
RulesMutateError::InvalidState => nsresult::NS_ERROR_DOM_INVALID_STATE_ERR,
}
}
}

View file

@ -71,7 +71,6 @@ use gecko_bindings::structs::SheetParsingMode;
use gecko_bindings::structs::StyleBasicShape; use gecko_bindings::structs::StyleBasicShape;
use gecko_bindings::structs::StyleBasicShapeType; use gecko_bindings::structs::StyleBasicShapeType;
use gecko_bindings::structs::StyleClipPath; use gecko_bindings::structs::StyleClipPath;
use gecko_bindings::structs::nscoord;
use gecko_bindings::structs::nsCSSKeyword; use gecko_bindings::structs::nsCSSKeyword;
use gecko_bindings::structs::nsCSSShadowArray; use gecko_bindings::structs::nsCSSShadowArray;
use gecko_bindings::structs::nsCSSValue; use gecko_bindings::structs::nsCSSValue;
@ -200,6 +199,8 @@ unsafe impl Sync for nsStyleVisibility {}
use gecko_bindings::structs::nsStyleXUL; use gecko_bindings::structs::nsStyleXUL;
unsafe impl Send for nsStyleXUL {} unsafe impl Send for nsStyleXUL {}
unsafe impl Sync for nsStyleXUL {} unsafe impl Sync for nsStyleXUL {}
use gecko_bindings::structs::nscoord;
use gecko_bindings::structs::nsresult;
#[repr(i32)] #[repr(i32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
@ -1025,6 +1026,17 @@ extern "C" {
index: u32) index: u32)
-> RawServoStyleRuleStrong; -> RawServoStyleRuleStrong;
} }
extern "C" {
pub fn Servo_CssRules_InsertRule(rules: ServoCssRulesBorrowed,
sheet: RawServoStyleSheetBorrowed,
rule: *const nsACString_internal,
index: u32, nested: bool,
rule_type: *mut u16) -> nsresult;
}
extern "C" {
pub fn Servo_CssRules_DeleteRule(rules: ServoCssRulesBorrowed, index: u32)
-> nsresult;
}
extern "C" { extern "C" {
pub fn Servo_StyleRule_Debug(rule: RawServoStyleRuleBorrowed, pub fn Servo_StyleRule_Debug(rule: RawServoStyleRuleBorrowed,
result: *mut nsACString_internal); result: *mut nsACString_internal);

View file

@ -43,6 +43,7 @@ use style::gecko_bindings::bindings::nsTArrayBorrowed_uintptr_t;
use style::gecko_bindings::structs; use style::gecko_bindings::structs;
use style::gecko_bindings::structs::{SheetParsingMode, nsIAtom}; use style::gecko_bindings::structs::{SheetParsingMode, nsIAtom};
use style::gecko_bindings::structs::{nsRestyleHint, nsChangeHint}; use style::gecko_bindings::structs::{nsRestyleHint, nsChangeHint};
use style::gecko_bindings::structs::nsresult;
use style::gecko_bindings::sugar::ownership::{FFIArcHelpers, HasArcFFI, HasBoxFFI}; use style::gecko_bindings::sugar::ownership::{FFIArcHelpers, HasArcFFI, HasBoxFFI};
use style::gecko_bindings::sugar::ownership::{HasSimpleFFI, Strong}; use style::gecko_bindings::sugar::ownership::{HasSimpleFFI, Strong};
use style::gecko_bindings::sugar::refptr::{GeckoArcPrincipal, GeckoArcURI}; use style::gecko_bindings::sugar::refptr::{GeckoArcPrincipal, GeckoArcURI};
@ -332,6 +333,31 @@ pub extern "C" fn Servo_CssRules_GetStyleRuleAt(rules: ServoCssRulesBorrowed, in
} }
} }
#[no_mangle]
pub extern "C" fn Servo_CssRules_InsertRule(rules: ServoCssRulesBorrowed, sheet: RawServoStyleSheetBorrowed,
rule: *const nsACString, index: u32, nested: bool,
rule_type: *mut u16) -> nsresult {
let rules = RwLock::<CssRules>::as_arc(&rules);
let sheet = Stylesheet::as_arc(&sheet);
let rule = unsafe { rule.as_ref().unwrap().as_str_unchecked() };
match rules.write().insert_rule(rule, sheet, index as usize, nested) {
Ok(new_rule) => {
*unsafe { rule_type.as_mut().unwrap() } = new_rule.rule_type() as u16;
nsresult::NS_OK
}
Err(err) => err.into()
}
}
#[no_mangle]
pub extern "C" fn Servo_CssRules_DeleteRule(rules: ServoCssRulesBorrowed, index: u32) -> nsresult {
let rules = RwLock::<CssRules>::as_arc(&rules);
match rules.write().remove_rule(index as usize) {
Ok(_) => nsresult::NS_OK,
Err(err) => err.into()
}
}
#[no_mangle] #[no_mangle]
pub extern "C" fn Servo_CssRules_AddRef(rules: ServoCssRulesBorrowed) -> () { pub extern "C" fn Servo_CssRules_AddRef(rules: ServoCssRulesBorrowed) -> () {
unsafe { RwLock::<CssRules>::addref(rules) }; unsafe { RwLock::<CssRules>::addref(rules) };