| Index: content/browser/accessibility/browser_accessibility_cocoa.mm
|
| diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm
|
| index f0d696d97b18e355b41e42b15f5a19d65f944754..bf5b5e2821bf9caeba7286cfb6972a1b00ea3d41 100644
|
| --- a/content/browser/accessibility/browser_accessibility_cocoa.mm
|
| +++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
|
| @@ -29,8 +29,10 @@
|
| #include "ui/accessibility/ax_range.h"
|
| #import "ui/accessibility/platform/ax_platform_node_mac.h"
|
|
|
| -using AXPlatformPositionInstance =
|
| +using AXAbstractPositionInstance =
|
| content::AXPlatformPosition::AXPositionInstance;
|
| +using AXPlatformPositionInstance =
|
| + content::AXPlatformPosition::ConcreteInstance;
|
| using AXPlatformRange = ui::AXRange<AXPlatformPositionInstance::element_type>;
|
| using AXTextMarkerRangeRef = CFTypeRef;
|
| using AXTextMarkerRef = CFTypeRef;
|
| @@ -140,49 +142,59 @@ AXTextMarkerRef AXTextMarkerRangeCopyEndMarker(
|
|
|
| } // extern "C"
|
|
|
| +static_assert(sizeof(AXPlatformPosition) == sizeof(ui::AXPositionBase),
|
| + "AXPosition size mismatch");
|
| +constexpr size_t kAXPositionSize = sizeof(ui::AXPositionBase);
|
| +
|
| // to call |release| on it to transfer ownership of the position to the text
|
| // marker object.
|
| -id CreateTextMarker(AXPlatformPositionInstance position) {
|
| +id CreateTextMarker(AXAbstractPositionInstance position) {
|
| AXTextMarkerRef text_marker = AXTextMarkerCreate(
|
| kCFAllocatorDefault, reinterpret_cast<const UInt8*>(position.release()),
|
| - sizeof(AXPlatformPosition));
|
| + kAXPositionSize);
|
| return static_cast<id>(
|
| base::mac::CFTypeRefToNSObjectAutorelease(text_marker));
|
| }
|
|
|
| // |range| is destructed at the end of this method and ownership of its |anchor|
|
| // and |focus| are transfered to the marker range object.
|
| -id CreateTextMarkerRange(const AXPlatformRange range) {
|
| +id CreateTextMarkerRange(const ui::AXAbstractRange range) {
|
| AXTextMarkerRef start_marker = AXTextMarkerCreate(
|
| kCFAllocatorDefault, reinterpret_cast<const UInt8*>(range.anchor()),
|
| - sizeof(AXPlatformPosition));
|
| + kAXPositionSize);
|
| AXTextMarkerRef end_marker = AXTextMarkerCreate(
|
| kCFAllocatorDefault, reinterpret_cast<const UInt8*>(range.focus()),
|
| - sizeof(AXPlatformPosition));
|
| + kAXPositionSize);
|
| AXTextMarkerRangeRef marker_range =
|
| AXTextMarkerRangeCreate(kCFAllocatorDefault, start_marker, end_marker);
|
| return static_cast<id>(
|
| base::mac::CFTypeRefToNSObjectAutorelease(marker_range));
|
| }
|
|
|
| -AXPlatformPositionInstance CreatePositionFromTextMarker(
|
| +AXPlatformPositionInstance CreateConcretePositionFromTextMarker(
|
| AXTextMarkerRef text_marker) {
|
| DCHECK(text_marker);
|
| - if (AXTextMarkerGetLength(text_marker) != sizeof(AXPlatformPosition))
|
| - return AXPlatformPosition::CreateNullPosition();
|
| + if (AXTextMarkerGetLength(text_marker) != kAXPositionSize)
|
| + return AXPlatformPosition::CreateConcreteNullPosition();
|
| const UInt8* source_buffer = AXTextMarkerGetBytePtr(text_marker);
|
| if (!source_buffer)
|
| - return AXPlatformPosition::CreateNullPosition();
|
| - UInt8* destination_buffer = new UInt8[sizeof(AXPlatformPosition)];
|
| - std::memcpy(destination_buffer, source_buffer, sizeof(AXPlatformPosition));
|
| - AXPlatformPosition::AXPositionInstance position(
|
| - reinterpret_cast<AXPlatformPosition::AXPositionInstance::pointer>(
|
| + return AXPlatformPosition::CreateConcreteNullPosition();
|
| + UInt8* destination_buffer = new UInt8[kAXPositionSize];
|
| + std::memcpy(destination_buffer, source_buffer, kAXPositionSize);
|
| + AXPlatformPositionInstance position(
|
| + reinterpret_cast<AXPlatformPositionInstance::pointer>(
|
| destination_buffer));
|
| if (!position)
|
| - return AXPlatformPosition::CreateNullPosition();
|
| + return AXPlatformPosition::CreateConcreteNullPosition();
|
| return position;
|
| }
|
|
|
| +AXAbstractPositionInstance CreatePositionFromTextMarker(
|
| + AXTextMarkerRef text_marker) {
|
| + return base::WrapUnique(
|
| + CreateConcretePositionFromTextMarker(text_marker).release());
|
| +}
|
| +
|
| AXPlatformRange CreateRangeFromTextMarkerRange(
|
| AXTextMarkerRangeRef marker_range) {
|
| DCHECK(marker_range);
|
| @@ -194,9 +206,9 @@ AXPlatformRange CreateRangeFromTextMarkerRange(
|
| return AXPlatformRange();
|
|
|
| AXPlatformPositionInstance anchor =
|
| - CreatePositionFromTextMarker(start_marker.get());
|
| + CreateConcretePositionFromTextMarker(start_marker.get());
|
| AXPlatformPositionInstance focus =
|
| - CreatePositionFromTextMarker(end_marker.get());
|
| + CreateConcretePositionFromTextMarker(end_marker.get());
|
| // |AXPlatformRange| takes ownership of its anchor and focus.
|
| return AXPlatformRange(std::move(anchor), std::move(focus));
|
| }
|
| @@ -206,11 +218,11 @@ AXPlatformPositionInstance CreateTextPosition(
|
| int offset,
|
| ui::AXTextAffinity affinity) {
|
| if (!object.instance_active())
|
| - return AXPlatformPosition::CreateNullPosition();
|
| + return AXPlatformPosition::CreateConcreteNullPosition();
|
|
|
| const BrowserAccessibilityManager* manager = object.manager();
|
| DCHECK(manager);
|
| - return AXPlatformPosition::CreateTextPosition(
|
| + return AXPlatformPosition::CreateConcreteTextPosition(
|
| manager->ax_tree_id(), object.GetId(), offset, affinity);
|
| }
|
|
|
| @@ -274,8 +286,8 @@ NSAttributedString* GetAttributedTextForTextMarkerRange(
|
| AXPlatformRange ax_range = CreateRangeFromTextMarkerRange(marker_range);
|
| if (ax_range.IsNull())
|
| return nil;
|
| - start_object = ax_range.anchor()->GetAnchor();
|
| - end_object = ax_range.focus()->GetAnchor();
|
| + start_object = ax_range.GetAnchorNode();
|
| + end_object = ax_range.GetFocusNode();
|
| start_offset = ax_range.anchor()->text_offset();
|
| end_offset = ax_range.focus()->text_offset();
|
| start_affinity = ax_range.anchor()->affinity();
|
| @@ -975,7 +987,7 @@ NSString* const NSAccessibilityRequiredAttribute = @"AXRequired";
|
| if (!root)
|
| return nil;
|
|
|
| - AXPlatformPositionInstance position = root->CreatePositionAt(0);
|
| + AXAbstractPositionInstance position = root->CreatePositionAt(0);
|
| return CreateTextMarker(position->CreatePositionAtEndOfAnchor());
|
| }
|
|
|
| @@ -1740,7 +1752,7 @@ NSString* const NSAccessibilityRequiredAttribute = @"AXRequired";
|
| if (!root)
|
| return nil;
|
|
|
| - AXPlatformPositionInstance position = root->CreatePositionAt(0);
|
| + AXAbstractPositionInstance position = root->CreatePositionAt(0);
|
| return CreateTextMarker(position->CreatePositionAtStartOfAnchor());
|
| }
|
|
|
| @@ -2132,7 +2144,7 @@ NSString* const NSAccessibilityRequiredAttribute = @"AXRequired";
|
|
|
| if ([attribute isEqualToString:@"AXUIElementForTextMarker"]) {
|
| AXPlatformPositionInstance position =
|
| - CreatePositionFromTextMarker(parameter);
|
| + CreateConcretePositionFromTextMarker(parameter);
|
| if (!position->IsNullPosition())
|
| return ToBrowserAccessibilityCocoa(position->GetAnchor());
|
|
|
| @@ -2140,12 +2152,12 @@ NSString* const NSAccessibilityRequiredAttribute = @"AXRequired";
|
| }
|
|
|
| if ([attribute isEqualToString:@"AXTextMarkerRangeForUIElement"]) {
|
| - AXPlatformPositionInstance startPosition =
|
| + AXAbstractPositionInstance startPosition =
|
| browserAccessibility_->CreatePositionAt(0);
|
| - AXPlatformPositionInstance endPosition =
|
| + AXAbstractPositionInstance endPosition =
|
| startPosition->CreatePositionAtEndOfAnchor();
|
| - AXPlatformRange range =
|
| - AXPlatformRange(std::move(startPosition), std::move(endPosition));
|
| + ui::AXAbstractRange range =
|
| + ui::AXAbstractRange(std::move(startPosition), std::move(endPosition));
|
| return CreateTextMarkerRange(std::move(range));
|
| }
|
|
|
| @@ -2156,7 +2168,7 @@ NSString* const NSAccessibilityRequiredAttribute = @"AXRequired";
|
| return GetAttributedTextForTextMarkerRange(parameter);
|
|
|
| if ([attribute isEqualToString:@"AXNextTextMarkerForTextMarker"]) {
|
| - AXPlatformPositionInstance position =
|
| + AXAbstractPositionInstance position =
|
| CreatePositionFromTextMarker(parameter);
|
| if (position->IsNullPosition())
|
| return nil;
|
| @@ -2164,7 +2176,7 @@ NSString* const NSAccessibilityRequiredAttribute = @"AXRequired";
|
| }
|
|
|
| if ([attribute isEqualToString:@"AXPreviousTextMarkerForTextMarker"]) {
|
| - AXPlatformPositionInstance position =
|
| + AXAbstractPositionInstance position =
|
| CreatePositionFromTextMarker(parameter);
|
| if (position->IsNullPosition())
|
| return nil;
|
| @@ -2172,41 +2184,41 @@ NSString* const NSAccessibilityRequiredAttribute = @"AXRequired";
|
| }
|
|
|
| if ([attribute isEqualToString:@"AXLeftWordTextMarkerRangeForTextMarker"]) {
|
| - AXPlatformPositionInstance endPosition =
|
| + AXAbstractPositionInstance endPosition =
|
| CreatePositionFromTextMarker(parameter);
|
| if (endPosition->IsNullPosition())
|
| return nil;
|
|
|
| - AXPlatformPositionInstance startWordPosition =
|
| + AXAbstractPositionInstance startWordPosition =
|
| endPosition->CreatePreviousWordStartPosition();
|
| - AXPlatformPositionInstance endWordPosition =
|
| + AXAbstractPositionInstance endWordPosition =
|
| endPosition->CreatePreviousWordEndPosition();
|
| - AXPlatformPositionInstance startPosition =
|
| + AXAbstractPositionInstance startPosition =
|
| *startWordPosition <= *endWordPosition ? std::move(endWordPosition)
|
| : std::move(startWordPosition);
|
| - AXPlatformRange range(std::move(startPosition), std::move(endPosition));
|
| + ui::AXAbstractRange range(std::move(startPosition), std::move(endPosition));
|
| return CreateTextMarkerRange(std::move(range));
|
| }
|
|
|
| if ([attribute isEqualToString:@"AXRightWordTextMarkerRangeForTextMarker"]) {
|
| - AXPlatformPositionInstance startPosition =
|
| + AXAbstractPositionInstance startPosition =
|
| CreatePositionFromTextMarker(parameter);
|
| if (startPosition->IsNullPosition())
|
| return nil;
|
|
|
| - AXPlatformPositionInstance endWordPosition =
|
| + AXAbstractPositionInstance endWordPosition =
|
| startPosition->CreateNextWordEndPosition();
|
| - AXPlatformPositionInstance startWordPosition =
|
| + AXAbstractPositionInstance startWordPosition =
|
| startPosition->CreateNextWordStartPosition();
|
| - AXPlatformPositionInstance endPosition =
|
| + AXAbstractPositionInstance endPosition =
|
| *startWordPosition <= *endWordPosition ? std::move(startWordPosition)
|
| : std::move(endWordPosition);
|
| - AXPlatformRange range(std::move(startPosition), std::move(endPosition));
|
| + ui::AXAbstractRange range(std::move(startPosition), std::move(endPosition));
|
| return CreateTextMarkerRange(std::move(range));
|
| }
|
|
|
| if ([attribute isEqualToString:@"AXNextWordEndTextMarkerForTextMarker"]) {
|
| - AXPlatformPositionInstance position =
|
| + AXAbstractPositionInstance position =
|
| CreatePositionFromTextMarker(parameter);
|
| if (position->IsNullPosition())
|
| return nil;
|
| @@ -2215,7 +2227,7 @@ NSString* const NSAccessibilityRequiredAttribute = @"AXRequired";
|
|
|
| if ([attribute
|
| isEqualToString:@"AXPreviousWordStartTextMarkerForTextMarker"]) {
|
| - AXPlatformPositionInstance position =
|
| + AXAbstractPositionInstance position =
|
| CreatePositionFromTextMarker(parameter);
|
| if (position->IsNullPosition())
|
| return nil;
|
| @@ -2223,55 +2235,55 @@ NSString* const NSAccessibilityRequiredAttribute = @"AXRequired";
|
| }
|
|
|
| if ([attribute isEqualToString:@"AXTextMarkerRangeForLine"]) {
|
| - AXPlatformPositionInstance position =
|
| + AXAbstractPositionInstance position =
|
| CreatePositionFromTextMarker(parameter);
|
| if (position->IsNullPosition())
|
| return nil;
|
|
|
| - AXPlatformPositionInstance startPosition =
|
| + AXAbstractPositionInstance startPosition =
|
| position->CreatePreviousLineStartPosition();
|
| - AXPlatformPositionInstance endPosition =
|
| + AXAbstractPositionInstance endPosition =
|
| position->CreateNextLineEndPosition();
|
| - AXPlatformRange range(std::move(startPosition), std::move(endPosition));
|
| + ui::AXAbstractRange range(std::move(startPosition), std::move(endPosition));
|
| return CreateTextMarkerRange(std::move(range));
|
| }
|
|
|
| if ([attribute isEqualToString:@"AXLeftLineTextMarkerRangeForTextMarker"]) {
|
| - AXPlatformPositionInstance endPosition =
|
| + AXAbstractPositionInstance endPosition =
|
| CreatePositionFromTextMarker(parameter);
|
| if (endPosition->IsNullPosition())
|
| return nil;
|
|
|
| - AXPlatformPositionInstance startLinePosition =
|
| + AXAbstractPositionInstance startLinePosition =
|
| endPosition->CreatePreviousLineStartPosition();
|
| - AXPlatformPositionInstance endLinePosition =
|
| + AXAbstractPositionInstance endLinePosition =
|
| endPosition->CreatePreviousLineEndPosition();
|
| - AXPlatformPositionInstance startPosition =
|
| + AXAbstractPositionInstance startPosition =
|
| *startLinePosition <= *endLinePosition ? std::move(endLinePosition)
|
| : std::move(startLinePosition);
|
| - AXPlatformRange range(std::move(startPosition), std::move(endPosition));
|
| + ui::AXAbstractRange range(std::move(startPosition), std::move(endPosition));
|
| return CreateTextMarkerRange(std::move(range));
|
| }
|
|
|
| if ([attribute isEqualToString:@"AXRightLineTextMarkerRangeForTextMarker"]) {
|
| - AXPlatformPositionInstance startPosition =
|
| + AXAbstractPositionInstance startPosition =
|
| CreatePositionFromTextMarker(parameter);
|
| if (startPosition->IsNullPosition())
|
| return nil;
|
|
|
| - AXPlatformPositionInstance startLinePosition =
|
| + AXAbstractPositionInstance startLinePosition =
|
| startPosition->CreateNextLineStartPosition();
|
| - AXPlatformPositionInstance endLinePosition =
|
| + AXAbstractPositionInstance endLinePosition =
|
| startPosition->CreateNextLineEndPosition();
|
| - AXPlatformPositionInstance endPosition =
|
| + AXAbstractPositionInstance endPosition =
|
| *startLinePosition <= *endLinePosition ? std::move(startLinePosition)
|
| : std::move(endLinePosition);
|
| - AXPlatformRange range(std::move(startPosition), std::move(endPosition));
|
| + ui::AXAbstractRange range(std::move(startPosition), std::move(endPosition));
|
| return CreateTextMarkerRange(std::move(range));
|
| }
|
|
|
| if ([attribute isEqualToString:@"AXNextLineEndTextMarkerForTextMarker"]) {
|
| - AXPlatformPositionInstance position =
|
| + AXAbstractPositionInstance position =
|
| CreatePositionFromTextMarker(parameter);
|
| if (position->IsNullPosition())
|
| return nil;
|
| @@ -2280,7 +2292,7 @@ NSString* const NSAccessibilityRequiredAttribute = @"AXRequired";
|
|
|
| if ([attribute
|
| isEqualToString:@"AXPreviousLineStartTextMarkerForTextMarker"]) {
|
| - AXPlatformPositionInstance position =
|
| + AXAbstractPositionInstance position =
|
| CreatePositionFromTextMarker(parameter);
|
| if (position->IsNullPosition())
|
| return nil;
|
| @@ -2330,13 +2342,13 @@ NSString* const NSAccessibilityRequiredAttribute = @"AXRequired";
|
|
|
| if ([attribute isEqualToString:
|
| NSAccessibilityLineTextMarkerRangeForTextMarkerParameterizedAttribute]) {
|
| - AXPlatformPositionInstance position =
|
| + AXAbstractPositionInstance position =
|
| CreatePositionFromTextMarker(parameter);
|
| if (position->IsNullPosition())
|
| return nil;
|
|
|
| - AXPlatformRange range(position->CreatePreviousLineStartPosition(),
|
| - position->CreateNextLineEndPosition());
|
| + ui::AXAbstractRange range(position->CreatePreviousLineStartPosition(),
|
| + position->CreateNextLineEndPosition());
|
| return CreateTextMarkerRange(std::move(range));
|
| }
|
|
|
| @@ -2349,8 +2361,8 @@ NSString* const NSAccessibilityRequiredAttribute = @"AXRequired";
|
| if (range.IsNull())
|
| return nil;
|
|
|
| - startObject = range.anchor()->GetAnchor();
|
| - endObject = range.focus()->GetAnchor();
|
| + startObject = range.GetAnchorNode();
|
| + endObject = range.GetFocusNode();
|
| startOffset = range.anchor()->text_offset();
|
| endOffset = range.focus()->text_offset();
|
| DCHECK(startObject && endObject);
|
| @@ -2376,16 +2388,16 @@ NSString* const NSAccessibilityRequiredAttribute = @"AXRequired";
|
| if ([text_marker_array count] != 2)
|
| return nil;
|
|
|
| - AXPlatformPositionInstance startPosition =
|
| + AXAbstractPositionInstance startPosition =
|
| CreatePositionFromTextMarker([text_marker_array objectAtIndex:0]);
|
| - AXPlatformPositionInstance endPosition =
|
| + AXAbstractPositionInstance endPosition =
|
| CreatePositionFromTextMarker([text_marker_array objectAtIndex:1]);
|
| if (*startPosition <= *endPosition) {
|
| - return CreateTextMarkerRange(
|
| - AXPlatformRange(std::move(startPosition), std::move(endPosition)));
|
| + return CreateTextMarkerRange(ui::AXAbstractRange(std::move(startPosition),
|
| + std::move(endPosition)));
|
| } else {
|
| - return CreateTextMarkerRange(
|
| - AXPlatformRange(std::move(endPosition), std::move(startPosition)));
|
| + return CreateTextMarkerRange(ui::AXAbstractRange(
|
| + std::move(endPosition), std::move(startPosition)));
|
| }
|
| }
|
|
|
|
|