| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/accessibility/accessibility_tree_formatter.h" | 5 #include "content/browser/accessibility/accessibility_tree_formatter.h" |
| 6 | 6 |
| 7 #include <oleacc.h> | 7 #include <oleacc.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 "localized_extended_role", | 88 "localized_extended_role", |
| 89 "inner_html", | 89 "inner_html", |
| 90 }; | 90 }; |
| 91 | 91 |
| 92 namespace { | 92 namespace { |
| 93 | 93 |
| 94 base::string16 GetIA2Hypertext(BrowserAccessibilityWin& ax_object) { | 94 base::string16 GetIA2Hypertext(BrowserAccessibilityWin& ax_object) { |
| 95 base::win::ScopedBstr text_bstr; | 95 base::win::ScopedBstr text_bstr; |
| 96 HRESULT hr; | 96 HRESULT hr; |
| 97 | 97 |
| 98 hr = ax_object.get_text(0, IA2_TEXT_OFFSET_LENGTH, text_bstr.Receive()); | 98 hr = ax_object.GetCOM()->get_text(0, IA2_TEXT_OFFSET_LENGTH, |
| 99 text_bstr.Receive()); |
| 99 if (FAILED(hr)) | 100 if (FAILED(hr)) |
| 100 return base::string16(); | 101 return base::string16(); |
| 101 | 102 |
| 102 base::string16 ia2_hypertext(text_bstr, text_bstr.Length()); | 103 base::string16 ia2_hypertext(text_bstr, text_bstr.Length()); |
| 103 // IA2 Spec calls embedded objects hyperlinks. We stick to embeds for clarity. | 104 // IA2 Spec calls embedded objects hyperlinks. We stick to embeds for clarity. |
| 104 LONG number_of_embeds; | 105 LONG number_of_embeds; |
| 105 hr = ax_object.get_nHyperlinks(&number_of_embeds); | 106 hr = ax_object.GetCOM()->get_nHyperlinks(&number_of_embeds); |
| 106 if (FAILED(hr) || number_of_embeds == 0) | 107 if (FAILED(hr) || number_of_embeds == 0) |
| 107 return ia2_hypertext; | 108 return ia2_hypertext; |
| 108 | 109 |
| 109 // Replace all embedded characters with the child indices of the accessibility | 110 // Replace all embedded characters with the child indices of the accessibility |
| 110 // objects they refer to. | 111 // objects they refer to. |
| 111 base::string16 embedded_character(1, | 112 base::string16 embedded_character( |
| 112 BrowserAccessibilityWin::kEmbeddedCharacter); | 113 1, BrowserAccessibilityComWin::kEmbeddedCharacter); |
| 113 size_t character_index = 0; | 114 size_t character_index = 0; |
| 114 size_t hypertext_index = 0; | 115 size_t hypertext_index = 0; |
| 115 while (hypertext_index < ia2_hypertext.length()) { | 116 while (hypertext_index < ia2_hypertext.length()) { |
| 116 if (ia2_hypertext[hypertext_index] != | 117 if (ia2_hypertext[hypertext_index] != |
| 117 BrowserAccessibilityWin::kEmbeddedCharacter) { | 118 BrowserAccessibilityComWin::kEmbeddedCharacter) { |
| 118 ++character_index; | 119 ++character_index; |
| 119 ++hypertext_index; | 120 ++hypertext_index; |
| 120 continue; | 121 continue; |
| 121 } | 122 } |
| 122 | 123 |
| 123 LONG index_of_embed; | 124 LONG index_of_embed; |
| 124 hr = ax_object.get_hyperlinkIndex(character_index, &index_of_embed); | 125 hr = ax_object.GetCOM()->get_hyperlinkIndex(character_index, |
| 126 &index_of_embed); |
| 125 // S_FALSE will be returned if no embedded object is found at the given | 127 // S_FALSE will be returned if no embedded object is found at the given |
| 126 // embedded character offset. Exclude child index from such cases. | 128 // embedded character offset. Exclude child index from such cases. |
| 127 LONG child_index = -1; | 129 LONG child_index = -1; |
| 128 if (hr == S_OK) { | 130 if (hr == S_OK) { |
| 129 DCHECK_GE(index_of_embed, 0); | 131 DCHECK_GE(index_of_embed, 0); |
| 130 base::win::ScopedComPtr<IAccessibleHyperlink> embedded_object; | 132 base::win::ScopedComPtr<IAccessibleHyperlink> embedded_object; |
| 131 hr = ax_object.get_hyperlink( | 133 hr = ax_object.GetCOM()->get_hyperlink(index_of_embed, |
| 132 index_of_embed, embedded_object.Receive()); | 134 embedded_object.Receive()); |
| 133 DCHECK(SUCCEEDED(hr)); | 135 DCHECK(SUCCEEDED(hr)); |
| 134 base::win::ScopedComPtr<IAccessible2> ax_embed; | 136 base::win::ScopedComPtr<IAccessible2> ax_embed; |
| 135 hr = embedded_object.CopyTo(ax_embed.Receive()); | 137 hr = embedded_object.CopyTo(ax_embed.Receive()); |
| 136 DCHECK(SUCCEEDED(hr)); | 138 DCHECK(SUCCEEDED(hr)); |
| 137 hr = ax_embed->get_indexInParent(&child_index); | 139 hr = ax_embed->get_indexInParent(&child_index); |
| 138 DCHECK(SUCCEEDED(hr)); | 140 DCHECK(SUCCEEDED(hr)); |
| 139 } | 141 } |
| 140 | 142 |
| 141 base::string16 child_index_str(L"<obj"); | 143 base::string16 child_index_str(L"<obj"); |
| 142 if (child_index >= 0) { | 144 if (child_index >= 0) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 161 const BrowserAccessibility& node, base::DictionaryValue* dict) { | 163 const BrowserAccessibility& node, base::DictionaryValue* dict) { |
| 162 dict->SetInteger("id", node.GetId()); | 164 dict->SetInteger("id", node.GetId()); |
| 163 BrowserAccessibilityWin* ax_object = | 165 BrowserAccessibilityWin* ax_object = |
| 164 ToBrowserAccessibilityWin(const_cast<BrowserAccessibility*>(&node)); | 166 ToBrowserAccessibilityWin(const_cast<BrowserAccessibility*>(&node)); |
| 165 DCHECK(ax_object); | 167 DCHECK(ax_object); |
| 166 | 168 |
| 167 VARIANT variant_self; | 169 VARIANT variant_self; |
| 168 variant_self.vt = VT_I4; | 170 variant_self.vt = VT_I4; |
| 169 variant_self.lVal = CHILDID_SELF; | 171 variant_self.lVal = CHILDID_SELF; |
| 170 | 172 |
| 171 dict->SetString("role", IAccessible2RoleToString(ax_object->ia2_role())); | 173 dict->SetString("role", |
| 174 IAccessible2RoleToString(ax_object->GetCOM()->ia2_role())); |
| 172 | 175 |
| 173 base::win::ScopedBstr temp_bstr; | 176 base::win::ScopedBstr temp_bstr; |
| 174 // If S_FALSE it means there is no name | 177 // If S_FALSE it means there is no name |
| 175 if (S_OK == ax_object->get_accName(variant_self, temp_bstr.Receive())) { | 178 if (S_OK == |
| 179 ax_object->GetCOM()->get_accName(variant_self, temp_bstr.Receive())) { |
| 176 base::string16 name = base::string16(temp_bstr, temp_bstr.Length()); | 180 base::string16 name = base::string16(temp_bstr, temp_bstr.Length()); |
| 177 | 181 |
| 178 // Ignore a JAWS workaround where the name of a document is " ". | 182 // Ignore a JAWS workaround where the name of a document is " ". |
| 179 if (name != L" " || ax_object->ia2_role() != ROLE_SYSTEM_DOCUMENT) | 183 if (name != L" " || ax_object->GetCOM()->ia2_role() != ROLE_SYSTEM_DOCUMENT) |
| 180 dict->SetString("name", name); | 184 dict->SetString("name", name); |
| 181 } | 185 } |
| 182 temp_bstr.Reset(); | 186 temp_bstr.Reset(); |
| 183 | 187 |
| 184 if (SUCCEEDED(ax_object->get_accValue(variant_self, temp_bstr.Receive()))) | 188 if (SUCCEEDED( |
| 189 ax_object->GetCOM()->get_accValue(variant_self, temp_bstr.Receive()))) |
| 185 dict->SetString("value", base::string16(temp_bstr, temp_bstr.Length())); | 190 dict->SetString("value", base::string16(temp_bstr, temp_bstr.Length())); |
| 186 temp_bstr.Reset(); | 191 temp_bstr.Reset(); |
| 187 | 192 |
| 188 std::vector<base::string16> state_strings; | 193 std::vector<base::string16> state_strings; |
| 189 int32_t ia_state = ax_object->ia_state(); | 194 int32_t ia_state = ax_object->GetCOM()->ia_state(); |
| 190 | 195 |
| 191 // Avoid flakiness: these states depend on whether the window is focused | 196 // Avoid flakiness: these states depend on whether the window is focused |
| 192 // and the position of the mouse cursor. | 197 // and the position of the mouse cursor. |
| 193 ia_state &= ~STATE_SYSTEM_HOTTRACKED; | 198 ia_state &= ~STATE_SYSTEM_HOTTRACKED; |
| 194 ia_state &= ~STATE_SYSTEM_OFFSCREEN; | 199 ia_state &= ~STATE_SYSTEM_OFFSCREEN; |
| 195 | 200 |
| 196 IAccessibleStateToStringVector(ia_state, &state_strings); | 201 IAccessibleStateToStringVector(ia_state, &state_strings); |
| 197 IAccessible2StateToStringVector(ax_object->ia2_state(), &state_strings); | 202 IAccessible2StateToStringVector(ax_object->GetCOM()->ia2_state(), |
| 203 &state_strings); |
| 198 std::unique_ptr<base::ListValue> states(new base::ListValue()); | 204 std::unique_ptr<base::ListValue> states(new base::ListValue()); |
| 199 for (const base::string16& state_string : state_strings) | 205 for (const base::string16& state_string : state_strings) |
| 200 states->AppendString(base::UTF16ToUTF8(state_string)); | 206 states->AppendString(base::UTF16ToUTF8(state_string)); |
| 201 dict->Set("states", std::move(states)); | 207 dict->Set("states", std::move(states)); |
| 202 | 208 |
| 203 const std::vector<base::string16>& ia2_attributes = | 209 const std::vector<base::string16>& ia2_attributes = |
| 204 ax_object->ia2_attributes(); | 210 ax_object->GetCOM()->ia2_attributes(); |
| 205 std::unique_ptr<base::ListValue> attributes(new base::ListValue()); | 211 std::unique_ptr<base::ListValue> attributes(new base::ListValue()); |
| 206 for (const base::string16& ia2_attribute : ia2_attributes) | 212 for (const base::string16& ia2_attribute : ia2_attributes) |
| 207 attributes->AppendString(base::UTF16ToUTF8(ia2_attribute)); | 213 attributes->AppendString(base::UTF16ToUTF8(ia2_attribute)); |
| 208 dict->Set("attributes", std::move(attributes)); | 214 dict->Set("attributes", std::move(attributes)); |
| 209 | 215 |
| 210 ax_object->ComputeStylesIfNeeded(); | 216 ax_object->GetCOM()->ComputeStylesIfNeeded(); |
| 211 const std::map<int, std::vector<base::string16>>& ia2_text_attributes = | 217 const std::map<int, std::vector<base::string16>>& ia2_text_attributes = |
| 212 ax_object->offset_to_text_attributes(); | 218 ax_object->GetCOM()->offset_to_text_attributes(); |
| 213 std::unique_ptr<base::ListValue> text_attributes(new base::ListValue()); | 219 std::unique_ptr<base::ListValue> text_attributes(new base::ListValue()); |
| 214 for (const auto& style_span : ia2_text_attributes) { | 220 for (const auto& style_span : ia2_text_attributes) { |
| 215 int start_offset = style_span.first; | 221 int start_offset = style_span.first; |
| 216 text_attributes->AppendString("offset:" + base::IntToString(start_offset)); | 222 text_attributes->AppendString("offset:" + base::IntToString(start_offset)); |
| 217 for (const base::string16& text_attribute : style_span.second) | 223 for (const base::string16& text_attribute : style_span.second) |
| 218 text_attributes->AppendString(base::UTF16ToUTF8(text_attribute)); | 224 text_attributes->AppendString(base::UTF16ToUTF8(text_attribute)); |
| 219 } | 225 } |
| 220 dict->Set("text_attributes", std::move(text_attributes)); | 226 dict->Set("text_attributes", std::move(text_attributes)); |
| 221 | 227 |
| 222 dict->SetString("role_name", ax_object->role_name()); | 228 dict->SetString("role_name", ax_object->GetCOM()->role_name()); |
| 223 dict->SetString("ia2_hypertext", GetIA2Hypertext(*ax_object)); | 229 dict->SetString("ia2_hypertext", GetIA2Hypertext(*ax_object)); |
| 224 | 230 |
| 225 VARIANT currentValue; | 231 VARIANT currentValue; |
| 226 if (ax_object->get_currentValue(¤tValue) == S_OK) | 232 if (ax_object->GetCOM()->get_currentValue(¤tValue) == S_OK) |
| 227 dict->SetDouble("currentValue", V_R8(¤tValue)); | 233 dict->SetDouble("currentValue", V_R8(¤tValue)); |
| 228 | 234 |
| 229 VARIANT minimumValue; | 235 VARIANT minimumValue; |
| 230 if (ax_object->get_minimumValue(&minimumValue) == S_OK) | 236 if (ax_object->GetCOM()->get_minimumValue(&minimumValue) == S_OK) |
| 231 dict->SetDouble("minimumValue", V_R8(&minimumValue)); | 237 dict->SetDouble("minimumValue", V_R8(&minimumValue)); |
| 232 | 238 |
| 233 VARIANT maximumValue; | 239 VARIANT maximumValue; |
| 234 if (ax_object->get_maximumValue(&maximumValue) == S_OK) | 240 if (ax_object->GetCOM()->get_maximumValue(&maximumValue) == S_OK) |
| 235 dict->SetDouble("maximumValue", V_R8(&maximumValue)); | 241 dict->SetDouble("maximumValue", V_R8(&maximumValue)); |
| 236 | 242 |
| 237 if (SUCCEEDED(ax_object->get_accDescription(variant_self, | 243 if (SUCCEEDED(ax_object->GetCOM()->get_accDescription(variant_self, |
| 238 temp_bstr.Receive()))) { | 244 temp_bstr.Receive()))) { |
| 239 dict->SetString("description", base::string16(temp_bstr, | 245 dict->SetString("description", base::string16(temp_bstr, |
| 240 temp_bstr.Length())); | 246 temp_bstr.Length())); |
| 241 } | 247 } |
| 242 temp_bstr.Reset(); | 248 temp_bstr.Reset(); |
| 243 | 249 |
| 244 if (SUCCEEDED(ax_object->get_accDefaultAction(variant_self, | 250 if (SUCCEEDED(ax_object->GetCOM()->get_accDefaultAction( |
| 245 temp_bstr.Receive()))) { | 251 variant_self, temp_bstr.Receive()))) { |
| 246 dict->SetString("default_action", base::string16(temp_bstr, | 252 dict->SetString("default_action", base::string16(temp_bstr, |
| 247 temp_bstr.Length())); | 253 temp_bstr.Length())); |
| 248 } | 254 } |
| 249 temp_bstr.Reset(); | 255 temp_bstr.Reset(); |
| 250 | 256 |
| 251 if (SUCCEEDED( | 257 if (SUCCEEDED(ax_object->GetCOM()->get_accKeyboardShortcut( |
| 252 ax_object->get_accKeyboardShortcut(variant_self, temp_bstr.Receive()))) { | 258 variant_self, temp_bstr.Receive()))) { |
| 253 dict->SetString("keyboard_shortcut", base::string16(temp_bstr, | 259 dict->SetString("keyboard_shortcut", base::string16(temp_bstr, |
| 254 temp_bstr.Length())); | 260 temp_bstr.Length())); |
| 255 } | 261 } |
| 256 temp_bstr.Reset(); | 262 temp_bstr.Reset(); |
| 257 | 263 |
| 258 if (SUCCEEDED(ax_object->get_accHelp(variant_self, temp_bstr.Receive()))) | 264 if (SUCCEEDED( |
| 265 ax_object->GetCOM()->get_accHelp(variant_self, temp_bstr.Receive()))) |
| 259 dict->SetString("help", base::string16(temp_bstr, temp_bstr.Length())); | 266 dict->SetString("help", base::string16(temp_bstr, temp_bstr.Length())); |
| 260 temp_bstr.Reset(); | 267 temp_bstr.Reset(); |
| 261 | 268 |
| 262 BrowserAccessibility* root = node.manager()->GetRootManager()->GetRoot(); | 269 BrowserAccessibility* root = node.manager()->GetRootManager()->GetRoot(); |
| 263 LONG left, top, width, height; | 270 LONG left, top, width, height; |
| 264 LONG root_left, root_top, root_width, root_height; | 271 LONG root_left, root_top, root_width, root_height; |
| 265 if (SUCCEEDED(ax_object->accLocation( | 272 if (SUCCEEDED(ax_object->GetCOM()->accLocation(&left, &top, &width, &height, |
| 266 &left, &top, &width, &height, variant_self)) && | 273 variant_self)) && |
| 267 SUCCEEDED(ToBrowserAccessibilityWin(root)->accLocation( | 274 SUCCEEDED(ToBrowserAccessibilityWin(root)->GetCOM()->accLocation( |
| 268 &root_left, &root_top, &root_width, &root_height, variant_self))) { | 275 &root_left, &root_top, &root_width, &root_height, variant_self))) { |
| 269 base::DictionaryValue* location = new base::DictionaryValue; | 276 base::DictionaryValue* location = new base::DictionaryValue; |
| 270 location->SetInteger("x", left - root_left); | 277 location->SetInteger("x", left - root_left); |
| 271 location->SetInteger("y", top - root_top); | 278 location->SetInteger("y", top - root_top); |
| 272 dict->Set("location", location); | 279 dict->Set("location", location); |
| 273 | 280 |
| 274 base::DictionaryValue* size = new base::DictionaryValue; | 281 base::DictionaryValue* size = new base::DictionaryValue; |
| 275 size->SetInteger("width", width); | 282 size->SetInteger("width", width); |
| 276 size->SetInteger("height", height); | 283 size->SetInteger("height", height); |
| 277 dict->Set("size", size); | 284 dict->Set("size", size); |
| 278 } | 285 } |
| 279 | 286 |
| 280 LONG index_in_parent; | 287 LONG index_in_parent; |
| 281 if (SUCCEEDED(ax_object->get_indexInParent(&index_in_parent))) | 288 if (SUCCEEDED(ax_object->GetCOM()->get_indexInParent(&index_in_parent))) |
| 282 dict->SetInteger("index_in_parent", index_in_parent); | 289 dict->SetInteger("index_in_parent", index_in_parent); |
| 283 | 290 |
| 284 LONG n_relations; | 291 LONG n_relations; |
| 285 if (SUCCEEDED(ax_object->get_nRelations(&n_relations))) | 292 if (SUCCEEDED(ax_object->GetCOM()->get_nRelations(&n_relations))) |
| 286 dict->SetInteger("n_relations", n_relations); | 293 dict->SetInteger("n_relations", n_relations); |
| 287 | 294 |
| 288 LONG group_level, similar_items_in_group, position_in_group; | 295 LONG group_level, similar_items_in_group, position_in_group; |
| 289 // |GetGroupPosition| returns S_FALSE when no grouping information is | 296 // |GetGroupPosition| returns S_FALSE when no grouping information is |
| 290 // available so avoid using |SUCCEEDED|. | 297 // available so avoid using |SUCCEEDED|. |
| 291 if (ax_object->get_groupPosition(&group_level, &similar_items_in_group, | 298 if (ax_object->GetCOM()->get_groupPosition( |
| 292 &position_in_group) == S_OK) { | 299 &group_level, &similar_items_in_group, &position_in_group) == S_OK) { |
| 293 dict->SetInteger("group_level", group_level); | 300 dict->SetInteger("group_level", group_level); |
| 294 dict->SetInteger("similar_items_in_group", similar_items_in_group); | 301 dict->SetInteger("similar_items_in_group", similar_items_in_group); |
| 295 dict->SetInteger("position_in_group", position_in_group); | 302 dict->SetInteger("position_in_group", position_in_group); |
| 296 } | 303 } |
| 297 | 304 |
| 298 LONG table_rows; | 305 LONG table_rows; |
| 299 if (SUCCEEDED(ax_object->get_nRows(&table_rows))) | 306 if (SUCCEEDED(ax_object->GetCOM()->get_nRows(&table_rows))) |
| 300 dict->SetInteger("table_rows", table_rows); | 307 dict->SetInteger("table_rows", table_rows); |
| 301 | 308 |
| 302 LONG table_columns; | 309 LONG table_columns; |
| 303 if (SUCCEEDED(ax_object->get_nRows(&table_columns))) | 310 if (SUCCEEDED(ax_object->GetCOM()->get_nRows(&table_columns))) |
| 304 dict->SetInteger("table_columns", table_columns); | 311 dict->SetInteger("table_columns", table_columns); |
| 305 | 312 |
| 306 LONG row_index; | 313 LONG row_index; |
| 307 if (SUCCEEDED(ax_object->get_rowIndex(&row_index))) | 314 if (SUCCEEDED(ax_object->GetCOM()->get_rowIndex(&row_index))) |
| 308 dict->SetInteger("row_index", row_index); | 315 dict->SetInteger("row_index", row_index); |
| 309 | 316 |
| 310 LONG column_index; | 317 LONG column_index; |
| 311 if (SUCCEEDED(ax_object->get_columnIndex(&column_index))) | 318 if (SUCCEEDED(ax_object->GetCOM()->get_columnIndex(&column_index))) |
| 312 dict->SetInteger("column_index", column_index); | 319 dict->SetInteger("column_index", column_index); |
| 313 | 320 |
| 314 LONG n_characters; | 321 LONG n_characters; |
| 315 if (SUCCEEDED(ax_object->get_nCharacters(&n_characters))) | 322 if (SUCCEEDED(ax_object->GetCOM()->get_nCharacters(&n_characters))) |
| 316 dict->SetInteger("n_characters", n_characters); | 323 dict->SetInteger("n_characters", n_characters); |
| 317 | 324 |
| 318 LONG caret_offset; | 325 LONG caret_offset; |
| 319 if (ax_object->get_caretOffset(&caret_offset) == S_OK) | 326 if (ax_object->GetCOM()->get_caretOffset(&caret_offset) == S_OK) |
| 320 dict->SetInteger("caret_offset", caret_offset); | 327 dict->SetInteger("caret_offset", caret_offset); |
| 321 | 328 |
| 322 LONG n_selections; | 329 LONG n_selections; |
| 323 if (SUCCEEDED(ax_object->get_nSelections(&n_selections))) { | 330 if (SUCCEEDED(ax_object->GetCOM()->get_nSelections(&n_selections))) { |
| 324 dict->SetInteger("n_selections", n_selections); | 331 dict->SetInteger("n_selections", n_selections); |
| 325 if (n_selections > 0) { | 332 if (n_selections > 0) { |
| 326 LONG start, end; | 333 LONG start, end; |
| 327 if (SUCCEEDED(ax_object->get_selection(0, &start, &end))) { | 334 if (SUCCEEDED(ax_object->GetCOM()->get_selection(0, &start, &end))) { |
| 328 dict->SetInteger("selection_start", start); | 335 dict->SetInteger("selection_start", start); |
| 329 dict->SetInteger("selection_end", end); | 336 dict->SetInteger("selection_end", end); |
| 330 } | 337 } |
| 331 } | 338 } |
| 332 } | 339 } |
| 333 | 340 |
| 334 if (SUCCEEDED(ax_object->get_localizedExtendedRole(temp_bstr.Receive()))) { | 341 if (SUCCEEDED(ax_object->GetCOM()->get_localizedExtendedRole( |
| 342 temp_bstr.Receive()))) { |
| 335 dict->SetString("localized_extended_role", base::string16(temp_bstr, | 343 dict->SetString("localized_extended_role", base::string16(temp_bstr, |
| 336 temp_bstr.Length())); | 344 temp_bstr.Length())); |
| 337 } | 345 } |
| 338 temp_bstr.Reset(); | 346 temp_bstr.Reset(); |
| 339 | 347 |
| 340 if (SUCCEEDED(ax_object->get_innerHTML(temp_bstr.Receive()))) { | 348 if (SUCCEEDED(ax_object->GetCOM()->get_innerHTML(temp_bstr.Receive()))) { |
| 341 dict->SetString("inner_html", | 349 dict->SetString("inner_html", |
| 342 base::string16(temp_bstr, temp_bstr.Length())); | 350 base::string16(temp_bstr, temp_bstr.Length())); |
| 343 } | 351 } |
| 344 temp_bstr.Reset(); | 352 temp_bstr.Reset(); |
| 345 } | 353 } |
| 346 | 354 |
| 347 base::string16 AccessibilityTreeFormatterWin::ToString( | 355 base::string16 AccessibilityTreeFormatterWin::ToString( |
| 348 const base::DictionaryValue& dict) { | 356 const base::DictionaryValue& dict) { |
| 349 base::string16 line; | 357 base::string16 line; |
| 350 | 358 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 | 455 |
| 448 const std::string AccessibilityTreeFormatterWin::GetAllowString() { | 456 const std::string AccessibilityTreeFormatterWin::GetAllowString() { |
| 449 return "@WIN-ALLOW:"; | 457 return "@WIN-ALLOW:"; |
| 450 } | 458 } |
| 451 | 459 |
| 452 const std::string AccessibilityTreeFormatterWin::GetDenyString() { | 460 const std::string AccessibilityTreeFormatterWin::GetDenyString() { |
| 453 return "@WIN-DENY:"; | 461 return "@WIN-DENY:"; |
| 454 } | 462 } |
| 455 | 463 |
| 456 } // namespace content | 464 } // namespace content |
| OLD | NEW |