diff --git a/ports/geckolib/data.rs b/ports/geckolib/data.rs index bc1c398e6c0..733d5e4f83f 100644 --- a/ports/geckolib/data.rs +++ b/ports/geckolib/data.rs @@ -22,7 +22,7 @@ use util::workqueue::WorkQueue; pub struct PerDocumentStyleData { /// Rule processor. - pub stylist: Stylist, + pub stylist: Arc, /// List of stylesheets, mirrored from Gecko. pub stylesheets: Vec>, @@ -50,8 +50,8 @@ impl PerDocumentStyleData { let num_threads = cmp::max(num_cpus::get() * 3 / 4, 1); PerDocumentStyleData { - stylist: Stylist::new(device), - stylesheets: Vec::new(), + stylist: Arc::new(Stylist::new(device)), + stylesheets: vec![], stylesheets_changed: true, new_animations_sender: new_anims_sender, new_animations_receiver: new_anims_receiver, diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index d4bfc62b9d6..4d7f2cdcb93 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -18,7 +18,7 @@ use std::ptr; use std::slice; use std::str::from_utf8_unchecked; use std::sync::{Arc, Mutex}; -use style::context::{ReflowGoal, StylistWrapper}; +use style::context::{ReflowGoal}; use style::dom::{TDocument, TElement, TNode}; use style::error_reporting::StdoutErrorReporter; use style::parallel; @@ -51,7 +51,8 @@ pub extern "C" fn Servo_RestyleDocument(doc: *mut RawGeckoDocument, raw_data: *m // into a runtime-wide init hook at some point. GeckoComputedValues::initial_values(); - let _needs_dirtying = data.stylist.update(&data.stylesheets, data.stylesheets_changed); + let _needs_dirtying = Arc::get_mut(&mut data.stylist).unwrap() + .update(&data.stylesheets, data.stylesheets_changed); data.stylesheets_changed = false; let shared_style_context = SharedStyleContext { @@ -59,7 +60,7 @@ pub extern "C" fn Servo_RestyleDocument(doc: *mut RawGeckoDocument, raw_data: *m screen_size_changed: false, generation: 0, goal: ReflowGoal::ForScriptQuery, - stylist: StylistWrapper(&data.stylist), + stylist: data.stylist.clone(), new_animations_sender: Mutex::new(data.new_animations_sender.clone()), running_animations: data.running_animations.clone(), expired_animations: data.expired_animations.clone(), diff --git a/ports/geckolib/selector_impl.rs b/ports/geckolib/selector_impl.rs index d892b68ca31..8561881330b 100644 --- a/ports/geckolib/selector_impl.rs +++ b/ports/geckolib/selector_impl.rs @@ -232,12 +232,89 @@ impl SelectorImpl for GeckoSelectorImpl { } impl SelectorImplExt for GeckoSelectorImpl { + type ComputedValues = GeckoComputedValues; + #[inline] - fn each_eagerly_cascaded_pseudo_element(mut fun: F) + fn is_eagerly_cascaded_pseudo_element(pseudo: &PseudoElement) -> bool { + match *pseudo { + PseudoElement::Before | + PseudoElement::After | + PseudoElement::FirstLine => true, + _ => false, + } + } + + #[inline] + fn each_pseudo_element(mut fun: F) where F: FnMut(PseudoElement) { fun(PseudoElement::Before); fun(PseudoElement::After); - // TODO: probably a lot more are missing here + fun(PseudoElement::FirstLine); + + fun(PseudoElement::MozNonElement); + fun(PseudoElement::MozAnonymousBlock); + fun(PseudoElement::MozAnonymousPositionedBlock); + fun(PseudoElement::MozMathMLAnonymousBlock); + fun(PseudoElement::MozXULAnonymousBlock); + + fun(PseudoElement::MozHorizontalFramesetBorder); + fun(PseudoElement::MozVerticalFramesetBorder); + fun(PseudoElement::MozLineFrame); + fun(PseudoElement::MozButtonContent); + fun(PseudoElement::MozButtonLabel); + fun(PseudoElement::MozCellContent); + fun(PseudoElement::MozDropdownList); + fun(PseudoElement::MozFieldsetContent); + fun(PseudoElement::MozFramesetBlank); + fun(PseudoElement::MozDisplayComboboxControlFrame); + + fun(PseudoElement::MozHTMLCanvasContent); + fun(PseudoElement::MozInlineTable); + fun(PseudoElement::MozTable); + fun(PseudoElement::MozTableCell); + fun(PseudoElement::MozTableColumnGroup); + fun(PseudoElement::MozTableColumn); + fun(PseudoElement::MozTableOuter); + fun(PseudoElement::MozTableRowGroup); + fun(PseudoElement::MozTableRow); + + fun(PseudoElement::MozCanvas); + fun(PseudoElement::MozPageBreak); + fun(PseudoElement::MozPage); + fun(PseudoElement::MozPageContent); + fun(PseudoElement::MozPageSequence); + fun(PseudoElement::MozScrolledContent); + fun(PseudoElement::MozScrolledCanvas); + fun(PseudoElement::MozScrolledPageSequence); + fun(PseudoElement::MozColumnContent); + fun(PseudoElement::MozViewport); + fun(PseudoElement::MozViewportScroll); + fun(PseudoElement::MozAnonymousFlexItem); + fun(PseudoElement::MozAnonymousGridItem); + + fun(PseudoElement::MozRuby); + fun(PseudoElement::MozRubyBase); + fun(PseudoElement::MozRubyBaseContainer); + fun(PseudoElement::MozRubyText); + fun(PseudoElement::MozRubyTextContainer); + + fun(PseudoElement::MozTreeColumn); + fun(PseudoElement::MozTreeRow); + fun(PseudoElement::MozTreeSeparator); + fun(PseudoElement::MozTreeCell); + fun(PseudoElement::MozTreeIndentation); + fun(PseudoElement::MozTreeLine); + fun(PseudoElement::MozTreeTwisty); + fun(PseudoElement::MozTreeImage); + fun(PseudoElement::MozTreeCellText); + fun(PseudoElement::MozTreeCheckbox); + fun(PseudoElement::MozTreeProgressMeter); + fun(PseudoElement::MozTreeDropFeedback); + + fun(PseudoElement::MozSVGMarkerAnonChild); + fun(PseudoElement::MozSVGOuterSVGAnonChild); + fun(PseudoElement::MozSVGForeignContent); + fun(PseudoElement::MozSVGText); } #[inline] diff --git a/ports/geckolib/traversal.rs b/ports/geckolib/traversal.rs index 33fc1fd322e..4e10d8c8fc8 100644 --- a/ports/geckolib/traversal.rs +++ b/ports/geckolib/traversal.rs @@ -52,7 +52,7 @@ impl<'a> StandaloneStyleContext<'a> { } } -impl<'a> StyleContext<'a, GeckoSelectorImpl, GeckoComputedValues> for StandaloneStyleContext<'a> { +impl<'a> StyleContext<'a, GeckoSelectorImpl> for StandaloneStyleContext<'a> { fn shared_context(&self) -> &'a SharedStyleContext { &self.shared }