summaryrefslogtreecommitdiff
path: root/chromium/content/browser/accessibility/browser_accessibility_cocoa.mm
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/accessibility/browser_accessibility_cocoa.mm')
-rw-r--r--chromium/content/browser/accessibility/browser_accessibility_cocoa.mm38
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(