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

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

Issue 1762143002: Use unique IDs for accessibility nodes on Android (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix null obj deref in DCHECK Created 4 years, 9 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_win.cc
diff --git a/content/browser/accessibility/browser_accessibility_win.cc b/content/browser/accessibility/browser_accessibility_win.cc
index a78d8b2f0aac81fe59c296b4b17cc0184eee8388..bf3b0affdd751d7d45d1dc592723149d05660882 100644
--- a/content/browser/accessibility/browser_accessibility_win.cc
+++ b/content/browser/accessibility/browser_accessibility_win.cc
@@ -42,10 +42,6 @@ const GUID GUID_IAccessibleContentDocument = {
const base::char16 BrowserAccessibilityWin::kEmbeddedCharacter = L'\xfffc';
-// static
-LONG BrowserAccessibilityWin::next_unique_id_win_ =
- base::win::kFirstBrowserAccessibilityManagerAccessibilityId;
-
//
// BrowserAccessibilityRelation
//
@@ -150,7 +146,7 @@ STDMETHODIMP BrowserAccessibilityRelation::get_target(long target_index,
return E_FAIL;
*target = static_cast<IAccessible*>(
- result->ToBrowserAccessibilityWin()->NewReference());
+ ToBrowserAccessibilityWin(result)->NewReference());
return S_OK;
}
@@ -207,29 +203,10 @@ BrowserAccessibility* BrowserAccessibility::Create() {
return instance->NewReference();
}
-const BrowserAccessibilityWin* BrowserAccessibility::ToBrowserAccessibilityWin()
- const {
- return static_cast<const BrowserAccessibilityWin*>(this);
-}
-
-BrowserAccessibilityWin* BrowserAccessibility::ToBrowserAccessibilityWin() {
- return static_cast<BrowserAccessibilityWin*>(this);
-}
-
BrowserAccessibilityWin::BrowserAccessibilityWin()
: win_attributes_(new WinAttributes()),
previous_scroll_x_(0),
previous_scroll_y_(0) {
- // Start unique IDs at -1 and decrement each time, because get_accChild
- // uses positive IDs to enumerate children, so we use negative IDs to
- // clearly distinguish between indices and unique IDs.
- unique_id_win_ = next_unique_id_win_;
- if (next_unique_id_win_ ==
- base::win::kLastBrowserAccessibilityManagerAccessibilityId) {
- next_unique_id_win_ =
- base::win::kFirstBrowserAccessibilityManagerAccessibilityId;
- }
- next_unique_id_win_--;
}
BrowserAccessibilityWin::~BrowserAccessibilityWin() {
@@ -281,7 +258,7 @@ STDMETHODIMP BrowserAccessibilityWin::accHitTest(LONG x_left,
child->lVal = CHILDID_SELF;
} else {
child->vt = VT_DISPATCH;
- child->pdispVal = result->ToBrowserAccessibilityWin()->NewReference();
+ child->pdispVal = ToBrowserAccessibilityWin(result)->NewReference();
}
return S_OK;
}
@@ -355,7 +332,7 @@ STDMETHODIMP BrowserAccessibilityWin::accNavigate(LONG nav_dir,
}
end->vt = VT_DISPATCH;
- end->pdispVal = result->ToBrowserAccessibilityWin()->NewReference();
+ end->pdispVal = ToBrowserAccessibilityWin(result)->NewReference();
return S_OK;
}
@@ -511,7 +488,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_accParent(IDispatch** disp_parent) {
if (!disp_parent)
return E_INVALIDARG;
- IAccessible* parent_obj = GetParent()->ToBrowserAccessibilityWin();
+ IAccessible* parent_obj = ToBrowserAccessibilityWin(GetParent());
if (parent_obj == NULL) {
// This happens if we're the root of the tree;
// return the IAccessible for the window.
@@ -646,7 +623,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_accSelection(VARIANT* selected) {
if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) {
selected->vt = VT_DISPATCH;
selected->pdispVal =
- InternalGetChild(i)->ToBrowserAccessibilityWin()->NewReference();
+ ToBrowserAccessibilityWin(InternalGetChild(i))->NewReference();
return S_OK;
}
}
@@ -661,7 +638,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_accSelection(VARIANT* selected) {
if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) {
enum_variant->ItemAt(index)->vt = VT_DISPATCH;
enum_variant->ItemAt(index)->pdispVal =
- InternalGetChild(i)->ToBrowserAccessibilityWin()->NewReference();
+ ToBrowserAccessibilityWin(InternalGetChild(i))->NewReference();
++index;
}
}
@@ -751,7 +728,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_uniqueID(LONG* unique_id) {
if (!unique_id)
return E_INVALIDARG;
- *unique_id = unique_id_win_;
+ *unique_id = -unique_id_;
return S_OK;
}
@@ -1289,7 +1266,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long cell_index,
int cell_id = unique_cell_ids[cell_index];
BrowserAccessibilityWin* cell =
- manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin();
+ ToBrowserAccessibilityWin(manager()->GetFromID(cell_id));
int col_index;
if (cell &&
cell->GetIntAttribute(
@@ -1394,7 +1371,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowDescription(long row,
for (int i = 0; i < columns; ++i) {
int cell_id = cell_ids[row * columns + i];
BrowserAccessibilityWin* cell =
- manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin();
+ ToBrowserAccessibilityWin(manager()->GetFromID(cell_id));
if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) {
base::string16 cell_name = cell->GetString16Attribute(
ui::AX_ATTR_NAME);
@@ -1439,7 +1416,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowExtentAt(long row,
GetIntListAttribute(ui::AX_ATTR_CELL_IDS);
int cell_id = cell_ids[row * columns + column];
BrowserAccessibilityWin* cell =
- manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin();
+ ToBrowserAccessibilityWin(manager()->GetFromID(cell_id));
int rowspan;
if (cell &&
cell->GetIntAttribute(
@@ -1477,7 +1454,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long cell_index,
int cell_id = unique_cell_ids[cell_index];
BrowserAccessibilityWin* cell =
- manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin();
+ ToBrowserAccessibilityWin(manager()->GetFromID(cell_id));
int cell_row_index;
if (cell &&
cell->GetIntAttribute(
@@ -1606,7 +1583,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowColumnExtentsAtIndex(
int cell_id = unique_cell_ids[index];
BrowserAccessibilityWin* cell =
- manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin();
+ ToBrowserAccessibilityWin(manager()->GetFromID(cell_id));
int rowspan;
int colspan;
if (cell &&
@@ -1765,7 +1742,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnHeaderCells(
for (int i = 0; i < rows; ++i) {
int cell_id = cell_ids[i * columns + column];
BrowserAccessibilityWin* cell =
- manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin();
+ ToBrowserAccessibilityWin(manager()->GetFromID(cell_id));
if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER)
(*n_column_header_cells)++;
}
@@ -1778,7 +1755,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnHeaderCells(
BrowserAccessibility* cell = manager()->GetFromID(cell_id);
if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) {
(*cell_accessibles)[index] = static_cast<IAccessible*>(
- cell->ToBrowserAccessibilityWin()->NewReference());
+ ToBrowserAccessibilityWin(cell)->NewReference());
++index;
}
}
@@ -1875,7 +1852,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowHeaderCells(
BrowserAccessibility* cell = manager()->GetFromID(cell_id);
if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) {
(*cell_accessibles)[index] = static_cast<IAccessible*>(
- cell->ToBrowserAccessibilityWin()->NewReference());
+ ToBrowserAccessibilityWin(cell)->NewReference());
++index;
}
}
@@ -1970,7 +1947,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_table(IUnknown** table) {
}
*table = static_cast<IAccessibleTable*>(
- find_table->ToBrowserAccessibilityWin()->NewReference());
+ ToBrowserAccessibilityWin(find_table)->NewReference());
return S_OK;
}
@@ -2412,7 +2389,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_hyperlink(
int32_t id = hyperlinks()[index];
BrowserAccessibilityWin* child =
- manager()->GetFromID(id)->ToBrowserAccessibilityWin();
+ ToBrowserAccessibilityWin(manager()->GetFromID(id));
if (child) {
*hyperlink = static_cast<IAccessibleHyperlink*>(child->NewReference());
return S_OK;
@@ -2510,7 +2487,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_startIndex(long* index) {
const auto parent = GetParent();
if (parent) {
hypertext_offset =
- parent->ToBrowserAccessibilityWin()->GetHypertextOffsetFromChild(*this);
+ ToBrowserAccessibilityWin(parent)->GetHypertextOffsetFromChild(*this);
}
*index = static_cast<LONG>(hypertext_offset);
return S_OK;
@@ -2751,7 +2728,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_nodeInfo(
*name_space_id = 0;
*node_value = SysAllocString(value().c_str());
*num_children = PlatformChildCount();
- *unique_id = unique_id_win_;
+ *unique_id = -unique_id_;
if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA ||
GetRole() == ui::AX_ROLE_WEB_AREA) {
@@ -2889,7 +2866,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) {
if (!node)
return E_INVALIDARG;
- *node = GetParent()->ToBrowserAccessibilityWin()->NewReference();
+ *node = ToBrowserAccessibilityWin(GetParent())->NewReference();
return S_OK;
}
@@ -2905,7 +2882,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_firstChild(ISimpleDOMNode** node) {
return S_FALSE;
}
- *node = PlatformGetChild(0)->ToBrowserAccessibilityWin()->NewReference();
+ *node = ToBrowserAccessibilityWin(PlatformGetChild(0))->NewReference();
return S_OK;
}
@@ -2921,8 +2898,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_lastChild(ISimpleDOMNode** node) {
return S_FALSE;
}
- *node = PlatformGetChild(PlatformChildCount() - 1)
- ->ToBrowserAccessibilityWin()->NewReference();
+ *node = ToBrowserAccessibilityWin(
+ PlatformGetChild(PlatformChildCount() - 1))->NewReference();
return S_OK;
}
@@ -2939,8 +2916,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_previousSibling(
return S_FALSE;
}
- *node = GetParent()->InternalGetChild(GetIndexInParent() - 1)->
- ToBrowserAccessibilityWin()->NewReference();
+ *node = ToBrowserAccessibilityWin(
+ GetParent()->InternalGetChild(GetIndexInParent() - 1))->NewReference();
return S_OK;
}
@@ -2959,8 +2936,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) {
return S_FALSE;
}
- *node = GetParent()->InternalGetChild(GetIndexInParent() + 1)->
- ToBrowserAccessibilityWin()->NewReference();
+ *node = ToBrowserAccessibilityWin(
+ GetParent()->InternalGetChild(GetIndexInParent() + 1))->NewReference();
return S_OK;
}
@@ -2982,7 +2959,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_childAt(
return S_FALSE;
}
- *node = child->ToBrowserAccessibilityWin()->NewReference();
+ *node = ToBrowserAccessibilityWin(child)->NewReference();
return S_OK;
}
@@ -3101,7 +3078,7 @@ STDMETHODIMP BrowserAccessibilityWin::QueryService(REFGUID guid_service,
BrowserAccessibility* node = this;
while (node->GetParent())
node = node->GetParent()->manager()->GetRoot();
- return node->ToBrowserAccessibilityWin()->QueryInterface(
+ return ToBrowserAccessibilityWin(node)->QueryInterface(
IID_IAccessible2, object);
}
@@ -3458,7 +3435,7 @@ void BrowserAccessibilityWin::UpdateStep2ComputeHypertext() {
// child object it points to.
for (unsigned int i = 0; i < PlatformChildCount(); ++i) {
BrowserAccessibilityWin* child =
- PlatformGetChild(i)->ToBrowserAccessibilityWin();
+ ToBrowserAccessibilityWin(PlatformGetChild(i));
DCHECK(child);
// Similar to Firefox, we don't expose text-only objects in IA2 hypertext.
if (child->IsTextOnlyObject()) {
@@ -3562,7 +3539,7 @@ void BrowserAccessibilityWin::UpdateStep3FireEvents(bool is_subtree_creation) {
// Changing a static text node can affect the IAccessibleText hypertext
// of the parent node, so force an update on the parent.
- BrowserAccessibilityWin* parent = GetParent()->ToBrowserAccessibilityWin();
+ BrowserAccessibilityWin* parent = ToBrowserAccessibilityWin(GetParent());
if (parent && IsTextOnlyObject() &&
name() != old_win_attributes_->name) {
parent->UpdateStep1ComputeWinAttributes();
@@ -3611,10 +3588,10 @@ BrowserAccessibilityWin* BrowserAccessibilityWin::GetTargetFromChildID(
return this;
if (child_id >= 1 && child_id <= static_cast<LONG>(PlatformChildCount()))
- return PlatformGetChild(child_id - 1)->ToBrowserAccessibilityWin();
+ return ToBrowserAccessibilityWin(PlatformGetChild(child_id - 1));
- return manager()->ToBrowserAccessibilityManagerWin()->
- GetFromUniqueIdWin(child_id);
+ return ToBrowserAccessibilityWin(
+ BrowserAccessibility::GetFromUniqueID(-child_id));
}
HRESULT BrowserAccessibilityWin::GetStringAttributeAsBstr(
@@ -3687,7 +3664,7 @@ bool BrowserAccessibilityWin::IsHyperlink() const {
const auto parent = GetParent();
if (parent) {
hyperlink_index =
- parent->ToBrowserAccessibilityWin()->GetHyperlinkIndexFromChild(*this);
+ ToBrowserAccessibilityWin(parent)->GetHyperlinkIndexFromChild(*this);
}
if (hyperlink_index >= 0)
@@ -3734,7 +3711,7 @@ int32_t BrowserAccessibilityWin::GetHypertextOffsetFromChild(
DCHECK_LT(index_in_parent, static_cast<int32_t>(InternalChildCount()));
for (uint32_t i = 0; i < static_cast<uint32_t>(index_in_parent); ++i) {
const BrowserAccessibilityWin* sibling =
- InternalGetChild(i)->ToBrowserAccessibilityWin();
+ ToBrowserAccessibilityWin(InternalGetChild(i));
DCHECK(sibling);
if (sibling->IsTextOnlyObject())
hypertextOffset += sibling->GetText().size();
@@ -3753,11 +3730,11 @@ int32_t BrowserAccessibilityWin::GetHypertextOffsetFromChild(
int32_t BrowserAccessibilityWin::GetHypertextOffsetFromDescendant(
const BrowserAccessibilityWin& descendant) const {
- auto parent_object = descendant.GetParent()->ToBrowserAccessibilityWin();
+ auto parent_object = ToBrowserAccessibilityWin(descendant.GetParent());
auto current_object = const_cast<BrowserAccessibilityWin*>(&descendant);
while (parent_object && parent_object != this) {
current_object = parent_object;
- parent_object = current_object->GetParent()->ToBrowserAccessibilityWin();
+ parent_object = ToBrowserAccessibilityWin(current_object->GetParent());
}
if (!parent_object)
return -1;
@@ -3839,7 +3816,7 @@ int BrowserAccessibilityWin::GetHypertextOffsetFromEndpoint(
int BrowserAccessibilityWin::GetSelectionAnchor() const {
int32_t anchor_id = manager()->GetTreeData().sel_anchor_object_id;
const auto anchor_object =
- manager()->GetFromID(anchor_id)->ToBrowserAccessibilityWin();
+ ToBrowserAccessibilityWin(manager()->GetFromID(anchor_id));
if (!anchor_object)
return -1;
@@ -3850,7 +3827,7 @@ int BrowserAccessibilityWin::GetSelectionAnchor() const {
int BrowserAccessibilityWin::GetSelectionFocus() const {
int32_t focus_id = manager()->GetTreeData().sel_focus_object_id;
const auto focus_object =
- manager()->GetFromID(focus_id)->ToBrowserAccessibilityWin();
+ ToBrowserAccessibilityWin(manager()->GetFromID(focus_id));
if (!focus_object)
return -1;
@@ -4048,7 +4025,7 @@ LONG BrowserAccessibilityWin::FindBoundary(
}
BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromID(int32_t id) {
- return manager()->GetFromID(id)->ToBrowserAccessibilityWin();
+ return ToBrowserAccessibilityWin(manager()->GetFromID(id));
}
bool BrowserAccessibilityWin::IsListBoxOptionOrMenuListOption() {
@@ -4703,4 +4680,15 @@ void BrowserAccessibilityWin::InitRoleAndState() {
win_attributes_->ia2_state = ia2_state;
}
+BrowserAccessibilityWin* ToBrowserAccessibilityWin(BrowserAccessibility* obj) {
+ DCHECK(!obj || obj->IsNative());
+ return static_cast<BrowserAccessibilityWin*>(obj);
+}
+
+const BrowserAccessibilityWin*
+ToBrowserAccessibilityWin(const BrowserAccessibility* obj) {
+ DCHECK(!obj || obj->IsNative());
+ return static_cast<const BrowserAccessibilityWin*>(obj);
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698