Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(588)

Unified Diff: content/browser/accessibility/browser_accessibility_com_win.cc

Issue 2931893002: More precise use of multiline state (Closed)
Patch Set: Rebase Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/accessibility/browser_accessibility_com_win.cc
diff --git a/content/browser/accessibility/browser_accessibility_com_win.cc b/content/browser/accessibility/browser_accessibility_com_win.cc
index 8ec9e981b9f157a48844fd71d957dab25cbeaf93..c415c6b96e5b9a3f71b873f34c53f5e2bca57a4c 100644
--- a/content/browser/accessibility/browser_accessibility_com_win.cc
+++ b/content/browser/accessibility/browser_accessibility_com_win.cc
@@ -2932,8 +2932,7 @@ STDMETHODIMP BrowserAccessibilityComWin::get_nodeInfo(
*num_children = owner()->PlatformChildCount();
*unique_id = -owner()->unique_id();
- if (owner()->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA ||
- owner()->GetRole() == ui::AX_ROLE_WEB_AREA) {
+ if (IsDocument()) {
*node_type = NODETYPE_DOCUMENT;
} else if (owner()->IsTextOnlyObject()) {
*node_type = NODETYPE_TEXT;
@@ -3777,8 +3776,7 @@ void BrowserAccessibilityComWin::UpdateStep1ComputeWinAttributes() {
win_attributes_->ia2_attributes.push_back(L"valuetext:" + value);
} else {
// On Windows, the value of a document should be its url.
- if (owner()->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA ||
- owner()->GetRole() == ui::AX_ROLE_WEB_AREA) {
+ if (IsDocument()) {
value = base::UTF8ToUTF16(Manager()->GetTreeData().url);
}
// If this doesn't have a value and is linked then set its value to the url
@@ -4302,6 +4300,27 @@ void BrowserAccessibilityComWin::IntAttributeToIA2(ui::AXIntAttribute attribute,
}
}
+bool BrowserAccessibilityComWin::IsDocument() const {
+ return owner()->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA ||
+ owner()->GetRole() == ui::AX_ROLE_WEB_AREA;
+}
+
+bool BrowserAccessibilityComWin::IsRootEditable() const {
+ if (!owner()->HasState(ui::AX_STATE_EDITABLE))
+ return false;
+
+ if (IsDocument())
+ return true;
+
+ BrowserAccessibility* parent = owner()->PlatformGetParent();
dougt 2017/06/23 18:27:18 I am confused by this. GetParent() is just retur
aleventhal 2017/06/28 14:20:57 It does what I want, but maybe it needs a differen
+ return !parent || !parent->HasState(ui::AX_STATE_EDITABLE);
+}
+
+bool BrowserAccessibilityComWin::IsEditBoxRole() const {
+ const int32_t role = owner()->GetRole();
+ return role == ui::AX_ROLE_TEXT_FIELD || role == ui::AX_ROLE_SEARCH_BOX;
+}
+
bool BrowserAccessibilityComWin::IsHyperlink() const {
int32_t hyperlink_index = -1;
auto* parent = owner()->PlatformGetParent();
@@ -4363,7 +4382,7 @@ int32_t BrowserAccessibilityComWin::GetHypertextOffsetFromChild(
// Handle the case when we are dealing with a direct text-only child.
// (Note that this object might be a platform leaf, e.g. an ARIA searchbox,
// and so |owner()->InternalChild...| functions need to be used. Also,
- // direct text-only children should not be present at tree roots and so no
+ // direct text-only children should not be present at tree s and so no
dougt 2017/06/23 18:27:18 I don't think you want this change.
aleventhal 2017/06/28 14:20:57 Done.
// cross-tree traversal is necessary.)
if (child.owner()->IsTextOnlyObject()) {
int32_t hypertextOffset = 0;
@@ -5078,8 +5097,22 @@ void BrowserAccessibilityComWin::InitRoleAndState() {
ia_state |= STATE_SYSTEM_HOTTRACKED;
}
- if (owner()->HasState(ui::AX_STATE_EDITABLE))
+ const bool is_editable = owner()->HasState(ui::AX_STATE_EDITABLE);
+ if (is_editable) {
ia2_state |= IA2_STATE_EDITABLE;
+ }
dougt 2017/06/23 18:27:17 Since this is a one liner, you don't need the curl
aleventhal 2017/06/28 14:20:57 Done.
+
+ if (is_editable ? IsRootEditable() : IsEditBoxRole()) {
+ // Support multi/single line states if root edtiable or appropriate role.
+ // We support the edit box roles even if the area is not actually editable,
+ // because it is technically feasible for JS to implement the edit box
+ // by controlling selection.
+ if (owner()->HasState(ui::AX_STATE_MULTILINE)) {
+ ia2_state |= IA2_STATE_MULTI_LINE;
+ } else {
+ ia2_state |= IA2_STATE_SINGLE_LINE;
+ }
+ }
if (!owner()->GetStringAttribute(ui::AX_ATTR_AUTO_COMPLETE).empty())
ia2_state |= IA2_STATE_SUPPORTS_AUTOCOMPLETION;
@@ -5477,11 +5510,6 @@ void BrowserAccessibilityComWin::InitRoleAndState() {
case ui::AX_ROLE_TEXT_FIELD:
case ui::AX_ROLE_SEARCH_BOX:
ia_role = ROLE_SYSTEM_TEXT;
- if (owner()->HasState(ui::AX_STATE_MULTILINE)) {
- ia2_state |= IA2_STATE_MULTI_LINE;
- } else {
- ia2_state |= IA2_STATE_SINGLE_LINE;
- }
if (owner()->HasState(ui::AX_STATE_READ_ONLY))
ia_state |= STATE_SYSTEM_READONLY;
ia2_state |= IA2_STATE_SELECTABLE_TEXT;

Powered by Google App Engine
This is Rietveld 408576698