Checks moved to Element::client_rect(), fixed conditions for the special cases, reconfigured Window constructor to initialize current_viewport to initial window size

This commit is contained in:
switchpiggy 2023-05-05 01:56:27 -07:00
parent bf49260e81
commit 7c61c5b930
2 changed files with 34 additions and 24 deletions

View file

@ -81,13 +81,15 @@ use crate::dom::text::Text;
use crate::dom::validation::Validatable; use crate::dom::validation::Validatable;
use crate::dom::virtualmethods::{vtable_for, VirtualMethods}; use crate::dom::virtualmethods::{vtable_for, VirtualMethods};
use crate::dom::window::ReflowReason; use crate::dom::window::ReflowReason;
use crate::dom::window::Window;
use crate::script_thread::ScriptThread; use crate::script_thread::ScriptThread;
use crate::stylesheet_loader::StylesheetOwner; use crate::stylesheet_loader::StylesheetOwner;
use crate::task::TaskOnce; use crate::task::TaskOnce;
use app_units::Au;
use devtools_traits::AttrInfo; use devtools_traits::AttrInfo;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use euclid::default::Point2D;
use euclid::default::Rect; use euclid::default::Rect;
use euclid::default::Size2D;
use html5ever::serialize; use html5ever::serialize;
use html5ever::serialize::SerializeOpts; use html5ever::serialize::SerializeOpts;
use html5ever::serialize::TraversalScope; use html5ever::serialize::TraversalScope;
@ -2502,32 +2504,11 @@ impl ElementMethods for Element {
// https://drafts.csswg.org/cssom-view/#dom-element-clientwidth // https://drafts.csswg.org/cssom-view/#dom-element-clientwidth
fn ClientWidth(&self) -> i32 { 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 self.client_rect().size.width
} }
// https://drafts.csswg.org/cssom-view/#dom-element-clientheight // https://drafts.csswg.org/cssom-view/#dom-element-clientheight
fn ClientHeight(&self) -> i32 { 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 self.client_rect().size.height
} }
@ -3314,7 +3295,30 @@ impl Element {
{ {
return rect; return rect;
} }
let rect = self.upcast::<Node>().client_rect();
let mut rect = self.upcast::<Node>().client_rect();
let owner_doc = self.node.owner_doc();
if (matches!(owner_doc.quirks_mode(), QuirksMode::Quirks) &&
owner_doc.GetBody().as_deref() == self.downcast::<HTMLElement>()) ||
(matches!(owner_doc.quirks_mode(), QuirksMode::NoQuirks) &&
*self.root_element() == *self)
{
let viewport = owner_doc.window().current_viewport();
//cast Rect<Au, _> into Rect<i32, _>
rect = Rect::<i32>::new(
Point2D::<i32>::new(
viewport.origin.x.to_nearest_px(),
viewport.origin.y.to_nearest_px(),
),
Size2D::<i32>::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)); self.ensure_rare_data().client_rect = Some(window_from_node(self).cache_layout_value(rect));
rect rect
} }

View file

@ -2609,7 +2609,13 @@ impl Window {
layout_chan, layout_chan,
layout_rpc, layout_rpc,
window_size: Cell::new(window_size), 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), suppress_reflow: Cell::new(true),
pending_reflow_count: Default::default(), pending_reflow_count: Default::default(),
current_state: Cell::new(WindowState::Alive), current_state: Cell::new(WindowState::Alive),