|
|
|
|
@@ -0,0 +1,727 @@
|
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Martin Robinson <mrobinson@igalia.com>
|
|
|
|
|
Date: Thu, 19 Nov 2020 21:28:45 +0000
|
|
|
|
|
Subject: Improve AXTextStateChangeType in
|
|
|
|
|
NSAccessibilitySelectedTextChangedNotification
|
|
|
|
|
|
|
|
|
|
When setting the AXTextStateChangeType key in the user info data
|
|
|
|
|
structure for the notification, use AXTextStateChangeTypeSelectionMove
|
|
|
|
|
when we detect a focus change. This causes VoiceOver to properly
|
|
|
|
|
announce the label and type of form entries when their contents are
|
|
|
|
|
selected due to focus changes.
|
|
|
|
|
|
|
|
|
|
type are now announced.
|
|
|
|
|
|
|
|
|
|
Bug: 1127421
|
|
|
|
|
Change-Id: I42d66ad60fbcba7c8c34396fdbc3f6e0c739d1a2
|
|
|
|
|
AX-Relnotes: When focus changes moves to form inputs, the input label and
|
|
|
|
|
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2512913
|
|
|
|
|
Commit-Queue: Martin Robinson <mrobinson@igalia.com>
|
|
|
|
|
Reviewed-by: Nektarios Paisios <nektar@chromium.org>
|
|
|
|
|
Cr-Commit-Position: refs/heads/master@{#829380}
|
|
|
|
|
|
|
|
|
|
diff --git a/content/browser/accessibility/accessibility_event_recorder_mac.mm b/content/browser/accessibility/accessibility_event_recorder_mac.mm
|
|
|
|
|
index 6efa579decbfef81ddd38b27696133f7f68673ee..cdf4f8f87cf1554044e698f8b85c0f8a28a741e8 100644
|
|
|
|
|
--- a/content/browser/accessibility/accessibility_event_recorder_mac.mm
|
|
|
|
|
+++ b/content/browser/accessibility/accessibility_event_recorder_mac.mm
|
|
|
|
|
@@ -6,6 +6,7 @@
|
|
|
|
|
|
|
|
|
|
#import <Cocoa/Cocoa.h>
|
|
|
|
|
|
|
|
|
|
+#include <algorithm>
|
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
|
|
#include "base/logging.h"
|
|
|
|
|
@@ -15,6 +16,7 @@
|
|
|
|
|
#include "base/strings/sys_string_conversions.h"
|
|
|
|
|
#include "content/browser/accessibility/accessibility_tools_utils_mac.h"
|
|
|
|
|
#include "content/browser/accessibility/browser_accessibility_manager.h"
|
|
|
|
|
+#include "ui/accessibility/platform/ax_private_webkit_constants_mac.h"
|
|
|
|
|
|
|
|
|
|
namespace content {
|
|
|
|
|
|
|
|
|
|
@@ -28,7 +30,11 @@
|
|
|
|
|
~AccessibilityEventRecorderMac() override;
|
|
|
|
|
|
|
|
|
|
// Callback executed every time we receive an event notification.
|
|
|
|
|
- void EventReceived(AXUIElementRef element, CFStringRef notification);
|
|
|
|
|
+ void EventReceived(AXUIElementRef element,
|
|
|
|
|
+ CFStringRef notification,
|
|
|
|
|
+ CFDictionaryRef user_info);
|
|
|
|
|
+ static std::string SerializeTextSelectionChangedProperties(
|
|
|
|
|
+ CFDictionaryRef user_info);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
// Add one notification to the list of notifications monitored by our
|
|
|
|
|
@@ -54,10 +60,11 @@
|
|
|
|
|
static void EventReceivedThunk(AXObserverRef observer_ref,
|
|
|
|
|
AXUIElementRef element,
|
|
|
|
|
CFStringRef notification,
|
|
|
|
|
+ CFDictionaryRef user_info,
|
|
|
|
|
void* refcon) {
|
|
|
|
|
AccessibilityEventRecorderMac* this_ptr =
|
|
|
|
|
static_cast<AccessibilityEventRecorderMac*>(refcon);
|
|
|
|
|
- this_ptr->EventReceived(element, notification);
|
|
|
|
|
+ this_ptr->EventReceived(element, notification, user_info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// static
|
|
|
|
|
@@ -95,8 +102,9 @@ static void EventReceivedThunk(AXObserverRef observer_ref,
|
|
|
|
|
base::ProcessId pid,
|
|
|
|
|
AXUIElementRef node)
|
|
|
|
|
: AccessibilityEventRecorder(manager), observer_run_loop_source_(NULL) {
|
|
|
|
|
- if (kAXErrorSuccess != AXObserverCreate(pid, EventReceivedThunk,
|
|
|
|
|
- observer_ref_.InitializeInto())) {
|
|
|
|
|
+ if (kAXErrorSuccess !=
|
|
|
|
|
+ AXObserverCreateWithInfoCallback(pid, EventReceivedThunk,
|
|
|
|
|
+ observer_ref_.InitializeInto())) {
|
|
|
|
|
LOG(FATAL) << "Failed to create AXObserverRef";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -157,7 +165,8 @@ static void EventReceivedThunk(AXObserverRef observer_ref,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AccessibilityEventRecorderMac::EventReceived(AXUIElementRef element,
|
|
|
|
|
- CFStringRef notification) {
|
|
|
|
|
+ CFStringRef notification,
|
|
|
|
|
+ CFDictionaryRef user_info) {
|
|
|
|
|
std::string notification_str = base::SysCFStringRefToUTF8(notification);
|
|
|
|
|
std::string role = GetAXAttributeValue(element, NSAccessibilityRoleAttribute);
|
|
|
|
|
if (role.empty())
|
|
|
|
|
@@ -180,7 +189,49 @@ static void EventReceivedThunk(AXObserverRef observer_ref,
|
|
|
|
|
if (!value.empty())
|
|
|
|
|
log += base::StringPrintf(" AXValue=\"%s\"", value.c_str());
|
|
|
|
|
|
|
|
|
|
+ if (notification_str ==
|
|
|
|
|
+ base::SysNSStringToUTF8(NSAccessibilitySelectedTextChangedNotification))
|
|
|
|
|
+ log += " " + SerializeTextSelectionChangedProperties(user_info);
|
|
|
|
|
+
|
|
|
|
|
OnEvent(log);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
+std::string
|
|
|
|
|
+AccessibilityEventRecorderMac::SerializeTextSelectionChangedProperties(
|
|
|
|
|
+ CFDictionaryRef user_info) {
|
|
|
|
|
+ std::vector<std::string> serialized_info;
|
|
|
|
|
+ CFDictionaryApplyFunction(
|
|
|
|
|
+ user_info,
|
|
|
|
|
+ [](const void* raw_key, const void* raw_value, void* context) {
|
|
|
|
|
+ auto* key = static_cast<NSString*>(raw_key);
|
|
|
|
|
+ auto* value = static_cast<NSObject*>(raw_value);
|
|
|
|
|
+ auto* serialized_info = static_cast<std::vector<std::string>*>(context);
|
|
|
|
|
+ std::string value_string;
|
|
|
|
|
+ if ([key isEqual:ui::NSAccessibilityTextStateChangeTypeKey]) {
|
|
|
|
|
+ value_string = ToString(static_cast<ui::AXTextStateChangeType>(
|
|
|
|
|
+ [static_cast<NSNumber*>(value) intValue]));
|
|
|
|
|
+ } else if ([key isEqual:ui::NSAccessibilityTextSelectionDirection]) {
|
|
|
|
|
+ value_string = ToString(static_cast<ui::AXTextSelectionDirection>(
|
|
|
|
|
+ [static_cast<NSNumber*>(value) intValue]));
|
|
|
|
|
+ } else if ([key isEqual:ui::NSAccessibilityTextSelectionGranularity]) {
|
|
|
|
|
+ value_string = ToString(static_cast<ui::AXTextSelectionGranularity>(
|
|
|
|
|
+ [static_cast<NSNumber*>(value) intValue]));
|
|
|
|
|
+ } else if ([key isEqual:ui::NSAccessibilityTextEditType]) {
|
|
|
|
|
+ value_string = ToString(static_cast<ui::AXTextEditType>(
|
|
|
|
|
+ [static_cast<NSNumber*>(value) intValue]));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ serialized_info->push_back(base::SysNSStringToUTF8(key) + "=" +
|
|
|
|
|
+ value_string);
|
|
|
|
|
+ },
|
|
|
|
|
+ &serialized_info);
|
|
|
|
|
+
|
|
|
|
|
+ // Always sort the info so that we don't depend on CFDictionary for
|
|
|
|
|
+ // consistent output ordering.
|
|
|
|
|
+ std::sort(serialized_info.begin(), serialized_info.end());
|
|
|
|
|
+
|
|
|
|
|
+ return base::JoinString(serialized_info, " ");
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
} // namespace content
|
|
|
|
|
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.h b/content/browser/accessibility/browser_accessibility_manager_mac.h
|
|
|
|
|
index b4043f56341e72bcf75ef71c56cb8cf9fc442579..925bfe1ea191ab846805fdbff1b0314e779b1c9e 100644
|
|
|
|
|
--- a/content/browser/accessibility/browser_accessibility_manager_mac.h
|
|
|
|
|
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.h
|
|
|
|
|
@@ -54,7 +54,8 @@ class CONTENT_EXPORT BrowserAccessibilityManagerMac
|
|
|
|
|
const std::vector<Change>& changes) override;
|
|
|
|
|
|
|
|
|
|
// Returns an autoreleased object.
|
|
|
|
|
- NSDictionary* GetUserInfoForSelectedTextChangedNotification();
|
|
|
|
|
+ NSDictionary* GetUserInfoForSelectedTextChangedNotification(
|
|
|
|
|
+ bool focus_changed);
|
|
|
|
|
|
|
|
|
|
// Returns an autoreleased object.
|
|
|
|
|
NSDictionary* GetUserInfoForValueChangedNotification(
|
|
|
|
|
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm
|
|
|
|
|
index 122e517ddcb3944847fc289eb45c87d5fb156afc..5a2b73f664646efc0bc8e506e93b179b8e96635a 100644
|
|
|
|
|
--- a/content/browser/accessibility/browser_accessibility_manager_mac.mm
|
|
|
|
|
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
|
|
|
|
|
@@ -19,91 +19,13 @@
|
|
|
|
|
#include "content/public/browser/web_contents.h"
|
|
|
|
|
#include "ui/accelerated_widget_mac/accelerated_widget_mac.h"
|
|
|
|
|
#include "ui/accessibility/ax_role_properties.h"
|
|
|
|
|
+#include "ui/accessibility/platform/ax_private_webkit_constants_mac.h"
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
|
|
// Use same value as in Safari's WebKit.
|
|
|
|
|
const int kLiveRegionChangeIntervalMS = 20;
|
|
|
|
|
|
|
|
|
|
-// Declare undocumented accessibility constants and enums only present in
|
|
|
|
|
-// WebKit.
|
|
|
|
|
-
|
|
|
|
|
-enum AXTextStateChangeType {
|
|
|
|
|
- AXTextStateChangeTypeUnknown,
|
|
|
|
|
- AXTextStateChangeTypeEdit,
|
|
|
|
|
- AXTextStateChangeTypeSelectionMove,
|
|
|
|
|
- AXTextStateChangeTypeSelectionExtend
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-enum AXTextSelectionDirection {
|
|
|
|
|
- AXTextSelectionDirectionUnknown,
|
|
|
|
|
- AXTextSelectionDirectionBeginning,
|
|
|
|
|
- AXTextSelectionDirectionEnd,
|
|
|
|
|
- AXTextSelectionDirectionPrevious,
|
|
|
|
|
- AXTextSelectionDirectionNext,
|
|
|
|
|
- AXTextSelectionDirectionDiscontiguous
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-enum AXTextSelectionGranularity {
|
|
|
|
|
- AXTextSelectionGranularityUnknown,
|
|
|
|
|
- AXTextSelectionGranularityCharacter,
|
|
|
|
|
- AXTextSelectionGranularityWord,
|
|
|
|
|
- AXTextSelectionGranularityLine,
|
|
|
|
|
- AXTextSelectionGranularitySentence,
|
|
|
|
|
- AXTextSelectionGranularityParagraph,
|
|
|
|
|
- AXTextSelectionGranularityPage,
|
|
|
|
|
- AXTextSelectionGranularityDocument,
|
|
|
|
|
- AXTextSelectionGranularityAll
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-enum AXTextEditType {
|
|
|
|
|
- AXTextEditTypeUnknown,
|
|
|
|
|
- AXTextEditTypeDelete,
|
|
|
|
|
- AXTextEditTypeInsert,
|
|
|
|
|
- AXTextEditTypeTyping,
|
|
|
|
|
- AXTextEditTypeDictation,
|
|
|
|
|
- AXTextEditTypeCut,
|
|
|
|
|
- AXTextEditTypePaste,
|
|
|
|
|
- AXTextEditTypeAttributesChange
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-// Native mac notifications fired.
|
|
|
|
|
-NSString* const NSAccessibilityAutocorrectionOccurredNotification =
|
|
|
|
|
- @"AXAutocorrectionOccurred";
|
|
|
|
|
-NSString* const NSAccessibilityLoadCompleteNotification = @"AXLoadComplete";
|
|
|
|
|
-NSString* const NSAccessibilityInvalidStatusChangedNotification =
|
|
|
|
|
- @"AXInvalidStatusChanged";
|
|
|
|
|
-NSString* const NSAccessibilityLiveRegionCreatedNotification =
|
|
|
|
|
- @"AXLiveRegionCreated";
|
|
|
|
|
-NSString* const NSAccessibilityLiveRegionChangedNotification =
|
|
|
|
|
- @"AXLiveRegionChanged";
|
|
|
|
|
-NSString* const NSAccessibilityExpandedChanged = @"AXExpandedChanged";
|
|
|
|
|
-NSString* const NSAccessibilityMenuItemSelectedNotification =
|
|
|
|
|
- @"AXMenuItemSelected";
|
|
|
|
|
-
|
|
|
|
|
-// The following native mac notifications are not fired:
|
|
|
|
|
-// AXLayoutComplete: Voiceover does not use this, it is considered too spammy.
|
|
|
|
|
-
|
|
|
|
|
-// Attributes used for NSAccessibilitySelectedTextChangedNotification and
|
|
|
|
|
-// NSAccessibilityValueChangedNotification.
|
|
|
|
|
-NSString* const NSAccessibilityTextStateChangeTypeKey =
|
|
|
|
|
- @"AXTextStateChangeType";
|
|
|
|
|
-NSString* const NSAccessibilityTextStateSyncKey = @"AXTextStateSync";
|
|
|
|
|
-NSString* const NSAccessibilityTextSelectionDirection =
|
|
|
|
|
- @"AXTextSelectionDirection";
|
|
|
|
|
-NSString* const NSAccessibilityTextSelectionGranularity =
|
|
|
|
|
- @"AXTextSelectionGranularity";
|
|
|
|
|
-NSString* const NSAccessibilityTextSelectionChangedFocus =
|
|
|
|
|
- @"AXTextSelectionChangedFocus";
|
|
|
|
|
-NSString* const NSAccessibilityTextChangeElement = @"AXTextChangeElement";
|
|
|
|
|
-NSString* const NSAccessibilityTextEditType = @"AXTextEditType";
|
|
|
|
|
-NSString* const NSAccessibilityTextChangeValue = @"AXTextChangeValue";
|
|
|
|
|
-NSString* const NSAccessibilityChangeValueStartMarker =
|
|
|
|
|
- @"AXTextChangeValueStartMarker";
|
|
|
|
|
-NSString* const NSAccessibilityTextChangeValueLength =
|
|
|
|
|
- @"AXTextChangeValueLength";
|
|
|
|
|
-NSString* const NSAccessibilityTextChangeValues = @"AXTextChangeValues";
|
|
|
|
|
-
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
namespace content {
|
|
|
|
|
@@ -164,7 +86,7 @@
|
|
|
|
|
NSString* mac_notification = nullptr;
|
|
|
|
|
switch (event_type) {
|
|
|
|
|
case ax::mojom::Event::kAutocorrectionOccured:
|
|
|
|
|
- mac_notification = NSAccessibilityAutocorrectionOccurredNotification;
|
|
|
|
|
+ mac_notification = ui::NSAccessibilityAutocorrectionOccurredNotification;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
return;
|
|
|
|
|
@@ -203,6 +125,8 @@ void PostAnnouncementNotification(NSString* announcement) {
|
|
|
|
|
auto native_node = ToBrowserAccessibilityCocoa(node);
|
|
|
|
|
DCHECK(native_node);
|
|
|
|
|
|
|
|
|
|
+ bool focus_changed = GetFocus() != GetLastFocusedNode();
|
|
|
|
|
+
|
|
|
|
|
// Refer to |AXObjectCache::postPlatformNotification| in WebKit source code.
|
|
|
|
|
NSString* mac_notification = nullptr;
|
|
|
|
|
switch (event_type) {
|
|
|
|
|
@@ -223,7 +147,7 @@ void PostAnnouncementNotification(NSString* announcement) {
|
|
|
|
|
break;
|
|
|
|
|
case ui::AXEventGenerator::Event::ALERT:
|
|
|
|
|
NSAccessibilityPostNotification(
|
|
|
|
|
- native_node, NSAccessibilityLiveRegionCreatedNotification);
|
|
|
|
|
+ native_node, ui::NSAccessibilityLiveRegionCreatedNotification);
|
|
|
|
|
// Voiceover requires a live region changed notification to actually
|
|
|
|
|
// announce the live region.
|
|
|
|
|
FireGeneratedEvent(ui::AXEventGenerator::Event::LIVE_REGION_CHANGED,
|
|
|
|
|
@@ -242,7 +166,7 @@ void PostAnnouncementNotification(NSString* announcement) {
|
|
|
|
|
node->GetRole() == ax::mojom::Role::kTreeItem) {
|
|
|
|
|
mac_notification = NSAccessibilityRowCollapsedNotification;
|
|
|
|
|
} else {
|
|
|
|
|
- mac_notification = NSAccessibilityExpandedChanged;
|
|
|
|
|
+ mac_notification = ui::NSAccessibilityExpandedChanged;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case ui::AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED: {
|
|
|
|
|
@@ -259,7 +183,7 @@ void PostAnnouncementNotification(NSString* announcement) {
|
|
|
|
|
// API has been present on versions of OS X since 10.7 but doesn't
|
|
|
|
|
// appear to be needed by Voiceover before version 10.11.
|
|
|
|
|
NSDictionary* user_info =
|
|
|
|
|
- GetUserInfoForSelectedTextChangedNotification();
|
|
|
|
|
+ GetUserInfoForSelectedTextChangedNotification(focus_changed);
|
|
|
|
|
|
|
|
|
|
BrowserAccessibilityManager* root_manager = GetRootManager();
|
|
|
|
|
if (!root_manager)
|
|
|
|
|
@@ -284,11 +208,11 @@ void PostAnnouncementNotification(NSString* announcement) {
|
|
|
|
|
node->GetRole() == ax::mojom::Role::kTreeItem) {
|
|
|
|
|
mac_notification = NSAccessibilityRowExpandedNotification;
|
|
|
|
|
} else {
|
|
|
|
|
- mac_notification = NSAccessibilityExpandedChanged;
|
|
|
|
|
+ mac_notification = ui::NSAccessibilityExpandedChanged;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case ui::AXEventGenerator::Event::INVALID_STATUS_CHANGED:
|
|
|
|
|
- mac_notification = NSAccessibilityInvalidStatusChangedNotification;
|
|
|
|
|
+ mac_notification = ui::NSAccessibilityInvalidStatusChangedNotification;
|
|
|
|
|
break;
|
|
|
|
|
case ui::AXEventGenerator::Event::LIVE_REGION_CHANGED: {
|
|
|
|
|
// Voiceover seems to drop live region changed notifications if they come
|
|
|
|
|
@@ -297,7 +221,7 @@ void PostAnnouncementNotification(NSString* announcement) {
|
|
|
|
|
|
|
|
|
|
if (never_suppress_or_delay_events_for_testing_) {
|
|
|
|
|
NSAccessibilityPostNotification(
|
|
|
|
|
- native_node, NSAccessibilityLiveRegionChangedNotification);
|
|
|
|
|
+ native_node, ui::NSAccessibilityLiveRegionChangedNotification);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -321,7 +245,7 @@ void PostAnnouncementNotification(NSString* announcement) {
|
|
|
|
|
[](base::scoped_nsobject<BrowserAccessibilityCocoa> node) {
|
|
|
|
|
if (node && [node instanceActive]) {
|
|
|
|
|
NSAccessibilityPostNotification(
|
|
|
|
|
- node, NSAccessibilityLiveRegionChangedNotification);
|
|
|
|
|
+ node, ui::NSAccessibilityLiveRegionChangedNotification);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
std::move(retained_node)),
|
|
|
|
|
@@ -329,7 +253,7 @@ void PostAnnouncementNotification(NSString* announcement) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
case ui::AXEventGenerator::Event::LIVE_REGION_CREATED:
|
|
|
|
|
- mac_notification = NSAccessibilityLiveRegionCreatedNotification;
|
|
|
|
|
+ mac_notification = ui::NSAccessibilityLiveRegionCreatedNotification;
|
|
|
|
|
break;
|
|
|
|
|
case ui::AXEventGenerator::Event::LOAD_COMPLETE:
|
|
|
|
|
// On MacOS 10.15, firing AXLoadComplete causes focus to move to the
|
|
|
|
|
@@ -343,7 +267,7 @@ void PostAnnouncementNotification(NSString* announcement) {
|
|
|
|
|
// |NSAccessibilityLoadCompleteNotification| should only be fired on the
|
|
|
|
|
// top document and when the document is not Chrome's new tab page.
|
|
|
|
|
if (IsRootTree() && !IsChromeNewTabPage()) {
|
|
|
|
|
- mac_notification = NSAccessibilityLoadCompleteNotification;
|
|
|
|
|
+ mac_notification = ui::NSAccessibilityLoadCompleteNotification;
|
|
|
|
|
} else {
|
|
|
|
|
// Voiceover moves focus to the web content when it receives an
|
|
|
|
|
// AXLoadComplete event. On Chrome's new tab page, focus should stay
|
|
|
|
|
@@ -353,7 +277,7 @@ void PostAnnouncementNotification(NSString* announcement) {
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case ui::AXEventGenerator::Event::MENU_ITEM_SELECTED:
|
|
|
|
|
- mac_notification = NSAccessibilityMenuItemSelectedNotification;
|
|
|
|
|
+ mac_notification = ui::NSAccessibilityMenuItemSelectedNotification;
|
|
|
|
|
break;
|
|
|
|
|
case ui::AXEventGenerator::Event::RANGE_VALUE_CHANGED:
|
|
|
|
|
DCHECK(node->GetData().IsRangeValueSupported());
|
|
|
|
|
@@ -532,18 +456,32 @@ void PostAnnouncementNotification(NSString* announcement) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-NSDictionary* BrowserAccessibilityManagerMac::
|
|
|
|
|
- GetUserInfoForSelectedTextChangedNotification() {
|
|
|
|
|
+NSDictionary*
|
|
|
|
|
+BrowserAccessibilityManagerMac::GetUserInfoForSelectedTextChangedNotification(
|
|
|
|
|
+ bool focus_changed) {
|
|
|
|
|
NSMutableDictionary* user_info =
|
|
|
|
|
[[[NSMutableDictionary alloc] init] autorelease];
|
|
|
|
|
- [user_info setObject:@YES forKey:NSAccessibilityTextStateSyncKey];
|
|
|
|
|
- [user_info setObject:@(AXTextStateChangeTypeUnknown)
|
|
|
|
|
- forKey:NSAccessibilityTextStateChangeTypeKey];
|
|
|
|
|
- [user_info setObject:@(AXTextSelectionDirectionUnknown)
|
|
|
|
|
- forKey:NSAccessibilityTextSelectionDirection];
|
|
|
|
|
- [user_info setObject:@(AXTextSelectionGranularityUnknown)
|
|
|
|
|
- forKey:NSAccessibilityTextSelectionGranularity];
|
|
|
|
|
- [user_info setObject:@YES forKey:NSAccessibilityTextSelectionChangedFocus];
|
|
|
|
|
+ [user_info setObject:@YES forKey:ui::NSAccessibilityTextStateSyncKey];
|
|
|
|
|
+ [user_info setObject:@(ui::AXTextSelectionDirectionUnknown)
|
|
|
|
|
+ forKey:ui::NSAccessibilityTextSelectionDirection];
|
|
|
|
|
+ [user_info setObject:@(ui::AXTextSelectionGranularityUnknown)
|
|
|
|
|
+ forKey:ui::NSAccessibilityTextSelectionGranularity];
|
|
|
|
|
+ [user_info setObject:@YES
|
|
|
|
|
+ forKey:ui::NSAccessibilityTextSelectionChangedFocus];
|
|
|
|
|
+
|
|
|
|
|
+ // Try to detect when the text selection changes due to a focus change.
|
|
|
|
|
+ // This is necessary so that VoiceOver also anounces information about the
|
|
|
|
|
+ // element that contains this selection.
|
|
|
|
|
+ // TODO(mrobinson): Determine definitively what the type of this text
|
|
|
|
|
+ // selection change is. This requires passing this information here from
|
|
|
|
|
+ // blink.
|
|
|
|
|
+ if (focus_changed) {
|
|
|
|
|
+ [user_info setObject:@(ui::AXTextStateChangeTypeSelectionMove)
|
|
|
|
|
+ forKey:ui::NSAccessibilityTextStateChangeTypeKey];
|
|
|
|
|
+ } else {
|
|
|
|
|
+ [user_info setObject:@(ui::AXTextStateChangeTypeUnknown)
|
|
|
|
|
+ forKey:ui::NSAccessibilityTextStateChangeTypeKey];
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
int32_t focus_id = ax_tree()->GetUnignoredSelection().focus_object_id;
|
|
|
|
|
BrowserAccessibility* focus_object = GetFromID(focus_id);
|
|
|
|
|
@@ -552,7 +490,7 @@ void PostAnnouncementNotification(NSString* announcement) {
|
|
|
|
|
auto native_focus_object = ToBrowserAccessibilityCocoa(focus_object);
|
|
|
|
|
if (native_focus_object && [native_focus_object instanceActive]) {
|
|
|
|
|
[user_info setObject:native_focus_object
|
|
|
|
|
- forKey:NSAccessibilityTextChangeElement];
|
|
|
|
|
+ forKey:ui::NSAccessibilityTextChangeElement];
|
|
|
|
|
|
|
|
|
|
#ifndef MAS_BUILD
|
|
|
|
|
id selected_text = [native_focus_object selectedTextMarkerRange];
|
|
|
|
|
@@ -583,38 +521,39 @@ void PostAnnouncementNotification(NSString* announcement) {
|
|
|
|
|
if (!deleted_text.empty()) {
|
|
|
|
|
NSMutableDictionary* change =
|
|
|
|
|
[NSMutableDictionary dictionaryWithDictionary:@{
|
|
|
|
|
- NSAccessibilityTextEditType : @(AXTextEditTypeDelete),
|
|
|
|
|
- NSAccessibilityTextChangeValueLength : @(deleted_text.length()),
|
|
|
|
|
- NSAccessibilityTextChangeValue :
|
|
|
|
|
+ ui::NSAccessibilityTextEditType : @(ui::AXTextEditTypeDelete),
|
|
|
|
|
+ ui::NSAccessibilityTextChangeValueLength : @(deleted_text.length()),
|
|
|
|
|
+ ui::NSAccessibilityTextChangeValue :
|
|
|
|
|
base::SysUTF16ToNSString(deleted_text)
|
|
|
|
|
}];
|
|
|
|
|
if (edit_text_marker) {
|
|
|
|
|
- change[NSAccessibilityChangeValueStartMarker] = edit_text_marker;
|
|
|
|
|
+ change[ui::NSAccessibilityChangeValueStartMarker] = edit_text_marker;
|
|
|
|
|
}
|
|
|
|
|
[changes addObject:change];
|
|
|
|
|
}
|
|
|
|
|
if (!inserted_text.empty()) {
|
|
|
|
|
// TODO(nektar): Figure out if this is a paste, insertion or typing.
|
|
|
|
|
// Changes to Blink would be required. A heuristic is currently used.
|
|
|
|
|
- auto edit_type = inserted_text.length() > 1 ? @(AXTextEditTypeInsert)
|
|
|
|
|
- : @(AXTextEditTypeTyping);
|
|
|
|
|
+ auto edit_type = inserted_text.length() > 1 ? @(ui::AXTextEditTypeInsert)
|
|
|
|
|
+ : @(ui::AXTextEditTypeTyping);
|
|
|
|
|
NSMutableDictionary* change =
|
|
|
|
|
[NSMutableDictionary dictionaryWithDictionary:@{
|
|
|
|
|
- NSAccessibilityTextEditType : edit_type,
|
|
|
|
|
- NSAccessibilityTextChangeValueLength : @(inserted_text.length()),
|
|
|
|
|
- NSAccessibilityTextChangeValue :
|
|
|
|
|
+ ui::NSAccessibilityTextEditType : edit_type,
|
|
|
|
|
+ ui::NSAccessibilityTextChangeValueLength : @(inserted_text.length()),
|
|
|
|
|
+ ui::NSAccessibilityTextChangeValue :
|
|
|
|
|
base::SysUTF16ToNSString(inserted_text)
|
|
|
|
|
}];
|
|
|
|
|
if (edit_text_marker) {
|
|
|
|
|
- change[NSAccessibilityChangeValueStartMarker] = edit_text_marker;
|
|
|
|
|
+ change[ui::NSAccessibilityChangeValueStartMarker] = edit_text_marker;
|
|
|
|
|
}
|
|
|
|
|
[changes addObject:change];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return @{
|
|
|
|
|
- NSAccessibilityTextStateChangeTypeKey : @(AXTextStateChangeTypeEdit),
|
|
|
|
|
- NSAccessibilityTextChangeValues : changes,
|
|
|
|
|
- NSAccessibilityTextChangeElement : native_node
|
|
|
|
|
+ ui::
|
|
|
|
|
+ NSAccessibilityTextStateChangeTypeKey : @(ui::AXTextStateChangeTypeEdit),
|
|
|
|
|
+ ui::NSAccessibilityTextChangeValues : changes,
|
|
|
|
|
+ ui::NSAccessibilityTextChangeElement : native_node
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
diff --git a/content/test/data/accessibility/event/aria-combo-box-focus-expected-mac.txt b/content/test/data/accessibility/event/aria-combo-box-focus-expected-mac.txt
|
|
|
|
|
index ad5e2bf2c8029185c51eecc94cac1dbe7608c99e..67e07a89f77f7c61a57eb51cecea211df5227341 100644
|
|
|
|
|
--- a/content/test/data/accessibility/event/aria-combo-box-focus-expected-mac.txt
|
|
|
|
|
+++ b/content/test/data/accessibility/event/aria-combo-box-focus-expected-mac.txt
|
|
|
|
|
@@ -1,3 +1,3 @@
|
|
|
|
|
AXFocusedUIElementChanged on AXStaticText AXValue="Apple not selected"
|
|
|
|
|
-AXSelectedTextChanged on AXStaticText AXValue="Apple not selected"
|
|
|
|
|
-AXSelectedTextChanged on AXWebArea
|
|
|
|
|
\ No newline at end of file
|
|
|
|
|
+AXSelectedTextChanged on AXStaticText AXValue="Apple not selected" AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeSelectionMove
|
|
|
|
|
+AXSelectedTextChanged on AXWebArea AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeSelectionMove
|
|
|
|
|
diff --git a/content/test/data/accessibility/event/caret-browsing-disabled-expected-mac.txt b/content/test/data/accessibility/event/caret-browsing-disabled-expected-mac.txt
|
|
|
|
|
index ec0b74d984ade9928705242f9b0682a743e20fb2..87447c5a4b14efde5b64b1d340a3fa2fb6574b80 100644
|
|
|
|
|
--- a/content/test/data/accessibility/event/caret-browsing-disabled-expected-mac.txt
|
|
|
|
|
+++ b/content/test/data/accessibility/event/caret-browsing-disabled-expected-mac.txt
|
|
|
|
|
@@ -1,5 +1,5 @@
|
|
|
|
|
-AXSelectedTextChanged on AXWebArea
|
|
|
|
|
-AXSelectedTextChanged on AXWebArea
|
|
|
|
|
+AXSelectedTextChanged on AXWebArea AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeUnknown
|
|
|
|
|
+AXSelectedTextChanged on AXWebArea AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeUnknown
|
|
|
|
|
=== Start Continuation ===
|
|
|
|
|
-AXSelectedTextChanged on AXWebArea
|
|
|
|
|
-AXSelectedTextChanged on AXWebArea
|
|
|
|
|
+AXSelectedTextChanged on AXWebArea AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeUnknown
|
|
|
|
|
+AXSelectedTextChanged on AXWebArea AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeUnknown
|
|
|
|
|
diff --git a/content/test/data/accessibility/event/caret-browsing-enabled-expected-mac.txt b/content/test/data/accessibility/event/caret-browsing-enabled-expected-mac.txt
|
|
|
|
|
index ec0b74d984ade9928705242f9b0682a743e20fb2..87447c5a4b14efde5b64b1d340a3fa2fb6574b80 100644
|
|
|
|
|
--- a/content/test/data/accessibility/event/caret-browsing-enabled-expected-mac.txt
|
|
|
|
|
+++ b/content/test/data/accessibility/event/caret-browsing-enabled-expected-mac.txt
|
|
|
|
|
@@ -1,5 +1,5 @@
|
|
|
|
|
-AXSelectedTextChanged on AXWebArea
|
|
|
|
|
-AXSelectedTextChanged on AXWebArea
|
|
|
|
|
+AXSelectedTextChanged on AXWebArea AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeUnknown
|
|
|
|
|
+AXSelectedTextChanged on AXWebArea AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeUnknown
|
|
|
|
|
=== Start Continuation ===
|
|
|
|
|
-AXSelectedTextChanged on AXWebArea
|
|
|
|
|
-AXSelectedTextChanged on AXWebArea
|
|
|
|
|
+AXSelectedTextChanged on AXWebArea AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeUnknown
|
|
|
|
|
+AXSelectedTextChanged on AXWebArea AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeUnknown
|
|
|
|
|
diff --git a/content/test/data/accessibility/event/text-selection-changed-expected-mac.txt b/content/test/data/accessibility/event/text-selection-changed-expected-mac.txt
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000000000000000000000000000000000000..9213c873393d595bba8796cdb0e2325d3ee37ee9
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/content/test/data/accessibility/event/text-selection-changed-expected-mac.txt
|
|
|
|
|
@@ -0,0 +1,10 @@
|
|
|
|
|
+AXSelectedTextChanged on AXWebArea AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeUnknown
|
|
|
|
|
+AXSelectedTextChanged on AXWebArea AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeUnknown
|
|
|
|
|
+=== Start Continuation ===
|
|
|
|
|
+AXFocusedUIElementChanged on AXTextField AXDescription="input" AXValue="input"
|
|
|
|
|
+AXSelectedTextChanged on AXTextField AXDescription="input" AXValue="input" AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeSelectionMove
|
|
|
|
|
+AXSelectedTextChanged on AXWebArea AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeSelectionMove
|
|
|
|
|
+=== Start Continuation ===
|
|
|
|
|
+AXFocusedUIElementChanged on AXTextArea AXDescription="textarea"
|
|
|
|
|
+AXSelectedTextChanged on AXTextArea AXDescription="textarea" AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeSelectionMove
|
|
|
|
|
+AXSelectedTextChanged on AXWebArea AXTextSelectionDirection=AXTextSelectionDirectionUnknown AXTextSelectionGranularity=AXTextSelectionGranularityUnknown AXTextStateChangeType=AXTextStateChangeTypeSelectionMove
|
|
|
|
|
diff --git a/ui/accessibility/platform/BUILD.gn b/ui/accessibility/platform/BUILD.gn
|
|
|
|
|
index 99df759347f899a78dc37846e30598f82edb34f7..47d57fcf7aa02b5b2c5afab18a96666dda3b79bb 100644
|
|
|
|
|
--- a/ui/accessibility/platform/BUILD.gn
|
|
|
|
|
+++ b/ui/accessibility/platform/BUILD.gn
|
|
|
|
|
@@ -118,6 +118,8 @@ source_set("platform") {
|
|
|
|
|
"ax_event_intent_mac.mm",
|
|
|
|
|
"ax_platform_node_mac.h",
|
|
|
|
|
"ax_platform_node_mac.mm",
|
|
|
|
|
+ "ax_private_webkit_constants_mac.h",
|
|
|
|
|
+ "ax_private_webkit_constants_mac.mm",
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
frameworks = [
|
|
|
|
|
diff --git a/ui/accessibility/platform/ax_private_webkit_constants_mac.h b/ui/accessibility/platform/ax_private_webkit_constants_mac.h
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000000000000000000000000000000000000..5f1776a3aeac89b70d6d852b8e5209a1208271ae
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/ui/accessibility/platform/ax_private_webkit_constants_mac.h
|
|
|
|
|
@@ -0,0 +1,96 @@
|
|
|
|
|
+// Copyright 2020 The Chromium Authors. All rights reserved.
|
|
|
|
|
+// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
|
+// found in the LICENSE file.
|
|
|
|
|
+
|
|
|
|
|
+#ifndef UI_ACCESSIBILITY_PLATFORM_AX_PRIVATE_WEBKIT_CONSTANTS_MAC_H_
|
|
|
|
|
+#define UI_ACCESSIBILITY_PLATFORM_AX_PRIVATE_WEBKIT_CONSTANTS_MAC_H_
|
|
|
|
|
+
|
|
|
|
|
+#import <Cocoa/Cocoa.h>
|
|
|
|
|
+#include "ui/accessibility/ax_export.h"
|
|
|
|
|
+
|
|
|
|
|
+namespace ui {
|
|
|
|
|
+
|
|
|
|
|
+enum AXTextStateChangeType {
|
|
|
|
|
+ AXTextStateChangeTypeUnknown,
|
|
|
|
|
+ AXTextStateChangeTypeEdit,
|
|
|
|
|
+ AXTextStateChangeTypeSelectionMove,
|
|
|
|
|
+ AXTextStateChangeTypeSelectionExtend
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+enum AXTextSelectionDirection {
|
|
|
|
|
+ AXTextSelectionDirectionUnknown,
|
|
|
|
|
+ AXTextSelectionDirectionBeginning,
|
|
|
|
|
+ AXTextSelectionDirectionEnd,
|
|
|
|
|
+ AXTextSelectionDirectionPrevious,
|
|
|
|
|
+ AXTextSelectionDirectionNext,
|
|
|
|
|
+ AXTextSelectionDirectionDiscontiguous
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+enum AXTextSelectionGranularity {
|
|
|
|
|
+ AXTextSelectionGranularityUnknown,
|
|
|
|
|
+ AXTextSelectionGranularityCharacter,
|
|
|
|
|
+ AXTextSelectionGranularityWord,
|
|
|
|
|
+ AXTextSelectionGranularityLine,
|
|
|
|
|
+ AXTextSelectionGranularitySentence,
|
|
|
|
|
+ AXTextSelectionGranularityParagraph,
|
|
|
|
|
+ AXTextSelectionGranularityPage,
|
|
|
|
|
+ AXTextSelectionGranularityDocument,
|
|
|
|
|
+ AXTextSelectionGranularityAll
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+enum AXTextEditType {
|
|
|
|
|
+ AXTextEditTypeUnknown,
|
|
|
|
|
+ AXTextEditTypeDelete,
|
|
|
|
|
+ AXTextEditTypeInsert,
|
|
|
|
|
+ AXTextEditTypeTyping,
|
|
|
|
|
+ AXTextEditTypeDictation,
|
|
|
|
|
+ AXTextEditTypeCut,
|
|
|
|
|
+ AXTextEditTypePaste,
|
|
|
|
|
+ AXTextEditTypeAttributesChange
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+// Native mac notifications fired.
|
|
|
|
|
+NSString* const NSAccessibilityAutocorrectionOccurredNotification =
|
|
|
|
|
+ @"AXAutocorrectionOccurred";
|
|
|
|
|
+NSString* const NSAccessibilityLoadCompleteNotification = @"AXLoadComplete";
|
|
|
|
|
+NSString* const NSAccessibilityInvalidStatusChangedNotification =
|
|
|
|
|
+ @"AXInvalidStatusChanged";
|
|
|
|
|
+NSString* const NSAccessibilityLiveRegionCreatedNotification =
|
|
|
|
|
+ @"AXLiveRegionCreated";
|
|
|
|
|
+NSString* const NSAccessibilityLiveRegionChangedNotification =
|
|
|
|
|
+ @"AXLiveRegionChanged";
|
|
|
|
|
+NSString* const NSAccessibilityExpandedChanged = @"AXExpandedChanged";
|
|
|
|
|
+NSString* const NSAccessibilityMenuItemSelectedNotification =
|
|
|
|
|
+ @"AXMenuItemSelected";
|
|
|
|
|
+
|
|
|
|
|
+// The following native mac notifications are not fired:
|
|
|
|
|
+// AXLayoutComplete: Voiceover does not use this, it is considered too spammy.
|
|
|
|
|
+
|
|
|
|
|
+// Attributes used for NSAccessibilitySelectedTextChangedNotification and
|
|
|
|
|
+// NSAccessibilityValueChangedNotification.
|
|
|
|
|
+NSString* const NSAccessibilityTextStateChangeTypeKey =
|
|
|
|
|
+ @"AXTextStateChangeType";
|
|
|
|
|
+NSString* const NSAccessibilityTextStateSyncKey = @"AXTextStateSync";
|
|
|
|
|
+NSString* const NSAccessibilityTextSelectionDirection =
|
|
|
|
|
+ @"AXTextSelectionDirection";
|
|
|
|
|
+NSString* const NSAccessibilityTextSelectionGranularity =
|
|
|
|
|
+ @"AXTextSelectionGranularity";
|
|
|
|
|
+NSString* const NSAccessibilityTextSelectionChangedFocus =
|
|
|
|
|
+ @"AXTextSelectionChangedFocus";
|
|
|
|
|
+NSString* const NSAccessibilityTextChangeElement = @"AXTextChangeElement";
|
|
|
|
|
+NSString* const NSAccessibilityTextEditType = @"AXTextEditType";
|
|
|
|
|
+NSString* const NSAccessibilityTextChangeValue = @"AXTextChangeValue";
|
|
|
|
|
+NSString* const NSAccessibilityChangeValueStartMarker =
|
|
|
|
|
+ @"AXTextChangeValueStartMarker";
|
|
|
|
|
+NSString* const NSAccessibilityTextChangeValueLength =
|
|
|
|
|
+ @"AXTextChangeValueLength";
|
|
|
|
|
+NSString* const NSAccessibilityTextChangeValues = @"AXTextChangeValues";
|
|
|
|
|
+
|
|
|
|
|
+AX_EXPORT const char* ToString(AXTextStateChangeType);
|
|
|
|
|
+AX_EXPORT const char* ToString(AXTextSelectionDirection);
|
|
|
|
|
+AX_EXPORT const char* ToString(AXTextSelectionGranularity);
|
|
|
|
|
+AX_EXPORT const char* ToString(AXTextEditType);
|
|
|
|
|
+
|
|
|
|
|
+} // namespace ui
|
|
|
|
|
+
|
|
|
|
|
+#endif // UI_ACCESSIBILITY_PLATFORM_AX_PRIVATE_WEBKIT_CONSTANTS_MAC_H_
|
|
|
|
|
diff --git a/ui/accessibility/platform/ax_private_webkit_constants_mac.mm b/ui/accessibility/platform/ax_private_webkit_constants_mac.mm
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000000000000000000000000000000000000..7de31a487dd6e0e6a4af2f4fa62e463f41a0d96a
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/ui/accessibility/platform/ax_private_webkit_constants_mac.mm
|
|
|
|
|
@@ -0,0 +1,91 @@
|
|
|
|
|
+// Copyright 2020 The Chromium Authors. All rights reserved.
|
|
|
|
|
+// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
|
+// found in the LICENSE file.
|
|
|
|
|
+
|
|
|
|
|
+#include "ui/accessibility/platform/ax_private_webkit_constants_mac.h"
|
|
|
|
|
+
|
|
|
|
|
+namespace ui {
|
|
|
|
|
+
|
|
|
|
|
+const char* ToString(AXTextStateChangeType type) {
|
|
|
|
|
+ switch (type) {
|
|
|
|
|
+ case AXTextStateChangeTypeUnknown:
|
|
|
|
|
+ return "AXTextStateChangeTypeUnknown";
|
|
|
|
|
+ case AXTextStateChangeTypeEdit:
|
|
|
|
|
+ return "AXTextStateChangeTypeEdit";
|
|
|
|
|
+ case AXTextStateChangeTypeSelectionMove:
|
|
|
|
|
+ return "AXTextStateChangeTypeSelectionMove";
|
|
|
|
|
+ case AXTextStateChangeTypeSelectionExtend:
|
|
|
|
|
+ return "AXTextStateChangeTypeSelectionExtend";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return "";
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const char* ToString(AXTextSelectionDirection direction) {
|
|
|
|
|
+ switch (direction) {
|
|
|
|
|
+ case AXTextSelectionDirectionUnknown:
|
|
|
|
|
+ return "AXTextSelectionDirectionUnknown";
|
|
|
|
|
+ case AXTextSelectionDirectionBeginning:
|
|
|
|
|
+ return "AXTextSelectionDirectionBeginning";
|
|
|
|
|
+ case AXTextSelectionDirectionEnd:
|
|
|
|
|
+ return "AXTextSelectionDirectionEnd";
|
|
|
|
|
+ case AXTextSelectionDirectionPrevious:
|
|
|
|
|
+ return "AXTextSelectionDirectionPrevious";
|
|
|
|
|
+ case AXTextSelectionDirectionNext:
|
|
|
|
|
+ return "AXTextSelectionDirectionNext";
|
|
|
|
|
+ case AXTextSelectionDirectionDiscontiguous:
|
|
|
|
|
+ return "AXTextSelectionDirectionDiscontiguous";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return "";
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const char* ToString(AXTextSelectionGranularity granularity) {
|
|
|
|
|
+ switch (granularity) {
|
|
|
|
|
+ case AXTextSelectionGranularityUnknown:
|
|
|
|
|
+ return "AXTextSelectionGranularityUnknown";
|
|
|
|
|
+ case AXTextSelectionGranularityCharacter:
|
|
|
|
|
+ return "AXTextSelectionGranularityCharacter";
|
|
|
|
|
+ case AXTextSelectionGranularityWord:
|
|
|
|
|
+ return "AXTextSelectionGranularityWord";
|
|
|
|
|
+ case AXTextSelectionGranularityLine:
|
|
|
|
|
+ return "AXTextSelectionGranularityLine";
|
|
|
|
|
+ case AXTextSelectionGranularitySentence:
|
|
|
|
|
+ return "AXTextSelectionGranularitySentence";
|
|
|
|
|
+ case AXTextSelectionGranularityParagraph:
|
|
|
|
|
+ return "AXTextSelectionGranularityParagraph";
|
|
|
|
|
+ case AXTextSelectionGranularityPage:
|
|
|
|
|
+ return "AXTextSelectionGranularityPage";
|
|
|
|
|
+ case AXTextSelectionGranularityDocument:
|
|
|
|
|
+ return "AXTextSelectionGranularityDocument";
|
|
|
|
|
+ case AXTextSelectionGranularityAll:
|
|
|
|
|
+ return "AXTextSelectionGranularityAll";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return "";
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const char* ToString(AXTextEditType type) {
|
|
|
|
|
+ switch (type) {
|
|
|
|
|
+ case AXTextEditTypeUnknown:
|
|
|
|
|
+ return "AXTextEditTypeUnknown";
|
|
|
|
|
+ case AXTextEditTypeDelete:
|
|
|
|
|
+ return "AXTextEditTypeDelete";
|
|
|
|
|
+ case AXTextEditTypeInsert:
|
|
|
|
|
+ return "AXTextEditTypeInsert";
|
|
|
|
|
+ case AXTextEditTypeTyping:
|
|
|
|
|
+ return "AXTextEditTypeTyping";
|
|
|
|
|
+ case AXTextEditTypeDictation:
|
|
|
|
|
+ return "AXTextEditTypeDictation";
|
|
|
|
|
+ case AXTextEditTypeCut:
|
|
|
|
|
+ return "AXTextEditTypeCut";
|
|
|
|
|
+ case AXTextEditTypePaste:
|
|
|
|
|
+ return "AXTextEditTypePaste";
|
|
|
|
|
+ case AXTextEditTypeAttributesChange:
|
|
|
|
|
+ return "AXTextEditTypeAttributesChange";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return "";
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+} // namespace ui
|