Bug 1302949 - Add a method to restyle with an added declaration; r=manishearth draft
authorBrian Birtles <birtles@gmail.com>
Fri, 16 Sep 2016 10:58:53 +0900
changeset 420000 1bcf8d6c3afa4188dcf49bed3ae66f69e8e5385d
parent 419999 3431bbdb4fafda3a1d1546497563ff605a12c488
child 420001 6d8784f63df02f15e5f05b969fd7da2e10ca0960
push id31064
push userbbirtles@mozilla.com
push dateMon, 03 Oct 2016 04:36:09 +0000
reviewersmanishearth
bugs1302949
milestone52.0a1
Bug 1302949 - Add a method to restyle with an added declaration; r=manishearth MozReview-Commit-ID: AbX0PCjjEM6
servo/components/style/gecko_bindings/bindings.rs
servo/ports/geckolib/glue.rs
--- 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();