From 38d9245726c5d6d912fca1bda579f9f5fa96bbfa Mon Sep 17 00:00:00 2001 From: Oriol Brufau Date: Mon, 29 Jan 2024 15:59:36 +0100 Subject: [PATCH] Don't use cached client_rect() when a reflow is needed (#31210) Fixes #31195: ```js element.style.width = "5px"; element.clientWidth; // 5 element.style.width = "15px"; element.clientWidth; // Was 5, now 15 ``` --- components/script/dom/element.rs | 20 ++++++++----------- ...pixel-sizes-and-offsets.tentative.html.ini | 3 --- ...pixel-sizes-and-offsets.tentative.html.ini | 15 -------------- 3 files changed, 8 insertions(+), 30 deletions(-) diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index e607f27c232..6348bb412a9 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -3372,30 +3372,26 @@ impl<'a> SelectorsElement for DomRoot { impl Element { fn client_rect(&self) -> Rect { + let doc = self.node.owner_doc(); + if let Some(rect) = self .rare_data() .as_ref() .and_then(|data| data.client_rect.as_ref()) .and_then(|rect| rect.get().ok()) { - return rect; + if doc.needs_reflow().is_none() { + return rect; + } } let mut rect = self.upcast::().client_rect(); - let in_quirks_mode = self.node.owner_doc().quirks_mode() == QuirksMode::Quirks; + let in_quirks_mode = doc.quirks_mode() == QuirksMode::Quirks; - if (in_quirks_mode && - self.node.owner_doc().GetBody().as_deref() == self.downcast::()) || + if (in_quirks_mode && doc.GetBody().as_deref() == self.downcast::()) || (!in_quirks_mode && *self.root_element() == *self) { - let viewport_dimensions = self - .node - .owner_doc() - .window() - .window_size() - .initial_viewport - .round() - .to_i32(); + let viewport_dimensions = doc.window().window_size().initial_viewport.round().to_i32(); rect.size = Size2D::::new(viewport_dimensions.width, viewport_dimensions.height); } diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/subpixel-sizes-and-offsets.tentative.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/subpixel-sizes-and-offsets.tentative.html.ini index e021cff99f4..949df1ceeae 100644 --- a/tests/wpt/meta-legacy-layout/css/cssom-view/subpixel-sizes-and-offsets.tentative.html.ini +++ b/tests/wpt/meta-legacy-layout/css/cssom-view/subpixel-sizes-and-offsets.tentative.html.ini @@ -5,9 +5,6 @@ [clientWidth, offsetWidth and scrollWidth round 5.9 to 6] expected: FAIL - [clientHeight, offsetHeight and scrollHeight round 5.1 to 5] - expected: FAIL - [clientHeight, offsetHeight and scrollHeight round 5.5 to 6] expected: FAIL diff --git a/tests/wpt/meta/css/cssom-view/subpixel-sizes-and-offsets.tentative.html.ini b/tests/wpt/meta/css/cssom-view/subpixel-sizes-and-offsets.tentative.html.ini index e021cff99f4..ddddc14630c 100644 --- a/tests/wpt/meta/css/cssom-view/subpixel-sizes-and-offsets.tentative.html.ini +++ b/tests/wpt/meta/css/cssom-view/subpixel-sizes-and-offsets.tentative.html.ini @@ -1,19 +1,4 @@ [subpixel-sizes-and-offsets.tentative.html] - [clientWidth, offsetWidth and scrollWidth round 5.5 to 6] - expected: FAIL - - [clientWidth, offsetWidth and scrollWidth round 5.9 to 6] - expected: FAIL - - [clientHeight, offsetHeight and scrollHeight round 5.1 to 5] - expected: FAIL - - [clientHeight, offsetHeight and scrollHeight round 5.5 to 6] - expected: FAIL - - [clientHeight, offsetHeight and scrollHeight round 5.9 to 6] - expected: FAIL - [clientLeft and clientTop don't round 44.9] expected: FAIL