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

Side by Side Diff: third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp

Issue 1477043003: Handle aria-owns and presentational children in AX name calc. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@garaventa_visibility_hidden
Patch Set: Rebase Created 5 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012, Google Inc. All rights reserved. 2 * Copyright (C) 2012, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 1515 matching lines...) Expand 10 before | Expand all | Expand 10 after
1526 nameSources->append(NameSource(foundTextAlternative)); 1526 nameSources->append(NameSource(foundTextAlternative));
1527 nameSources->last().type = nameFrom; 1527 nameSources->last().type = nameFrom;
1528 } 1528 }
1529 1529
1530 Node* node = this->node(); 1530 Node* node = this->node();
1531 if (node && node->isTextNode()) 1531 if (node && node->isTextNode())
1532 textAlternative = toText(node)->wholeText(); 1532 textAlternative = toText(node)->wholeText();
1533 else if (isHTMLBRElement(node)) 1533 else if (isHTMLBRElement(node))
1534 textAlternative = String("\n"); 1534 textAlternative = String("\n");
1535 else 1535 else
1536 textAlternative = textFromDescendants(visited); 1536 textAlternative = textFromDescendants(visited, false);
1537 1537
1538 if (!textAlternative.isEmpty()) { 1538 if (!textAlternative.isEmpty()) {
1539 if (nameSources) { 1539 if (nameSources) {
1540 foundTextAlternative = true; 1540 foundTextAlternative = true;
1541 nameSources->last().text = textAlternative; 1541 nameSources->last().text = textAlternative;
1542 } else { 1542 } else {
1543 return textAlternative; 1543 return textAlternative;
1544 } 1544 }
1545 } 1545 }
1546 } 1546 }
(...skipping 25 matching lines...) Expand all
1572 if (!nameSource.relatedObjects.isEmpty()) 1572 if (!nameSource.relatedObjects.isEmpty())
1573 *relatedObjects = nameSource.relatedObjects; 1573 *relatedObjects = nameSource.relatedObjects;
1574 return nameSource.text; 1574 return nameSource.text;
1575 } 1575 }
1576 } 1576 }
1577 } 1577 }
1578 1578
1579 return String(); 1579 return String();
1580 } 1580 }
1581 1581
1582 String AXNodeObject::textFromDescendants(AXObjectSet& visited) const 1582 String AXNodeObject::textFromDescendants(AXObjectSet& visited, bool recursive) c onst
1583 { 1583 {
1584 if (!canHaveChildren() && recursive)
1585 return String();
1586
1584 StringBuilder accumulatedText; 1587 StringBuilder accumulatedText;
1585 AXObject* previous = nullptr; 1588 AXObject* previous = nullptr;
1586 for (AXObject* child = rawFirstChild(); child; child = child->rawFirstSiblin g()) { 1589
1590 AXObjectVector children;
1591
1592 HeapVector<Member<AXObject>> ownedChildren;
1593 computeAriaOwnsChildren(ownedChildren);
1594 for (AXObject* obj = rawFirstChild(); obj; obj = obj->rawNextSibling()) {
1595 if (!axObjectCache().isAriaOwned(obj))
1596 children.append(obj);
1597 }
1598 for (const auto& ownedChild : ownedChildren)
1599 children.append(ownedChild);
1600
1601 for (AXObject* child : children) {
1587 // Skip hidden children 1602 // Skip hidden children
1588 if (child->isInertOrAriaHidden()) 1603 if (child->isInertOrAriaHidden())
1589 continue; 1604 continue;
1590 1605
1591 // If we're going between two layoutObjects that are in separate LayoutB oxes, add 1606 // If we're going between two layoutObjects that are in separate LayoutB oxes, add
1592 // whitespace if it wasn't there already. Intuitively if you have 1607 // whitespace if it wasn't there already. Intuitively if you have
1593 // <span>Hello</span><span>World</span>, those are part of the same Layo utBox 1608 // <span>Hello</span><span>World</span>, those are part of the same Layo utBox
1594 // so we should return "HelloWorld", but given <div>Hello</div><div>Worl d</div> the 1609 // so we should return "HelloWorld", but given <div>Hello</div><div>Worl d</div> the
1595 // strings are in separate boxes so we should return "Hello World". 1610 // strings are in separate boxes so we should return "Hello World".
1596 if (previous && accumulatedText.length() && !isHTMLSpace(accumulatedText [accumulatedText.length() - 1])) { 1611 if (previous && accumulatedText.length() && !isHTMLSpace(accumulatedText [accumulatedText.length() - 1])) {
1597 if (!isInSameNonInlineBlockFlow(child->layoutObject(), previous->lay outObject())) 1612 if (!isInSameNonInlineBlockFlow(child->layoutObject(), previous->lay outObject()))
1598 accumulatedText.append(' '); 1613 accumulatedText.append(' ');
1599 } 1614 }
1600 1615
1601 String result = recursiveTextAlternative(*child, false, visited); 1616 String result;
1617 if (child->isPresentational())
1618 result = child->textFromDescendants(visited, true);
1619 else
1620 result = recursiveTextAlternative(*child, false, visited);
1602 accumulatedText.append(result); 1621 accumulatedText.append(result);
1603 previous = child; 1622 previous = child;
1604 } 1623 }
1605 1624
1606 return accumulatedText.toString(); 1625 return accumulatedText.toString();
1607 } 1626 }
1608 1627
1609 bool AXNodeObject::nameFromLabelElement() const 1628 bool AXNodeObject::nameFromLabelElement() const
1610 { 1629 {
1611 // This unfortunately duplicates a bit of logic from textAlternative and nat iveTextAlternative, 1630 // This unfortunately duplicates a bit of logic from textAlternative and nat iveTextAlternative,
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
1728 return 0; 1747 return 0;
1729 1748
1730 Node* firstChild = node()->firstChild(); 1749 Node* firstChild = node()->firstChild();
1731 1750
1732 if (!firstChild) 1751 if (!firstChild)
1733 return 0; 1752 return 0;
1734 1753
1735 return axObjectCache().getOrCreate(firstChild); 1754 return axObjectCache().getOrCreate(firstChild);
1736 } 1755 }
1737 1756
1738 AXObject* AXNodeObject::rawFirstSibling() const 1757 AXObject* AXNodeObject::rawNextSibling() const
1739 { 1758 {
1740 if (!node()) 1759 if (!node())
1741 return 0; 1760 return 0;
1742 1761
1743 Node* nextSibling = node()->nextSibling(); 1762 Node* nextSibling = node()->nextSibling();
1744 if (!nextSibling) 1763 if (!nextSibling)
1745 return 0; 1764 return 0;
1746 1765
1747 return axObjectCache().getOrCreate(nextSibling); 1766 return axObjectCache().getOrCreate(nextSibling);
1748 } 1767 }
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
2064 void AXNodeObject::updateAccessibilityRole() 2083 void AXNodeObject::updateAccessibilityRole()
2065 { 2084 {
2066 bool ignoredStatus = accessibilityIsIgnored(); 2085 bool ignoredStatus = accessibilityIsIgnored();
2067 m_role = determineAccessibilityRole(); 2086 m_role = determineAccessibilityRole();
2068 2087
2069 // The AX hierarchy only needs to be updated if the ignored status of an ele ment has changed. 2088 // The AX hierarchy only needs to be updated if the ignored status of an ele ment has changed.
2070 if (ignoredStatus != accessibilityIsIgnored()) 2089 if (ignoredStatus != accessibilityIsIgnored())
2071 childrenChanged(); 2090 childrenChanged();
2072 } 2091 }
2073 2092
2074 void AXNodeObject::computeAriaOwnsChildren(HeapVector<Member<AXObject>>& ownedCh ildren) 2093 void AXNodeObject::computeAriaOwnsChildren(HeapVector<Member<AXObject>>& ownedCh ildren) const
2075 { 2094 {
2076 if (!hasAttribute(aria_ownsAttr)) 2095 if (!hasAttribute(aria_ownsAttr))
2077 return; 2096 return;
2078 2097
2079 Vector<String> idVector; 2098 Vector<String> idVector;
2080 tokenVectorFromAttribute(idVector, aria_ownsAttr); 2099 tokenVectorFromAttribute(idVector, aria_ownsAttr);
2081 2100
2082 axObjectCache().updateAriaOwns(this, idVector, ownedChildren); 2101 axObjectCache().updateAriaOwns(this, idVector, ownedChildren);
2083 } 2102 }
2084 2103
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after
2589 2608
2590 // summary, 5.6.2 from: http://rawgit.com/w3c/aria/master/html-aam/html-aam. html 2609 // summary, 5.6.2 from: http://rawgit.com/w3c/aria/master/html-aam/html-aam. html
2591 if (nameFrom != AXNameFromContents && isHTMLSummaryElement(node())) { 2610 if (nameFrom != AXNameFromContents && isHTMLSummaryElement(node())) {
2592 descriptionFrom = AXDescriptionFromContents; 2611 descriptionFrom = AXDescriptionFromContents;
2593 if (descriptionSources) { 2612 if (descriptionSources) {
2594 descriptionSources->append(DescriptionSource(foundDescription)); 2613 descriptionSources->append(DescriptionSource(foundDescription));
2595 descriptionSources->last().type = descriptionFrom; 2614 descriptionSources->last().type = descriptionFrom;
2596 } 2615 }
2597 2616
2598 AXObjectSet visited; 2617 AXObjectSet visited;
2599 description = textFromDescendants(visited); 2618 description = textFromDescendants(visited, false);
2600 2619
2601 if (!description.isEmpty()) { 2620 if (!description.isEmpty()) {
2602 if (descriptionSources) { 2621 if (descriptionSources) {
2603 foundDescription = true; 2622 foundDescription = true;
2604 descriptionSources->last().text = description; 2623 descriptionSources->last().text = description;
2605 } else { 2624 } else {
2606 return description; 2625 return description;
2607 } 2626 }
2608 } 2627 }
2609 } 2628 }
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
2684 return placeholder; 2703 return placeholder;
2685 } 2704 }
2686 2705
2687 DEFINE_TRACE(AXNodeObject) 2706 DEFINE_TRACE(AXNodeObject)
2688 { 2707 {
2689 visitor->trace(m_node); 2708 visitor->trace(m_node);
2690 AXObject::trace(visitor); 2709 AXObject::trace(visitor);
2691 } 2710 }
2692 2711
2693 } // namespace blin 2712 } // namespace blin
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698