Changeset 195405 in webkit
- Timestamp:
- Jan 21, 2016 12:35:10 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 15 edited
- 1 copied
- 4 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r195397 r195405 1 2016-01-21 Nan Wang <n_wang@apple.com> 2 3 AX: [IOS] Implement next/previous text marker functions using TextIterator 4 https://bugs.webkit.org/show_bug.cgi?id=153292 5 <rdar://problem/24268243> 6 7 Reviewed by Chris Fleizach. 8 9 * accessibility/mac/previous-next-text-marker-expected.txt: Removed. 10 * accessibility/mac/previous-next-text-marker.html: Removed. 11 * accessibility/mac/text-marker-with-user-select-none-expected.txt: Removed. 12 * accessibility/mac/text-marker-with-user-select-none.html: Removed. 13 * accessibility/text-marker: Added. 14 * accessibility/text-marker/text-marker-previous-next-expected.txt: Added. 15 * accessibility/text-marker/text-marker-previous-next.html: Added. 16 * accessibility/text-marker/text-marker-with-user-select-none-expected.txt: Added. 17 * accessibility/text-marker/text-marker-with-user-select-none.html: Added. 18 * platform/efl/TestExpectations: 19 * platform/gtk/TestExpectations: 20 * platform/ios-simulator/TestExpectations: 21 * platform/win/TestExpectations: 22 1 23 2016-01-20 Zalan Bujtas <zalan@apple.com> 2 24 -
trunk/LayoutTests/accessibility/text-marker/text-marker-previous-next-expected.txt
r195398 r195405 13 13 PASS text.accessibilityElementForTextMarker(startMarker).isEqual(text) is true 14 14 PASS text.accessibilityElementForTextMarker(endMarker).isEqual(text) is true 15 PASS element.stringValue is 'AXValue:'16 PASS element.stringValue is 'AXValue: text1'17 PASS element.stringValue is 'AXValue:'18 PASS element.stringValue is 'AXValue: text'15 PASS text.stringForTextMarkerRange(markerRange) is '' 16 PASS text.stringForTextMarkerRange(markerRange) is 't' 17 PASS text.stringForTextMarkerRange(markerRange) is '' 18 PASS text.stringForTextMarkerRange(markerRange) is 't' 19 19 PASS text2.textMarkerRangeLength(textMarkerRange2) is 5 20 20 Object string for range: c [ATTACHMENT] d 21 AXValue: c 22 AXValue: c 23 AXValue: 24 AXValue: d 25 AXValue: 26 AXValue: c 27 AXValue: c 28 AXValue: text1 21 PASS text2.stringForTextMarkerRange(markerRange) is 'd' 22 PASS text2.stringForTextMarkerRange(markerRange) is '1' 29 23 PASS text3.stringForTextMarkerRange(markerRange) is 'ect' 30 24 PASS text3.stringForTextMarkerRange(markerRange) is 'sel' -
trunk/LayoutTests/accessibility/text-marker/text-marker-previous-next.html
r195398 r195405 45 45 // Check next text marker. (Advance 5 characters, it will land at <br>.) 46 46 var currentMarker = startMarker; 47 var previousMarker, markerRange; 47 48 for (var i = 0; i < 5; i++) { 49 previousMarker = currentMarker; 48 50 currentMarker = text.nextTextMarker(currentMarker); 49 51 } 50 var element = text.accessibilityElementForTextMarker(currentMarker);51 shouldBe(" element.stringValue", "'AXValue:'");52 markerRange = text.textMarkerRangeForMarkers(previousMarker, currentMarker); 53 shouldBe("text.stringForTextMarkerRange(markerRange)", "''"); 52 54 53 55 // Advance one more character, it will lande at "t" in "text1". 56 previousMarker = currentMarker; 54 57 currentMarker = text.nextTextMarker(currentMarker); 55 element = text.accessibilityElementForTextMarker(currentMarker);56 shouldBe(" element.stringValue", "'AXValue: text1'");58 markerRange = text.textMarkerRangeForMarkers(previousMarker, currentMarker); 59 shouldBe("text.stringForTextMarkerRange(markerRange)", "'t'"); 57 60 58 61 // Check previous text marker. (Traverse backwards one character, it will land at <br>.) 62 previousMarker = text.previousTextMarker(previousMarker); 59 63 currentMarker = text.previousTextMarker(currentMarker); 60 element = text.accessibilityElementForTextMarker(currentMarker);61 shouldBe(" element.stringValue", "'AXValue:'");64 markerRange = text.textMarkerRangeForMarkers(previousMarker, currentMarker); 65 shouldBe("text.stringForTextMarkerRange(markerRange)", "''"); 62 66 63 67 // Traverse backwards one more character, it will land at the last character of "text". 68 previousMarker = text.previousTextMarker(previousMarker); 64 69 currentMarker = text.previousTextMarker(currentMarker); 65 element = text.accessibilityElementForTextMarker(currentMarker);66 shouldBe(" element.stringValue", "'AXValue: text'");70 markerRange = text.textMarkerRangeForMarkers(previousMarker, currentMarker); 71 shouldBe("text.stringForTextMarkerRange(markerRange)", "'t'"); 67 72 68 73 // Check the case with replaced node … … 74 79 75 80 currentMarker = text2.startTextMarkerForTextMarkerRange(textMarkerRange2); 76 // Advance 4 characters, it will land at first character of " d". 77 for (var i = 0; i < 4; i++) { 81 // Advance 5 characters, it will land at "d". 82 for (var i = 0; i < 5; i++) { 83 previousMarker = currentMarker; 78 84 currentMarker = text2.nextTextMarker(currentMarker); 79 element = text2.accessibilityElementForTextMarker(currentMarker);80 debug(element.stringValue);81 85 } 86 markerRange = text2.textMarkerRangeForMarkers(previousMarker, currentMarker); 87 shouldBe("text2.stringForTextMarkerRange(markerRange)", "'d'"); 82 88 83 // Traverse backwards 4 characters, it will land at the last character of "text1". 84 for (var i = 0; i < 4; i++) { 89 // Traverse backwards 5 characters, it will land at the last character of "text1". 90 for (var i = 0; i < 5; i++) { 91 previousMarker = text2.previousTextMarker(previousMarker); 85 92 currentMarker = text2.previousTextMarker(currentMarker); 86 element = text2.accessibilityElementForTextMarker(currentMarker);87 debug(element.stringValue);88 93 } 94 markerRange = text2.textMarkerRangeForMarkers(previousMarker, currentMarker); 95 shouldBe("text2.stringForTextMarkerRange(markerRange)", "'1'"); 89 96 90 97 // Check the case with user-select:none, nextTextMarker/previousTextMarker should still work. … … 101 108 } 102 109 marker2 = currentMarker; 103 varmarkerRange = text3.textMarkerRangeForMarkers(marker1, marker2);110 markerRange = text3.textMarkerRangeForMarkers(marker1, marker2); 104 111 shouldBe("text3.stringForTextMarkerRange(markerRange)", "'ect'"); 105 112 // Iterate backwards the second marker for 6 characters, the range should be "sel" -
trunk/LayoutTests/platform/efl/TestExpectations
r194672 r195405 2346 2346 webkit.org/b/146887 accessibility/aria-roledescription.html [ Failure ] 2347 2347 webkit.org/b/146887 accessibility/list-detection.html [ Failure ] 2348 2349 # Text marker tests are not supported 2350 webkit.org/b/153292 accessibility/text-marker [ Skip ] 2348 2351 2349 2352 # This test hardcodes the result of a platform-dependent font lookup algorithm. -
trunk/LayoutTests/platform/gtk/TestExpectations
r194962 r195405 609 609 # ARIA 1.1 table related attributes are not supported 610 610 webkit.org/b/148967 accessibility/aria-table-attributes.html [ Skip ] 611 612 # Text marker tests are not supported 613 webkit.org/b/153292 accessibility/text-marker [ Skip ] 611 614 612 615 # WebKitGTK+ needs WOFF2 support. -
trunk/LayoutTests/platform/ios-simulator/TestExpectations
r195382 r195405 2765 2765 webkit.org/b/150366 accessibility/aria-table-attributes.html [ Pass ] 2766 2766 2767 # Enable Text marker tests for iOS 2768 webkit.org/b/153292 accessibility/text-marker [ Pass ] 2769 2767 2770 # More flaky tests (Sept 18, 2015) 2768 2771 -
trunk/LayoutTests/platform/win/TestExpectations
r194672 r195405 1718 1718 webkit.org/b/138566 accessibility/aria-modal.html [ Skip ] 1719 1719 webkit.org/b/138566 accessibility/aria-modal-multiple-dialogs.html [ Skip ] 1720 1721 # Text marker tests are not supported 1722 webkit.org/b/153292 accessibility/text-marker [ Skip ] 1720 1723 1721 1724 ################################################################################ -
trunk/Source/WebCore/ChangeLog
r195397 r195405 1 2016-01-21 Nan Wang <n_wang@apple.com> 2 3 AX: [IOS] Implement next/previous text marker functions using TextIterator 4 https://bugs.webkit.org/show_bug.cgi?id=153292 5 <rdar://problem/24268243> 6 7 Reviewed by Chris Fleizach. 8 9 Added support for the refactored next/previous text marker functions on iOS. And 10 made text marker tests working on iOS. 11 Also, fixed an issue in AXObjectCache where creating a range with a replaced node 12 at the start or end might exclude that node. 13 14 Tests: accessibility/text-marker/text-marker-previous-next.html 15 accessibility/text-marker/text-marker-with-user-select-none.html 16 17 * accessibility/AXObjectCache.cpp: 18 (WebCore::characterOffsetsInOrder): 19 (WebCore::resetNodeAndOffsetForReplacedNode): 20 (WebCore::AXObjectCache::rangeForUnorderedCharacterOffsets): 21 * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm: 22 (+[WebAccessibilityTextMarker textMarkerWithVisiblePosition:cache:]): 23 (+[WebAccessibilityTextMarker textMarkerWithCharacterOffset:cache:]): 24 (+[WebAccessibilityTextMarker startOrEndTextMarkerForRange:isStart:cache:]): 25 (-[WebAccessibilityTextMarker dataRepresentation]): 26 (-[WebAccessibilityTextMarker visiblePosition]): 27 (-[WebAccessibilityTextMarker characterOffset]): 28 (-[WebAccessibilityTextMarker isIgnored]): 29 (-[WebAccessibilityTextMarker accessibilityObject]): 30 (-[WebAccessibilityTextMarker description]): 31 (-[WebAccessibilityObjectWrapper stringForTextMarkers:]): 32 (blockquoteLevel): 33 (-[WebAccessibilityObjectWrapper textMarkerRange]): 34 (-[WebAccessibilityObjectWrapper accessibilityObjectForTextMarker:]): 35 (-[WebAccessibilityObjectWrapper nextMarkerForMarker:]): 36 (-[WebAccessibilityObjectWrapper previousMarkerForMarker:]): 37 (-[WebAccessibilityObjectWrapper textMarkerForPoint:]): 38 (-[WebAccessibilityObjectWrapper nextMarkerForCharacterOffset:]): 39 (-[WebAccessibilityObjectWrapper previousMarkerForCharacterOffset:]): 40 (-[WebAccessibilityObjectWrapper rangeForTextMarkers:]): 41 (-[WebAccessibilityObjectWrapper lengthForTextMarkers:]): 42 (-[WebAccessibilityObjectWrapper startOrEndTextMarkerForTextMarkers:isStart:]): 43 (-[WebAccessibilityObjectWrapper textMarkerRangeForMarkers:]): 44 (-[WebAccessibilityObjectWrapper accessibilityIdentifier]): 45 1 46 2016-01-20 Zalan Bujtas <zalan@apple.com> 2 47 -
trunk/Source/WebCore/accessibility/AXObjectCache.cpp
r195240 r195405 1546 1546 } 1547 1547 1548 static Node* resetNodeAndOffsetForReplacedNode(Node* replacedNode, int& offset, int characterCount) 1549 { 1550 // Use this function to include the replaced node itself in the range we are creating. 1551 if (!replacedNode) 1552 return nullptr; 1553 1554 RefPtr<Range> nodeRange = AXObjectCache::rangeForNodeContents(replacedNode); 1555 int nodeLength = TextIterator::rangeLength(nodeRange.get()); 1556 offset = characterCount <= nodeLength ? replacedNode->computeNodeIndex() : replacedNode->computeNodeIndex() + 1; 1557 return replacedNode->parentNode(); 1558 } 1559 1560 static bool isReplacedNodeOrBR(Node* node) 1561 { 1562 return AccessibilityObject::replacedNodeNeedsCharacter(node) || node->hasTagName(brTag); 1563 } 1564 1548 1565 RefPtr<Range> AXObjectCache::rangeForUnorderedCharacterOffsets(const CharacterOffset& characterOffset1, const CharacterOffset& characterOffset2) 1549 1566 { … … 1555 1572 CharacterOffset endCharacterOffset = alreadyInOrder ? characterOffset2 : characterOffset1; 1556 1573 1557 int endOffset = endCharacterOffset.offset;1558 1559 // endOffset can be out of bounds sometimes if the node is a replaced node or has brTag.1560 if (startCharacterOffset.node == endCharacterOffset.node) {1561 RefPtr<Range> nodeRange = AXObjectCache::rangeForNodeContents(startCharacterOffset.node);1562 int nodeLength = TextIterator::rangeLength(nodeRange.get());1563 if (endOffset > nodeLength)1564 endOffset = nodeLength;1565 }1566 1567 1574 int startOffset = startCharacterOffset.startIndex + startCharacterOffset.offset; 1568 endOffset = endCharacterOffset.startIndex + endOffset; 1569 1570 // If start node is a replaced node and it has children, we want to include the replaced node itself in the range. 1575 int endOffset = endCharacterOffset.startIndex + endCharacterOffset.offset; 1571 1576 Node* startNode = startCharacterOffset.node; 1572 if (AccessibilityObject::replacedNodeNeedsCharacter(startNode) && (startNode->hasChildNodes() || startNode != endCharacterOffset.node)) { 1573 startOffset = startNode->computeNodeIndex(); 1574 startNode = startNode->parentNode(); 1577 Node* endNode = endCharacterOffset.node; 1578 1579 // Consider the case when the replaced node is at the start/end of the range. 1580 bool startNodeIsReplacedOrBR = isReplacedNodeOrBR(startNode); 1581 bool endNodeIsReplacedOrBR = isReplacedNodeOrBR(endNode); 1582 if (startNodeIsReplacedOrBR || endNodeIsReplacedOrBR) { 1583 // endOffset can be out of bounds sometimes if the node is a replaced node or has brTag and it has no children. 1584 if (startNode == endNode && !startNode->hasChildNodes()) { 1585 RefPtr<Range> nodeRange = AXObjectCache::rangeForNodeContents(startNode); 1586 int nodeLength = TextIterator::rangeLength(nodeRange.get()); 1587 if (endCharacterOffset.offset > nodeLength) 1588 endOffset = endCharacterOffset.startIndex + nodeLength; 1589 } else { 1590 if (startNodeIsReplacedOrBR) 1591 startNode = resetNodeAndOffsetForReplacedNode(startNode, startOffset, startCharacterOffset.offset); 1592 if (endNodeIsReplacedOrBR) 1593 endNode = resetNodeAndOffsetForReplacedNode(startNode, endOffset, startCharacterOffset.offset); 1594 } 1575 1595 } 1576 1596 … … 1578 1598 ExceptionCode ecStart = 0, ecEnd = 0; 1579 1599 result->setStart(startNode, startOffset, ecStart); 1580 result->setEnd(end CharacterOffset.node, endOffset, ecEnd);1600 result->setEnd(endNode, endOffset, ecEnd); 1581 1601 if (ecStart || ecEnd) 1582 1602 return nullptr; -
trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm
r194054 r195405 135 135 136 136 + (WebAccessibilityTextMarker *)textMarkerWithVisiblePosition:(VisiblePosition&)visiblePos cache:(AXObjectCache*)cache; 137 + (WebAccessibilityTextMarker *)textMarkerWithCharacterOffset:(CharacterOffset&)characterOffset cache:(AXObjectCache*)cache; 138 + (WebAccessibilityTextMarker *)startOrEndTextMarkerForRange:(const RefPtr<Range>)range isStart:(BOOL)isStart cache:(AXObjectCache*)cache; 137 139 138 140 @end … … 179 181 } 180 182 183 + (WebAccessibilityTextMarker *)textMarkerWithCharacterOffset:(CharacterOffset&)characterOffset cache:(AXObjectCache*)cache 184 { 185 if (!cache) 186 return nil; 187 188 if (characterOffset.isNull()) 189 return nil; 190 191 TextMarkerData textMarkerData; 192 cache->textMarkerDataForCharacterOffset(textMarkerData, *characterOffset.node, characterOffset.offset, false); 193 if (!textMarkerData.axID && !textMarkerData.ignored) 194 return nil; 195 return [[[WebAccessibilityTextMarker alloc] initWithTextMarker:&textMarkerData cache:cache] autorelease]; 196 } 197 198 + (WebAccessibilityTextMarker *)startOrEndTextMarkerForRange:(const RefPtr<Range>)range isStart:(BOOL)isStart cache:(AXObjectCache*)cache 199 { 200 if (!cache) 201 return nil; 202 203 TextMarkerData textMarkerData; 204 cache->startOrEndTextMarkerDataForRange(textMarkerData, range, isStart); 205 if (!textMarkerData.axID) 206 return nil; 207 return [[[WebAccessibilityTextMarker alloc] initWithTextMarker:&textMarkerData cache:cache] autorelease]; 208 } 209 181 210 - (NSData *)dataRepresentation 182 211 { … … 187 216 { 188 217 return _cache->visiblePositionForTextMarkerData(_textMarkerData); 218 } 219 220 - (CharacterOffset)characterOffset 221 { 222 if (_textMarkerData.ignored) 223 return CharacterOffset(); 224 return CharacterOffset(_textMarkerData.node, _textMarkerData.characterStartIndex, _textMarkerData.characterOffset); 225 } 226 227 - (BOOL)isIgnored 228 { 229 return _textMarkerData.ignored; 230 } 231 232 - (AccessibilityObject*)accessibilityObject 233 { 234 if (_textMarkerData.ignored) 235 return nullptr; 236 return _cache->accessibilityObjectForTextMarkerData(_textMarkerData); 189 237 } 190 238 … … 1832 1880 return nil; 1833 1881 1834 if ([markers count] != 2) 1835 return nil; 1836 1837 WebAccessibilityTextMarker* startMarker = [markers objectAtIndex:0]; 1838 WebAccessibilityTextMarker* endMarker = [markers objectAtIndex:1]; 1839 if (![startMarker isKindOfClass:[WebAccessibilityTextMarker class]] || ![endMarker isKindOfClass:[WebAccessibilityTextMarker class]]) 1840 return nil; 1841 1842 // extract the start and end VisiblePosition 1843 VisiblePosition startVisiblePosition = [startMarker visiblePosition]; 1844 if (startVisiblePosition.isNull()) 1845 return nil; 1846 1847 VisiblePosition endVisiblePosition = [endMarker visiblePosition]; 1848 if (endVisiblePosition.isNull()) 1849 return nil; 1850 1851 VisiblePositionRange visiblePosRange = VisiblePositionRange(startVisiblePosition, endVisiblePosition); 1852 return m_object->stringForVisiblePositionRange(visiblePosRange); 1882 RefPtr<Range> range = [self rangeForTextMarkers:markers]; 1883 if (!range) 1884 return nil; 1885 1886 return m_object->stringForRange(range); 1853 1887 } 1854 1888 … … 2125 2159 return nil; 2126 2160 2127 VisiblePositionRange range = m_object->visiblePositionRange(); 2128 VisiblePosition startPosition = range.start; 2129 VisiblePosition endPosition = range.end; 2130 WebAccessibilityTextMarker* start = [WebAccessibilityTextMarker textMarkerWithVisiblePosition:startPosition cache:m_object->axObjectCache()]; 2131 WebAccessibilityTextMarker* end = [WebAccessibilityTextMarker textMarkerWithVisiblePosition:endPosition cache:m_object->axObjectCache()]; 2132 2133 return [NSArray arrayWithObjects:start, end, nil]; 2161 RefPtr<Range> range = m_object->elementRange(); 2162 return [self textMarkersForRange:range]; 2134 2163 } 2135 2164 … … 2161 2190 return nil; 2162 2191 2163 VisiblePosition visiblePosition = [marker visiblePosition]; 2164 AccessibilityObject* obj = m_object->accessibilityObjectForPosition(visiblePosition); 2192 AccessibilityObject* obj = [marker accessibilityObject]; 2165 2193 if (!obj) 2166 2194 return nil; … … 2355 2383 return nil; 2356 2384 2357 VisiblePosition start = [marker visiblePosition]; 2358 VisiblePosition nextMarker = m_object->nextVisiblePosition(start); 2359 2360 return [WebAccessibilityTextMarker textMarkerWithVisiblePosition:nextMarker cache:m_object->axObjectCache()]; 2361 } 2362 2363 // This method is intended to return the marker at the start of the line starting at 2364 // the marker that is passed into the method. 2385 CharacterOffset start = [marker characterOffset]; 2386 return [self nextMarkerForCharacterOffset:start]; 2387 } 2388 2365 2389 - (WebAccessibilityTextMarker *)previousMarkerForMarker:(WebAccessibilityTextMarker *)marker 2366 2390 { … … 2371 2395 return nil; 2372 2396 2373 VisiblePosition start = [marker visiblePosition]; 2374 VisiblePosition previousMarker = m_object->previousVisiblePosition(start); 2375 2376 return [WebAccessibilityTextMarker textMarkerWithVisiblePosition:previousMarker cache:m_object->axObjectCache()]; 2397 CharacterOffset start = [marker characterOffset]; 2398 return [self previousMarkerForCharacterOffset:start]; 2377 2399 } 2378 2400 … … 2402 2424 VisiblePosition pos = m_object->visiblePositionForPoint(IntPoint(point)); 2403 2425 return [WebAccessibilityTextMarker textMarkerWithVisiblePosition:pos cache:m_object->axObjectCache()]; 2426 } 2427 2428 - (WebAccessibilityTextMarker *)nextMarkerForCharacterOffset:(CharacterOffset&)characterOffset 2429 { 2430 characterOffset.offset = characterOffset.offset + 1; 2431 WebAccessibilityTextMarker *textMarker = [WebAccessibilityTextMarker textMarkerWithCharacterOffset:characterOffset cache:m_object->axObjectCache()]; 2432 if (textMarker && textMarker.isIgnored) 2433 textMarker = [self nextMarkerForCharacterOffset:characterOffset]; 2434 return textMarker; 2435 } 2436 2437 - (WebAccessibilityTextMarker *)previousMarkerForCharacterOffset:(CharacterOffset&)characterOffset 2438 { 2439 characterOffset.offset = characterOffset.offset - 1; 2440 WebAccessibilityTextMarker *textMarker = [WebAccessibilityTextMarker textMarkerWithCharacterOffset:characterOffset cache:m_object->axObjectCache()]; 2441 if (textMarker && textMarker.isIgnored) 2442 textMarker = [self previousMarkerForCharacterOffset:characterOffset]; 2443 return textMarker; 2444 } 2445 2446 - (RefPtr<Range>)rangeForTextMarkers:(NSArray *)textMarkers 2447 { 2448 if ([textMarkers count] != 2) 2449 return nullptr; 2450 2451 WebAccessibilityTextMarker *startMarker = [textMarkers objectAtIndex:0]; 2452 WebAccessibilityTextMarker *endMarker = [textMarkers objectAtIndex:1]; 2453 2454 if (![startMarker isKindOfClass:[WebAccessibilityTextMarker class]] || ![endMarker isKindOfClass:[WebAccessibilityTextMarker class]]) 2455 return nullptr; 2456 2457 AXObjectCache* cache = m_object->axObjectCache(); 2458 if (!cache) 2459 return nullptr; 2460 2461 CharacterOffset startCharacterOffset = [startMarker characterOffset]; 2462 CharacterOffset endCharacterOffset = [endMarker characterOffset]; 2463 return cache->rangeForUnorderedCharacterOffsets(startCharacterOffset, endCharacterOffset); 2464 } 2465 2466 - (NSInteger)lengthForTextMarkers:(NSArray *)textMarkers 2467 { 2468 if (![self _prepareAccessibilityCall]) 2469 return 0; 2470 2471 RefPtr<Range> range = [self rangeForTextMarkers:textMarkers]; 2472 int length = AXObjectCache::lengthForRange(range.get()); 2473 return length < 0 ? 0 : length; 2474 } 2475 2476 - (WebAccessibilityTextMarker *)startOrEndTextMarkerForTextMarkers:(NSArray *)textMarkers isStart:(BOOL)isStart 2477 { 2478 if (![self _prepareAccessibilityCall]) 2479 return nil; 2480 2481 RefPtr<Range> range = [self rangeForTextMarkers:textMarkers]; 2482 if (!range) 2483 return nil; 2484 2485 return [WebAccessibilityTextMarker startOrEndTextMarkerForRange:range isStart:isStart cache:m_object->axObjectCache()]; 2486 } 2487 2488 - (NSArray *)textMarkerRangeForMarkers:(NSArray *)textMarkers 2489 { 2490 if (![self _prepareAccessibilityCall]) 2491 return nil; 2492 2493 RefPtr<Range> range = [self rangeForTextMarkers:textMarkers]; 2494 return [self textMarkersForRange:range]; 2495 } 2496 2497 - (NSArray *)textMarkersForRange:(RefPtr<Range>)range 2498 { 2499 if (!range) 2500 return nil; 2501 2502 WebAccessibilityTextMarker* start = [WebAccessibilityTextMarker startOrEndTextMarkerForRange:range isStart:YES cache:m_object->axObjectCache()]; 2503 WebAccessibilityTextMarker* end = [WebAccessibilityTextMarker startOrEndTextMarkerForRange:range isStart:NO cache:m_object->axObjectCache()]; 2504 if (!start || !end) 2505 return nil; 2506 return [NSArray arrayWithObjects:start, end, nil]; 2404 2507 } 2405 2508 -
trunk/Tools/ChangeLog
r195396 r195405 1 2016-01-21 Nan Wang <n_wang@apple.com> 2 3 AX: [IOS] Implement next/previous text marker functions using TextIterator 4 https://bugs.webkit.org/show_bug.cgi?id=153292 5 <rdar://problem/24268243> 6 7 Reviewed by Chris Fleizach. 8 9 Made text marker tests available on iOS. 10 11 * DumpRenderTree/AccessibilityTextMarker.h: 12 * DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj: 13 * DumpRenderTree/ios/AccessibilityTextMarkerIOS.mm: Added. 14 (AccessibilityTextMarker::AccessibilityTextMarker): 15 (AccessibilityTextMarker::~AccessibilityTextMarker): 16 (AccessibilityTextMarker::isEqual): 17 (AccessibilityTextMarker::platformTextMarker): 18 (AccessibilityTextMarkerRange::AccessibilityTextMarkerRange): 19 (AccessibilityTextMarkerRange::~AccessibilityTextMarkerRange): 20 (AccessibilityTextMarkerRange::isEqual): 21 (AccessibilityTextMarkerRange::platformTextMarkerRange): 22 * DumpRenderTree/ios/AccessibilityUIElementIOS.mm: 23 (AccessibilityUIElement::pathDescription): 24 (AccessibilityUIElement::lineTextMarkerRangeForTextMarker): 25 (AccessibilityUIElement::textMarkerRangeForElement): 26 (AccessibilityUIElement::selectedTextMarkerRange): 27 (AccessibilityUIElement::resetSelectedTextMarkerRange): 28 (AccessibilityUIElement::textMarkerRangeLength): 29 (AccessibilityUIElement::textMarkerRangeForMarkers): 30 (AccessibilityUIElement::startTextMarkerForTextMarkerRange): 31 (AccessibilityUIElement::endTextMarkerForTextMarkerRange): 32 (AccessibilityUIElement::accessibilityElementForTextMarker): 33 (AccessibilityUIElement::endTextMarkerForBounds): 34 (AccessibilityUIElement::startTextMarkerForBounds): 35 (AccessibilityUIElement::textMarkerForPoint): 36 (AccessibilityUIElement::previousTextMarker): 37 (AccessibilityUIElement::nextTextMarker): 38 (AccessibilityUIElement::stringForTextMarkerRange): 39 (AccessibilityUIElement::attributedStringForTextMarkerRangeContainsAttribute): 40 (AccessibilityUIElement::indexForTextMarker): 41 (AccessibilityUIElement::isTextMarkerValid): 42 (AccessibilityUIElement::textMarkerForIndex): 43 (AccessibilityUIElement::startTextMarker): 44 (AccessibilityUIElement::endTextMarker): 45 (AccessibilityUIElement::setSelectedVisibleTextRange): 46 (AccessibilityUIElement::getLinkedUIElements): 47 * DumpRenderTree/mac/AccessibilityTextMarkerMac.mm: 48 (AccessibilityTextMarkerRange::platformTextMarkerRange): 49 * DumpRenderTree/mac/AccessibilityUIElementMac.mm: 50 (AccessibilityUIElement::removeSelection): 51 (AccessibilityUIElement::lineTextMarkerRangeForTextMarker): 52 (AccessibilityUIElement::setSelectedVisibleTextRange): 53 (AccessibilityUIElement::supportedActions): 54 * WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm: 55 (WTR::AccessibilityUIElement::textMarkerRangeForElement): 56 (WTR::AccessibilityUIElement::textMarkerRangeLength): 57 (WTR::AccessibilityUIElement::previousTextMarker): 58 (WTR::AccessibilityUIElement::nextTextMarker): 59 (WTR::AccessibilityUIElement::stringForTextMarkerRange): 60 (WTR::AccessibilityUIElement::textMarkerRangeForMarkers): 61 (WTR::AccessibilityUIElement::startTextMarkerForTextMarkerRange): 62 (WTR::AccessibilityUIElement::endTextMarkerForTextMarkerRange): 63 (WTR::AccessibilityUIElement::endTextMarkerForBounds): 64 (WTR::AccessibilityUIElement::accessibilityElementForTextMarker): 65 (WTR::AccessibilityUIElement::attributedStringForTextMarkerRangeContainsAttribute): 66 1 67 2016-01-20 Filip Pizlo <fpizlo@apple.com> 2 68 -
trunk/Tools/DumpRenderTree/AccessibilityTextMarker.h
r164270 r195405 29 29 #include <JavaScriptCore/JSObjectRef.h> 30 30 31 #if PLATFORM(MAC) && !PLATFORM(IOS)31 #if PLATFORM(MAC) || PLATFORM(IOS) 32 32 #define SUPPORTS_AX_TEXTMARKERS 1 33 33 #else … … 59 59 private: 60 60 static JSClassRef getJSClass(); 61 #if SUPPORTS_AX_TEXTMARKERS 61 #if SUPPORTS_AX_TEXTMARKERS && PLATFORM(MAC) 62 62 RetainPtr<PlatformTextMarker> m_textMarker; 63 63 #else … … 79 79 private: 80 80 static JSClassRef getJSClass(); 81 #if SUPPORTS_AX_TEXTMARKERS 81 #if SUPPORTS_AX_TEXTMARKERS && PLATFORM(MAC) 82 82 RetainPtr<PlatformTextMarkerRange> m_textMarkerRange; 83 83 #else -
trunk/Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj
r194115 r195405 96 96 A8B91BFD0CF522B4008F91FF /* CheckedMalloc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A8B91BF70CF522B4008F91FF /* CheckedMalloc.cpp */; }; 97 97 A8D79CEB0FC28B2C004AC8FE /* DumpRenderTreeFileDraggingSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A8D79CE90FC28B2C004AC8FE /* DumpRenderTreeFileDraggingSource.m */; }; 98 A9BB7C5C1C505278002C525B /* AccessibilityTextMarkerIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9BB7C5B1C505278002C525B /* AccessibilityTextMarkerIOS.mm */; }; 98 99 AA5A15EF16E15CD000F7C561 /* AccessibilityControllerIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = AA5A15ED16E15CD000F7C561 /* AccessibilityControllerIOS.mm */; }; 99 100 AA5A15F016E15CD000F7C561 /* AccessibilityUIElementIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = AA5A15EE16E15CD000F7C561 /* AccessibilityUIElementIOS.mm */; }; … … 310 311 A8D79CE80FC28B2C004AC8FE /* DumpRenderTreeFileDraggingSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DumpRenderTreeFileDraggingSource.h; sourceTree = "<group>"; }; 311 312 A8D79CE90FC28B2C004AC8FE /* DumpRenderTreeFileDraggingSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DumpRenderTreeFileDraggingSource.m; sourceTree = "<group>"; }; 313 A9BB7C5B1C505278002C525B /* AccessibilityTextMarkerIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AccessibilityTextMarkerIOS.mm; path = ios/AccessibilityTextMarkerIOS.mm; sourceTree = "<group>"; }; 312 314 AA5A15ED16E15CD000F7C561 /* AccessibilityControllerIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AccessibilityControllerIOS.mm; path = ios/AccessibilityControllerIOS.mm; sourceTree = "<group>"; }; 313 315 AA5A15EE16E15CD000F7C561 /* AccessibilityUIElementIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AccessibilityUIElementIOS.mm; path = ios/AccessibilityUIElementIOS.mm; sourceTree = "<group>"; }; … … 500 502 29CFBA0F122736E600BC30C0 /* AccessibilityTextMarker.cpp */, 501 503 29CFBA0E122736E600BC30C0 /* AccessibilityTextMarker.h */, 504 A9BB7C5B1C505278002C525B /* AccessibilityTextMarkerIOS.mm */, 502 505 29CFBA2D12273A1000BC30C0 /* AccessibilityTextMarkerMac.mm */, 503 506 BC0E24DF0E2D9451001B6BC2 /* AccessibilityUIElement.cpp */, … … 975 978 9830F31F15C81181005AB206 /* DumpRenderTreeCommon.cpp in Sources */, 976 979 BCA18B7B0C9B08F100114369 /* DumpRenderTreeDraggingInfo.mm in Sources */, 980 A9BB7C5C1C505278002C525B /* AccessibilityTextMarkerIOS.mm in Sources */, 977 981 A8D79CEB0FC28B2C004AC8FE /* DumpRenderTreeFileDraggingSource.m in Sources */, 978 982 A8B91ADA0CF3B32F008F91FF /* DumpRenderTreePasteboard.m in Sources */, -
trunk/Tools/DumpRenderTree/ios/AccessibilityTextMarkerIOS.mm
r195398 r195405 1 1 /* 2 * Copyright (C) 201 0Apple Inc. All Rights Reserved.2 * Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 25 25 26 26 #import "config.h" 27 #import "AccessibilityTextMarker.h" 27 28 28 #import "AccessibilityTextMarker.h"29 29 #import "DumpRenderTree.h" 30 30 31 #if SUPPORTS_AX_TEXTMARKERS 31 #if SUPPORTS_AX_TEXTMARKERS && PLATFORM(IOS) 32 32 33 33 // MARK: AccessibilityTextMarker … … 54 54 PlatformTextMarker AccessibilityTextMarker::platformTextMarker() const 55 55 { 56 return m_textMarker .get();56 return m_textMarker; 57 57 } 58 58 … … 80 80 PlatformTextMarkerRange AccessibilityTextMarkerRange::platformTextMarkerRange() const 81 81 { 82 return m_textMarkerRange .get();82 return m_textMarkerRange; 83 83 } 84 84 85 #endif // SUPPORTS_AX_TEXTMARKERS 85 #endif // SUPPORTS_AX_TEXTMARKERS && PLATFORM(IOS) -
trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm
r194054 r195405 95 95 - (UIAccessibilityTraits)_axContainedByFieldsetTrait; 96 96 - (id)_accessibilityFieldsetAncestor; 97 98 // TextMarker related 99 - (NSArray *)textMarkerRange; 100 - (NSInteger)lengthForTextMarkers:(NSArray *)textMarkers; 101 - (NSString *)stringForTextMarkers:(NSArray *)markers; 102 - (id)startOrEndTextMarkerForTextMarkers:(NSArray*)textMarkers isStart:(BOOL)isStart; 103 - (NSArray *)textMarkerRangeForMarkers:(NSArray *)textMarkers; 104 - (id)nextMarkerForMarker:(id)marker; 105 - (id)previousMarkerForMarker:(id)marker; 106 - (id)accessibilityObjectForTextMarker:(id)marker; 97 107 @end 98 108 … … 412 422 } 413 423 424 #if SUPPORTS_AX_TEXTMARKERS && PLATFORM(IOS) 425 426 // Text markers 427 428 AccessibilityTextMarkerRange AccessibilityUIElement::lineTextMarkerRangeForTextMarker(AccessibilityTextMarker*) 429 { 430 return nullptr; 431 } 432 433 AccessibilityTextMarkerRange AccessibilityUIElement::textMarkerRangeForElement(AccessibilityUIElement* element) 434 { 435 id textMarkerRange = [element->platformUIElement() textMarkerRange]; 436 return AccessibilityTextMarkerRange(textMarkerRange); 437 } 438 439 AccessibilityTextMarkerRange AccessibilityUIElement::selectedTextMarkerRange() 440 { 441 return nullptr; 442 } 443 444 void AccessibilityUIElement::resetSelectedTextMarkerRange() 445 { 446 } 447 448 int AccessibilityUIElement::textMarkerRangeLength(AccessibilityTextMarkerRange* range) 449 { 450 id textMarkers = (id)range->platformTextMarkerRange(); 451 return [m_element lengthForTextMarkers:textMarkers]; 452 } 453 454 AccessibilityTextMarkerRange AccessibilityUIElement::textMarkerRangeForMarkers(AccessibilityTextMarker* startMarker, AccessibilityTextMarker* endMarker) 455 { 456 NSArray *textMarkers = [NSArray arrayWithObjects:(id)startMarker->platformTextMarker(), (id)endMarker->platformTextMarker(), nil]; 457 id textMarkerRange = [m_element textMarkerRangeForMarkers:textMarkers]; 458 return AccessibilityTextMarkerRange(textMarkerRange); 459 } 460 461 AccessibilityTextMarker AccessibilityUIElement::startTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange* range) 462 { 463 id textMarkers = (id)range->platformTextMarkerRange(); 464 id textMarker = [m_element startOrEndTextMarkerForTextMarkers:textMarkers isStart:YES]; 465 return AccessibilityTextMarker(textMarker); 466 } 467 468 AccessibilityTextMarker AccessibilityUIElement::endTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange* range) 469 { 470 id textMarkers = (id)range->platformTextMarkerRange(); 471 id textMarker = [m_element startOrEndTextMarkerForTextMarkers:textMarkers isStart:NO]; 472 return AccessibilityTextMarker(textMarker); 473 } 474 475 AccessibilityUIElement AccessibilityUIElement::accessibilityElementForTextMarker(AccessibilityTextMarker* marker) 476 { 477 id obj = [m_element accessibilityObjectForTextMarker:(id)marker->platformTextMarker()]; 478 if (obj) 479 return AccessibilityUIElement(obj); 480 return nullptr; 481 } 482 483 AccessibilityTextMarker AccessibilityUIElement::endTextMarkerForBounds(int x, int y, int width, int height) 484 { 485 return nullptr; 486 } 487 488 AccessibilityTextMarker AccessibilityUIElement::startTextMarkerForBounds(int x, int y, int width, int height) 489 { 490 return nullptr; 491 } 492 493 AccessibilityTextMarker AccessibilityUIElement::textMarkerForPoint(int x, int y) 494 { 495 return nullptr; 496 } 497 498 AccessibilityTextMarker AccessibilityUIElement::previousTextMarker(AccessibilityTextMarker* textMarker) 499 { 500 id previousMarker = [m_element previousMarkerForMarker:(id)textMarker->platformTextMarker()]; 501 return AccessibilityTextMarker(previousMarker); 502 } 503 504 AccessibilityTextMarker AccessibilityUIElement::nextTextMarker(AccessibilityTextMarker* textMarker) 505 { 506 id nextMarker = [m_element nextMarkerForMarker:(id)textMarker->platformTextMarker()]; 507 return AccessibilityTextMarker(nextMarker); 508 } 509 510 JSStringRef AccessibilityUIElement::stringForTextMarkerRange(AccessibilityTextMarkerRange* markerRange) 511 { 512 id textMarkers = (id)markerRange->platformTextMarkerRange(); 513 if (!textMarkers || ![textMarkers isKindOfClass:[NSArray class]]) 514 return JSStringCreateWithCharacters(0, 0); 515 return [[m_element stringForTextMarkers:textMarkers] createJSStringRef]; 516 } 517 518 bool AccessibilityUIElement::attributedStringForTextMarkerRangeContainsAttribute(JSStringRef, AccessibilityTextMarkerRange*) 519 { 520 return false; 521 } 522 523 int AccessibilityUIElement::indexForTextMarker(AccessibilityTextMarker*) 524 { 525 return -1; 526 } 527 528 bool AccessibilityUIElement::isTextMarkerValid(AccessibilityTextMarker*) 529 { 530 return false; 531 } 532 533 AccessibilityTextMarker AccessibilityUIElement::textMarkerForIndex(int) 534 { 535 return nullptr; 536 } 537 538 AccessibilityTextMarker AccessibilityUIElement::startTextMarker() 539 { 540 return nullptr; 541 } 542 543 AccessibilityTextMarker AccessibilityUIElement::endTextMarker() 544 { 545 return nullptr; 546 } 547 548 bool AccessibilityUIElement::setSelectedVisibleTextRange(AccessibilityTextMarkerRange*) 549 { 550 return false; 551 } 552 553 #endif // SUPPORTS_AX_TEXTMARKERS && PLATFORM(IOS) 554 414 555 #pragma mark Unused 415 556 -
trunk/Tools/DumpRenderTree/mac/AccessibilityTextMarkerMac.mm
r162817 r195405 29 29 #import "DumpRenderTree.h" 30 30 31 #if SUPPORTS_AX_TEXTMARKERS 31 #if SUPPORTS_AX_TEXTMARKERS && PLATFORM(MAC) 32 32 33 33 // MARK: AccessibilityTextMarker … … 83 83 } 84 84 85 #endif // SUPPORTS_AX_TEXTMARKERS 85 #endif // SUPPORTS_AX_TEXTMARKERS && PLATFORM(MAC) -
trunk/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm
r194364 r195405 1613 1613 } 1614 1614 1615 #if SUPPORTS_AX_TEXTMARKERS 1615 #if SUPPORTS_AX_TEXTMARKERS && PLATFORM(MAC) 1616 1616 1617 1617 // Text markers … … 1847 1847 } 1848 1848 1849 #endif // SUPPORTS_AX_TEXTMARKERS 1849 #endif // SUPPORTS_AX_TEXTMARKERS && PLATFORM(MAC) 1850 1850 1851 1851 JSStringRef AccessibilityUIElement::supportedActions() -
trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm
r194054 r195405 72 72 - (UIAccessibilityTraits)_axContainedByFieldsetTrait; 73 73 - (id)_accessibilityFieldsetAncestor; 74 75 // TextMarker related 76 - (NSArray *)textMarkerRange; 77 - (NSInteger)lengthForTextMarkers:(NSArray *)textMarkers; 78 - (NSString *)stringForTextMarkers:(NSArray *)markers; 79 - (id)startOrEndTextMarkerForTextMarkers:(NSArray*)textMarkers isStart:(BOOL)isStart; 80 - (NSArray *)textMarkerRangeForMarkers:(NSArray *)textMarkers; 81 - (id)nextMarkerForMarker:(id)marker; 82 - (id)previousMarkerForMarker:(id)marker; 83 - (id)accessibilityObjectForTextMarker:(id)marker; 74 84 @end 75 85 … … 983 993 PassRefPtr<AccessibilityTextMarkerRange> AccessibilityUIElement::textMarkerRangeForElement(AccessibilityUIElement* element) 984 994 { 985 return 0; 995 id textMarkerRange = [element->platformUIElement() textMarkerRange]; 996 return AccessibilityTextMarkerRange::create(textMarkerRange); 986 997 } 987 998 988 999 int AccessibilityUIElement::textMarkerRangeLength(AccessibilityTextMarkerRange* range) 989 1000 { 990 return 0; 1001 id textMarkers = (id)range->platformTextMarkerRange(); 1002 return [m_element lengthForTextMarkers:textMarkers]; 991 1003 } 992 1004 993 1005 PassRefPtr<AccessibilityTextMarker> AccessibilityUIElement::previousTextMarker(AccessibilityTextMarker* textMarker) 994 1006 { 995 return 0; 1007 id previousMarker = [m_element previousMarkerForMarker:(id)textMarker->platformTextMarker()]; 1008 return AccessibilityTextMarker::create(previousMarker); 996 1009 } 997 1010 998 1011 PassRefPtr<AccessibilityTextMarker> AccessibilityUIElement::nextTextMarker(AccessibilityTextMarker* textMarker) 999 1012 { 1000 return 0; 1013 id nextMarker = [m_element nextMarkerForMarker:(id)textMarker->platformTextMarker()]; 1014 return AccessibilityTextMarker::create(nextMarker); 1001 1015 } 1002 1016 1003 1017 JSRetainPtr<JSStringRef> AccessibilityUIElement::stringForTextMarkerRange(AccessibilityTextMarkerRange* markerRange) 1004 1018 { 1005 return 0; 1019 id textMarkers = (id)markerRange->platformTextMarkerRange(); 1020 if (!textMarkers || ![textMarkers isKindOfClass:[NSArray class]]) 1021 return JSStringCreateWithCharacters(0, 0); 1022 return [[m_element stringForTextMarkers:textMarkers] createJSStringRef]; 1006 1023 } 1007 1024 1008 1025 PassRefPtr<AccessibilityTextMarkerRange> AccessibilityUIElement::textMarkerRangeForMarkers(AccessibilityTextMarker* startMarker, AccessibilityTextMarker* endMarker) 1009 1026 { 1010 return 0; 1027 NSArray *textMarkers = [NSArray arrayWithObjects:(id)startMarker->platformTextMarker(), (id)endMarker->platformTextMarker(), nil]; 1028 id textMarkerRange = [m_element textMarkerRangeForMarkers:textMarkers]; 1029 return AccessibilityTextMarkerRange::create(textMarkerRange); 1011 1030 } 1012 1031 1013 1032 PassRefPtr<AccessibilityTextMarker> AccessibilityUIElement::startTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange* range) 1014 1033 { 1015 return 0; 1034 id textMarkers = (id)range->platformTextMarkerRange(); 1035 id textMarker = [m_element startOrEndTextMarkerForTextMarkers:textMarkers isStart:YES]; 1036 return AccessibilityTextMarker::create(textMarker); 1016 1037 } 1017 1038 1018 1039 PassRefPtr<AccessibilityTextMarker> AccessibilityUIElement::endTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange* range) 1019 1040 { 1020 return 0; 1041 id textMarkers = (id)range->platformTextMarkerRange(); 1042 id textMarker = [m_element startOrEndTextMarkerForTextMarkers:textMarkers isStart:NO]; 1043 return AccessibilityTextMarker::create(textMarker); 1021 1044 } 1022 1045 … … 1038 1061 PassRefPtr<AccessibilityUIElement> AccessibilityUIElement::accessibilityElementForTextMarker(AccessibilityTextMarker* marker) 1039 1062 { 1040 return 0; 1063 id obj = [m_element accessibilityObjectForTextMarker:(id)marker->platformTextMarker()]; 1064 if (obj) 1065 return AccessibilityUIElement::create(obj); 1066 return nullptr; 1041 1067 } 1042 1068
Note: See TracChangeset
for help on using the changeset viewer.