diff options
author | Oriol Brufau <obrufau@igalia.com> | 2024-01-29 15:59:36 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-29 14:59:36 +0000 |
commit | 38d9245726c5d6d912fca1bda579f9f5fa96bbfa (patch) | |
tree | 555d03841a1c059c8b9c6dec4231639bf79ee630 | |
parent | 742d3ed97f8e439a5807dbbfece6c23935525bce (diff) | |
download | servo-38d9245726c5d6d912fca1bda579f9f5fa96bbfa.tar.gz servo-38d9245726c5d6d912fca1bda579f9f5fa96bbfa.zip |
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
```
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<Element> { impl Element { fn client_rect(&self) -> Rect<i32> { + 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::<Node>().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::<HTMLElement>()) || + if (in_quirks_mode && doc.GetBody().as_deref() == self.downcast::<HTMLElement>()) || (!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::<i32>::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 |