From bf49260e81d79dd3e769c942ecdbb21effaf4f71 Mon Sep 17 00:00:00 2001 From: switchpiggy Date: Thu, 4 May 2023 22:59:46 -0700 Subject: [PATCH 1/4] Implemented special cases for Element.clientWidth() and clientHeight() --- components/script/dom/element.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 179cb169c46..3bf403498f1 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -81,6 +81,7 @@ use crate::dom::text::Text; use crate::dom::validation::Validatable; use crate::dom::virtualmethods::{vtable_for, VirtualMethods}; use crate::dom::window::ReflowReason; +use crate::dom::window::Window; use crate::script_thread::ScriptThread; use crate::stylesheet_loader::StylesheetOwner; use crate::task::TaskOnce; @@ -2501,11 +2502,32 @@ impl ElementMethods for Element { // https://drafts.csswg.org/cssom-view/#dom-element-clientwidth fn ClientWidth(&self) -> i32 { + let owner_doc: &Document = &self.node.owner_doc(); + if self.local_name().to_string() == "body" || + matches!(owner_doc.quirks_mode(), QuirksMode::Quirks) + { + let window: &Window = owner_doc.window(); + return window.window_size().initial_viewport.round().to_i32().width; + } + self.client_rect().size.width } // https://drafts.csswg.org/cssom-view/#dom-element-clientheight fn ClientHeight(&self) -> i32 { + let owner_doc: &Document = &self.node.owner_doc(); + if self.local_name().to_string() == "body" || + matches!(owner_doc.quirks_mode(), QuirksMode::Quirks) + { + let window: &Window = owner_doc.window(); + return window + .window_size() + .initial_viewport + .round() + .to_i32() + .height; + } + self.client_rect().size.height } From 7c61c5b9300b25da474f1951402f0ba11b82e216 Mon Sep 17 00:00:00 2001 From: switchpiggy Date: Fri, 5 May 2023 01:56:27 -0700 Subject: [PATCH 2/4] Checks moved to Element::client_rect(), fixed conditions for the special cases, reconfigured Window constructor to initialize current_viewport to initial window size --- components/script/dom/element.rs | 50 +++++++++++++++++--------------- components/script/dom/window.rs | 8 ++++- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 3bf403498f1..e7583a2b428 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -81,13 +81,15 @@ use crate::dom::text::Text; use crate::dom::validation::Validatable; use crate::dom::virtualmethods::{vtable_for, VirtualMethods}; use crate::dom::window::ReflowReason; -use crate::dom::window::Window; use crate::script_thread::ScriptThread; use crate::stylesheet_loader::StylesheetOwner; use crate::task::TaskOnce; +use app_units::Au; use devtools_traits::AttrInfo; use dom_struct::dom_struct; +use euclid::default::Point2D; use euclid::default::Rect; +use euclid::default::Size2D; use html5ever::serialize; use html5ever::serialize::SerializeOpts; use html5ever::serialize::TraversalScope; @@ -2502,32 +2504,11 @@ impl ElementMethods for Element { // https://drafts.csswg.org/cssom-view/#dom-element-clientwidth fn ClientWidth(&self) -> i32 { - let owner_doc: &Document = &self.node.owner_doc(); - if self.local_name().to_string() == "body" || - matches!(owner_doc.quirks_mode(), QuirksMode::Quirks) - { - let window: &Window = owner_doc.window(); - return window.window_size().initial_viewport.round().to_i32().width; - } - self.client_rect().size.width } // https://drafts.csswg.org/cssom-view/#dom-element-clientheight fn ClientHeight(&self) -> i32 { - let owner_doc: &Document = &self.node.owner_doc(); - if self.local_name().to_string() == "body" || - matches!(owner_doc.quirks_mode(), QuirksMode::Quirks) - { - let window: &Window = owner_doc.window(); - return window - .window_size() - .initial_viewport - .round() - .to_i32() - .height; - } - self.client_rect().size.height } @@ -3314,7 +3295,30 @@ impl Element { { return rect; } - let rect = self.upcast::().client_rect(); + + let mut rect = self.upcast::().client_rect(); + let owner_doc = self.node.owner_doc(); + + if (matches!(owner_doc.quirks_mode(), QuirksMode::Quirks) && + owner_doc.GetBody().as_deref() == self.downcast::()) || + (matches!(owner_doc.quirks_mode(), QuirksMode::NoQuirks) && + *self.root_element() == *self) + { + let viewport = owner_doc.window().current_viewport(); + + //cast Rect into Rect + rect = Rect::::new( + Point2D::::new( + viewport.origin.x.to_nearest_px(), + viewport.origin.y.to_nearest_px(), + ), + Size2D::::new( + viewport.size.width.to_nearest_px(), + viewport.size.height.to_nearest_px(), + ), + ); + } + self.ensure_rare_data().client_rect = Some(window_from_node(self).cache_layout_value(rect)); rect } diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 2364c1c7f72..e3237cc9eb4 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -2609,7 +2609,13 @@ impl Window { layout_chan, layout_rpc, window_size: Cell::new(window_size), - current_viewport: Cell::new(Rect::zero()), + current_viewport: Cell::new(Rect::new( + Point2D::zero(), + Size2D::new( + Au::from_f32_px(window_size.initial_viewport.width.into()), + Au::from_f32_px(window_size.initial_viewport.width.into()), + ), + )), suppress_reflow: Cell::new(true), pending_reflow_count: Default::default(), current_state: Cell::new(WindowState::Alive), From 34762d97ad2bc4bfb22df3477913affcaec76b56 Mon Sep 17 00:00:00 2001 From: switchpiggy Date: Fri, 5 May 2023 02:32:29 -0700 Subject: [PATCH 3/4] fixup! Checks moved to Element::client_rect(), fixed conditions for the special cases, reconfigured Window constructor to initialize current_viewport to initial window size --- components/script/dom/element.rs | 33 +++++++++++++------------------- components/script/dom/window.rs | 8 +------- 2 files changed, 14 insertions(+), 27 deletions(-) diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index e7583a2b428..de34eb401e0 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -84,10 +84,8 @@ use crate::dom::window::ReflowReason; use crate::script_thread::ScriptThread; use crate::stylesheet_loader::StylesheetOwner; use crate::task::TaskOnce; -use app_units::Au; use devtools_traits::AttrInfo; use dom_struct::dom_struct; -use euclid::default::Point2D; use euclid::default::Rect; use euclid::default::Size2D; use html5ever::serialize; @@ -3297,26 +3295,21 @@ impl Element { } let mut rect = self.upcast::().client_rect(); - let owner_doc = self.node.owner_doc(); + let in_quirks_mode = self.node.owner_doc().quirks_mode() == QuirksMode::Quirks; - if (matches!(owner_doc.quirks_mode(), QuirksMode::Quirks) && - owner_doc.GetBody().as_deref() == self.downcast::()) || - (matches!(owner_doc.quirks_mode(), QuirksMode::NoQuirks) && - *self.root_element() == *self) + if (in_quirks_mode && + self.node.owner_doc().GetBody().as_deref() == self.downcast::()) || + (!in_quirks_mode && *self.root_element() == *self) { - let viewport = owner_doc.window().current_viewport(); - - //cast Rect into Rect - rect = Rect::::new( - Point2D::::new( - viewport.origin.x.to_nearest_px(), - viewport.origin.y.to_nearest_px(), - ), - Size2D::::new( - viewport.size.width.to_nearest_px(), - viewport.size.height.to_nearest_px(), - ), - ); + let viewport_dimensions = self + .node + .owner_doc() + .window() + .window_size() + .initial_viewport + .round() + .to_i32(); + rect.size = Size2D::::new(viewport_dimensions.width, viewport_dimensions.height); } self.ensure_rare_data().client_rect = Some(window_from_node(self).cache_layout_value(rect)); diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index e3237cc9eb4..2364c1c7f72 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -2609,13 +2609,7 @@ impl Window { layout_chan, layout_rpc, window_size: Cell::new(window_size), - current_viewport: Cell::new(Rect::new( - Point2D::zero(), - Size2D::new( - Au::from_f32_px(window_size.initial_viewport.width.into()), - Au::from_f32_px(window_size.initial_viewport.width.into()), - ), - )), + current_viewport: Cell::new(Rect::zero()), suppress_reflow: Cell::new(true), pending_reflow_count: Default::default(), current_state: Cell::new(WindowState::Alive), From 53f939eac516408fca968fb7fa1f70a0dcd153c2 Mon Sep 17 00:00:00 2001 From: switchpiggy Date: Sat, 6 May 2023 12:52:21 -0700 Subject: [PATCH 4/4] Changed expected test results for clientHeight/clientWidth special cases from failing to passing --- .../css/cssom-view/client-props-root.html.ini | 4 ---- .../css/cssom-view/scrolling-quirks-vs-nonquirks.html.ini | 6 ------ .../wpt/metadata/css/cssom-view/client-props-root.html.ini | 4 ---- .../css/cssom-view/scrolling-quirks-vs-nonquirks.html.ini | 6 ------ 4 files changed, 20 deletions(-) delete mode 100644 tests/wpt/metadata-layout-2020/css/cssom-view/client-props-root.html.ini delete mode 100644 tests/wpt/metadata/css/cssom-view/client-props-root.html.ini diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/client-props-root.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/client-props-root.html.ini deleted file mode 100644 index cbdf6bf109c..00000000000 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/client-props-root.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[client-props-root.html] - [client* properties on the root element] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/scrolling-quirks-vs-nonquirks.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/scrolling-quirks-vs-nonquirks.html.ini index 99173dec8cf..956adb406b3 100644 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/scrolling-quirks-vs-nonquirks.html.ini +++ b/tests/wpt/metadata-layout-2020/css/cssom-view/scrolling-quirks-vs-nonquirks.html.ini @@ -2,9 +2,6 @@ [scrollingElement in non-quirks mode] expected: FAIL - [clientWidth/clientHeight on the HTML body element in quirks mode] - expected: FAIL - [scrollLeft/scrollRight of the content in quirks mode] expected: FAIL @@ -14,9 +11,6 @@ [scrollingElement in quirks mode] expected: FAIL - [clientWidth/clientHeight on the root element in non-quirks mode] - expected: FAIL - [scrollWidth/scrollHeight on the root element in quirks mode] expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/client-props-root.html.ini b/tests/wpt/metadata/css/cssom-view/client-props-root.html.ini deleted file mode 100644 index cbdf6bf109c..00000000000 --- a/tests/wpt/metadata/css/cssom-view/client-props-root.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[client-props-root.html] - [client* properties on the root element] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/scrolling-quirks-vs-nonquirks.html.ini b/tests/wpt/metadata/css/cssom-view/scrolling-quirks-vs-nonquirks.html.ini index b63dd7da4f6..3c36f7201c5 100644 --- a/tests/wpt/metadata/css/cssom-view/scrolling-quirks-vs-nonquirks.html.ini +++ b/tests/wpt/metadata/css/cssom-view/scrolling-quirks-vs-nonquirks.html.ini @@ -8,9 +8,6 @@ [scrollWidth/scrollHeight on the HTML body element in quirks mode] expected: FAIL - [clientWidth/clientHeight on the HTML body element in quirks mode] - expected: FAIL - [scrollLeft/scrollRight of the content in quirks mode] expected: FAIL @@ -20,9 +17,6 @@ [scrollWidth/scrollHeight on the root element in non-quirks mode] expected: FAIL - [clientWidth/clientHeight on the root element in non-quirks mode] - expected: FAIL - [scroll() on the HTML body element in non-quirks mode] expected: FAIL