зеркало из https://github.com/mozilla/gecko-dev.git
servo: Merge #17581 - Fix incremental layout bugs for absolute and cleared elements (from mbrubeck:incremental); r=pcwalton
Fixes #17307. <del>There were two underlying bugs:</del> * <del>Nodes were not marked dirty when their style attribute changed.</del> * BaseFlow flags set during flow construction could get out of sync with the element's style if repair_style was called. --- - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #17307 - [x] There are tests for these changes Source-Repo: https://github.com/servo/servo Source-Revision: ece35f9caa7c6882adf2927ca7d7ce2bc7d8cef8 --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 099f14c641744ca088d8bf1d19eb81e60c653769
This commit is contained in:
Родитель
c67360a240
Коммит
1fb5baeb50
|
@ -1415,7 +1415,7 @@ version = "0.0.1"
|
|||
dependencies = [
|
||||
"app_units 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"canvas_traits 0.0.1",
|
||||
"euclid 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
|
|
@ -12,7 +12,7 @@ path = "lib.rs"
|
|||
[dependencies]
|
||||
app_units = "0.5"
|
||||
atomic_refcell = "0.1"
|
||||
bitflags = "0.7"
|
||||
bitflags = "0.8"
|
||||
canvas_traits = {path = "../canvas_traits"}
|
||||
euclid = "0.15"
|
||||
fnv = "1.0"
|
||||
|
|
|
@ -1115,6 +1115,28 @@ impl BaseFlow {
|
|||
}
|
||||
}
|
||||
|
||||
/// Update the 'flags' field when computed styles have changed.
|
||||
///
|
||||
/// These flags are initially set during flow construction. They only need to be updated here
|
||||
/// if they are based on properties that can change without triggering `RECONSTRUCT_FLOW`.
|
||||
pub fn update_flags_if_needed(&mut self, style: &ServoComputedValues) {
|
||||
// For absolutely-positioned flows, changes to top/bottom/left/right can cause these flags
|
||||
// to get out of date:
|
||||
if self.restyle_damage.contains(REFLOW_OUT_OF_FLOW) {
|
||||
// Note: We don't need to check whether IS_ABSOLUTELY_POSITIONED has changed, because
|
||||
// changes to the 'position' property trigger flow reconstruction.
|
||||
if self.flags.contains(IS_ABSOLUTELY_POSITIONED) {
|
||||
let logical_position = style.logical_position();
|
||||
self.flags.set(INLINE_POSITION_IS_STATIC,
|
||||
logical_position.inline_start == LengthOrPercentageOrAuto::Auto &&
|
||||
logical_position.inline_end == LengthOrPercentageOrAuto::Auto);
|
||||
self.flags.set(BLOCK_POSITION_IS_STATIC,
|
||||
logical_position.block_start == LengthOrPercentageOrAuto::Auto &&
|
||||
logical_position.block_end == LengthOrPercentageOrAuto::Auto);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Return a new BaseFlow like this one but with the given children list
|
||||
pub fn clone_with_children(&self, children: FlowList) -> BaseFlow {
|
||||
BaseFlow {
|
||||
|
@ -1361,6 +1383,7 @@ impl<'a> MutableFlowUtils for &'a mut Flow {
|
|||
/// calling them individually, since there is no reason not to perform both operations.
|
||||
fn repair_style_and_bubble_inline_sizes(self, style: &::StyleArc<ServoComputedValues>) {
|
||||
self.repair_style(style);
|
||||
mut_base(self).update_flags_if_needed(style);
|
||||
self.bubble_inline_sizes();
|
||||
}
|
||||
|
||||
|
|
|
@ -202,7 +202,7 @@ fn compute_damage(old: &ServoComputedValues, new: &ServoComputedValues) -> Servo
|
|||
add_if_not_equal!(old, new, damage,
|
||||
[REPAINT, REPOSITION, STORE_OVERFLOW, BUBBLE_ISIZES, REFLOW_OUT_OF_FLOW,
|
||||
REFLOW, RECONSTRUCT_FLOW], [
|
||||
get_box.float, get_box.display, get_box.position, get_counters.content,
|
||||
get_box.clear, get_box.float, get_box.display, get_box.position, get_counters.content,
|
||||
get_counters.counter_reset, get_counters.counter_increment,
|
||||
get_inheritedbox._servo_under_display_none,
|
||||
get_list.quotes, get_list.list_style_type,
|
||||
|
|
Загрузка…
Ссылка в новой задаче