aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorOriol Brufau <obrufau@igalia.com>2024-01-29 15:59:36 +0100
committerGitHub <noreply@github.com>2024-01-29 14:59:36 +0000
commit38d9245726c5d6d912fca1bda579f9f5fa96bbfa (patch)
tree555d03841a1c059c8b9c6dec4231639bf79ee630 /components/script/dom
parent742d3ed97f8e439a5807dbbfece6c23935525bce (diff)
downloadservo-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 ```
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/element.rs20
1 files changed, 8 insertions, 12 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);
}