DOMRectList interface implementation (#34025)

* rechecking all file changes and additions

Signed-off-by: L Ashwin B <lashwinib@gmail.com>

* added comments with specification links

Signed-off-by: L Ashwin B <lashwinib@gmail.com>

* added space before the links

Signed-off-by: L Ashwin B <lashwinib@gmail.com>

* modified the doc link format

Signed-off-by: L Ashwin B <lashwinib@gmail.com>

* suggested changes + updated interfaces.https.html + updated passing test expectations

Signed-off-by: L Ashwin B <lashwinib@gmail.com>

* needed to do an update-manifest

Signed-off-by: L Ashwin B <lashwinib@gmail.com>

* updated the idlharness.any.html expectations

Signed-off-by: L Ashwin B <lashwinib@gmail.com>

---------

Signed-off-by: L Ashwin B <lashwinib@gmail.com>
This commit is contained in:
chickenleaf 2024-11-01 21:28:30 +05:30 committed by GitHub
parent d2c4448ac8
commit 257f4b84db
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 86 additions and 42 deletions

View file

@ -0,0 +1,66 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use dom_struct::dom_struct;
use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::DOMRectListBinding::DOMRectListMethods;
use crate::dom::bindings::reflector::{reflect_dom_object_with_proto, DomObject, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::domrect::DOMRect;
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
#[dom_struct]
pub struct DOMRectList {
reflector_: Reflector,
rects: DomRefCell<Vec<Dom<DOMRect>>>,
}
impl DOMRectList {
fn new_inherited(rects: Vec<DomRoot<DOMRect>>) -> DOMRectList {
DOMRectList {
reflector_: Reflector::new(),
rects: DomRefCell::new(
rects
.into_iter()
.map(|dom_root| dom_root.as_traced())
.collect(),
),
}
}
pub fn new(
window: &Window,
rects: Vec<DomRoot<DOMRect>>,
can_gc: CanGc,
) -> DomRoot<DOMRectList> {
reflect_dom_object_with_proto(
Box::new(DOMRectList::new_inherited(rects)),
&*window.global(),
None,
can_gc,
)
}
pub fn first(&self) -> Option<DomRoot<DOMRect>> {
self.rects.borrow().first().map(Dom::as_rooted)
}
}
impl DOMRectListMethods for DOMRectList {
/// <https://drafts.fxtf.org/geometry/#DOMRectList>
fn Item(&self, index: u32) -> Option<DomRoot<DOMRect>> {
self.rects.borrow().get(index as usize).map(Dom::as_rooted)
}
/// <https://drafts.fxtf.org/geometry/#DOMRectList>
fn IndexedGetter(&self, index: u32) -> Option<DomRoot<DOMRect>> {
self.Item(index)
}
/// <https://drafts.fxtf.org/geometry/#DOMRectList>
fn Length(&self) -> u32 {
self.rects.borrow().len() as u32
}
}

View file

@ -103,6 +103,7 @@ use crate::dom::document::{
};
use crate::dom::documentfragment::DocumentFragment;
use crate::dom::domrect::DOMRect;
use crate::dom::domrectlist::DOMRectList;
use crate::dom::domtokenlist::DOMTokenList;
use crate::dom::elementinternals::ElementInternals;
use crate::dom::eventtarget::EventTarget;
@ -2431,10 +2432,10 @@ impl ElementMethods for Element {
}
// https://drafts.csswg.org/cssom-view/#dom-element-getclientrects
fn GetClientRects(&self, can_gc: CanGc) -> Vec<DomRoot<DOMRect>> {
fn GetClientRects(&self, can_gc: CanGc) -> DomRoot<DOMRectList> {
let win = window_from_node(self);
let raw_rects = self.upcast::<Node>().content_boxes(can_gc);
raw_rects
let rects: Vec<DomRoot<DOMRect>> = raw_rects
.iter()
.map(|rect| {
DOMRect::new(
@ -2446,7 +2447,8 @@ impl ElementMethods for Element {
can_gc,
)
})
.collect()
.collect();
DOMRectList::new(&win, rects, can_gc)
}
// https://drafts.csswg.org/cssom-view/#dom-element-getboundingclientrect

View file

@ -294,6 +294,7 @@ pub mod dompoint;
pub mod dompointreadonly;
pub mod domquad;
pub mod domrect;
pub mod domrectlist;
pub mod domrectreadonly;
pub mod domstringlist;
pub mod domstringmap;

View file

@ -0,0 +1,11 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
// https://drafts.fxtf.org/geometry-1/#domrectlist
[Exposed=Window]
interface DOMRectList {
readonly attribute unsigned long length;
getter DOMRect? item(unsigned long index);
};

View file

@ -88,7 +88,7 @@ interface Element : Node {
// http://dev.w3.org/csswg/cssom-view/#extensions-to-the-element-interface
partial interface Element {
sequence<DOMRect> getClientRects();
DOMRectList getClientRects();
[NewObject]
DOMRect getBoundingClientRect();

View file

@ -1,7 +1,3 @@
[DOMRectList.html]
[Range getClientRects()]
expected: FAIL
[Element getClientRects()]
expected: FAIL

View file

@ -1,9 +0,0 @@
[DOMRectList.html]
[DOMRectList is exposed]
expected: FAIL
[DOMRectList is not [LegacyArrayClass\]]
expected: FAIL
[DOMRectList item()]
expected: FAIL

View file

@ -19,27 +19,12 @@
[DOMPointReadOnly interface: calling matrixTransform(optional DOMMatrixInit) on new DOMPoint() with too few arguments must throw TypeError]
expected: FAIL
[DOMRectList interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
[DOMRectList interface: existence and properties of interface prototype object]
expected: FAIL
[DOMPointReadOnly interface: operation matrixTransform(optional DOMMatrixInit)]
expected: FAIL
[DOMRectList interface: [object DOMRect\] must inherit property "length" with the proper type]
expected: FAIL
[DOMRectList interface: operation item(unsigned long)]
expected: FAIL
[DOMRectList interface: existence and properties of interface object]
expected: FAIL
[DOMRectList interface object name]
expected: FAIL
[DOMRectList interface: [object DOMRect\] must inherit property "item(unsigned long)" with the proper type]
expected: FAIL
@ -52,9 +37,6 @@
[DOMPoint interface: legacy window alias]
expected: FAIL
[DOMRectList interface object length]
expected: FAIL
[DOMMatrix interface: calling setMatrixValue(DOMString) on new DOMMatrix() with too few arguments must throw TypeError]
expected: FAIL
@ -73,18 +55,12 @@
[DOMPointReadOnly interface: calling matrixTransform(optional DOMMatrixInit) on new DOMPointReadOnly() with too few arguments must throw TypeError]
expected: FAIL
[DOMRectList interface: attribute length]
expected: FAIL
[DOMMatrix interface: legacy window alias]
expected: FAIL
[Stringification of [object DOMRect\]]
expected: FAIL
[DOMRectList interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL
[DOMRectList must be primary interface of ]
expected: FAIL

View file

@ -13495,7 +13495,7 @@
]
],
"interfaces.https.html": [
"bfe16e7de02b6c95f3aaf274510633f029ad682a",
"24a5535b77ba9716e67056e1d81de837a3fecc7b",
[
null,
{}

View file

@ -63,6 +63,7 @@ test_interfaces([
"DOMPointReadOnly",
"DOMQuad",
"DOMRect",
"DOMRectList",
"DOMRectReadOnly",
"Comment",
"CustomElementRegistry",