Chromium Code Reviews| 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 1799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1810 } | 1810 } |
| 1811 | 1811 |
| 1812 | 1812 |
| 1813 // | 1813 // |
| 1814 // Modify or take an action on an object. | 1814 // Modify or take an action on an object. |
| 1815 // | 1815 // |
| 1816 | 1816 |
| 1817 // Convert from an accessible object and offset to a VisiblePosition. | 1817 // Convert from an accessible object and offset to a VisiblePosition. |
| 1818 static VisiblePosition toVisiblePosition(AXObject* obj, int offset) | 1818 static VisiblePosition toVisiblePosition(AXObject* obj, int offset) |
| 1819 { | 1819 { |
| 1820 // First walk up until we find an accessible object with an associated node. | 1820 if (!obj->getNode()) |
| 1821 AXObject* runner = obj; | |
| 1822 Node* node = nullptr; | |
| 1823 while (runner && !node) { | |
| 1824 node = runner->getNode(); | |
| 1825 runner = runner->parentObject(); | |
| 1826 } | |
| 1827 | |
| 1828 if (!node) | |
| 1829 return VisiblePosition(); | 1821 return VisiblePosition(); |
| 1830 | 1822 |
| 1831 // If it's not a text node, no conversion is necessary, just create a Visibl ePosition | 1823 Node* node = obj->getNode(); |
| 1832 // with this node and offset. | 1824 if (!node->isTextNode()) { |
|
dmazzoni
2016/09/15 16:32:36
It's possible to call AXObject::setSelection on an
| |
| 1833 if (!node->isTextNode()) | 1825 // The offsets are child offsets over the AX tree. Note that we allow |
| 1834 return createVisiblePosition(Position(node, offset)); | 1826 // for the offset to equal the number of children as |Range| does. |
| 1827 if (offset < 0 || static_cast<unsigned>(offset) > obj->children().size() ) | |
| 1828 return VisiblePosition(); | |
| 1829 | |
| 1830 // Clamp to between 0 and child count - 1. | |
| 1831 int clampedOffset = | |
| 1832 static_cast<unsigned>(offset) > (obj->children().size() - 1) ? offse t - 1 : offset; | |
|
dmazzoni
2016/09/15 16:32:36
Clearer using std::min?
| |
| 1833 AXObject* childObj = obj->children()[clampedOffset]; | |
| 1834 Node* childNode = childObj->getNode(); | |
| 1835 if (!childNode || !childNode->parentNode()) | |
| 1836 return VisiblePosition(); | |
| 1837 | |
| 1838 // The index in parent. | |
| 1839 int adjustedOffset = -1; | |
| 1840 NodeList* childNodes = childNode->parentNode()->childNodes(); | |
| 1841 for (unsigned i = 0; i < childNodes->length(); ++i) { | |
| 1842 if (childNodes->item(i) == childNode) { | |
| 1843 adjustedOffset = i; | |
| 1844 break; | |
| 1845 } | |
| 1846 } | |
| 1847 | |
| 1848 if (adjustedOffset == -1) | |
| 1849 return VisiblePosition(); | |
| 1850 | |
| 1851 // If we had to clamp the offset above, the client wants to select the | |
| 1852 // end of the node. | |
| 1853 if (clampedOffset != offset) | |
| 1854 adjustedOffset++; | |
| 1855 | |
| 1856 return createVisiblePosition(Position::editingPositionOf(childNode->pare ntNode(), adjustedOffset)); | |
|
dmazzoni
2016/09/15 16:32:36
Instead of computing the index in parent in the DO
| |
| 1857 } | |
| 1835 | 1858 |
| 1836 // If it is a text node, we need to call some utility functions that use a T extIterator | 1859 // If it is a text node, we need to call some utility functions that use a T extIterator |
| 1837 // to walk the characters of the node and figure out the position correspond ing to the | 1860 // to walk the characters of the node and figure out the position correspond ing to the |
| 1838 // visible character at position |offset|. | 1861 // visible character at position |offset|. |
| 1839 ContainerNode* parent = node->parentNode(); | 1862 ContainerNode* parent = node->parentNode(); |
| 1840 if (!parent) | 1863 if (!parent) |
| 1841 return VisiblePosition(); | 1864 return VisiblePosition(); |
| 1842 | 1865 |
| 1843 VisiblePosition nodePosition = blink::visiblePositionBeforeNode(*node); | 1866 VisiblePosition nodePosition = blink::visiblePositionBeforeNode(*node); |
| 1844 int nodeIndex = blink::indexForVisiblePosition(nodePosition, parent); | 1867 int nodeIndex = blink::indexForVisiblePosition(nodePosition, parent); |
| 1845 return blink::visiblePositionForIndex(nodeIndex + offset, parent); | 1868 return blink::visiblePositionForIndex(nodeIndex + offset, parent); |
| 1846 } | 1869 } |
| 1847 | 1870 |
| 1848 void AXLayoutObject::setSelection(const AXRange& selection) | 1871 void AXLayoutObject::setSelection(const AXRange& selection) |
| 1849 { | 1872 { |
| 1850 if (!getLayoutObject() || !selection.isValid()) | 1873 if (!getLayoutObject() || !selection.isValid()) |
| 1851 return; | 1874 return; |
| 1852 | 1875 |
| 1853 AXObject* anchorObject = selection.anchorObject ? | 1876 AXObject* anchorObject = selection.anchorObject ? |
| 1854 selection.anchorObject.get() : this; | 1877 selection.anchorObject.get() : this; |
| 1855 AXObject* focusObject = selection.focusObject ? | 1878 AXObject* focusObject = selection.focusObject ? |
| 1856 selection.focusObject.get() : this; | 1879 selection.focusObject.get() : this; |
| 1857 | 1880 |
| 1858 if (!isValidSelectionBound(anchorObject) | 1881 if (!isValidSelectionBound(anchorObject) |
| 1859 || !isValidSelectionBound(focusObject)) { | 1882 || !isValidSelectionBound(focusObject)) { |
| 1860 return; | 1883 return; |
| 1861 } | 1884 } |
| 1862 | 1885 |
| 1886 // The selection offsets are offsets into the accessible value. | |
| 1863 if (anchorObject == focusObject | 1887 if (anchorObject == focusObject |
| 1864 && anchorObject->getLayoutObject()->isTextControl()) { | 1888 && anchorObject->getLayoutObject()->isTextControl()) { |
| 1865 HTMLTextFormControlElement* textControl = toLayoutTextControl( | 1889 HTMLTextFormControlElement* textControl = toLayoutTextControl( |
| 1866 anchorObject->getLayoutObject())->textFormControlElement(); | 1890 anchorObject->getLayoutObject())->textFormControlElement(); |
| 1867 if (selection.anchorOffset <= selection.focusOffset) { | 1891 if (selection.anchorOffset <= selection.focusOffset) { |
| 1868 textControl->setSelectionRange( | 1892 textControl->setSelectionRange( |
| 1869 selection.anchorOffset, selection.focusOffset, | 1893 selection.anchorOffset, selection.focusOffset, |
| 1870 SelectionHasForwardDirection); | 1894 SelectionHasForwardDirection); |
| 1871 } else { | 1895 } else { |
| 1872 textControl->setSelectionRange( | 1896 textControl->setSelectionRange( |
| (...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2371 | 2395 |
| 2372 bool AXLayoutObject::elementAttributeValue(const QualifiedName& attributeName) c onst | 2396 bool AXLayoutObject::elementAttributeValue(const QualifiedName& attributeName) c onst |
| 2373 { | 2397 { |
| 2374 if (!m_layoutObject) | 2398 if (!m_layoutObject) |
| 2375 return false; | 2399 return false; |
| 2376 | 2400 |
| 2377 return equalIgnoringCase(getAttribute(attributeName), "true"); | 2401 return equalIgnoringCase(getAttribute(attributeName), "true"); |
| 2378 } | 2402 } |
| 2379 | 2403 |
| 2380 } // namespace blink | 2404 } // namespace blink |
| OLD | NEW |