| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) |
| 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) | 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) |
| 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc.
All rights reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc.
All rights reserved. |
| 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
| 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> |
| 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
| 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. | 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. |
| 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 if (context.selector->isCustomPseudoElement()) { | 255 if (context.selector->isCustomPseudoElement()) { |
| 256 if (!matchesCustomPseudoElement(context.element, *context.selector)) | 256 if (!matchesCustomPseudoElement(context.element, *context.selector)) |
| 257 return SelectorFailsLocally; | 257 return SelectorFailsLocally; |
| 258 } else if (context.selector->isContentPseudoElement()) { | 258 } else if (context.selector->isContentPseudoElement()) { |
| 259 if (!context.element->isInShadowTree() || !context.element->isInsert
ionPoint()) | 259 if (!context.element->isInShadowTree() || !context.element->isInsert
ionPoint()) |
| 260 return SelectorFailsLocally; | 260 return SelectorFailsLocally; |
| 261 } else if (context.selector->isShadowPseudoElement()) { | 261 } else if (context.selector->isShadowPseudoElement()) { |
| 262 if (!context.element->isInShadowTree() || !context.previousElement) | 262 if (!context.element->isInShadowTree() || !context.previousElement) |
| 263 return SelectorFailsCompletely; | 263 return SelectorFailsCompletely; |
| 264 } else { | 264 } else { |
| 265 if ((!context.elementStyle && m_mode == ResolvingStyle) || m_mode ==
QueryingRules) | 265 if ((!context.inRightmostCompound && m_mode == ResolvingStyle) || m_
mode == QueryingRules) |
| 266 return SelectorFailsLocally; | 266 return SelectorFailsLocally; |
| 267 | 267 |
| 268 PseudoId pseudoId = CSSSelector::pseudoId(context.selector->pseudoTy
pe()); | 268 PseudoId pseudoId = CSSSelector::pseudoId(context.selector->pseudoTy
pe()); |
| 269 if (pseudoId != NOPSEUDO && m_mode != SharingRules) | 269 if (pseudoId != NOPSEUDO && m_mode != SharingRules) |
| 270 result.dynamicPseudo = pseudoId; | 270 result.dynamicPseudo = pseudoId; |
| 271 } | 271 } |
| 272 } | 272 } |
| 273 | 273 |
| 274 // Prepare next selector | 274 // Prepare next selector |
| 275 if (context.selector->isLastInTagHistory()) { | 275 if (context.selector->isLastInTagHistory()) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 SelectorChecker::Match SelectorChecker::matchForSubSelector(const SelectorChecki
ngContext& context, MatchResult& result) const | 316 SelectorChecker::Match SelectorChecker::matchForSubSelector(const SelectorChecki
ngContext& context, MatchResult& result) const |
| 317 { | 317 { |
| 318 SelectorCheckingContext nextContext = prepareNextContextForRelation(context)
; | 318 SelectorCheckingContext nextContext = prepareNextContextForRelation(context)
; |
| 319 | 319 |
| 320 PseudoId dynamicPseudo = result.dynamicPseudo; | 320 PseudoId dynamicPseudo = result.dynamicPseudo; |
| 321 // a selector is invalid if something follows a pseudo-element | 321 // a selector is invalid if something follows a pseudo-element |
| 322 // We make an exception for scrollbar pseudo elements and allow a set of pse
udo classes (but nothing else) | 322 // We make an exception for scrollbar pseudo elements and allow a set of pse
udo classes (but nothing else) |
| 323 // to follow the pseudo elements. | 323 // to follow the pseudo elements. |
| 324 nextContext.hasScrollbarPseudo = dynamicPseudo != NOPSEUDO && (context.scrol
lbar || dynamicPseudo == SCROLLBAR_CORNER || dynamicPseudo == RESIZER); | 324 nextContext.hasScrollbarPseudo = dynamicPseudo != NOPSEUDO && (context.scrol
lbar || dynamicPseudo == SCROLLBAR_CORNER || dynamicPseudo == RESIZER); |
| 325 nextContext.hasSelectionPseudo = dynamicPseudo == SELECTION; | 325 nextContext.hasSelectionPseudo = dynamicPseudo == SELECTION; |
| 326 if ((context.elementStyle || m_mode == CollectingCSSRules || m_mode == Colle
ctingStyleRules || m_mode == QueryingRules) && dynamicPseudo != NOPSEUDO | 326 if ((context.inRightmostCompound || m_mode == CollectingCSSRules || m_mode =
= CollectingStyleRules || m_mode == QueryingRules) && dynamicPseudo != NOPSEUDO |
| 327 && !nextContext.hasSelectionPseudo | 327 && !nextContext.hasSelectionPseudo |
| 328 && !(nextContext.hasScrollbarPseudo && nextContext.selector->match() ==
CSSSelector::PseudoClass)) | 328 && !(nextContext.hasScrollbarPseudo && nextContext.selector->match() ==
CSSSelector::PseudoClass)) |
| 329 return SelectorFailsCompletely; | 329 return SelectorFailsCompletely; |
| 330 | 330 |
| 331 nextContext.isSubSelector = true; | 331 nextContext.isSubSelector = true; |
| 332 return matchSelector(nextContext, result); | 332 return matchSelector(nextContext, result); |
| 333 } | 333 } |
| 334 | 334 |
| 335 static inline Element* parentOrShadowHostButDisallowEscapingUserAgentShadowTree(
const Element& element) | 335 static inline Element* parentOrShadowHostButDisallowEscapingUserAgentShadowTree(
const Element& element) |
| 336 { | 336 { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 367 switch (relation) { | 367 switch (relation) { |
| 368 case CSSSelector::Descendant: | 368 case CSSSelector::Descendant: |
| 369 if (context.selector->relationIsAffectedByPseudoContent()) { | 369 if (context.selector->relationIsAffectedByPseudoContent()) { |
| 370 for (Element* element = context.element; element; element = element-
>parentElement()) { | 370 for (Element* element = context.element; element; element = element-
>parentElement()) { |
| 371 if (matchForShadowDistributed(nextContext, *element, result) ==
SelectorMatches) | 371 if (matchForShadowDistributed(nextContext, *element, result) ==
SelectorMatches) |
| 372 return SelectorMatches; | 372 return SelectorMatches; |
| 373 } | 373 } |
| 374 return SelectorFailsCompletely; | 374 return SelectorFailsCompletely; |
| 375 } | 375 } |
| 376 nextContext.isSubSelector = false; | 376 nextContext.isSubSelector = false; |
| 377 nextContext.elementStyle = 0; | 377 nextContext.inRightmostCompound = false; |
| 378 | 378 |
| 379 if (nextContext.selector->isShadowPseudoElement()) | 379 if (nextContext.selector->isShadowPseudoElement()) |
| 380 return matchForPseudoShadow(nextContext, context.element->containing
ShadowRoot(), result); | 380 return matchForPseudoShadow(nextContext, context.element->containing
ShadowRoot(), result); |
| 381 | 381 |
| 382 for (nextContext.element = parentElement(context); nextContext.element;
nextContext.element = parentElement(nextContext)) { | 382 for (nextContext.element = parentElement(context); nextContext.element;
nextContext.element = parentElement(nextContext)) { |
| 383 Match match = matchSelector(nextContext, result); | 383 Match match = matchSelector(nextContext, result); |
| 384 if (match == SelectorMatches || match == SelectorFailsCompletely) | 384 if (match == SelectorMatches || match == SelectorFailsCompletely) |
| 385 return match; | 385 return match; |
| 386 if (nextSelectorExceedsScope(nextContext)) | 386 if (nextSelectorExceedsScope(nextContext)) |
| 387 return SelectorFailsCompletely; | 387 return SelectorFailsCompletely; |
| 388 } | 388 } |
| 389 return SelectorFailsCompletely; | 389 return SelectorFailsCompletely; |
| 390 case CSSSelector::Child: | 390 case CSSSelector::Child: |
| 391 { | 391 { |
| 392 if (context.selector->relationIsAffectedByPseudoContent()) | 392 if (context.selector->relationIsAffectedByPseudoContent()) |
| 393 return matchForShadowDistributed(nextContext, *context.element,
result); | 393 return matchForShadowDistributed(nextContext, *context.element,
result); |
| 394 | 394 |
| 395 nextContext.isSubSelector = false; | 395 nextContext.isSubSelector = false; |
| 396 nextContext.elementStyle = 0; | 396 nextContext.inRightmostCompound = false; |
| 397 | 397 |
| 398 if (nextContext.selector->isShadowPseudoElement()) | 398 if (nextContext.selector->isShadowPseudoElement()) |
| 399 return matchForPseudoShadow(nextContext, context.element->parent
Node(), result); | 399 return matchForPseudoShadow(nextContext, context.element->parent
Node(), result); |
| 400 | 400 |
| 401 nextContext.element = parentElement(context); | 401 nextContext.element = parentElement(context); |
| 402 if (!nextContext.element) | 402 if (!nextContext.element) |
| 403 return SelectorFailsCompletely; | 403 return SelectorFailsCompletely; |
| 404 return matchSelector(nextContext, result); | 404 return matchSelector(nextContext, result); |
| 405 } | 405 } |
| 406 case CSSSelector::DirectAdjacent: | 406 case CSSSelector::DirectAdjacent: |
| 407 // Shadow roots can't have sibling elements | 407 // Shadow roots can't have sibling elements |
| 408 if (nextContext.selector->isShadowPseudoElement()) | 408 if (nextContext.selector->isShadowPseudoElement()) |
| 409 return SelectorFailsCompletely; | 409 return SelectorFailsCompletely; |
| 410 | 410 |
| 411 if (m_mode == ResolvingStyle) { | 411 if (m_mode == ResolvingStyle) { |
| 412 if (ContainerNode* parent = context.element->parentElementOrShadowRo
ot()) | 412 if (ContainerNode* parent = context.element->parentElementOrShadowRo
ot()) |
| 413 parent->setChildrenAffectedByDirectAdjacentRules(); | 413 parent->setChildrenAffectedByDirectAdjacentRules(); |
| 414 } | 414 } |
| 415 nextContext.element = ElementTraversal::previousSibling(*context.element
); | 415 nextContext.element = ElementTraversal::previousSibling(*context.element
); |
| 416 if (!nextContext.element) | 416 if (!nextContext.element) |
| 417 return SelectorFailsAllSiblings; | 417 return SelectorFailsAllSiblings; |
| 418 nextContext.isSubSelector = false; | 418 nextContext.isSubSelector = false; |
| 419 nextContext.elementStyle = 0; | 419 nextContext.inRightmostCompound = false; |
| 420 return matchSelector(nextContext, result); | 420 return matchSelector(nextContext, result); |
| 421 | 421 |
| 422 case CSSSelector::IndirectAdjacent: | 422 case CSSSelector::IndirectAdjacent: |
| 423 // Shadow roots can't have sibling elements | 423 // Shadow roots can't have sibling elements |
| 424 if (nextContext.selector->isShadowPseudoElement()) | 424 if (nextContext.selector->isShadowPseudoElement()) |
| 425 return SelectorFailsCompletely; | 425 return SelectorFailsCompletely; |
| 426 | 426 |
| 427 if (m_mode == ResolvingStyle) { | 427 if (m_mode == ResolvingStyle) { |
| 428 if (ContainerNode* parent = context.element->parentElementOrShadowRo
ot()) | 428 if (ContainerNode* parent = context.element->parentElementOrShadowRo
ot()) |
| 429 parent->setChildrenAffectedByIndirectAdjacentRules(); | 429 parent->setChildrenAffectedByIndirectAdjacentRules(); |
| 430 } | 430 } |
| 431 nextContext.element = ElementTraversal::previousSibling(*context.element
); | 431 nextContext.element = ElementTraversal::previousSibling(*context.element
); |
| 432 nextContext.isSubSelector = false; | 432 nextContext.isSubSelector = false; |
| 433 nextContext.elementStyle = 0; | 433 nextContext.inRightmostCompound = false; |
| 434 for (; nextContext.element; nextContext.element = ElementTraversal::prev
iousSibling(*nextContext.element)) { | 434 for (; nextContext.element; nextContext.element = ElementTraversal::prev
iousSibling(*nextContext.element)) { |
| 435 Match match = matchSelector(nextContext, result); | 435 Match match = matchSelector(nextContext, result); |
| 436 if (match == SelectorMatches || match == SelectorFailsAllSiblings ||
match == SelectorFailsCompletely) | 436 if (match == SelectorMatches || match == SelectorFailsAllSiblings ||
match == SelectorFailsCompletely) |
| 437 return match; | 437 return match; |
| 438 }; | 438 }; |
| 439 return SelectorFailsAllSiblings; | 439 return SelectorFailsAllSiblings; |
| 440 | 440 |
| 441 case CSSSelector::ShadowPseudo: | 441 case CSSSelector::ShadowPseudo: |
| 442 { | 442 { |
| 443 // If we're in the same tree-scope as the scoping element, then foll
owing a shadow descendant combinator would escape that and thus the scope. | 443 // If we're in the same tree-scope as the scoping element, then foll
owing a shadow descendant combinator would escape that and thus the scope. |
| 444 if (context.scope && context.scope->shadowHost() && context.scope->s
hadowHost()->treeScope() == context.element->treeScope()) | 444 if (context.scope && context.scope->shadowHost() && context.scope->s
hadowHost()->treeScope() == context.element->treeScope()) |
| 445 return SelectorFailsCompletely; | 445 return SelectorFailsCompletely; |
| 446 | 446 |
| 447 Element* shadowHost = context.element->shadowHost(); | 447 Element* shadowHost = context.element->shadowHost(); |
| 448 if (!shadowHost) | 448 if (!shadowHost) |
| 449 return SelectorFailsCompletely; | 449 return SelectorFailsCompletely; |
| 450 nextContext.element = shadowHost; | 450 nextContext.element = shadowHost; |
| 451 nextContext.isSubSelector = false; | 451 nextContext.isSubSelector = false; |
| 452 nextContext.elementStyle = 0; | 452 nextContext.inRightmostCompound = false; |
| 453 return matchSelector(nextContext, result); | 453 return matchSelector(nextContext, result); |
| 454 } | 454 } |
| 455 | 455 |
| 456 case CSSSelector::ShadowDeep: | 456 case CSSSelector::ShadowDeep: |
| 457 { | 457 { |
| 458 if (context.selector->relationIsAffectedByPseudoContent()) { | 458 if (context.selector->relationIsAffectedByPseudoContent()) { |
| 459 for (Element* element = context.element; element; element = pare
ntOrShadowHostButDisallowEscapingUserAgentShadowTree(*element)) { | 459 for (Element* element = context.element; element; element = pare
ntOrShadowHostButDisallowEscapingUserAgentShadowTree(*element)) { |
| 460 if (matchForShadowDistributed(nextContext, *element, result)
== SelectorMatches) | 460 if (matchForShadowDistributed(nextContext, *element, result)
== SelectorMatches) |
| 461 return SelectorMatches; | 461 return SelectorMatches; |
| 462 } | 462 } |
| 463 return SelectorFailsCompletely; | 463 return SelectorFailsCompletely; |
| 464 } | 464 } |
| 465 | 465 |
| 466 nextContext.isSubSelector = false; | 466 nextContext.isSubSelector = false; |
| 467 nextContext.elementStyle = 0; | 467 nextContext.inRightmostCompound = false; |
| 468 for (nextContext.element = parentOrShadowHostButDisallowEscapingUser
AgentShadowTree(*context.element); nextContext.element; nextContext.element = pa
rentOrShadowHostButDisallowEscapingUserAgentShadowTree(*nextContext.element)) { | 468 for (nextContext.element = parentOrShadowHostButDisallowEscapingUser
AgentShadowTree(*context.element); nextContext.element; nextContext.element = pa
rentOrShadowHostButDisallowEscapingUserAgentShadowTree(*nextContext.element)) { |
| 469 Match match = matchSelector(nextContext, result); | 469 Match match = matchSelector(nextContext, result); |
| 470 if (match == SelectorMatches || match == SelectorFailsCompletely
) | 470 if (match == SelectorMatches || match == SelectorFailsCompletely
) |
| 471 return match; | 471 return match; |
| 472 if (nextSelectorExceedsScope(nextContext)) | 472 if (nextSelectorExceedsScope(nextContext)) |
| 473 return SelectorFailsCompletely; | 473 return SelectorFailsCompletely; |
| 474 } | 474 } |
| 475 return SelectorFailsCompletely; | 475 return SelectorFailsCompletely; |
| 476 } | 476 } |
| 477 | 477 |
| 478 case CSSSelector::SubSelector: | 478 case CSSSelector::SubSelector: |
| 479 ASSERT_NOT_REACHED(); | 479 ASSERT_NOT_REACHED(); |
| 480 } | 480 } |
| 481 | 481 |
| 482 ASSERT_NOT_REACHED(); | 482 ASSERT_NOT_REACHED(); |
| 483 return SelectorFailsCompletely; | 483 return SelectorFailsCompletely; |
| 484 } | 484 } |
| 485 | 485 |
| 486 SelectorChecker::Match SelectorChecker::matchForShadowDistributed(const Selector
CheckingContext& context, const Element& element, MatchResult& result) const | 486 SelectorChecker::Match SelectorChecker::matchForShadowDistributed(const Selector
CheckingContext& context, const Element& element, MatchResult& result) const |
| 487 { | 487 { |
| 488 WillBeHeapVector<RawPtrWillBeMember<InsertionPoint>, 8> insertionPoints; | 488 WillBeHeapVector<RawPtrWillBeMember<InsertionPoint>, 8> insertionPoints; |
| 489 collectDestinationInsertionPoints(element, insertionPoints); | 489 collectDestinationInsertionPoints(element, insertionPoints); |
| 490 SelectorCheckingContext nextContext(context); | 490 SelectorCheckingContext nextContext(context); |
| 491 nextContext.isSubSelector = false; | 491 nextContext.isSubSelector = false; |
| 492 nextContext.elementStyle = 0; | 492 nextContext.inRightmostCompound = false; |
| 493 for (const auto& insertionPoint : insertionPoints) { | 493 for (const auto& insertionPoint : insertionPoints) { |
| 494 nextContext.element = insertionPoint; | 494 nextContext.element = insertionPoint; |
| 495 // TODO(esprehn): Why does SharingRules have a special case? | 495 // TODO(esprehn): Why does SharingRules have a special case? |
| 496 if (m_mode == SharingRules) | 496 if (m_mode == SharingRules) |
| 497 nextContext.scope = insertionPoint->containingShadowRoot(); | 497 nextContext.scope = insertionPoint->containingShadowRoot(); |
| 498 if (match(nextContext, result)) | 498 if (match(nextContext, result)) |
| 499 return SelectorMatches; | 499 return SelectorMatches; |
| 500 } | 500 } |
| 501 return SelectorFailsLocally; | 501 return SelectorFailsLocally; |
| 502 } | 502 } |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 723 if (n->isTextNode()) { | 723 if (n->isTextNode()) { |
| 724 Text* textNode = toText(n); | 724 Text* textNode = toText(n); |
| 725 if (!textNode->data().isEmpty()) { | 725 if (!textNode->data().isEmpty()) { |
| 726 result = false; | 726 result = false; |
| 727 break; | 727 break; |
| 728 } | 728 } |
| 729 } | 729 } |
| 730 } | 730 } |
| 731 if (m_mode == ResolvingStyle) { | 731 if (m_mode == ResolvingStyle) { |
| 732 element.setStyleAffectedByEmpty(); | 732 element.setStyleAffectedByEmpty(); |
| 733 if (context.elementStyle) | 733 if (context.inRightmostCompound) |
| 734 context.elementStyle->setEmptyState(result); | 734 context.elementStyle->setEmptyState(result); |
| 735 else if (element.computedStyle() && (element.document().styleEng
ine().usesSiblingRules() || element.computedStyle()->unique())) | 735 else if (element.computedStyle() && (element.document().styleEng
ine().usesSiblingRules() || element.computedStyle()->unique())) |
| 736 element.mutableComputedStyle()->setEmptyState(result); | 736 element.mutableComputedStyle()->setEmptyState(result); |
| 737 } | 737 } |
| 738 return result; | 738 return result; |
| 739 } | 739 } |
| 740 case CSSSelector::PseudoFirstChild: | 740 case CSSSelector::PseudoFirstChild: |
| 741 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 741 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { |
| 742 if (m_mode == ResolvingStyle) { | 742 if (m_mode == ResolvingStyle) { |
| 743 parent->setChildrenAffectedByFirstChildRules(); | 743 parent->setChildrenAffectedByFirstChildRules(); |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 853 break; | 853 break; |
| 854 case CSSSelector::PseudoAutofill: | 854 case CSSSelector::PseudoAutofill: |
| 855 return element.isFormControlElement() && toHTMLFormControlElement(elemen
t).isAutofilled(); | 855 return element.isFormControlElement() && toHTMLFormControlElement(elemen
t).isAutofilled(); |
| 856 case CSSSelector::PseudoAnyLink: | 856 case CSSSelector::PseudoAnyLink: |
| 857 case CSSSelector::PseudoLink: | 857 case CSSSelector::PseudoLink: |
| 858 return element.isLink(); | 858 return element.isLink(); |
| 859 case CSSSelector::PseudoVisited: | 859 case CSSSelector::PseudoVisited: |
| 860 return element.isLink() && context.visitedMatchType == VisitedMatchEnabl
ed; | 860 return element.isLink() && context.visitedMatchType == VisitedMatchEnabl
ed; |
| 861 case CSSSelector::PseudoDrag: | 861 case CSSSelector::PseudoDrag: |
| 862 if (m_mode == ResolvingStyle) { | 862 if (m_mode == ResolvingStyle) { |
| 863 if (context.elementStyle) | 863 if (context.inRightmostCompound) |
| 864 context.elementStyle->setAffectedByDrag(); | 864 context.elementStyle->setAffectedByDrag(); |
| 865 else | 865 else |
| 866 element.setChildrenOrSiblingsAffectedByDrag(); | 866 element.setChildrenOrSiblingsAffectedByDrag(); |
| 867 } | 867 } |
| 868 return element.layoutObject() && element.layoutObject()->isDragging(); | 868 return element.layoutObject() && element.layoutObject()->isDragging(); |
| 869 case CSSSelector::PseudoFocus: | 869 case CSSSelector::PseudoFocus: |
| 870 if (m_mode == ResolvingStyle) { | 870 if (m_mode == ResolvingStyle) { |
| 871 if (context.elementStyle) | 871 if (context.inRightmostCompound) |
| 872 context.elementStyle->setAffectedByFocus(); | 872 context.elementStyle->setAffectedByFocus(); |
| 873 else | 873 else |
| 874 element.setChildrenOrSiblingsAffectedByFocus(); | 874 element.setChildrenOrSiblingsAffectedByFocus(); |
| 875 } | 875 } |
| 876 return matchesFocusPseudoClass(element); | 876 return matchesFocusPseudoClass(element); |
| 877 case CSSSelector::PseudoHover: | 877 case CSSSelector::PseudoHover: |
| 878 if (m_mode == ResolvingStyle) { | 878 if (m_mode == ResolvingStyle) { |
| 879 if (context.elementStyle) | 879 if (context.inRightmostCompound) |
| 880 context.elementStyle->setAffectedByHover(); | 880 context.elementStyle->setAffectedByHover(); |
| 881 else | 881 else |
| 882 element.setChildrenOrSiblingsAffectedByHover(); | 882 element.setChildrenOrSiblingsAffectedByHover(); |
| 883 } | 883 } |
| 884 if (!shouldMatchHoverOrActive(context)) | 884 if (!shouldMatchHoverOrActive(context)) |
| 885 return false; | 885 return false; |
| 886 if (InspectorInstrumentation::forcePseudoState(&element, CSSSelector::Ps
eudoHover)) | 886 if (InspectorInstrumentation::forcePseudoState(&element, CSSSelector::Ps
eudoHover)) |
| 887 return true; | 887 return true; |
| 888 return element.hovered(); | 888 return element.hovered(); |
| 889 case CSSSelector::PseudoActive: | 889 case CSSSelector::PseudoActive: |
| 890 if (m_mode == ResolvingStyle) { | 890 if (m_mode == ResolvingStyle) { |
| 891 if (context.elementStyle) | 891 if (context.inRightmostCompound) |
| 892 context.elementStyle->setAffectedByActive(); | 892 context.elementStyle->setAffectedByActive(); |
| 893 else | 893 else |
| 894 element.setChildrenOrSiblingsAffectedByActive(); | 894 element.setChildrenOrSiblingsAffectedByActive(); |
| 895 } | 895 } |
| 896 if (!shouldMatchHoverOrActive(context)) | 896 if (!shouldMatchHoverOrActive(context)) |
| 897 return false; | 897 return false; |
| 898 if (InspectorInstrumentation::forcePseudoState(&element, CSSSelector::Ps
eudoActive)) | 898 if (InspectorInstrumentation::forcePseudoState(&element, CSSSelector::Ps
eudoActive)) |
| 899 return true; | 899 return true; |
| 900 return element.active(); | 900 return element.active(); |
| 901 case CSSSelector::PseudoEnabled: | 901 case CSSSelector::PseudoEnabled: |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1092 maxSpecificity = std::max(maxSpecificity, hostContext.selector->
specificity() + subResult.specificity); | 1092 maxSpecificity = std::max(maxSpecificity, hostContext.selector->
specificity() + subResult.specificity); |
| 1093 break; | 1093 break; |
| 1094 } | 1094 } |
| 1095 hostContext.scopeContainsLastMatchedElement = false; | 1095 hostContext.scopeContainsLastMatchedElement = false; |
| 1096 hostContext.treatShadowHostAsNormalScope = false; | 1096 hostContext.treatShadowHostAsNormalScope = false; |
| 1097 hostContext.scope = nullptr; | 1097 hostContext.scope = nullptr; |
| 1098 | 1098 |
| 1099 if (selector.pseudoType() == CSSSelector::PseudoHost) | 1099 if (selector.pseudoType() == CSSSelector::PseudoHost) |
| 1100 break; | 1100 break; |
| 1101 | 1101 |
| 1102 hostContext.elementStyle = 0; | 1102 hostContext.inRightmostCompound = false; |
| 1103 nextElement = ComposedTreeTraversal::parentElement(*nextElement); | 1103 nextElement = ComposedTreeTraversal::parentElement(*nextElement); |
| 1104 } while (nextElement); | 1104 } while (nextElement); |
| 1105 } | 1105 } |
| 1106 if (matched) { | 1106 if (matched) { |
| 1107 if (specificity) | 1107 if (specificity) |
| 1108 *specificity = maxSpecificity; | 1108 *specificity = maxSpecificity; |
| 1109 return true; | 1109 return true; |
| 1110 } | 1110 } |
| 1111 | 1111 |
| 1112 // FIXME: this was a fallthrough condition. | 1112 // FIXME: this was a fallthrough condition. |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1198 } | 1198 } |
| 1199 | 1199 |
| 1200 bool SelectorChecker::matchesFocusPseudoClass(const Element& element) | 1200 bool SelectorChecker::matchesFocusPseudoClass(const Element& element) |
| 1201 { | 1201 { |
| 1202 if (InspectorInstrumentation::forcePseudoState(const_cast<Element*>(&element
), CSSSelector::PseudoFocus)) | 1202 if (InspectorInstrumentation::forcePseudoState(const_cast<Element*>(&element
), CSSSelector::PseudoFocus)) |
| 1203 return true; | 1203 return true; |
| 1204 return element.focused() && isFrameFocused(element); | 1204 return element.focused() && isFrameFocused(element); |
| 1205 } | 1205 } |
| 1206 | 1206 |
| 1207 } | 1207 } |
| OLD | NEW |