Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(138)

Unified Diff: third_party/WebKit/Source/core/css/SelectorChecker.cpp

Issue 2588643004: Allow positional selectors to match elements without a parent. (Closed)
Patch Set: Changed the expectation instead of the crashtest, since it felt a bit saner. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/css/SelectorChecker.cpp
diff --git a/third_party/WebKit/Source/core/css/SelectorChecker.cpp b/third_party/WebKit/Source/core/css/SelectorChecker.cpp
index adbdbc8dfa97cf42508c9ddcf315c30f7ee64eb8..82d142aebf64835d5347bacd6898dd86cd514bd6 100644
--- a/third_party/WebKit/Source/core/css/SelectorChecker.cpp
+++ b/third_party/WebKit/Source/core/css/SelectorChecker.cpp
@@ -763,103 +763,97 @@ bool SelectorChecker::checkPseudoClass(const SelectorCheckingContext& context,
return result;
}
case CSSSelector::PseudoFirstChild:
- if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
- if (m_mode == ResolvingStyle) {
+ if (m_mode == ResolvingStyle) {
+ if (ContainerNode* parent = element.parentElementOrDocumentFragment())
parent->setChildrenAffectedByFirstChildRules();
- element.setAffectedByFirstChildRules();
- }
- return isFirstChild(element);
+ element.setAffectedByFirstChildRules();
}
- break;
+ return isFirstChild(element);
case CSSSelector::PseudoFirstOfType:
- if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
- if (m_mode == ResolvingStyle)
+ if (m_mode == ResolvingStyle) {
+ if (ContainerNode* parent = element.parentElementOrDocumentFragment())
parent->setChildrenAffectedByForwardPositionalRules();
- return isFirstOfType(element, element.tagQName());
}
- break;
- case CSSSelector::PseudoLastChild:
- if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
- if (m_mode == ResolvingStyle) {
+ return isFirstOfType(element, element.tagQName());
+ case CSSSelector::PseudoLastChild: {
+ ContainerNode* parent = element.parentElementOrDocumentFragment();
+ if (m_mode == ResolvingStyle) {
+ if (parent)
parent->setChildrenAffectedByLastChildRules();
- element.setAffectedByLastChildRules();
- }
- if (!m_isQuerySelector && !parent->isFinishedParsingChildren())
- return false;
- return isLastChild(element);
+ element.setAffectedByLastChildRules();
}
- break;
- case CSSSelector::PseudoLastOfType:
- if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
- if (m_mode == ResolvingStyle)
+ if (!m_isQuerySelector && parent && !parent->isFinishedParsingChildren())
+ return false;
+ return isLastChild(element);
+ }
+ case CSSSelector::PseudoLastOfType: {
+ ContainerNode* parent = element.parentElementOrDocumentFragment();
+ if (m_mode == ResolvingStyle) {
+ if (parent)
parent->setChildrenAffectedByBackwardPositionalRules();
- if (!m_isQuerySelector && !parent->isFinishedParsingChildren())
- return false;
- return isLastOfType(element, element.tagQName());
}
- break;
- case CSSSelector::PseudoOnlyChild:
- if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
- if (m_mode == ResolvingStyle) {
+ if (!m_isQuerySelector && parent && !parent->isFinishedParsingChildren())
+ return false;
+ return isLastOfType(element, element.tagQName());
+ }
+ case CSSSelector::PseudoOnlyChild: {
+ ContainerNode* parent = element.parentElementOrDocumentFragment();
+ if (m_mode == ResolvingStyle) {
+ if (parent) {
parent->setChildrenAffectedByFirstChildRules();
parent->setChildrenAffectedByLastChildRules();
- element.setAffectedByFirstChildRules();
- element.setAffectedByLastChildRules();
}
- if (!m_isQuerySelector && !parent->isFinishedParsingChildren())
- return false;
- return isFirstChild(element) && isLastChild(element);
+ element.setAffectedByFirstChildRules();
+ element.setAffectedByLastChildRules();
}
- break;
- case CSSSelector::PseudoOnlyOfType:
+ if (!m_isQuerySelector && parent && !parent->isFinishedParsingChildren())
+ return false;
+ return isFirstChild(element) && isLastChild(element);
+ }
+ case CSSSelector::PseudoOnlyOfType: {
// FIXME: This selector is very slow.
- if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
- if (m_mode == ResolvingStyle) {
- parent->setChildrenAffectedByForwardPositionalRules();
- parent->setChildrenAffectedByBackwardPositionalRules();
- }
- if (!m_isQuerySelector && !parent->isFinishedParsingChildren())
- return false;
- return isFirstOfType(element, element.tagQName()) &&
- isLastOfType(element, element.tagQName());
+ ContainerNode* parent = element.parentElementOrDocumentFragment();
+ if (m_mode == ResolvingStyle && parent) {
+ parent->setChildrenAffectedByForwardPositionalRules();
+ parent->setChildrenAffectedByBackwardPositionalRules();
}
- break;
+ if (!m_isQuerySelector && parent && !parent->isFinishedParsingChildren())
+ return false;
+ return isFirstOfType(element, element.tagQName()) &&
+ isLastOfType(element, element.tagQName());
+ }
case CSSSelector::PseudoPlaceholderShown:
if (isTextControlElement(element))
return toTextControlElement(element).isPlaceholderVisible();
break;
case CSSSelector::PseudoNthChild:
- if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
- if (m_mode == ResolvingStyle)
+ if (m_mode == ResolvingStyle) {
+ if (ContainerNode* parent = element.parentElementOrDocumentFragment())
parent->setChildrenAffectedByForwardPositionalRules();
- return selector.matchNth(NthIndexCache::nthChildIndex(element));
}
- break;
+ return selector.matchNth(NthIndexCache::nthChildIndex(element));
case CSSSelector::PseudoNthOfType:
- if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
- if (m_mode == ResolvingStyle)
+ if (m_mode == ResolvingStyle) {
+ if (ContainerNode* parent = element.parentElementOrDocumentFragment())
parent->setChildrenAffectedByForwardPositionalRules();
- return selector.matchNth(NthIndexCache::nthOfTypeIndex(element));
- }
- break;
- case CSSSelector::PseudoNthLastChild:
- if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
- if (m_mode == ResolvingStyle)
- parent->setChildrenAffectedByBackwardPositionalRules();
- if (!m_isQuerySelector && !parent->isFinishedParsingChildren())
- return false;
- return selector.matchNth(NthIndexCache::nthLastChildIndex(element));
- }
- break;
- case CSSSelector::PseudoNthLastOfType:
- if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
- if (m_mode == ResolvingStyle)
- parent->setChildrenAffectedByBackwardPositionalRules();
- if (!m_isQuerySelector && !parent->isFinishedParsingChildren())
- return false;
- return selector.matchNth(NthIndexCache::nthLastOfTypeIndex(element));
}
- break;
+ return selector.matchNth(NthIndexCache::nthOfTypeIndex(element));
+ case CSSSelector::PseudoNthLastChild: {
+ ContainerNode* parent = element.parentElementOrDocumentFragment();
+ if (m_mode == ResolvingStyle && parent)
+ parent->setChildrenAffectedByBackwardPositionalRules();
+ if (!m_isQuerySelector && parent && !parent->isFinishedParsingChildren())
+ return false;
+ return selector.matchNth(NthIndexCache::nthLastChildIndex(element));
+ }
+ case CSSSelector::PseudoNthLastOfType: {
+ ContainerNode* parent = element.parentElementOrDocumentFragment();
+ if (m_mode == ResolvingStyle && parent)
+ parent->setChildrenAffectedByBackwardPositionalRules();
+ if (!m_isQuerySelector && parent && !parent->isFinishedParsingChildren())
+ return false;
+ return selector.matchNth(NthIndexCache::nthLastOfTypeIndex(element));
+ }
case CSSSelector::PseudoTarget:
return element == element.document().cssTarget();
case CSSSelector::PseudoAny: {

Powered by Google App Engine
This is Rietveld 408576698