/
githubmirror
/
servo
Обзор
Документация
Войти
/
githubmirror
/
servo
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
components/script/dom/geometry/domrectreadonly.rs
245 строк
7 KB
Furkan Erdem
script: replace deprecated as_slice method with as_slice_safe method (#46654)
20 июл 2026, 11:46
Не верифицирован
20 июл 2026, 11:46
e9c7025
Код
Авторство
О чём код?
/* 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 std::cell::Cell; use dom_struct::dom_struct; use js::context::{JSContext, NoGC}; use js::rust::HandleObject; use rustc_hash::FxHashMap; use script_bindings::reflector::{ Reflector, reflect_dom_object_with_cx, reflect_dom_object_with_proto, }; use servo_base::id::{DomRectId, DomRectIndex}; use servo_constellation_traits::DomRect; use crate::dom::bindings::codegen::Bindings::DOMRectReadOnlyBinding::{ DOMRectInit, DOMRectReadOnlyMethods, }; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::serializable::Serializable; use crate::dom::bindings::structuredclone::StructuredData; use crate::dom::globalscope::GlobalScope; #[dom_struct] pub(crate) struct DOMRectReadOnly { reflector_: Reflector, x: Cell<f64>, y: Cell<f64>, width: Cell<f64>, height: Cell<f64>, } impl DOMRectReadOnly { pub(crate) fn new_inherited(x: f64, y: f64, width: f64, height: f64) -> DOMRectReadOnly { DOMRectReadOnly { x: Cell::new(x), y: Cell::new(y), width: Cell::new(width), height: Cell::new(height), reflector_: Reflector::new(), } } pub(crate) fn new( cx: &mut JSContext, global: &GlobalScope, proto: Option<HandleObject>, x: f64, y: f64, width: f64, height: f64, ) -> DomRoot<DOMRectReadOnly> { reflect_dom_object_with_proto( cx, Box::new(DOMRectReadOnly::new_inherited(x, y, width, height)), global, proto, ) } pub(crate) fn new_from_dictionary( cx: &mut JSContext, global: &GlobalScope, proto: Option<HandleObject>, dictionary: &DOMRectInit, ) -> DomRoot<DOMRectReadOnly> { reflect_dom_object_with_proto( cx, Box::new(create_a_domrectreadonly_from_the_dictionary(dictionary)), global, proto, ) } pub(crate) fn set_x(&self, value: f64) { self.x.set(value); } pub(crate) fn set_y(&self, value: f64) { self.y.set(value); } pub(crate) fn set_width(&self, value: f64) { self.width.set(value); } pub(crate) fn set_height(&self, value: f64) { self.height.set(value); } } impl DOMRectReadOnlyMethods<crate::DomTypeHolder> for DOMRectReadOnly { /// <https://drafts.fxtf.org/geometry/#dom-domrectreadonly-domrectreadonly> fn Constructor( cx: &mut JSContext, global: &GlobalScope, proto: Option<HandleObject>, x: f64, y: f64, width: f64, height: f64, ) -> Fallible<DomRoot<DOMRectReadOnly>> { Ok(DOMRectReadOnly::new(cx, global, proto, x, y, width, height)) } // https://drafts.fxtf.org/geometry/#dom-domrectreadonly-fromrect #[cfg_attr(crown, expect(crown::unrooted_must_root))] fn FromRect( cx: &mut JSContext, global: &GlobalScope, other: &DOMRectInit, ) -> DomRoot<DOMRectReadOnly> { let dom_rect = create_a_domrectreadonly_from_the_dictionary(other); reflect_dom_object_with_cx(Box::new(dom_rect), global, cx) } /// <https://drafts.fxtf.org/geometry/#dom-domrectreadonly-x> fn X(&self) -> f64 { self.x.get() } /// <https://drafts.fxtf.org/geometry/#dom-domrectreadonly-y> fn Y(&self) -> f64 { self.y.get() } /// <https://drafts.fxtf.org/geometry/#dom-domrectreadonly-width> fn Width(&self) -> f64 { self.width.get() } /// <https://drafts.fxtf.org/geometry/#dom-domrectreadonly-height> fn Height(&self) -> f64 { self.height.get() } /// <https://drafts.fxtf.org/geometry/#dom-domrectreadonly-top> fn Top(&self) -> f64 { let height = self.height.get(); if height >= 0f64 { self.y.get() } else { self.y.get() + height } } /// <https://drafts.fxtf.org/geometry/#dom-domrectreadonly-right> fn Right(&self) -> f64 { let width = self.width.get(); if width < 0f64 { self.x.get() } else { self.x.get() + width } } /// <https://drafts.fxtf.org/geometry/#dom-domrectreadonly-bottom> fn Bottom(&self) -> f64 { let height = self.height.get(); if height < 0f64 { self.y.get() } else { self.y.get() + height } } /// <https://drafts.fxtf.org/geometry/#dom-domrectreadonly-left> fn Left(&self) -> f64 { let width = self.width.get(); if width >= 0f64 { self.x.get() } else { self.x.get() + width } } } /// <https://drafts.fxtf.org/geometry/#ref-for-create-a-domrectreadonly-from-the-dictionary> pub(super) fn create_a_domrectreadonly_from_the_dictionary(other: &DOMRectInit) -> DOMRectReadOnly { // NOTE: We trivially combine all three steps into one // Step 1. Let rect be a new DOMRectReadOnly or DOMRect as appropriate. // Step 2. Set rect’s variables x coordinate to other’s x dictionary member, y coordinate to other’s y // dictionary member, width dimension to other’s width dictionary member and height dimension to // other’s height dictionary member. // Step 3. Return rect. DOMRectReadOnly { reflector_: Reflector::new(), x: Cell::new(other.x), y: Cell::new(other.y), width: Cell::new(other.width), height: Cell::new(other.height), } } type Type = DomRectId; impl Serializable for DOMRectReadOnly { type Index = DomRectIndex; type Data = DomRect; fn serialize(&self, _no_gc: &NoGC) -> Result<(DomRectId, Self::Data), ()> { let serialized = DomRect { x: self.X(), y: self.Y(), width: self.Width(), height: self.Height(), }; Ok((DomRectId::new(), serialized)) } fn deserialize( cx: &mut JSContext, owner: &GlobalScope, serialized: Self::Data, ) -> Result<DomRoot<Self>, ()> where Self: Sized, { Ok(Self::new( cx, owner, None, serialized.x, serialized.y, serialized.width, serialized.height, )) } fn serialized_storage<'a>( data: StructuredData<'a, '_>, ) -> &'a mut Option<FxHashMap<Type, Self::Data>> { match data { StructuredData::Reader(reader) => &mut reader.rects, StructuredData::Writer(writer) => &mut writer.rects, } } }