mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
First bits of shadow dom layout
This commit is contained in:
parent
be06f1e9b3
commit
7c9e8aa4cc
5 changed files with 118 additions and 30 deletions
|
@ -15,6 +15,7 @@ use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods;
|
|||
use crate::dom::bindings::codegen::Bindings::FunctionBinding::Function;
|
||||
use crate::dom::bindings::codegen::Bindings::HTMLTemplateElementBinding::HTMLTemplateElementMethods;
|
||||
use crate::dom::bindings::codegen::Bindings::NodeBinding::{GetRootNodeOptions, NodeMethods};
|
||||
use crate::dom::bindings::codegen::Bindings::ShadowRootBinding::ShadowRootBinding::ShadowRootMethods;
|
||||
use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
||||
use crate::dom::bindings::codegen::Bindings::WindowBinding::{ScrollBehavior, ScrollToOptions};
|
||||
use crate::dom::bindings::codegen::UnionTypes::NodeOrString;
|
||||
|
@ -76,7 +77,7 @@ use crate::dom::node::{NodeDamage, NodeFlags, UnbindContext};
|
|||
use crate::dom::nodelist::NodeList;
|
||||
use crate::dom::promise::Promise;
|
||||
use crate::dom::servoparser::ServoParser;
|
||||
use crate::dom::shadowroot::ShadowRoot;
|
||||
use crate::dom::shadowroot::{LayoutShadowRootHelpers, ShadowRoot};
|
||||
use crate::dom::text::Text;
|
||||
use crate::dom::validation::Validatable;
|
||||
use crate::dom::virtualmethods::{vtable_for, VirtualMethods};
|
||||
|
@ -587,6 +588,9 @@ pub trait LayoutElementHelpers {
|
|||
fn get_state_for_layout(&self) -> ElementState;
|
||||
fn insert_selector_flags(&self, flags: ElementSelectorFlags);
|
||||
fn has_selector_flags(&self, flags: ElementSelectorFlags) -> bool;
|
||||
/// The shadow root this element is a host of.
|
||||
#[allow(unsafe_code)]
|
||||
unsafe fn get_shadow_root_for_layout(&self) -> Option<LayoutDom<ShadowRoot>>;
|
||||
}
|
||||
|
||||
impl LayoutElementHelpers for LayoutDom<Element> {
|
||||
|
@ -1049,6 +1053,12 @@ impl LayoutElementHelpers for LayoutDom<Element> {
|
|||
fn has_selector_flags(&self, flags: ElementSelectorFlags) -> bool {
|
||||
unsafe { (*self.unsafe_get()).selector_flags.get().contains(flags) }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[allow(unsafe_code)]
|
||||
unsafe fn get_shadow_root_for_layout(&self) -> Option<LayoutDom<ShadowRoot>> {
|
||||
(*self.unsafe_get()).shadow_root.get_inner_as_layout()
|
||||
}
|
||||
}
|
||||
|
||||
impl Element {
|
||||
|
@ -2877,11 +2887,18 @@ impl<'a> SelectorsElement for DomRoot<Element> {
|
|||
}
|
||||
|
||||
fn parent_node_is_shadow_root(&self) -> bool {
|
||||
false
|
||||
match self.upcast::<Node>().GetParentNode() {
|
||||
None => false,
|
||||
Some(node) => node.is::<ShadowRoot>(),
|
||||
}
|
||||
}
|
||||
|
||||
fn containing_shadow_host(&self) -> Option<Self> {
|
||||
None
|
||||
if let Some(shadow_root) = self.upcast::<Node>().owner_shadow_root() {
|
||||
Some(shadow_root.Host())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn match_pseudo_element(
|
||||
|
|
|
@ -295,8 +295,8 @@ impl Node {
|
|||
if parent_in_shadow_tree {
|
||||
if let Some(shadow_root) = self.downcast::<ShadowRoot>() {
|
||||
node.set_owner_shadow_root(&*shadow_root);
|
||||
} else {
|
||||
node.set_owner_shadow_root(&*self.owner_shadow_root());
|
||||
} else if let Some(shadow_root) = self.owner_shadow_root() {
|
||||
node.set_owner_shadow_root(&*shadow_root);
|
||||
}
|
||||
}
|
||||
let mut is_connected = parent_is_connected;
|
||||
|
@ -946,8 +946,8 @@ impl Node {
|
|||
self.owner_doc.set(Some(document));
|
||||
}
|
||||
|
||||
pub fn owner_shadow_root(&self) -> DomRoot<ShadowRoot> {
|
||||
self.owner_shadow_root.get().unwrap()
|
||||
pub fn owner_shadow_root(&self) -> Option<DomRoot<ShadowRoot>> {
|
||||
self.owner_shadow_root.get()
|
||||
}
|
||||
|
||||
pub fn set_owner_shadow_root(&self, shadow_root: &ShadowRoot) {
|
||||
|
@ -1184,6 +1184,7 @@ pub trait LayoutNodeHelpers {
|
|||
unsafe fn next_sibling_ref(&self) -> Option<LayoutDom<Node>>;
|
||||
|
||||
unsafe fn owner_doc_for_layout(&self) -> LayoutDom<Document>;
|
||||
unsafe fn owner_shadow_root_for_layout(&self) -> Option<LayoutDom<ShadowRoot>>;
|
||||
|
||||
unsafe fn is_element_for_layout(&self) -> bool;
|
||||
unsafe fn get_flag(&self, flag: NodeFlags) -> bool;
|
||||
|
@ -1260,6 +1261,12 @@ impl LayoutNodeHelpers for LayoutDom<Node> {
|
|||
.unwrap()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[allow(unsafe_code)]
|
||||
unsafe fn owner_shadow_root_for_layout(&self) -> Option<LayoutDom<ShadowRoot>> {
|
||||
(*self.unsafe_get()).owner_shadow_root.get_inner_as_layout()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[allow(unsafe_code)]
|
||||
unsafe fn get_flag(&self, flag: NodeFlags) -> bool {
|
||||
|
|
|
@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::ShadowRootBinding::{self, ShadowRoo
|
|||
use crate::dom::bindings::inheritance::Castable;
|
||||
use crate::dom::bindings::num::Finite;
|
||||
use crate::dom::bindings::reflector::reflect_dom_object;
|
||||
use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom};
|
||||
use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom};
|
||||
use crate::dom::cssstylesheet::CSSStyleSheet;
|
||||
use crate::dom::document::Document;
|
||||
use crate::dom::documentfragment::DocumentFragment;
|
||||
|
@ -121,3 +121,16 @@ impl ShadowRootMethods for ShadowRoot {
|
|||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unsafe_code)]
|
||||
pub trait LayoutShadowRootHelpers {
|
||||
unsafe fn get_host_for_layout(&self) -> LayoutDom<Element>;
|
||||
}
|
||||
|
||||
impl LayoutShadowRootHelpers for LayoutDom<ShadowRoot> {
|
||||
#[inline]
|
||||
#[allow(unsafe_code)]
|
||||
unsafe fn get_host_for_layout(&self) -> LayoutDom<Element> {
|
||||
(*self.unsafe_get()).host.to_layout()
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue