diff --git a/components/style/gecko_bindings/bindings.rs b/components/style/gecko_bindings/bindings.rs index 93956c73cce..b3295e928cb 100644 --- a/components/style/gecko_bindings/bindings.rs +++ b/components/style/gecko_bindings/bindings.rs @@ -1476,7 +1476,7 @@ extern "C" { extern "C" { pub fn Servo_TraverseSubtree(root: RawGeckoElementBorrowed, set: RawServoStyleSetBorrowed, - root_behavior: TraversalRootBehavior); + root_behavior: TraversalRootBehavior) -> bool; } extern "C" { pub fn Servo_AssertTreeIsClean(root: RawGeckoElementBorrowed); diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 72c0b5daf61..c754da42e79 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -164,14 +164,19 @@ fn traverse_subtree(element: GeckoElement, raw_data: RawServoStyleSetBorrowed, } } +/// Traverses the subtree rooted at `root` for restyling. Returns whether a +/// Gecko post-traversal (to perform lazy frame construction, or consume any +/// RestyleData, or drop any ElementData) is required. #[no_mangle] pub extern "C" fn Servo_TraverseSubtree(root: RawGeckoElementBorrowed, raw_data: RawServoStyleSetBorrowed, - behavior: structs::TraversalRootBehavior) -> () { + behavior: structs::TraversalRootBehavior) -> bool { let element = GeckoElement(root); debug!("Servo_TraverseSubtree: {:?}", element); traverse_subtree(element, raw_data, behavior == structs::TraversalRootBehavior::UnstyledChildrenOnly); + + element.has_dirty_descendants() || element.mutate_data().unwrap().has_restyle() } #[no_mangle]