bool HTMLShadowElement::doesSelectFromHostChildren() const { TreeScope* scope = treeScope(); if (scope->rootNode()->isShadowRoot()) return toShadowRoot(scope->rootNode())->isOldest(); return false; }
void DocumentOrderedMap::add(const AtomicStringImpl& key, Element& element, const TreeScope& treeScope) { UNUSED_PARAM(treeScope); ASSERT_WITH_SECURITY_IMPLICATION(element.isInTreeScope()); ASSERT_WITH_SECURITY_IMPLICATION(treeScope.rootNode().containsIncludingShadowDOM(&element)); if (!element.isInTreeScope()) return; Map::AddResult addResult = m_map.ensure(&key, [&element] { return MapEntry(&element); }); MapEntry& entry = addResult.iterator->value; #if !ASSERT_DISABLED || ENABLE(SECURITY_ASSERTIONS) ASSERT_WITH_SECURITY_IMPLICATION(!entry.registeredElements.contains(&element)); entry.registeredElements.add(&element); #endif if (addResult.isNewEntry) return; ASSERT_WITH_SECURITY_IMPLICATION(entry.count); entry.element = nullptr; entry.count++; entry.orderedList.clear(); }
TreeScopeEventContext::TreeScopeEventContext(TreeScope& treeScope) : m_treeScope(treeScope) , m_rootNode(treeScope.rootNode()) , m_containingClosedShadowTree(nullptr) , m_preOrder(-1) , m_postOrder(-1) { }
void DocumentOrderedMap::add(const AtomicStringImpl& key, Element& element, const TreeScope& treeScope) { ASSERT_WITH_SECURITY_IMPLICATION(element.isInTreeScope()); ASSERT_WITH_SECURITY_IMPLICATION(treeScope.rootNode()->containsIncludingShadowDOM(&element)); if (!element.isInTreeScope() || &element.document() != treeScope.documentScope()) return; Map::AddResult addResult = m_map.add(&key, MapEntry(&element)); if (addResult.isNewEntry) return; MapEntry& entry = addResult.iterator->value; ASSERT_WITH_SECURITY_IMPLICATION(entry.count); entry.element = 0; entry.count++; entry.orderedList.clear(); }
static Position adjustPositionForStart(const Position& currentPosition, Node* endContainerNode) { TreeScope* treeScope = endContainerNode->treeScope(); ASSERT(currentPosition.containerNode()->treeScope() != treeScope); if (Node* ancestor = treeScope->ancestorInThisScope(currentPosition.containerNode())) { if (ancestor->contains(endContainerNode)) return positionBeforeNode(ancestor); return positionAfterNode(ancestor); } if (Node* firstChild = treeScope->rootNode()->firstChild()) return positionBeforeNode(firstChild); return Position(); }
Element* TreeScope::focusedElement() { Document& document = m_rootNode.document(); Element* element = document.focusedElement(); if (!element && document.page()) element = focusedFrameOwnerElement(document.page()->focusController().focusedFrame(), document.frame()); if (!element) return nullptr; TreeScope* treeScope = &element->treeScope(); while (treeScope != this && treeScope != &document) { element = downcast<ShadowRoot>(treeScope->rootNode()).host(); treeScope = &element->treeScope(); } if (this != treeScope) return nullptr; return element; }
Element* TreeScope::focusedElement() { Document* document = rootNode()->document(); Element* element = document->focusedElement(); if (!element && document->page()) element = focusedFrameOwnerElement(document->page()->focusController().focusedFrame(), document->frame()); if (!element) return 0; TreeScope* treeScope = element->treeScope(); while (treeScope != this && treeScope != document) { element = toShadowRoot(treeScope->rootNode())->hostElement(); treeScope = element->treeScope(); } if (this != treeScope) return 0; return element; }
RelatedNodeRetargeter(Node& relatedNode, TreeScope& targetTreeScope) : m_relatedNode(relatedNode) , m_retargetedRelatedNode(&relatedNode) { TreeScope* currentTreeScope = &m_relatedNode.treeScope(); if (LIKELY(currentTreeScope == &targetTreeScope)) return; if (¤tTreeScope->documentScope() != &targetTreeScope.documentScope()) { m_hasDifferentTreeRoot = true; m_retargetedRelatedNode = nullptr; return; } if (relatedNode.inDocument() != targetTreeScope.rootNode().inDocument()) { m_hasDifferentTreeRoot = true; while (m_retargetedRelatedNode->isInShadowTree()) m_retargetedRelatedNode = downcast<ShadowRoot>(m_retargetedRelatedNode->treeScope().rootNode()).host(); return; } collectTreeScopes(); // FIXME: We should collect this while constructing the event path. Vector<TreeScope*, 8> targetTreeScopeAncestors; for (TreeScope* currentTreeScope = &targetTreeScope; currentTreeScope; currentTreeScope = currentTreeScope->parentTreeScope()) targetTreeScopeAncestors.append(currentTreeScope); ASSERT_WITH_SECURITY_IMPLICATION(!targetTreeScopeAncestors.isEmpty()); unsigned i = m_ancestorTreeScopes.size(); unsigned j = targetTreeScopeAncestors.size(); ASSERT_WITH_SECURITY_IMPLICATION(m_ancestorTreeScopes.last() == targetTreeScopeAncestors.last()); while (m_ancestorTreeScopes[i - 1] == targetTreeScopeAncestors[j - 1]) { i--; j--; if (!i || !j) break; } m_lowestCommonAncestorIndex = i; m_retargetedRelatedNode = nodeInLowestCommonAncestor(); }
DocumentStyleSheetCollection::DocumentStyleSheetCollection(TreeScope& treeScope) : TreeScopeStyleSheetCollection(treeScope) { ASSERT(treeScope.rootNode() == treeScope.rootNode().document()); }