| 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: {
|
|
|