diff options
Diffstat (limited to 'components/script/dom/bindings/root.rs')
-rw-r--r-- | components/script/dom/bindings/root.rs | 49 |
1 files changed, 32 insertions, 17 deletions
diff --git a/components/script/dom/bindings/root.rs b/components/script/dom/bindings/root.rs index 0ba69687dba..b1739ac27c3 100644 --- a/components/script/dom/bindings/root.rs +++ b/components/script/dom/bindings/root.rs @@ -331,6 +331,7 @@ impl<T> Dom<T> { debug_assert!(thread_state::get().is_layout()); LayoutDom { ptr: self.ptr.clone(), + marker: PhantomData, } } } @@ -413,13 +414,17 @@ where /// An unrooted reference to a DOM object for use in layout. `Layout*Helpers` /// traits must be implemented on this. #[unrooted_must_root_lint::allow_unrooted_interior] -pub struct LayoutDom<T> { +pub struct LayoutDom<'dom, T> { ptr: ptr::NonNull<T>, + marker: PhantomData<&'dom T>, } -impl<T: Castable> LayoutDom<T> { +impl<'dom, T> LayoutDom<'dom, T> +where + T: Castable, +{ /// Cast a DOM object root upwards to one of the interfaces it derives from. - pub fn upcast<U>(&self) -> LayoutDom<U> + pub fn upcast<U>(&self) -> LayoutDom<'dom, U> where U: Castable, T: DerivedFrom<U>, @@ -428,11 +433,12 @@ impl<T: Castable> LayoutDom<T> { let ptr: *mut T = self.ptr.as_ptr(); LayoutDom { ptr: unsafe { ptr::NonNull::new_unchecked(ptr as *mut U) }, + marker: PhantomData, } } /// Cast a DOM object downwards to one of the interfaces it might implement. - pub fn downcast<U>(&self) -> Option<LayoutDom<U>> + pub fn downcast<U>(&self) -> Option<LayoutDom<'dom, U>> where U: DerivedFrom<T>, { @@ -442,6 +448,7 @@ impl<T: Castable> LayoutDom<T> { let ptr: *mut T = self.ptr.as_ptr(); Some(LayoutDom { ptr: ptr::NonNull::new_unchecked(ptr as *mut U), + marker: PhantomData, }) } else { None @@ -450,7 +457,10 @@ impl<T: Castable> LayoutDom<T> { } } -impl<T: DomObject> LayoutDom<T> { +impl<T> LayoutDom<'_, T> +where + T: DomObject, +{ /// Get the reflector. pub unsafe fn get_jsobject(&self) -> *mut JSObject { debug_assert!(thread_state::get().is_layout()); @@ -458,7 +468,7 @@ impl<T: DomObject> LayoutDom<T> { } } -impl<T> Copy for LayoutDom<T> {} +impl<T> Copy for LayoutDom<'_, T> {} impl<T> PartialEq for Dom<T> { fn eq(&self, other: &Dom<T>) -> bool { @@ -474,13 +484,13 @@ impl<'a, T: DomObject> PartialEq<&'a T> for Dom<T> { impl<T> Eq for Dom<T> {} -impl<T> PartialEq for LayoutDom<T> { - fn eq(&self, other: &LayoutDom<T>) -> bool { +impl<T> PartialEq for LayoutDom<'_, T> { + fn eq(&self, other: &Self) -> bool { self.ptr.as_ptr() == other.ptr.as_ptr() } } -impl<T> Eq for LayoutDom<T> {} +impl<T> Eq for LayoutDom<'_, T> {} impl<T> Hash for Dom<T> { fn hash<H: Hasher>(&self, state: &mut H) { @@ -488,7 +498,7 @@ impl<T> Hash for Dom<T> { } } -impl<T> Hash for LayoutDom<T> { +impl<T> Hash for LayoutDom<'_, T> { fn hash<H: Hasher>(&self, state: &mut H) { self.ptr.as_ptr().hash(state) } @@ -497,7 +507,7 @@ impl<T> Hash for LayoutDom<T> { impl<T> Clone for Dom<T> { #[inline] #[allow(unrooted_must_root)] - fn clone(&self) -> Dom<T> { + fn clone(&self) -> Self { debug_assert!(thread_state::get().is_script()); Dom { ptr: self.ptr.clone(), @@ -505,24 +515,26 @@ impl<T> Clone for Dom<T> { } } -impl<T> Clone for LayoutDom<T> { +impl<T> Clone for LayoutDom<'_, T> { #[inline] - fn clone(&self) -> LayoutDom<T> { + fn clone(&self) -> Self { debug_assert!(thread_state::get().is_layout()); LayoutDom { ptr: self.ptr.clone(), + marker: PhantomData, } } } -impl LayoutDom<Node> { +impl LayoutDom<'_, Node> { /// Create a new JS-owned value wrapped from an address known to be a /// `Node` pointer. - pub unsafe fn from_trusted_node_address(inner: TrustedNodeAddress) -> LayoutDom<Node> { + pub unsafe fn from_trusted_node_address(inner: TrustedNodeAddress) -> Self { debug_assert!(thread_state::get().is_layout()); let TrustedNodeAddress(addr) = inner; LayoutDom { ptr: ptr::NonNull::new_unchecked(addr as *const Node as *mut Node), + marker: PhantomData, } } } @@ -624,7 +636,7 @@ impl<T: DomObject> MutNullableDom<T> { #[allow(unrooted_must_root)] pub unsafe fn get_inner_as_layout(&self) -> Option<LayoutDom<T>> { debug_assert!(thread_state::get().is_layout()); - ptr::read(self.ptr.get()).map(|js| js.to_layout()) + (*self.ptr.get()).as_ref().map(|js| js.to_layout()) } /// Get a rooted value out of this object @@ -732,7 +744,10 @@ unsafe impl<T: DomObject> JSTraceable for DomOnceCell<T> { } } -impl<T: DomObject> LayoutDom<T> { +impl<'dom, T> LayoutDom<'dom, T> +where + T: 'dom + DomObject, +{ /// Returns an unsafe pointer to the interior of this JS object. This is /// the only method that be safely accessed from layout. (The fact that /// this is unsafe is what necessitates the layout wrappers.) |