diff options
-rw-r--r-- | components/layout_thread/dom_wrapper.rs | 19 | ||||
-rw-r--r-- | components/script/dom/document.rs | 2 | ||||
-rw-r--r-- | components/script/dom/documentorshadowroot.rs | 45 | ||||
-rw-r--r-- | components/script/dom/element.rs | 2 | ||||
-rw-r--r-- | components/script/dom/node.rs | 4 | ||||
-rw-r--r-- | components/script/dom/range.rs | 7 |
6 files changed, 33 insertions, 46 deletions
diff --git a/components/layout_thread/dom_wrapper.rs b/components/layout_thread/dom_wrapper.rs index d1ab90fcb0c..5a231161d7b 100644 --- a/components/layout_thread/dom_wrapper.rs +++ b/components/layout_thread/dom_wrapper.rs @@ -232,7 +232,7 @@ impl<'ln> TNode for ServoLayoutNode<'ln> { fn parent_node(&self) -> Option<Self> { unsafe { self.node - .parent_node_ref() + .composed_parent_node_ref() .map(|node| self.new_with_this_lifetime(&node)) } } @@ -794,7 +794,12 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> { } fn parent_element(&self) -> Option<ServoLayoutElement<'le>> { - unsafe { self.element.upcast().parent_node_ref().and_then(as_element) } + unsafe { + self.element + .upcast() + .composed_parent_node_ref() + .and_then(as_element) + } } fn parent_node_is_shadow_root(&self) -> bool { @@ -1083,12 +1088,10 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> { } fn children(&self) -> LayoutIterator<Self::ChildrenIterator> { - if let Some(element) = self.node.as_element() { - if let Some(shadow) = element.shadow_root() { - return LayoutIterator(ThreadSafeLayoutNodeChildrenIterator::new( - shadow.as_node().to_threadsafe(), - )); - } + if let Some(shadow) = self.node.as_element().and_then(|e| e.shadow_root()) { + return LayoutIterator(ThreadSafeLayoutNodeChildrenIterator::new( + shadow.as_node().to_threadsafe(), + )); } LayoutIterator(ThreadSafeLayoutNodeChildrenIterator::new(*self)) } diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 697d2938115..e0c1cf57027 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -376,7 +376,7 @@ pub struct Document { delayed_tasks: DomRefCell<Vec<Box<dyn TaskBox>>>, /// https://html.spec.whatwg.org/multipage/#completely-loaded completely_loaded: Cell<bool>, - /// List of shadow roots bound to the document tree. + /// Set of shadow roots connected to the document tree. shadow_roots: DomRefCell<HashSet<Dom<ShadowRoot>>>, /// Whether any of the shadow roots need the stylesheets flushed. shadow_roots_styles_changed: Cell<bool>, diff --git a/components/script/dom/documentorshadowroot.rs b/components/script/dom/documentorshadowroot.rs index 5c8428242ee..03932159359 100644 --- a/components/script/dom/documentorshadowroot.rs +++ b/components/script/dom/documentorshadowroot.rs @@ -277,25 +277,20 @@ impl DocumentOrShadowRoot { "Removing named element {:p}: {:p} id={}", self, to_unregister, id ); - // Limit the scope of the borrow because id_map might be borrowed again by - // GetElementById through the following sequence of calls - // reset_form_owner_for_listeners -> reset_form_owner -> GetElementById - { - let mut id_map = id_map.borrow_mut(); - let is_empty = match id_map.get_mut(&id) { - None => false, - Some(elements) => { - let position = elements - .iter() - .position(|element| &**element == to_unregister) - .expect("This element should be in registered."); - elements.remove(position); - elements.is_empty() - }, - }; - if is_empty { - id_map.remove(&id); - } + let mut id_map = id_map.borrow_mut(); + let is_empty = match id_map.get_mut(&id) { + None => false, + Some(elements) => { + let position = elements + .iter() + .position(|element| &**element == to_unregister) + .expect("This element should be in registered."); + elements.remove(position); + elements.is_empty() + }, + }; + if is_empty { + id_map.remove(&id); } } @@ -310,14 +305,8 @@ impl DocumentOrShadowRoot { debug!("Adding named element {:p}: {:p} id={}", self, element, id); assert!(element.upcast::<Node>().is_connected()); assert!(!id.is_empty()); - - // Limit the scope of the borrow because id_map might be borrowed again by - // GetElementById through the following sequence of calls - // reset_form_owner_for_listeners -> reset_form_owner -> GetElementById - { - let mut id_map = id_map.borrow_mut(); - let elements = id_map.entry(id.clone()).or_insert(Vec::new()); - elements.insert_pre_order(element, &root); - } + let mut id_map = id_map.borrow_mut(); + let elements = id_map.entry(id.clone()).or_insert(Vec::new()); + elements.insert_pre_order(element, &root); } } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index e0659729673..0d320b833b8 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -994,7 +994,7 @@ impl LayoutElementHelpers for LayoutDom<Element> { unsafe { let mut current_node = Some(self.upcast::<Node>()); while let Some(node) = current_node { - current_node = node.parent_node_ref(); + current_node = node.composed_parent_node_ref(); match node.downcast::<Element>().map(|el| el.unsafe_get()) { Some(elem) => { if let Some(attr) = diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index f93679a3976..809c54eff36 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -1175,7 +1175,7 @@ pub unsafe fn from_untrusted_node_address( pub trait LayoutNodeHelpers { unsafe fn type_id_for_layout(&self) -> NodeTypeId; - unsafe fn parent_node_ref(&self) -> Option<LayoutDom<Node>>; + unsafe fn composed_parent_node_ref(&self) -> Option<LayoutDom<Node>>; unsafe fn first_child_ref(&self) -> Option<LayoutDom<Node>>; unsafe fn last_child_ref(&self) -> Option<LayoutDom<Node>>; unsafe fn prev_sibling_ref(&self) -> Option<LayoutDom<Node>>; @@ -1222,7 +1222,7 @@ impl LayoutNodeHelpers for LayoutDom<Node> { #[inline] #[allow(unsafe_code)] - unsafe fn parent_node_ref(&self) -> Option<LayoutDom<Node>> { + unsafe fn composed_parent_node_ref(&self) -> Option<LayoutDom<Node>> { let parent = (*self.unsafe_get()).parent_node.get_inner_as_layout(); if let Some(ref parent) = parent { if let Some(shadow_root) = parent.downcast::<ShadowRoot>() { diff --git a/components/script/dom/range.rs b/components/script/dom/range.rs index 462b3382c71..8d9bfbf21d2 100644 --- a/components/script/dom/range.rs +++ b/components/script/dom/range.rs @@ -10,7 +10,6 @@ use crate::dom::bindings::codegen::Bindings::RangeBinding::RangeMethods; use crate::dom::bindings::codegen::Bindings::RangeBinding::{self, RangeConstants}; use crate::dom::bindings::codegen::Bindings::TextBinding::TextMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; -use crate::dom::bindings::codegen::InheritTypes::DocumentFragmentTypeId; use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::inheritance::{CharacterDataTypeId, NodeTypeId}; @@ -764,11 +763,7 @@ impl RangeMethods for Range { // Step 11 let new_offset = new_offset + - if node.type_id() == - NodeTypeId::DocumentFragment(DocumentFragmentTypeId::DocumentFragment) || - node.type_id() == - NodeTypeId::DocumentFragment(DocumentFragmentTypeId::ShadowRoot) - { + if let NodeTypeId::DocumentFragment(_) = node.type_id() { node.len() } else { 1 |