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

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

Issue 2588643004: Allow positional selectors to match elements without a parent. (Closed)
Patch Set: Allow positional selectors to match elements without a parent. Created 3 years, 11 months 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 b8c76c9a1b81511e35f06dd45457ac3abc1e5edd..b28a4861df01f7f1e8700ec634ff8e89d26fcd09 100644
--- a/third_party/WebKit/Source/core/css/SelectorChecker.cpp
+++ b/third_party/WebKit/Source/core/css/SelectorChecker.cpp
@@ -764,103 +764,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: {
« no previous file with comments | « third_party/WebKit/LayoutTests/http/tests/misc/acid3.html ('k') | third_party/WebKit/Source/core/dom/NthIndexCache.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698