| 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 1572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1583 | 1583 |
| 1584 // | 1584 // |
| 1585 // Selected text. | 1585 // Selected text. |
| 1586 // | 1586 // |
| 1587 | 1587 |
| 1588 AXObject::PlainTextRange AXLayoutObject::selectedTextRange() const | 1588 AXObject::PlainTextRange AXLayoutObject::selectedTextRange() const |
| 1589 { | 1589 { |
| 1590 if (!isTextControl()) | 1590 if (!isTextControl()) |
| 1591 return PlainTextRange(); | 1591 return PlainTextRange(); |
| 1592 | 1592 |
| 1593 if (m_layoutObject->isTextControl()) { | 1593 AccessibilityRole ariaRole = ariaRoleAttribute(); |
| 1594 if (isNativeTextControl() && ariaRole == UnknownRole && m_layoutObject->isTe
xtControl()) { |
| 1594 HTMLTextFormControlElement* textControl = toLayoutTextControl(m_layoutOb
ject)->textFormControlElement(); | 1595 HTMLTextFormControlElement* textControl = toLayoutTextControl(m_layoutOb
ject)->textFormControlElement(); |
| 1595 return PlainTextRange(textControl->selectionStart(), textControl->select
ionEnd() - textControl->selectionStart()); | 1596 return PlainTextRange(textControl->selectionStart(), textControl->select
ionEnd() - textControl->selectionStart()); |
| 1596 } | 1597 } |
| 1597 | 1598 |
| 1598 return visibleSelectionUnderObject(); | 1599 if (ariaRole == UnknownRole) |
| 1600 return PlainTextRange(); |
| 1601 |
| 1602 return ariaSelectedTextRange(); |
| 1599 } | 1603 } |
| 1600 | 1604 |
| 1601 VisibleSelection AXLayoutObject::selection() const | 1605 VisibleSelection AXLayoutObject::selection() const |
| 1602 { | 1606 { |
| 1603 return m_layoutObject->frame()->selection().selection(); | 1607 return m_layoutObject->frame()->selection().selection(); |
| 1604 } | 1608 } |
| 1605 | 1609 |
| 1606 // | 1610 // |
| 1607 // Modify or take an action on an object. | 1611 // Modify or take an action on an object. |
| 1608 // | 1612 // |
| 1609 | 1613 |
| 1610 void AXLayoutObject::setSelectedTextRange(const PlainTextRange& range) | 1614 void AXLayoutObject::setSelectedTextRange(const PlainTextRange& range) |
| 1611 { | 1615 { |
| 1612 if (m_layoutObject->isTextControl()) { | 1616 if (isNativeTextControl() && m_layoutObject->isTextControl()) { |
| 1613 HTMLTextFormControlElement* textControl = toLayoutTextControl(m_layoutOb
ject)->textFormControlElement(); | 1617 HTMLTextFormControlElement* textControl = toLayoutTextControl(m_layoutOb
ject)->textFormControlElement(); |
| 1614 textControl->setSelectionRange(range.start, range.start + range.length,
SelectionHasNoDirection, NotDispatchSelectEvent); | 1618 textControl->setSelectionRange(range.start, range.start + range.length,
SelectionHasNoDirection, NotDispatchSelectEvent); |
| 1615 return; | 1619 return; |
| 1616 } | 1620 } |
| 1617 | 1621 |
| 1618 Document& document = m_layoutObject->document(); | 1622 Document& document = m_layoutObject->document(); |
| 1619 LocalFrame* frame = document.frame(); | 1623 LocalFrame* frame = document.frame(); |
| 1620 if (!frame) | 1624 if (!frame) |
| 1621 return; | 1625 return; |
| 1622 Node* node = m_layoutObject->node(); | 1626 Node* node = m_layoutObject->node(); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1739 return indexForVisiblePosition(position); | 1743 return indexForVisiblePosition(position); |
| 1740 | 1744 |
| 1741 return -1; | 1745 return -1; |
| 1742 } | 1746 } |
| 1743 | 1747 |
| 1744 VisiblePosition AXLayoutObject::visiblePositionForIndex(int index) const | 1748 VisiblePosition AXLayoutObject::visiblePositionForIndex(int index) const |
| 1745 { | 1749 { |
| 1746 if (!m_layoutObject) | 1750 if (!m_layoutObject) |
| 1747 return VisiblePosition(); | 1751 return VisiblePosition(); |
| 1748 | 1752 |
| 1749 if (m_layoutObject->isTextControl()) | 1753 if (isNativeTextControl() && m_layoutObject->isTextControl()) |
| 1750 return toLayoutTextControl(m_layoutObject)->textFormControlElement()->vi
siblePositionForIndex(index); | 1754 return toLayoutTextControl(m_layoutObject)->textFormControlElement()->vi
siblePositionForIndex(index); |
| 1751 | 1755 |
| 1752 if (!allowsTextRanges() && !m_layoutObject->isText()) | 1756 if (!allowsTextRanges() && !m_layoutObject->isText()) |
| 1753 return VisiblePosition(); | 1757 return VisiblePosition(); |
| 1754 | 1758 |
| 1755 Node* node = m_layoutObject->node(); | 1759 Node* node = m_layoutObject->node(); |
| 1756 if (!node) | 1760 if (!node) |
| 1757 return VisiblePosition(); | 1761 return VisiblePosition(); |
| 1758 | 1762 |
| 1759 if (index <= 0) | 1763 if (index <= 0) |
| 1760 return VisiblePosition(firstPositionInOrBeforeNode(node), DOWNSTREAM); | 1764 return VisiblePosition(firstPositionInOrBeforeNode(node), DOWNSTREAM); |
| 1761 | 1765 |
| 1762 Position start, end; | 1766 Position start, end; |
| 1763 bool selected = Range::selectNodeContents(node, start, end); | 1767 bool selected = Range::selectNodeContents(node, start, end); |
| 1764 if (!selected) | 1768 if (!selected) |
| 1765 return VisiblePosition(); | 1769 return VisiblePosition(); |
| 1766 | 1770 |
| 1767 CharacterIterator it(start, end); | 1771 CharacterIterator it(start, end); |
| 1768 it.advance(index - 1); | 1772 it.advance(index - 1); |
| 1769 return VisiblePosition(Position(it.currentContainer(), it.endOffset(), Posit
ion::PositionIsOffsetInAnchor), UPSTREAM); | 1773 return VisiblePosition(Position(it.currentContainer(), it.endOffset(), Posit
ion::PositionIsOffsetInAnchor), UPSTREAM); |
| 1770 } | 1774 } |
| 1771 | 1775 |
| 1772 int AXLayoutObject::indexForVisiblePosition(const VisiblePosition& pos) const | 1776 int AXLayoutObject::indexForVisiblePosition(const VisiblePosition& pos) const |
| 1773 { | 1777 { |
| 1774 if (m_layoutObject->isTextControl()) { | 1778 if (isNativeTextControl() && m_layoutObject->isTextControl()) { |
| 1775 HTMLTextFormControlElement* textControl = toLayoutTextControl(m_layoutOb
ject)->textFormControlElement(); | 1779 HTMLTextFormControlElement* textControl = toLayoutTextControl(m_layoutOb
ject)->textFormControlElement(); |
| 1776 return textControl->indexForVisiblePosition(pos); | 1780 return textControl->indexForVisiblePosition(pos); |
| 1777 } | 1781 } |
| 1778 | 1782 |
| 1779 if (!isTextControl()) | 1783 if (!isTextControl()) |
| 1780 return 0; | 1784 return 0; |
| 1781 | 1785 |
| 1782 Node* node = m_layoutObject->node(); | 1786 Node* node = m_layoutObject->node(); |
| 1783 if (!node) | 1787 if (!node) |
| 1784 return 0; | 1788 return 0; |
| 1785 | 1789 |
| 1786 Position indexPosition = pos.deepEquivalent(); | 1790 Position indexPosition = pos.deepEquivalent(); |
| 1787 if (indexPosition.isNull() | 1791 if (indexPosition.isNull() || highestEditableRoot(indexPosition, HasEditable
AXRole) != node) |
| 1788 || (highestEditableRoot(indexPosition) != node | |
| 1789 && highestEditableRoot(indexPosition, HasEditableAXRole) != node)) | |
| 1790 return 0; | 1792 return 0; |
| 1791 | 1793 |
| 1792 RefPtrWillBeRawPtr<Range> range = Range::create(m_layoutObject->document()); | 1794 RefPtrWillBeRawPtr<Range> range = Range::create(m_layoutObject->document()); |
| 1793 range->setStart(node, 0, IGNORE_EXCEPTION); | 1795 range->setStart(node, 0, IGNORE_EXCEPTION); |
| 1794 range->setEnd(indexPosition, IGNORE_EXCEPTION); | 1796 range->setEnd(indexPosition, IGNORE_EXCEPTION); |
| 1795 | 1797 |
| 1796 return TextIterator::rangeLength(range->startPosition(), range->endPosition(
)); | 1798 return TextIterator::rangeLength(range->startPosition(), range->endPosition(
)); |
| 1797 } | 1799 } |
| 1798 | 1800 |
| 1799 void AXLayoutObject::addInlineTextBoxChildren(bool force) | 1801 void AXLayoutObject::addInlineTextBoxChildren(bool force) |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1868 for (const auto& child : children()) { | 1870 for (const auto& child : children()) { |
| 1869 // Every child should have aria-role option, and if so, check for select
ed attribute/state. | 1871 // Every child should have aria-role option, and if so, check for select
ed attribute/state. |
| 1870 if (child->isSelected() && child->ariaRoleAttribute() == ListBoxOptionRo
le) { | 1872 if (child->isSelected() && child->ariaRoleAttribute() == ListBoxOptionRo
le) { |
| 1871 result.append(child); | 1873 result.append(child); |
| 1872 if (!isMulti) | 1874 if (!isMulti) |
| 1873 return; | 1875 return; |
| 1874 } | 1876 } |
| 1875 } | 1877 } |
| 1876 } | 1878 } |
| 1877 | 1879 |
| 1878 AXObject::PlainTextRange AXLayoutObject::visibleSelectionUnderObject() const | 1880 AXObject::PlainTextRange AXLayoutObject::ariaSelectedTextRange() const |
| 1879 { | 1881 { |
| 1880 Node* node = m_layoutObject->node(); | 1882 Node* node = m_layoutObject->node(); |
| 1881 if (!node) | 1883 if (!node) |
| 1882 return PlainTextRange(); | 1884 return PlainTextRange(); |
| 1883 | 1885 |
| 1884 VisibleSelection visibleSelection = selection(); | 1886 VisibleSelection visibleSelection = selection(); |
| 1885 RefPtrWillBeRawPtr<Range> currentSelectionRange = visibleSelection.toNormali
zedRange(); | 1887 RefPtrWillBeRawPtr<Range> currentSelectionRange = visibleSelection.toNormali
zedRange(); |
| 1886 if (!currentSelectionRange || !currentSelectionRange->intersectsNode(node, I
GNORE_EXCEPTION)) | 1888 if (!currentSelectionRange || !currentSelectionRange->intersectsNode(node, I
GNORE_EXCEPTION)) |
| 1887 return PlainTextRange(); | 1889 return PlainTextRange(); |
| 1888 | 1890 |
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2266 if (label && label->layoutObject()) { | 2268 if (label && label->layoutObject()) { |
| 2267 LayoutRect labelRect = axObjectCache()->getOrCreate(label)->elementR
ect(); | 2269 LayoutRect labelRect = axObjectCache()->getOrCreate(label)->elementR
ect(); |
| 2268 result.unite(labelRect); | 2270 result.unite(labelRect); |
| 2269 } | 2271 } |
| 2270 } | 2272 } |
| 2271 | 2273 |
| 2272 return result; | 2274 return result; |
| 2273 } | 2275 } |
| 2274 | 2276 |
| 2275 } // namespace blink | 2277 } // namespace blink |
| OLD | NEW |