Bug 1302949 - Add a method to restyle with an added declaration; r=manishearth
MozReview-Commit-ID: AbX0PCjjEM6
--- a/servo/components/style/gecko_bindings/bindings.rs
+++ b/servo/components/style/gecko_bindings/bindings.rs
@@ -947,16 +947,21 @@ extern "C" {
set: RawServoStyleSetBorrowed)
-> nsRestyleHint;
}
extern "C" {
pub fn Servo_RestyleSubtree(node: RawGeckoNodeBorrowed,
set: RawServoStyleSetBorrowedMut);
}
extern "C" {
+ pub fn Servo_RestyleWithAddedDeclaration(declarations: ServoDeclarationBlockBorrowed,
+ previous_style: ServoComputedValuesBorrowed)
+ -> ServoComputedValuesStrong;
+}
+extern "C" {
pub fn Servo_GetStyleFont(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleFont;
}
extern "C" {
pub fn Servo_GetStyleColor(computed_values: ServoComputedValuesBorrowed)
-> *const nsStyleColor;
}
extern "C" {
--- a/servo/ports/geckolib/glue.rs
+++ b/servo/ports/geckolib/glue.rs
@@ -39,18 +39,19 @@ use style::gecko_bindings::structs::Serv
use style::gecko_bindings::structs::nsRestyleHint;
use style::gecko_bindings::structs::nsString;
use style::gecko_bindings::sugar::ownership::{FFIArcHelpers, HasArcFFI, HasBoxFFI};
use style::gecko_bindings::sugar::ownership::{HasSimpleFFI, Strong};
use style::parallel;
use style::parser::{ParserContext, ParserContextExtraData};
use style::properties::{ComputedValues, Importance, PropertyDeclaration,
PropertyDeclarationParseResult, PropertyDeclarationBlock,
- parse_one_declaration};
+ cascade, parse_one_declaration};
use style::selector_impl::PseudoElementCascadeType;
+use style::selector_matching::ApplicableDeclarationBlock;
use style::sequential;
use style::string_cache::Atom;
use style::stylesheets::{Origin, Stylesheet};
use style::timer::Timer;
use url::Url;
/*
@@ -93,16 +94,17 @@ fn restyle_subtree(node: GeckoNode, raw_
// The stylist consumes stylesheets lazily.
let per_doc_data = PerDocumentStyleData::from_ffi_mut(raw_data);
per_doc_data.flush_stylesheets();
let local_context_data =
LocalStyleContextCreationInfo::new(per_doc_data.new_animations_sender.clone());
let shared_style_context = SharedStyleContext {
+ // FIXME (bug 1303229): Use the actual viewport size here
viewport_size: Size2D::new(Au(0), Au(0)),
screen_size_changed: false,
generation: 0,
goal: ReflowGoal::ForScriptQuery,
stylist: per_doc_data.stylist.clone(),
running_animations: per_doc_data.running_animations.clone(),
expired_animations: per_doc_data.expired_animations.clone(),
error_reporter: Box::new(StdoutErrorReporter),
@@ -123,16 +125,45 @@ fn restyle_subtree(node: GeckoNode, raw_
#[no_mangle]
pub extern "C" fn Servo_RestyleSubtree(node: RawGeckoNodeBorrowed,
raw_data: RawServoStyleSetBorrowedMut) -> () {
let node = GeckoNode(node);
restyle_subtree(node, raw_data);
}
#[no_mangle]
+pub extern "C" fn Servo_RestyleWithAddedDeclaration(declarations: ServoDeclarationBlockBorrowed,
+ previous_style: ServoComputedValuesBorrowed)
+ -> ServoComputedValuesStrong
+{
+ match GeckoDeclarationBlock::as_arc(&declarations).declarations {
+ Some(ref declarations) => {
+ let declaration_block = ApplicableDeclarationBlock {
+ mixed_declarations: declarations.clone(),
+ importance: Importance::Normal,
+ source_order: 0,
+ specificity: ::std::u32::MAX,
+ };
+ let previous_style = ComputedValues::as_arc(&previous_style);
+
+ // FIXME (bug 1303229): Use the actual viewport size here
+ let (computed, _) = cascade(Size2D::new(Au(0), Au(0)),
+ &[declaration_block],
+ false,
+ Some(previous_style),
+ None,
+ None,
+ Box::new(StdoutErrorReporter));
+ Arc::new(computed).into_strong()
+ },
+ None => ServoComputedValuesStrong::null(),
+ }
+}
+
+#[no_mangle]
pub extern "C" fn Servo_StyleWorkerThreadCount() -> u32 {
*NUM_THREADS as u32
}
#[no_mangle]
pub extern "C" fn Servo_Node_ClearNodeData(node: RawGeckoNodeBorrowed) -> () {
let node = GeckoNode(node);
node.clear_data();