Commit ab0448c6 authored by esprehn's avatar esprehn Committed by Commit bot

Simplify some shadow crossing logic in SelectorQuery.cpp

ElementTraversal::firstWithin is the same as doing
::next(rootNode, &rootNode) we can just do that here. We can also use
isOpenOrV0() to remove some verbose checks, and finally we don't need to
check isShadowHost (which contains a bunch of duplciate checks) and can
just null check ::shadow() which is equivalent.

BUG=703900

Review-Url: https://codereview.chromium.org/2782483004
Cr-Commit-Position: refs/heads/master@{#460544}
parent 78f5d7d5
...@@ -363,27 +363,20 @@ void SelectorQuery::executeSlow( ...@@ -363,27 +363,20 @@ void SelectorQuery::executeSlow(
// firstWithinTraversingShadowTree, nextTraversingShadowTree to the best place, // firstWithinTraversingShadowTree, nextTraversingShadowTree to the best place,
// e.g. NodeTraversal. // e.g. NodeTraversal.
static ShadowRoot* authorShadowRootOf(const ContainerNode& node) { static ShadowRoot* authorShadowRootOf(const ContainerNode& node) {
if (!node.isElementNode() || !isShadowHost(&node)) if (!node.isElementNode())
return nullptr; return nullptr;
ElementShadow* shadow = toElement(node).shadow(); ElementShadow* shadow = toElement(node).shadow();
DCHECK(shadow); if (!shadow)
return nullptr;
for (ShadowRoot* shadowRoot = &shadow->oldestShadowRoot(); shadowRoot; for (ShadowRoot* shadowRoot = &shadow->oldestShadowRoot(); shadowRoot;
shadowRoot = shadowRoot->youngerShadowRoot()) { shadowRoot = shadowRoot->youngerShadowRoot()) {
if (shadowRoot->type() == ShadowRootType::V0 || if (shadowRoot->isOpenOrV0())
shadowRoot->type() == ShadowRootType::Open)
return shadowRoot; return shadowRoot;
} }
return nullptr; return nullptr;
} }
static ContainerNode* firstWithinTraversingShadowTree(
const ContainerNode& rootNode) {
if (ShadowRoot* shadowRoot = authorShadowRootOf(rootNode))
return shadowRoot;
return ElementTraversal::firstWithin(rootNode);
}
static ContainerNode* nextTraversingShadowTree(const ContainerNode& node, static ContainerNode* nextTraversingShadowTree(const ContainerNode& node,
const ContainerNode* rootNode) { const ContainerNode* rootNode) {
if (ShadowRoot* shadowRoot = authorShadowRootOf(node)) if (ShadowRoot* shadowRoot = authorShadowRootOf(node))
...@@ -401,9 +394,7 @@ static ContainerNode* nextTraversingShadowTree(const ContainerNode& node, ...@@ -401,9 +394,7 @@ static ContainerNode* nextTraversingShadowTree(const ContainerNode& node,
if (shadowRoot == rootNode) if (shadowRoot == rootNode)
return nullptr; return nullptr;
if (ShadowRoot* youngerShadowRoot = shadowRoot->youngerShadowRoot()) { if (ShadowRoot* youngerShadowRoot = shadowRoot->youngerShadowRoot()) {
// Should not obtain any elements in closed or user-agent shadow root. DCHECK(youngerShadowRoot->isOpenOrV0());
DCHECK(youngerShadowRoot->type() == ShadowRootType::V0 ||
youngerShadowRoot->type() == ShadowRootType::Open);
return youngerShadowRoot; return youngerShadowRoot;
} }
...@@ -416,8 +407,8 @@ template <typename SelectorQueryTrait> ...@@ -416,8 +407,8 @@ template <typename SelectorQueryTrait>
void SelectorQuery::executeSlowTraversingShadowTree( void SelectorQuery::executeSlowTraversingShadowTree(
ContainerNode& rootNode, ContainerNode& rootNode,
typename SelectorQueryTrait::OutputType& output) const { typename SelectorQueryTrait::OutputType& output) const {
for (ContainerNode* node = firstWithinTraversingShadowTree(rootNode); node; for (ContainerNode* node = nextTraversingShadowTree(rootNode, &rootNode);
node = nextTraversingShadowTree(*node, &rootNode)) { node; node = nextTraversingShadowTree(*node, &rootNode)) {
if (!node->isElementNode()) if (!node->isElementNode())
continue; continue;
Element* element = toElement(node); Element* element = toElement(node);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment