@@ -27,8 +27,8 @@ use fxhash::FxHashMap;
27
27
use ipc_channel:: ipc:: IpcSender ;
28
28
use layout_api:: {
29
29
IFrameSizes , Layout , LayoutConfig , LayoutDamage , LayoutFactory , NodesFromPointQueryType ,
30
- OffsetParentResponse , QueryMsg , ReflowGoal , ReflowRequest , ReflowRequestRestyle , ReflowResult ,
31
- TrustedNodeAddress ,
30
+ OffsetParentResponse , QueryMsg , ReflowGoal , ReflowPhasesRun , ReflowRequest ,
31
+ ReflowRequestRestyle , ReflowResult , TrustedNodeAddress ,
32
32
} ;
33
33
use log:: { debug, error, warn} ;
34
34
use malloc_size_of:: { MallocConditionalSizeOf , MallocSizeOf , MallocSizeOfOps } ;
@@ -672,13 +672,13 @@ impl LayoutThread {
672
672
self . maybe_print_reflow_event ( & reflow_request) ;
673
673
674
674
if self . can_skip_reflow_request_entirely ( & reflow_request) {
675
- // We could skip the layout, but we might need to update the scroll node.
676
- let update_scroll_reflow_target_scrolled =
677
- self . handle_update_scroll_node_request ( & reflow_request) ;
678
-
679
- return Some ( ReflowResult :: new_without_relayout (
680
- update_scroll_reflow_target_scrolled ,
681
- ) ) ;
675
+ // We can skip layout, but we might need to update a scroll node.
676
+ return self
677
+ . handle_update_scroll_node_request ( & reflow_request)
678
+ . then ( || ReflowResult {
679
+ reflow_phases_run : ReflowPhasesRun :: UpdatedScrollNodeOffset ,
680
+ .. Default :: default ( )
681
+ } ) ;
682
682
}
683
683
684
684
let document = unsafe { ServoLayoutNode :: new ( & reflow_request. document ) } ;
@@ -698,30 +698,34 @@ impl LayoutThread {
698
698
animation_timeline_value : reflow_request. animation_timeline_value ,
699
699
} ) ;
700
700
701
- let ( damage, iframe_sizes) = self . restyle_and_build_trees (
701
+ let ( mut reflow_phases_run , damage, iframe_sizes) = self . restyle_and_build_trees (
702
702
& mut reflow_request,
703
703
document,
704
704
root_element,
705
705
& image_resolver,
706
706
) ;
707
- self . calculate_overflow ( damage) ;
708
- self . build_stacking_context_tree ( & reflow_request, damage) ;
709
- let built_display_list = self . build_display_list ( & reflow_request, damage, & image_resolver) ;
710
-
711
- let update_scroll_reflow_target_scrolled =
712
- self . handle_update_scroll_node_request ( & reflow_request) ;
707
+ if self . calculate_overflow ( damage) {
708
+ reflow_phases_run. insert ( ReflowPhasesRun :: CalculatedOverflow ) ;
709
+ }
710
+ if self . build_stacking_context_tree ( & reflow_request, damage) {
711
+ reflow_phases_run. insert ( ReflowPhasesRun :: BuiltStackingContextTree ) ;
712
+ }
713
+ if self . build_display_list ( & reflow_request, damage, & image_resolver) {
714
+ reflow_phases_run. insert ( ReflowPhasesRun :: BuiltDisplayList ) ;
715
+ }
716
+ if self . handle_update_scroll_node_request ( & reflow_request) {
717
+ reflow_phases_run. insert ( ReflowPhasesRun :: UpdatedScrollNodeOffset ) ;
718
+ }
713
719
714
720
let pending_images = std:: mem:: take ( & mut * image_resolver. pending_images . lock ( ) ) ;
715
721
let pending_rasterization_images =
716
722
std:: mem:: take ( & mut * image_resolver. pending_rasterization_images . lock ( ) ) ;
717
723
718
724
Some ( ReflowResult {
719
- built_display_list ,
725
+ reflow_phases_run ,
720
726
pending_images,
721
727
pending_rasterization_images,
722
728
iframe_sizes : Some ( iframe_sizes) ,
723
- update_scroll_reflow_target_scrolled,
724
- processed_relayout : true ,
725
729
} )
726
730
}
727
731
@@ -793,11 +797,11 @@ impl LayoutThread {
793
797
document : ServoLayoutDocument < ' _ > ,
794
798
root_element : ServoLayoutElement < ' _ > ,
795
799
image_resolver : & Arc < ImageResolver > ,
796
- ) -> ( RestyleDamage , IFrameSizes ) {
800
+ ) -> ( ReflowPhasesRun , RestyleDamage , IFrameSizes ) {
797
801
let mut snapshot_map = SnapshotMap :: new ( ) ;
798
802
let _snapshot_setter = match reflow_request. restyle . as_mut ( ) {
799
803
Some ( restyle) => SnapshotSetter :: new ( restyle, & mut snapshot_map) ,
800
- None => return ( RestyleDamage :: empty ( ) , IFrameSizes :: default ( ) ) ,
804
+ None => return Default :: default ( ) ,
801
805
} ;
802
806
803
807
let document_shared_lock = document. style_shared_lock ( ) ;
@@ -877,7 +881,7 @@ impl LayoutThread {
877
881
878
882
if !token. should_traverse ( ) {
879
883
layout_context. style_context . stylist . rule_tree ( ) . maybe_gc ( ) ;
880
- return ( RestyleDamage :: empty ( ) , IFrameSizes :: default ( ) ) ;
884
+ return Default :: default ( ) ;
881
885
}
882
886
883
887
dirty_root = driver:: traverse_dom ( & recalc_style_traversal, token, rayon_pool) . as_node ( ) ;
@@ -895,7 +899,7 @@ impl LayoutThread {
895
899
896
900
if !damage. contains ( RestyleDamage :: RELAYOUT ) {
897
901
layout_context. style_context . stylist . rule_tree ( ) . maybe_gc ( ) ;
898
- return ( damage, IFrameSizes :: default ( ) ) ;
902
+ return ( ReflowPhasesRun :: empty ( ) , damage, IFrameSizes :: default ( ) ) ;
899
903
}
900
904
901
905
let mut box_tree = self . box_tree . borrow_mut ( ) ;
@@ -956,13 +960,17 @@ impl LayoutThread {
956
960
layout_context. style_context . stylist . rule_tree ( ) . maybe_gc ( ) ;
957
961
958
962
let mut iframe_sizes = layout_context. iframe_sizes . lock ( ) ;
959
- ( damage, std:: mem:: take ( & mut * iframe_sizes) )
963
+ (
964
+ ReflowPhasesRun :: RanLayout ,
965
+ damage,
966
+ std:: mem:: take ( & mut * iframe_sizes) ,
967
+ )
960
968
}
961
969
962
970
#[ servo_tracing:: instrument( name = "Overflow Calculation" , skip_all) ]
963
- fn calculate_overflow ( & self , damage : RestyleDamage ) {
971
+ fn calculate_overflow ( & self , damage : RestyleDamage ) -> bool {
964
972
if !damage. contains ( RestyleDamage :: RECALCULATE_OVERFLOW ) {
965
- return ;
973
+ return false ;
966
974
}
967
975
968
976
if let Some ( fragment_tree) = & * self . fragment_tree . borrow ( ) {
@@ -976,22 +984,27 @@ impl LayoutThread {
976
984
// display list the next time one is requested.
977
985
self . need_new_display_list . set ( true ) ;
978
986
self . need_new_stacking_context_tree . set ( true ) ;
987
+ true
979
988
}
980
989
981
990
#[ servo_tracing:: instrument( name = "Stacking Context Tree Construction" , skip_all) ]
982
- fn build_stacking_context_tree ( & self , reflow_request : & ReflowRequest , damage : RestyleDamage ) {
991
+ fn build_stacking_context_tree (
992
+ & self ,
993
+ reflow_request : & ReflowRequest ,
994
+ damage : RestyleDamage ,
995
+ ) -> bool {
983
996
if !ReflowPhases :: necessary ( & reflow_request. reflow_goal )
984
997
. contains ( ReflowPhases :: StackingContextTreeConstruction )
985
998
{
986
- return ;
999
+ return false ;
987
1000
}
988
1001
let Some ( fragment_tree) = & * self . fragment_tree . borrow ( ) else {
989
- return ;
1002
+ return false ;
990
1003
} ;
991
1004
if !damage. contains ( RestyleDamage :: REBUILD_STACKING_CONTEXT ) &&
992
1005
!self . need_new_stacking_context_tree . get ( )
993
1006
{
994
- return ;
1007
+ return false ;
995
1008
}
996
1009
997
1010
let mut stacking_context_tree = self . stacking_context_tree . borrow_mut ( ) ;
@@ -1041,6 +1054,8 @@ impl LayoutThread {
1041
1054
) ;
1042
1055
}
1043
1056
}
1057
+
1058
+ true
1044
1059
}
1045
1060
1046
1061
/// Build the display list for the current layout and send it to the renderer. If no display
0 commit comments