aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorOriol Brufau <obrufau@igalia.com>2024-09-13 17:59:57 +0200
committerGitHub <noreply@github.com>2024-09-13 15:59:57 +0000
commita76daaf04c121b70c9b0f3883b682983d676ff7f (patch)
treeb5068d707d5fa98500893f50a0cda980d81045ac /components/script
parent261d60e456b678939b8a0ceff4d8eafcd44e582e (diff)
downloadservo-a76daaf04c121b70c9b0f3883b682983d676ff7f.tar.gz
servo-a76daaf04c121b70c9b0f3883b682983d676ff7f.zip
Upgrade stylo to 2024-09-02 (#33370)
* Upgrade stylo to 2024-09-02 Signed-off-by: Oriol Brufau <obrufau@igalia.com> * Fixup for https://phabricator.services.mozilla.com/D217308 Signed-off-by: Oriol Brufau <obrufau@igalia.com> * Fixup for https://phabricator.services.mozilla.com/D217626 Signed-off-by: Oriol Brufau <obrufau@igalia.com> * Fixup for https://phabricator.services.mozilla.com/D218488 Signed-off-by: Oriol Brufau <obrufau@igalia.com> * Fixup for https://phabricator.services.mozilla.com/D219537 Signed-off-by: Oriol Brufau <obrufau@igalia.com> * Update test expectations Signed-off-by: Oriol Brufau <obrufau@igalia.com> --------- Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/cssrule.rs1
-rw-r--r--components/script/dom/node.rs29
-rw-r--r--components/script/layout_dom/element.rs16
3 files changed, 35 insertions, 11 deletions
diff --git a/components/script/dom/cssrule.rs b/components/script/dom/cssrule.rs
index 25281bf4d96..465dcce7aa2 100644
--- a/components/script/dom/cssrule.rs
+++ b/components/script/dom/cssrule.rs
@@ -119,6 +119,7 @@ impl CSSRule {
StyleCssRule::Margin(_) => unimplemented!(), // TODO
StyleCssRule::Scope(_) => unimplemented!(), // TODO
StyleCssRule::StartingStyle(_) => unimplemented!(), // TODO
+ StyleCssRule::PositionTry(_) => unimplemented!(), // TODO
}
}
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 6122db3221a..f53f7193bdf 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -1297,16 +1297,7 @@ where
/// returns it.
#[allow(unsafe_code)]
pub unsafe fn from_untrusted_node_address(candidate: UntrustedNodeAddress) -> DomRoot<Node> {
- // https://github.com/servo/servo/issues/6383
- let candidate = candidate.0 as usize;
- // let object: *mut JSObject = jsfriendapi::bindgen::JS_GetAddressableObject(runtime,
- // candidate);
- let object = candidate as *mut JSObject;
- if object.is_null() {
- panic!("Attempted to create a `Dom<Node>` from an invalid pointer!")
- }
- let boxed_node = conversions::private_from_object(object) as *const Node;
- DomRoot::from_ref(&*boxed_node)
+ DomRoot::from_ref(Node::from_untrusted_node_address(candidate))
}
#[allow(unsafe_code)]
@@ -2430,6 +2421,24 @@ impl Node {
.map_or(ns!(), |elem| elem.locate_namespace(prefix)),
}
}
+
+ /// If the given untrusted node address represents a valid DOM node in the given runtime,
+ /// returns it.
+ ///
+ /// # Safety
+ ///
+ /// Callers should ensure they pass an UntrustedNodeAddress that points to a valid `JSObject`
+ /// in memory that represents a `Node`.
+ #[allow(unsafe_code)]
+ pub unsafe fn from_untrusted_node_address(candidate: UntrustedNodeAddress) -> &'static Self {
+ // https://github.com/servo/servo/issues/6383
+ let candidate = candidate.0 as usize;
+ let object = candidate as *mut JSObject;
+ if object.is_null() {
+ panic!("Attempted to create a `Node` from an invalid pointer!")
+ }
+ &*(conversions::private_from_object(object) as *const Self)
+ }
}
impl NodeMethods for Node {
diff --git a/components/script/layout_dom/element.rs b/components/script/layout_dom/element.rs
index e5cf8d068c4..05a3b990bb6 100644
--- a/components/script/layout_dom/element.rs
+++ b/components/script/layout_dom/element.rs
@@ -8,10 +8,12 @@ use std::sync::atomic::Ordering;
use atomic_refcell::{AtomicRef, AtomicRefMut};
use html5ever::{local_name, namespace_url, ns, LocalName, Namespace};
+use js::jsapi::JSObject;
use script_layout_interface::wrapper_traits::{
LayoutNode, PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode,
};
use script_layout_interface::{LayoutNodeType, StyleData};
+use script_traits::UntrustedNodeAddress;
use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint};
use selectors::bloom::{BloomFilter, BLOOM_HASH_MASK};
use selectors::matching::{ElementSelectorFlags, MatchingContext, VisitedHandlingMode};
@@ -44,7 +46,7 @@ use crate::dom::bindings::inheritance::{
use crate::dom::bindings::root::LayoutDom;
use crate::dom::characterdata::LayoutCharacterDataHelpers;
use crate::dom::element::{Element, LayoutElementHelpers};
-use crate::dom::node::{LayoutNodeHelpers, NodeFlags};
+use crate::dom::node::{LayoutNodeHelpers, Node, NodeFlags};
use crate::layout_dom::{ServoLayoutNode, ServoShadowRoot, ServoThreadSafeLayoutNode};
/// A wrapper around elements that ensures layout can only ever access safe properties.
@@ -429,6 +431,18 @@ impl<'dom> style::dom::TElement for ServoLayoutElement<'dom> {
F: FnMut(&AtomIdent),
{
}
+
+ /// Convert an opaque element back into the element.
+ fn unopaque(opaque: ::selectors::OpaqueElement) -> Self {
+ unsafe {
+ let ptr = opaque.as_const_ptr::<JSObject>();
+ let untrusted_address = UntrustedNodeAddress::from_id(ptr as usize);
+ let node = Node::from_untrusted_node_address(untrusted_address);
+ let trusted_address = node.to_trusted_node_address();
+ let servo_layout_node = ServoLayoutNode::new(&trusted_address);
+ servo_layout_node.as_element().unwrap()
+ }
+ }
}
impl<'dom> ::selectors::Element for ServoLayoutElement<'dom> {