diff options
Diffstat (limited to 'chromium/content/browser/accessibility/browser_accessibility_cocoa.mm')
-rw-r--r-- | chromium/content/browser/accessibility/browser_accessibility_cocoa.mm | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/chromium/content/browser/accessibility/browser_accessibility_cocoa.mm b/chromium/content/browser/accessibility/browser_accessibility_cocoa.mm index a2927a31d6b..4889a5c2f5d 100644 --- a/chromium/content/browser/accessibility/browser_accessibility_cocoa.mm +++ b/chromium/content/browser/accessibility/browser_accessibility_cocoa.mm @@ -38,6 +38,8 @@ using BrowserAccessibilityPositionInstance = content::BrowserAccessibilityPosition::AXPositionInstance; +using SerializedPosition = + content::BrowserAccessibilityPosition::SerializedPosition; using AXPlatformRange = ui::AXRange<BrowserAccessibilityPositionInstance::element_type>; using AXTextMarkerRangeRef = CFTypeRef; @@ -54,6 +56,10 @@ using content::OneShotAccessibilityTreeSearch; using ui::AXNodeData; using ui::AXTreeIDRegistry; +static_assert( + std::is_trivially_copyable<SerializedPosition>::value, + "SerializedPosition must be POD because it's used to back an AXTextMarker"); + namespace { // Private WebKit accessibility attributes. @@ -172,21 +178,24 @@ AXTextMarkerRef AXTextMarkerRangeCopyEndMarker( // AXTextMarkerCreate copies from data buffer given to it. id CreateTextMarker(BrowserAccessibilityPositionInstance position) { + SerializedPosition serialized = position->Serialize(); AXTextMarkerRef text_marker = AXTextMarkerCreate( - kCFAllocatorDefault, reinterpret_cast<const UInt8*>(position.get()), - sizeof(BrowserAccessibilityPosition)); + kCFAllocatorDefault, reinterpret_cast<const UInt8*>(&serialized), + sizeof(SerializedPosition)); return [static_cast<id>(text_marker) autorelease]; } // |range| is destructed at the end of this method. |anchor| and |focus| are // copied into the individual text markers. id CreateTextMarkerRange(const AXPlatformRange range) { + SerializedPosition serialized_anchor = range.anchor()->Serialize(); + SerializedPosition serialized_focus = range.focus()->Serialize(); base::ScopedCFTypeRef<AXTextMarkerRef> start_marker(AXTextMarkerCreate( - kCFAllocatorDefault, reinterpret_cast<const UInt8*>(range.anchor()), - sizeof(BrowserAccessibilityPosition))); + kCFAllocatorDefault, reinterpret_cast<const UInt8*>(&serialized_anchor), + sizeof(SerializedPosition))); base::ScopedCFTypeRef<AXTextMarkerRef> end_marker(AXTextMarkerCreate( - kCFAllocatorDefault, reinterpret_cast<const UInt8*>(range.focus()), - sizeof(BrowserAccessibilityPosition))); + kCFAllocatorDefault, reinterpret_cast<const UInt8*>(&serialized_focus), + sizeof(SerializedPosition))); AXTextMarkerRangeRef marker_range = AXTextMarkerRangeCreate(kCFAllocatorDefault, start_marker, end_marker); return [static_cast<id>(marker_range) autorelease]; @@ -195,22 +204,15 @@ id CreateTextMarkerRange(const AXPlatformRange range) { BrowserAccessibilityPositionInstance CreatePositionFromTextMarker( AXTextMarkerRef text_marker) { DCHECK(text_marker); - if (AXTextMarkerGetLength(text_marker) != - sizeof(BrowserAccessibilityPosition)) + if (AXTextMarkerGetLength(text_marker) != sizeof(SerializedPosition)) return BrowserAccessibilityPosition::CreateNullPosition(); + const UInt8* source_buffer = AXTextMarkerGetBytePtr(text_marker); if (!source_buffer) return BrowserAccessibilityPosition::CreateNullPosition(); - UInt8* destination_buffer = new UInt8[sizeof(BrowserAccessibilityPosition)]; - std::memcpy(destination_buffer, source_buffer, - sizeof(BrowserAccessibilityPosition)); - BrowserAccessibilityPosition::AXPositionInstance position( - reinterpret_cast< - BrowserAccessibilityPosition::AXPositionInstance::pointer>( - destination_buffer)); - if (!position) - return BrowserAccessibilityPosition::CreateNullPosition(); - return position; + + return BrowserAccessibilityPosition::Unserialize( + *reinterpret_cast<const SerializedPosition*>(source_buffer)); } AXPlatformRange CreateRangeFromTextMarkerRange( |