mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Cache the result of retrieving an element's client rectangle from layout.
This commit is contained in:
parent
148c24c29c
commit
6ab7a50b31
5 changed files with 125 additions and 22 deletions
|
@ -85,6 +85,7 @@ use crate::stylesheet_loader::StylesheetOwner;
|
|||
use crate::task::TaskOnce;
|
||||
use devtools_traits::AttrInfo;
|
||||
use dom_struct::dom_struct;
|
||||
use euclid::default::Rect;
|
||||
use html5ever::serialize;
|
||||
use html5ever::serialize::SerializeOpts;
|
||||
use html5ever::serialize::TraversalScope;
|
||||
|
@ -2438,22 +2439,22 @@ impl ElementMethods for Element {
|
|||
|
||||
// https://drafts.csswg.org/cssom-view/#dom-element-clienttop
|
||||
fn ClientTop(&self) -> i32 {
|
||||
self.upcast::<Node>().client_rect().origin.y
|
||||
self.client_rect().origin.y
|
||||
}
|
||||
|
||||
// https://drafts.csswg.org/cssom-view/#dom-element-clientleft
|
||||
fn ClientLeft(&self) -> i32 {
|
||||
self.upcast::<Node>().client_rect().origin.x
|
||||
self.client_rect().origin.x
|
||||
}
|
||||
|
||||
// https://drafts.csswg.org/cssom-view/#dom-element-clientwidth
|
||||
fn ClientWidth(&self) -> i32 {
|
||||
self.upcast::<Node>().client_rect().size.width
|
||||
self.client_rect().size.width
|
||||
}
|
||||
|
||||
// https://drafts.csswg.org/cssom-view/#dom-element-clientheight
|
||||
fn ClientHeight(&self) -> i32 {
|
||||
self.upcast::<Node>().client_rect().size.height
|
||||
self.client_rect().size.height
|
||||
}
|
||||
|
||||
/// <https://w3c.github.io/DOM-Parsing/#widl-Element-innerHTML>
|
||||
|
@ -3206,6 +3207,20 @@ impl<'a> SelectorsElement for DomRoot<Element> {
|
|||
}
|
||||
|
||||
impl Element {
|
||||
fn client_rect(&self) -> Rect<i32> {
|
||||
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;
|
||||
}
|
||||
let rect = self.upcast::<Node>().client_rect();
|
||||
self.ensure_rare_data().client_rect = Some(window_from_node(self).cache_layout_value(rect));
|
||||
rect
|
||||
}
|
||||
|
||||
pub fn as_maybe_activatable(&self) -> Option<&dyn Activatable> {
|
||||
let element = match self.upcast::<Node>().type_id() {
|
||||
NodeTypeId::Element(ElementTypeId::HTMLElement(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue