Returns true if the specified selector selects the specified element. @param browserVersion the browser version @param selector the selector to test @param element the element to test @param pseudoElement the pseudo element to match, (can be null) @param fromQuerySelectorAll whether
(final BrowserVersion browserVersion, final Selector selector,
final DomElement element, final String pseudoElement, final boolean fromQuerySelectorAll,
final boolean throwOnSyntax)
| 408 | * @return {@code true} if it does apply, {@code false} if it doesn't apply |
| 409 | */ |
| 410 | public static boolean selects(final BrowserVersion browserVersion, final Selector selector, |
| 411 | final DomElement element, final String pseudoElement, final boolean fromQuerySelectorAll, |
| 412 | final boolean throwOnSyntax) { |
| 413 | switch (selector.getSelectorType()) { |
| 414 | case ELEMENT_NODE_SELECTOR: |
| 415 | final ElementSelector es = (ElementSelector) selector; |
| 416 | |
| 417 | final String name; |
| 418 | final String elementName; |
| 419 | if (element.getPage().hasCaseSensitiveTagNames()) { |
| 420 | name = es.getLocalName(); |
| 421 | elementName = element.getLocalName(); |
| 422 | } |
| 423 | else { |
| 424 | name = es.getLocalNameLowerCase(); |
| 425 | elementName = element.getLowercaseName(); |
| 426 | } |
| 427 | |
| 428 | if (name == null || name.equals(elementName)) { |
| 429 | final List<Condition> conditions = es.getConditions(); |
| 430 | if (conditions != null) { |
| 431 | for (final Condition condition : conditions) { |
| 432 | if (!selects(browserVersion, condition, element, fromQuerySelectorAll, throwOnSyntax)) { |
| 433 | return false; |
| 434 | } |
| 435 | } |
| 436 | } |
| 437 | return true; |
| 438 | } |
| 439 | |
| 440 | return false; |
| 441 | |
| 442 | case CHILD_SELECTOR: |
| 443 | final DomNode parentNode = element.getParentNode(); |
| 444 | if (parentNode == element.getPage()) { |
| 445 | return false; |
| 446 | } |
| 447 | if (!(parentNode instanceof DomElement)) { |
| 448 | return false; // for instance parent is a DocumentFragment |
| 449 | } |
| 450 | final ChildSelector cs = (ChildSelector) selector; |
| 451 | return selects(browserVersion, cs.getSimpleSelector(), element, pseudoElement, |
| 452 | fromQuerySelectorAll, throwOnSyntax) |
| 453 | && selects(browserVersion, cs.getAncestorSelector(), (DomElement) parentNode, |
| 454 | pseudoElement, fromQuerySelectorAll, throwOnSyntax); |
| 455 | |
| 456 | case DESCENDANT_SELECTOR: |
| 457 | final DescendantSelector ds = (DescendantSelector) selector; |
| 458 | final SimpleSelector simpleSelector = ds.getSimpleSelector(); |
| 459 | if (selects(browserVersion, simpleSelector, element, pseudoElement, |
| 460 | fromQuerySelectorAll, throwOnSyntax)) { |
| 461 | DomNode ancestor = element; |
| 462 | if (simpleSelector.getSelectorType() != SelectorType.PSEUDO_ELEMENT_SELECTOR) { |
| 463 | ancestor = ancestor.getParentNode(); |
| 464 | } |
| 465 | final Selector dsAncestorSelector = ds.getAncestorSelector(); |
| 466 | while (ancestor instanceof DomElement) { |
| 467 | if (selects(browserVersion, dsAncestorSelector, (DomElement) ancestor, pseudoElement, |