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

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

Issue 21269002: Make AccessibilityNodeData more compact. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix windows compile Created 7 years, 5 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 792adc4440d08fa643c148f700ed9353ac1d041c..df048d5ab18734eebb9a30913f5479872198aafa 100644
--- a/content/browser/accessibility/browser_accessibility_win.cc
+++ b/content/browser/accessibility/browser_accessibility_win.cc
@@ -457,7 +457,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_accName(VARIANT var_id, BSTR* name) {
if (!target)
return E_INVALIDARG;
- string16 name_str = target->name_;
+ std::string name_str;
+ target->GetStringAttribute(AccessibilityNodeData::ATTR_NAME, &name_str);
// If the name is empty, see if it's labeled by another element.
if (name_str.empty()) {
@@ -474,7 +475,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_accName(VARIANT var_id, BSTR* name) {
if (name_str.empty())
return S_FALSE;
- *name = SysAllocString(name_str.c_str());
+ *name = SysAllocString(UTF8ToUTF16(name_str).c_str());
DCHECK(*name);
return S_OK;
@@ -557,10 +558,32 @@ STDMETHODIMP BrowserAccessibilityWin::get_accValue(VARIANT var_id,
if (!target)
return E_INVALIDARG;
- *value = SysAllocString(target->value_.c_str());
+ if (ia_role_ == ROLE_SYSTEM_PROGRESSBAR ||
+ ia_role_ == ROLE_SYSTEM_SCROLLBAR ||
+ ia_role_ == ROLE_SYSTEM_SLIDER) {
+ string16 value_text = GetValueText();
+ *value = SysAllocString(value_text.c_str());
+ DCHECK(*value);
+ return S_OK;
+ }
- DCHECK(*value);
- return S_OK;
+ // Expose color well value.
+ if (ia2_role_ == IA2_ROLE_COLOR_CHOOSER) {
aboxhall 2013/08/07 17:16:09 Does this block belong in GetValueText() as well?
dmazzoni 2013/08/07 17:48:18 Possibly, but that would be a change in functional
+ int r, g, b;
+ GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_RED, &r);
+ GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN, &g);
+ GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_BLUE, &b);
+ string16 value_text;
+ value_text = base::IntToString16((r * 100) / 255) + L"% red " +
+ base::IntToString16((g * 100) / 255) + L"% green " +
+ base::IntToString16((b * 100) / 255) + L"% blue";
+ *value = SysAllocString(value_text.c_str());
+ DCHECK(*value);
+ return S_OK;
+ }
+
+ return target->GetStringAttributeAsBstr(
+ AccessibilityNodeData::ATTR_VALUE, value);
}
STDMETHODIMP BrowserAccessibilityWin::get_accHelpTopic(BSTR* help_file,
@@ -1014,9 +1037,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_accessibleAt(
if (row < 0 || row >= rows || column < 0 || column >= columns)
return E_INVALIDARG;
- DCHECK_EQ(columns * rows, static_cast<int>(cell_ids_.size()));
+ const std::vector<int32>& cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
+ DCHECK_EQ(columns * rows, static_cast<int>(cell_ids.size()));
- int cell_id = cell_ids_[row * columns + column];
+ int cell_id = cell_ids[row * columns + column];
BrowserAccessibilityWin* cell = GetFromRendererID(cell_id);
if (cell) {
*accessible = static_cast<IAccessible*>(cell->NewReference());
@@ -1061,10 +1086,14 @@ STDMETHODIMP BrowserAccessibilityWin::get_childIndex(long row,
if (row < 0 || row >= rows || column < 0 || column >= columns)
return E_INVALIDARG;
- DCHECK_EQ(columns * rows, static_cast<int>(cell_ids_.size()));
- int cell_id = cell_ids_[row * columns + column];
- for (size_t i = 0; i < unique_cell_ids_.size(); ++i) {
- if (unique_cell_ids_[i] == cell_id) {
+ const std::vector<int32>& cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
+ const std::vector<int32>& unique_cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
+ DCHECK_EQ(columns * rows, static_cast<int>(cell_ids.size()));
+ int cell_id = cell_ids[row * columns + column];
+ for (size_t i = 0; i < unique_cell_ids.size(); ++i) {
+ if (unique_cell_ids[i] == cell_id) {
*cell_index = (long)i;
return S_OK;
}
@@ -1094,13 +1123,17 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnDescription(long column,
if (column < 0 || column >= columns)
return E_INVALIDARG;
+ const std::vector<int32>& cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
for (int i = 0; i < rows; ++i) {
- int cell_id = cell_ids_[i * columns + column];
+ int cell_id = cell_ids[i * columns + column];
BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>(
manager_->GetFromRendererID(cell_id));
if (cell && cell->role_ == AccessibilityNodeData::ROLE_COLUMN_HEADER) {
- if (cell->name_.size() > 0) {
- *description = SysAllocString(cell->name_.c_str());
+ string16 cell_name;
+ cell->GetStringAttribute(AccessibilityNodeData::ATTR_NAME, &cell_name);
+ if (cell_name.size() > 0) {
+ *description = SysAllocString(cell_name.c_str());
return S_OK;
}
@@ -1135,7 +1168,9 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnExtentAt(
if (row < 0 || row >= rows || column < 0 || column >= columns)
return E_INVALIDARG;
- int cell_id = cell_ids_[row * columns + column];
+ const std::vector<int32>& cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
+ int cell_id = cell_ids[row * columns + column];
BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>(
manager_->GetFromRendererID(cell_id));
int colspan;
@@ -1165,13 +1200,15 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long cell_index,
if (!column_index)
return E_INVALIDARG;
- int cell_id_count = static_cast<int>(unique_cell_ids_.size());
+ const std::vector<int32>& unique_cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
+ int cell_id_count = static_cast<int>(unique_cell_ids.size());
if (cell_index < 0)
return E_INVALIDARG;
if (cell_index >= cell_id_count)
return S_FALSE;
- int cell_id = unique_cell_ids_[cell_index];
+ int cell_id = unique_cell_ids[cell_index];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
int col_index;
@@ -1273,13 +1310,17 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowDescription(long row,
if (row < 0 || row >= rows)
return E_INVALIDARG;
+ const std::vector<int32>& cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
for (int i = 0; i < columns; ++i) {
- int cell_id = cell_ids_[row * columns + i];
+ int cell_id = cell_ids[row * columns + i];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
if (cell && cell->role_ == AccessibilityNodeData::ROLE_ROW_HEADER) {
- if (cell->name_.size() > 0) {
- *description = SysAllocString(cell->name_.c_str());
+ string16 cell_name;
+ cell->GetStringAttribute(AccessibilityNodeData::ATTR_NAME, &cell_name);
+ if (cell_name.size() > 0) {
+ *description = SysAllocString(cell_name.c_str());
return S_OK;
}
@@ -1313,7 +1354,9 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowExtentAt(long row,
if (row < 0 || row >= rows || column < 0 || column >= columns)
return E_INVALIDARG;
- int cell_id = cell_ids_[row * columns + column];
+ const std::vector<int32>& cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
+ int cell_id = cell_ids[row * columns + column];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
int rowspan;
@@ -1343,13 +1386,15 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long cell_index,
if (!row_index)
return E_INVALIDARG;
- int cell_id_count = static_cast<int>(unique_cell_ids_.size());
+ const std::vector<int32>& unique_cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
+ int cell_id_count = static_cast<int>(unique_cell_ids.size());
if (cell_index < 0)
return E_INVALIDARG;
if (cell_index >= cell_id_count)
return S_FALSE;
- int cell_id = unique_cell_ids_[cell_index];
+ int cell_id = unique_cell_ids[cell_index];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
int cell_row_index;
@@ -1470,13 +1515,15 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowColumnExtentsAtIndex(
if (!row || !column || !row_extents || !column_extents || !is_selected)
return E_INVALIDARG;
- int cell_id_count = static_cast<int>(unique_cell_ids_.size());
+ const std::vector<int32>& unique_cell_ids = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
+ int cell_id_count = static_cast<int>(unique_cell_ids.size());
if (index < 0)
return E_INVALIDARG;
if (index >= cell_id_count)
return S_FALSE;
- int cell_id = unique_cell_ids_[index];
+ int cell_id = unique_cell_ids[index];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
int rowspan;
@@ -1610,8 +1657,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnHeaderCells(
if (columns <= 0 || rows <= 0 || column < 0 || column >= columns)
return S_FALSE;
+ const std::vector<int32>& cell_ids = table->GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
+
for (int i = 0; i < rows; ++i) {
- int cell_id = table->cell_ids()[i * columns + column];
+ int cell_id = cell_ids[i * columns + column];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
if (cell && cell->role_ == AccessibilityNodeData::ROLE_COLUMN_HEADER)
@@ -1622,7 +1672,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_columnHeaderCells(
(*n_column_header_cells) * sizeof(cell_accessibles[0])));
int index = 0;
for (int i = 0; i < rows; ++i) {
- int cell_id = table->cell_ids()[i * columns + column];
+ int cell_id = cell_ids[i * columns + column];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
if (cell && cell->role_ == AccessibilityNodeData::ROLE_COLUMN_HEADER) {
@@ -1706,8 +1756,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowHeaderCells(
if (columns <= 0 || rows <= 0 || row < 0 || row >= rows)
return S_FALSE;
+ const std::vector<int32>& cell_ids = table->GetIntListAttribute(
+ AccessibilityNodeData::ATTR_CELL_IDS);
+
for (int i = 0; i < columns; ++i) {
- int cell_id = table->cell_ids()[row * columns + i];
+ int cell_id = cell_ids[row * columns + i];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
if (cell && cell->role_ == AccessibilityNodeData::ROLE_ROW_HEADER)
@@ -1718,7 +1771,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_rowHeaderCells(
(*n_row_header_cells) * sizeof(cell_accessibles[0])));
int index = 0;
for (int i = 0; i < columns; ++i) {
- int cell_id = table->cell_ids()[row * columns + i];
+ int cell_id = cell_ids[row * columns + i];
BrowserAccessibilityWin* cell =
manager_->GetFromRendererID(cell_id)->ToBrowserAccessibilityWin();
if (cell && cell->role_ == AccessibilityNodeData::ROLE_ROW_HEADER) {
@@ -2340,7 +2393,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_nodeInfo(
*node_name = NULL;
*name_space_id = 0;
- *node_value = SysAllocString(value_.c_str());
+ GetStringAttributeAsBstr(AccessibilityNodeData::ATTR_VALUE, node_value);
*num_children = children_.size();
*unique_id = unique_id_win_;
@@ -2373,9 +2426,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_attributes(
*num_attribs = html_attributes_.size();
for (unsigned short i = 0; i < *num_attribs; ++i) {
- attrib_names[i] = SysAllocString(html_attributes_[i].first.c_str());
+ attrib_names[i] = SysAllocString(
+ UTF8ToUTF16(html_attributes_[i].first).c_str());
name_space_id[i] = 0;
- attrib_values[i] = SysAllocString(html_attributes_[i].second.c_str());
+ attrib_values[i] = SysAllocString(
+ UTF8ToUTF16(html_attributes_[i].second).c_str());
}
return S_OK;
}
@@ -2394,10 +2449,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_attributesForNames(
for (unsigned short i = 0; i < num_attribs; ++i) {
name_space_id[i] = 0;
bool found = false;
- string16 name = (LPCWSTR)attrib_names[i];
+ std::string name = UTF16ToUTF8((LPCWSTR)attrib_names[i]);
for (unsigned int j = 0; j < html_attributes_.size(); ++j) {
if (html_attributes_[j].first == name) {
- attrib_values[i] = SysAllocString(html_attributes_[j].second.c_str());
+ attrib_values[i] = SysAllocString(
+ UTF8ToUTF16(html_attributes_[j].second).c_str());
found = true;
break;
}
@@ -2579,12 +2635,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_domText(BSTR* dom_text) {
if (!dom_text)
return E_INVALIDARG;
- if (name_.empty())
- return S_FALSE;
-
- *dom_text = SysAllocString(name_.c_str());
- DCHECK(*dom_text);
- return S_OK;
+ return GetStringAttributeAsBstr(
+ AccessibilityNodeData::ATTR_NAME, dom_text);
}
//
@@ -2773,24 +2825,7 @@ void BrowserAccessibilityWin::PreInitialize() {
if (ia_role_ == ROLE_SYSTEM_PROGRESSBAR ||
ia_role_ == ROLE_SYSTEM_SCROLLBAR ||
ia_role_ == ROLE_SYSTEM_SLIDER) {
- float fval;
- if (value_.empty() &&
- GetFloatAttribute(AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &fval)) {
- // TODO(dmazzoni): Use ICU to localize this?
- value_ = UTF8ToUTF16(base::DoubleToString(fval));
- }
- ia2_attributes_.push_back(L"valuetext:" + value_);
- }
-
- // Expose color well value.
- if (ia2_role_ == IA2_ROLE_COLOR_CHOOSER) {
aboxhall 2013/08/07 17:16:09 I guess this was never doing anything, but should
dmazzoni 2013/08/07 17:48:18 It's just being moved. The main reason I moved it
- int r, g, b;
- GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_RED, &r);
- GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN, &g);
- GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_BLUE, &b);
- value_ = base::IntToString16((r * 100) / 255) + L"% red " +
- base::IntToString16((g * 100) / 255) + L"% green " +
- base::IntToString16((b * 100) / 255) + L"% blue";
+ ia2_attributes_.push_back(L"valuetext:" + GetValueText());
}
// Expose table cell index.
@@ -2799,7 +2834,8 @@ void BrowserAccessibilityWin::PreInitialize() {
while (table && table->role() != AccessibilityNodeData::ROLE_TABLE)
table = table->parent();
if (table) {
- const std::vector<int32>& unique_cell_ids = table->unique_cell_ids();
+ const std::vector<int32>& unique_cell_ids = table->GetIntListAttribute(
+ AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
for (size_t i = 0; i < unique_cell_ids.size(); ++i) {
if (unique_cell_ids[i] == renderer_id_) {
ia2_attributes_.push_back(
@@ -2830,11 +2866,12 @@ void BrowserAccessibilityWin::PreInitialize() {
// always returns the primary name in "name" and the secondary name,
// if any, in "description".
- string16 description, help, title_attr;
+ std::string name, value, description, help, title_attr;
int title_elem_id = 0;
- GetIntAttribute(AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, &title_elem_id);
+ GetStringAttribute(AccessibilityNodeData::ATTR_NAME, &name);
GetStringAttribute(AccessibilityNodeData::ATTR_DESCRIPTION, &description);
GetStringAttribute(AccessibilityNodeData::ATTR_HELP, &help);
+ GetIntAttribute(AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, &title_elem_id);
// WebKit annoyingly puts the title in the description if there's no other
// description, which just confuses the rest of the logic. Put it back.
@@ -2844,42 +2881,40 @@ void BrowserAccessibilityWin::PreInitialize() {
help.empty()) {
help = description;
description.clear();
- string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION].clear();
- string_attributes_[AccessibilityNodeData::ATTR_HELP] = help;
}
// Now implement the main logic: the descripion should become the name if
// it's nonempty, and the help should become the description if
// there's no description - or the name if there's no name or description.
if (!description.empty()) {
- name_ = description;
+ name = description;
description.clear();
- string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = description;
}
if (!help.empty() && description.empty()) {
description = help;
- string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = help;
- string_attributes_[AccessibilityNodeData::ATTR_HELP].clear();
+ help.clear();
}
if (!description.empty() && name_.empty() && !title_elem_id) {
- name_ = description;
+ name = description;
description.clear();
- string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION].clear();
}
// If it's a text field, also consider the placeholder.
- string16 placeholder;
+ std::string placeholder;
if (role_ == AccessibilityNodeData::ROLE_TEXT_FIELD &&
HasState(AccessibilityNodeData::STATE_FOCUSABLE) &&
GetHtmlAttribute("placeholder", &placeholder)) {
if (name_.empty() && !title_elem_id) {
- name_ = placeholder;
+ name = placeholder;
} else if (description.empty()) {
description = placeholder;
- string_attributes_[AccessibilityNodeData::ATTR_DESCRIPTION] = description;
}
}
+ SetStringAttribute(AccessibilityNodeData::ATTR_NAME, name);
+ SetStringAttribute(AccessibilityNodeData::ATTR_DESCRIPTION, description);
+ SetStringAttribute(AccessibilityNodeData::ATTR_HELP, help);
+
// On Windows, the value of a document should be its url.
if (role_ == AccessibilityNodeData::ROLE_ROOT_WEB_AREA ||
role_ == AccessibilityNodeData::ROLE_WEB_AREA) {
@@ -2931,7 +2966,9 @@ void BrowserAccessibilityWin::PostInitialize() {
for (unsigned int i = 0; i < children().size(); ++i) {
BrowserAccessibility* child = children()[i];
if (child->role() == AccessibilityNodeData::ROLE_STATIC_TEXT) {
- hypertext_ += child->name();
+ string16 name;
+ child->GetStringAttribute(AccessibilityNodeData::ATTR_NAME, &name);
+ hypertext_ += name;
} else {
hyperlink_offset_to_index_[hypertext_.size()] = hyperlinks_.size();
hypertext_ += kEmbeddedCharacter;
@@ -3074,11 +3111,25 @@ void BrowserAccessibilityWin::IntAttributeToIA2(
base::IntToString16(value));
}
-const string16& BrowserAccessibilityWin::TextForIAccessibleText() {
+string16 BrowserAccessibilityWin::GetValueText() {
aboxhall 2013/07/31 18:34:47 Where is this method used?
dmazzoni 2013/08/06 17:36:34 It's private, it's called by both get_accValue, an
+ float fval;
+ string16 value;
+ GetStringAttribute(AccessibilityNodeData::ATTR_VALUE, &value);
+ if (value.empty() &&
+ GetFloatAttribute(AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &fval)) {
+ value = UTF8ToUTF16(base::DoubleToString(fval));
+ }
+ return value;
+}
+
+string16 BrowserAccessibilityWin::TextForIAccessibleText() {
+ string16 name, value;
+ GetStringAttribute(AccessibilityNodeData::ATTR_NAME, &name);
+ GetStringAttribute(AccessibilityNodeData::ATTR_VALUE, &value);
if (IsEditableText())
- return value_;
+ return value;
return (role_ == AccessibilityNodeData::ROLE_STATIC_TEXT) ?
- name_ : hypertext_;
+ name : hypertext_;
}
void BrowserAccessibilityWin::HandleSpecialTextOffset(const string16& text,
@@ -3111,8 +3162,10 @@ LONG BrowserAccessibilityWin::FindBoundary(
ui::TextBoundaryDirection direction) {
HandleSpecialTextOffset(text, &start_offset);
ui::TextBoundaryType boundary = IA2TextBoundaryToTextBoundary(ia2_boundary);
+ const std::vector<int32>& line_breaks = GetIntListAttribute(
+ AccessibilityNodeData::ATTR_LINE_BREAKS);
return ui::FindAccessibleTextBoundary(
- text, line_breaks_, boundary, start_offset, direction);
+ text, line_breaks, boundary, start_offset, direction);
}
BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromRendererID(

Powered by Google App Engine
This is Rietveld 408576698