| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008 Apple 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 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 // We want to notify that the combo box has changed its active descendant, | 240 // We want to notify that the combo box has changed its active descendant, |
| 241 // but we do not want to change the focus, because focus should remain with
the combo box. | 241 // but we do not want to change the focus, because focus should remain with
the combo box. |
| 242 if (isComboBox()) | 242 if (isComboBox()) |
| 243 return true; | 243 return true; |
| 244 | 244 |
| 245 return shouldFocusActiveDescendant(); | 245 return shouldFocusActiveDescendant(); |
| 246 } | 246 } |
| 247 | 247 |
| 248 ScrollableArea* AXLayoutObject::getScrollableAreaIfScrollable() const | 248 ScrollableArea* AXLayoutObject::getScrollableAreaIfScrollable() const |
| 249 { | 249 { |
| 250 // FIXME(dmazzoni): the plan is to get rid of AXScrollView, but until | 250 if (isWebArea()) |
| 251 // this is done, a WebArea delegates its scrolling to its parent scroll view
. | 251 return documentFrameView(); |
| 252 // http://crbug.com/484878 | |
| 253 if (parentObject() && parentObject()->isAXScrollView()) | |
| 254 return parentObject()->getScrollableAreaIfScrollable(); | |
| 255 | 252 |
| 256 if (!m_layoutObject || !m_layoutObject->isBox()) | 253 if (!m_layoutObject || !m_layoutObject->isBox()) |
| 257 return 0; | 254 return 0; |
| 258 | 255 |
| 259 LayoutBox* box = toLayoutBox(m_layoutObject); | 256 LayoutBox* box = toLayoutBox(m_layoutObject); |
| 260 if (!box->canBeScrolledAndHasScrollableArea()) | 257 if (!box->canBeScrolledAndHasScrollableArea()) |
| 261 return 0; | 258 return 0; |
| 262 | 259 |
| 263 return box->scrollableArea(); | 260 return box->scrollableArea(); |
| 264 } | 261 } |
| (...skipping 1330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1595 if (ariaRoleAttribute() == MenuRole) { | 1592 if (ariaRoleAttribute() == MenuRole) { |
| 1596 AXObject* parent = menuButtonForMenu(); | 1593 AXObject* parent = menuButtonForMenu(); |
| 1597 if (parent) | 1594 if (parent) |
| 1598 return parent; | 1595 return parent; |
| 1599 } | 1596 } |
| 1600 | 1597 |
| 1601 LayoutObject* parentObj = layoutParentObject(); | 1598 LayoutObject* parentObj = layoutParentObject(); |
| 1602 if (parentObj) | 1599 if (parentObj) |
| 1603 return axObjectCache().getOrCreate(parentObj); | 1600 return axObjectCache().getOrCreate(parentObj); |
| 1604 | 1601 |
| 1605 // WebArea's parent should be the scroll view containing it. | |
| 1606 if (isWebArea()) | |
| 1607 return axObjectCache().getOrCreate(m_layoutObject->frame()->view()); | |
| 1608 | |
| 1609 return 0; | 1602 return 0; |
| 1610 } | 1603 } |
| 1611 | 1604 |
| 1612 AXObject* AXLayoutObject::computeParentIfExists() const | 1605 AXObject* AXLayoutObject::computeParentIfExists() const |
| 1613 { | 1606 { |
| 1614 if (!m_layoutObject) | 1607 if (!m_layoutObject) |
| 1615 return 0; | 1608 return 0; |
| 1616 | 1609 |
| 1617 if (ariaRoleAttribute() == MenuBarRole) | 1610 if (ariaRoleAttribute() == MenuBarRole) |
| 1618 return axObjectCache().get(m_layoutObject->parent()); | 1611 return axObjectCache().get(m_layoutObject->parent()); |
| 1619 | 1612 |
| 1620 // menuButton and its corresponding menu are DOM siblings, but Accessibility
needs them to be parent/child | 1613 // menuButton and its corresponding menu are DOM siblings, but Accessibility
needs them to be parent/child |
| 1621 if (ariaRoleAttribute() == MenuRole) { | 1614 if (ariaRoleAttribute() == MenuRole) { |
| 1622 AXObject* parent = menuButtonForMenu(); | 1615 AXObject* parent = menuButtonForMenu(); |
| 1623 if (parent) | 1616 if (parent) |
| 1624 return parent; | 1617 return parent; |
| 1625 } | 1618 } |
| 1626 | 1619 |
| 1627 LayoutObject* parentObj = layoutParentObject(); | 1620 LayoutObject* parentObj = layoutParentObject(); |
| 1628 if (parentObj) | 1621 if (parentObj) |
| 1629 return axObjectCache().get(parentObj); | 1622 return axObjectCache().get(parentObj); |
| 1630 | 1623 |
| 1631 // WebArea's parent should be the scroll view containing it. | |
| 1632 if (isWebArea()) | |
| 1633 return axObjectCache().get(m_layoutObject->frame()->view()); | |
| 1634 | |
| 1635 return 0; | 1624 return 0; |
| 1636 } | 1625 } |
| 1637 | 1626 |
| 1638 // | 1627 // |
| 1639 // Low-level accessibility tree exploration, only for use within the accessibili
ty module. | 1628 // Low-level accessibility tree exploration, only for use within the accessibili
ty module. |
| 1640 // | 1629 // |
| 1641 | 1630 |
| 1642 AXObject* AXLayoutObject::firstChild() const | 1631 AXObject* AXLayoutObject::firstChild() const |
| 1643 { | 1632 { |
| 1644 if (!m_layoutObject) | 1633 if (!m_layoutObject) |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1709 | 1698 |
| 1710 HeapVector<Member<AXObject>> ownedChildren; | 1699 HeapVector<Member<AXObject>> ownedChildren; |
| 1711 computeAriaOwnsChildren(ownedChildren); | 1700 computeAriaOwnsChildren(ownedChildren); |
| 1712 | 1701 |
| 1713 for (AXObject* obj = firstChild(); obj; obj = obj->nextSibling()) { | 1702 for (AXObject* obj = firstChild(); obj; obj = obj->nextSibling()) { |
| 1714 if (!axObjectCache().isAriaOwned(obj)) | 1703 if (!axObjectCache().isAriaOwned(obj)) |
| 1715 addChild(obj); | 1704 addChild(obj); |
| 1716 } | 1705 } |
| 1717 | 1706 |
| 1718 addHiddenChildren(); | 1707 addHiddenChildren(); |
| 1719 addAttachmentChildren(); | |
| 1720 addPopupChildren(); | 1708 addPopupChildren(); |
| 1721 addImageMapChildren(); | 1709 addImageMapChildren(); |
| 1722 addTextFieldChildren(); | 1710 addTextFieldChildren(); |
| 1723 addCanvasChildren(); | 1711 addCanvasChildren(); |
| 1724 addRemoteSVGChildren(); | 1712 addRemoteSVGChildren(); |
| 1725 addInlineTextBoxChildren(false); | 1713 addInlineTextBoxChildren(false); |
| 1726 | 1714 |
| 1727 for (const auto& child : m_children) { | 1715 for (const auto& child : m_children) { |
| 1728 if (!child->cachedParentObject()) | 1716 if (!child->cachedParentObject()) |
| 1729 child->setParent(this); | 1717 child->setParent(this); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1822 // NOTE: this assumes that any non-image with an anchor is an HTMLAnchorElem
ent | 1810 // NOTE: this assumes that any non-image with an anchor is an HTMLAnchorElem
ent |
| 1823 Node* node = currLayoutObject->node(); | 1811 Node* node = currLayoutObject->node(); |
| 1824 for ( ; node; node = node->parentNode()) { | 1812 for ( ; node; node = node->parentNode()) { |
| 1825 if (isHTMLAnchorElement(*node) || (node->layoutObject() && cache.getOrCr
eate(node->layoutObject())->isAnchor())) | 1813 if (isHTMLAnchorElement(*node) || (node->layoutObject() && cache.getOrCr
eate(node->layoutObject())->isAnchor())) |
| 1826 return toElement(node); | 1814 return toElement(node); |
| 1827 } | 1815 } |
| 1828 | 1816 |
| 1829 return 0; | 1817 return 0; |
| 1830 } | 1818 } |
| 1831 | 1819 |
| 1832 Widget* AXLayoutObject::widgetForAttachmentView() const | |
| 1833 { | |
| 1834 if (!isAttachment()) | |
| 1835 return 0; | |
| 1836 return toLayoutPart(m_layoutObject)->widget(); | |
| 1837 } | |
| 1838 | |
| 1839 // | 1820 // |
| 1840 // Functions that retrieve the current selection. | 1821 // Functions that retrieve the current selection. |
| 1841 // | 1822 // |
| 1842 | 1823 |
| 1843 AXObject::AXRange AXLayoutObject::selection() const | 1824 AXObject::AXRange AXLayoutObject::selection() const |
| 1844 { | 1825 { |
| 1845 AXRange textSelection = textControlSelection(); | 1826 AXRange textSelection = textControlSelection(); |
| 1846 if (textSelection.isValid()) | 1827 if (textSelection.isValid()) |
| 1847 return textSelection; | 1828 return textSelection; |
| 1848 | 1829 |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2301 if (!isTabItem() || !m_layoutObject) | 2282 if (!isTabItem() || !m_layoutObject) |
| 2302 return false; | 2283 return false; |
| 2303 | 2284 |
| 2304 Node* node = m_layoutObject->node(); | 2285 Node* node = m_layoutObject->node(); |
| 2305 if (!node || !node->isElementNode()) | 2286 if (!node || !node->isElementNode()) |
| 2306 return false; | 2287 return false; |
| 2307 | 2288 |
| 2308 // The ARIA spec says a tab item can also be selected if it is aria-labeled
by a tabpanel | 2289 // The ARIA spec says a tab item can also be selected if it is aria-labeled
by a tabpanel |
| 2309 // that has keyboard focus inside of it, or if a tabpanel in its aria-contro
ls list has KB | 2290 // that has keyboard focus inside of it, or if a tabpanel in its aria-contro
ls list has KB |
| 2310 // focus inside of it. | 2291 // focus inside of it. |
| 2311 AXObject* focusedElement = focusedUIElement(); | 2292 Document* doc = document(); |
| 2293 if (!doc) |
| 2294 return false; |
| 2295 |
| 2296 Element* focusedElement = doc->activeElement(); |
| 2312 if (!focusedElement) | 2297 if (!focusedElement) |
| 2313 return false; | 2298 return false; |
| 2314 | 2299 |
| 2315 WillBeHeapVector<RawPtrWillBeMember<Element>> elements; | 2300 WillBeHeapVector<RawPtrWillBeMember<Element>> elements; |
| 2316 elementsFromAttribute(elements, aria_controlsAttr); | 2301 elementsFromAttribute(elements, aria_controlsAttr); |
| 2317 | 2302 |
| 2318 for (const auto& element : elements) { | 2303 for (const auto& element : elements) { |
| 2319 AXObject* tabPanel = axObjectCache().getOrCreate(element); | 2304 AXObject* tabPanel = axObjectCache().getOrCreate(element); |
| 2320 | 2305 |
| 2321 // A tab item should only control tab panels. | 2306 // A tab item should only control tab panels. |
| 2322 if (!tabPanel || tabPanel->roleValue() != TabPanelRole) | 2307 if (!tabPanel || tabPanel->roleValue() != TabPanelRole) |
| 2323 continue; | 2308 continue; |
| 2324 | 2309 |
| 2325 AXObject* checkFocusElement = focusedElement; | 2310 Element* checkFocusElement = focusedElement; |
| 2326 // Check if the focused element is a descendant of the element controlle
d by the tab item. | 2311 // Check if the focused element is a descendant of the element controlle
d by the tab item. |
| 2327 while (checkFocusElement) { | 2312 while (checkFocusElement) { |
| 2328 if (tabPanel == checkFocusElement) | 2313 if (tabPanel->node() == checkFocusElement) |
| 2329 return true; | 2314 return true; |
| 2330 checkFocusElement = checkFocusElement->parentObject(); | 2315 checkFocusElement = checkFocusElement->parentElement(); |
| 2331 } | 2316 } |
| 2332 } | 2317 } |
| 2333 | 2318 |
| 2334 return false; | 2319 return false; |
| 2335 } | 2320 } |
| 2336 | 2321 |
| 2337 AXObject* AXLayoutObject::accessibilityImageMapHitTest(HTMLAreaElement* area, co
nst IntPoint& point) const | 2322 AXObject* AXLayoutObject::accessibilityImageMapHitTest(HTMLAreaElement* area, co
nst IntPoint& point) const |
| 2338 { | 2323 { |
| 2339 if (!area) | 2324 if (!area) |
| 2340 return 0; | 2325 return 0; |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2532 if (!isHTMLCanvasElement(node())) | 2517 if (!isHTMLCanvasElement(node())) |
| 2533 return; | 2518 return; |
| 2534 | 2519 |
| 2535 // If it's a canvas, it won't have laid out children, but it might have acce
ssible fallback content. | 2520 // If it's a canvas, it won't have laid out children, but it might have acce
ssible fallback content. |
| 2536 // Clear m_haveChildren because AXNodeObject::addChildren will expect it to
be false. | 2521 // Clear m_haveChildren because AXNodeObject::addChildren will expect it to
be false. |
| 2537 ASSERT(!m_children.size()); | 2522 ASSERT(!m_children.size()); |
| 2538 m_haveChildren = false; | 2523 m_haveChildren = false; |
| 2539 AXNodeObject::addChildren(); | 2524 AXNodeObject::addChildren(); |
| 2540 } | 2525 } |
| 2541 | 2526 |
| 2542 void AXLayoutObject::addAttachmentChildren() | |
| 2543 { | |
| 2544 if (!isAttachment()) | |
| 2545 return; | |
| 2546 | |
| 2547 // FrameView's need to be inserted into the AX hierarchy when encountered. | |
| 2548 Widget* widget = widgetForAttachmentView(); | |
| 2549 if (!widget || !widget->isFrameView()) | |
| 2550 return; | |
| 2551 | |
| 2552 AXObject* axWidget = axObjectCache().getOrCreate(widget); | |
| 2553 if (!axWidget->accessibilityIsIgnored()) | |
| 2554 m_children.append(axWidget); | |
| 2555 } | |
| 2556 | |
| 2557 void AXLayoutObject::addPopupChildren() | 2527 void AXLayoutObject::addPopupChildren() |
| 2558 { | 2528 { |
| 2559 if (!isHTMLInputElement(node())) | 2529 if (!isHTMLInputElement(node())) |
| 2560 return; | 2530 return; |
| 2561 if (AXObject* axPopup = toHTMLInputElement(node())->popupRootAXObject()) | 2531 if (AXObject* axPopup = toHTMLInputElement(node())->popupRootAXObject()) |
| 2562 m_children.append(axPopup); | 2532 m_children.append(axPopup); |
| 2563 } | 2533 } |
| 2564 | 2534 |
| 2565 void AXLayoutObject::addRemoteSVGChildren() | 2535 void AXLayoutObject::addRemoteSVGChildren() |
| 2566 { | 2536 { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2659 if (label && label->layoutObject()) { | 2629 if (label && label->layoutObject()) { |
| 2660 LayoutRect labelRect = axObjectCache().getOrCreate(label)->elementRe
ct(); | 2630 LayoutRect labelRect = axObjectCache().getOrCreate(label)->elementRe
ct(); |
| 2661 result.unite(labelRect); | 2631 result.unite(labelRect); |
| 2662 } | 2632 } |
| 2663 } | 2633 } |
| 2664 | 2634 |
| 2665 return result; | 2635 return result; |
| 2666 } | 2636 } |
| 2667 | 2637 |
| 2668 } // namespace blink | 2638 } // namespace blink |
| OLD | NEW |