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/browser_accessibility_win.h" | 5 #include "content/browser/accessibility/browser_accessibility_win.h" |
6 | 6 |
7 #include <UIAutomationClient.h> | 7 #include <UIAutomationClient.h> |
8 #include <UIAutomationCoreApi.h> | 8 #include <UIAutomationCoreApi.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 24 matching lines...) Expand all Loading... |
35 0x11cf, | 35 0x11cf, |
36 {0xb6, 0x61, 0x00, 0xaa, 0x00, 0x4c, 0xd6, 0xd8}}; | 36 {0xb6, 0x61, 0x00, 0xaa, 0x00, 0x4c, 0xd6, 0xd8}}; |
37 const GUID GUID_IAccessibleContentDocument = { | 37 const GUID GUID_IAccessibleContentDocument = { |
38 0xa5d8e1f3, | 38 0xa5d8e1f3, |
39 0x3571, | 39 0x3571, |
40 0x4d8f, | 40 0x4d8f, |
41 {0x95, 0x21, 0x07, 0xed, 0x28, 0xfb, 0x07, 0x2e}}; | 41 {0x95, 0x21, 0x07, 0xed, 0x28, 0xfb, 0x07, 0x2e}}; |
42 | 42 |
43 const base::char16 BrowserAccessibilityWin::kEmbeddedCharacter = L'\xfffc'; | 43 const base::char16 BrowserAccessibilityWin::kEmbeddedCharacter = L'\xfffc'; |
44 | 44 |
45 // static | |
46 LONG BrowserAccessibilityWin::next_unique_id_win_ = | |
47 base::win::kFirstBrowserAccessibilityManagerAccessibilityId; | |
48 | |
49 // | 45 // |
50 // BrowserAccessibilityRelation | 46 // BrowserAccessibilityRelation |
51 // | 47 // |
52 // A simple implementation of IAccessibleRelation, used to represent | 48 // A simple implementation of IAccessibleRelation, used to represent |
53 // a relationship between two accessible nodes in the tree. | 49 // a relationship between two accessible nodes in the tree. |
54 // | 50 // |
55 | 51 |
56 class BrowserAccessibilityRelation | 52 class BrowserAccessibilityRelation |
57 : public CComObjectRootEx<CComMultiThreadModel>, | 53 : public CComObjectRootEx<CComMultiThreadModel>, |
58 public IAccessibleRelation { | 54 public IAccessibleRelation { |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 return E_INVALIDARG; | 139 return E_INVALIDARG; |
144 } | 140 } |
145 | 141 |
146 BrowserAccessibilityManager* manager = owner_->manager(); | 142 BrowserAccessibilityManager* manager = owner_->manager(); |
147 BrowserAccessibility* result = | 143 BrowserAccessibility* result = |
148 manager->GetFromID(target_ids_[target_index]); | 144 manager->GetFromID(target_ids_[target_index]); |
149 if (!result || !result->instance_active()) | 145 if (!result || !result->instance_active()) |
150 return E_FAIL; | 146 return E_FAIL; |
151 | 147 |
152 *target = static_cast<IAccessible*>( | 148 *target = static_cast<IAccessible*>( |
153 result->ToBrowserAccessibilityWin()->NewReference()); | 149 ToBrowserAccessibilityWin(result)->NewReference()); |
154 return S_OK; | 150 return S_OK; |
155 } | 151 } |
156 | 152 |
157 STDMETHODIMP BrowserAccessibilityRelation::get_targets(long max_targets, | 153 STDMETHODIMP BrowserAccessibilityRelation::get_targets(long max_targets, |
158 IUnknown** targets, | 154 IUnknown** targets, |
159 long* n_targets) { | 155 long* n_targets) { |
160 if (!targets || !n_targets) | 156 if (!targets || !n_targets) |
161 return E_INVALIDARG; | 157 return E_INVALIDARG; |
162 | 158 |
163 if (!owner_->instance_active()) | 159 if (!owner_->instance_active()) |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 | 196 |
201 // static | 197 // static |
202 BrowserAccessibility* BrowserAccessibility::Create() { | 198 BrowserAccessibility* BrowserAccessibility::Create() { |
203 ui::win::CreateATLModuleIfNeeded(); | 199 ui::win::CreateATLModuleIfNeeded(); |
204 CComObject<BrowserAccessibilityWin>* instance; | 200 CComObject<BrowserAccessibilityWin>* instance; |
205 HRESULT hr = CComObject<BrowserAccessibilityWin>::CreateInstance(&instance); | 201 HRESULT hr = CComObject<BrowserAccessibilityWin>::CreateInstance(&instance); |
206 DCHECK(SUCCEEDED(hr)); | 202 DCHECK(SUCCEEDED(hr)); |
207 return instance->NewReference(); | 203 return instance->NewReference(); |
208 } | 204 } |
209 | 205 |
210 const BrowserAccessibilityWin* BrowserAccessibility::ToBrowserAccessibilityWin() | |
211 const { | |
212 return static_cast<const BrowserAccessibilityWin*>(this); | |
213 } | |
214 | |
215 BrowserAccessibilityWin* BrowserAccessibility::ToBrowserAccessibilityWin() { | |
216 return static_cast<BrowserAccessibilityWin*>(this); | |
217 } | |
218 | |
219 BrowserAccessibilityWin::BrowserAccessibilityWin() | 206 BrowserAccessibilityWin::BrowserAccessibilityWin() |
220 : win_attributes_(new WinAttributes()), | 207 : win_attributes_(new WinAttributes()), |
221 previous_scroll_x_(0), | 208 previous_scroll_x_(0), |
222 previous_scroll_y_(0) { | 209 previous_scroll_y_(0) { |
223 // Start unique IDs at -1 and decrement each time, because get_accChild | |
224 // uses positive IDs to enumerate children, so we use negative IDs to | |
225 // clearly distinguish between indices and unique IDs. | |
226 unique_id_win_ = next_unique_id_win_; | |
227 if (next_unique_id_win_ == | |
228 base::win::kLastBrowserAccessibilityManagerAccessibilityId) { | |
229 next_unique_id_win_ = | |
230 base::win::kFirstBrowserAccessibilityManagerAccessibilityId; | |
231 } | |
232 next_unique_id_win_--; | |
233 } | 210 } |
234 | 211 |
235 BrowserAccessibilityWin::~BrowserAccessibilityWin() { | 212 BrowserAccessibilityWin::~BrowserAccessibilityWin() { |
236 for (size_t i = 0; i < relations_.size(); ++i) | 213 for (size_t i = 0; i < relations_.size(); ++i) |
237 relations_[i]->Release(); | 214 relations_[i]->Release(); |
238 } | 215 } |
239 | 216 |
240 // | 217 // |
241 // IAccessible methods. | 218 // IAccessible methods. |
242 // | 219 // |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 return S_FALSE; | 251 return S_FALSE; |
275 } | 252 } |
276 | 253 |
277 BrowserAccessibility* result = BrowserAccessibilityForPoint(point); | 254 BrowserAccessibility* result = BrowserAccessibilityForPoint(point); |
278 if (result == this) { | 255 if (result == this) { |
279 // Point is within this object. | 256 // Point is within this object. |
280 child->vt = VT_I4; | 257 child->vt = VT_I4; |
281 child->lVal = CHILDID_SELF; | 258 child->lVal = CHILDID_SELF; |
282 } else { | 259 } else { |
283 child->vt = VT_DISPATCH; | 260 child->vt = VT_DISPATCH; |
284 child->pdispVal = result->ToBrowserAccessibilityWin()->NewReference(); | 261 child->pdispVal = ToBrowserAccessibilityWin(result)->NewReference(); |
285 } | 262 } |
286 return S_OK; | 263 return S_OK; |
287 } | 264 } |
288 | 265 |
289 STDMETHODIMP BrowserAccessibilityWin::accLocation(LONG* x_left, | 266 STDMETHODIMP BrowserAccessibilityWin::accLocation(LONG* x_left, |
290 LONG* y_top, | 267 LONG* y_top, |
291 LONG* width, | 268 LONG* width, |
292 LONG* height, | 269 LONG* height, |
293 VARIANT var_id) { | 270 VARIANT var_id) { |
294 if (!instance_active()) | 271 if (!instance_active()) |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 result = target->GetPreviousSibling(); | 325 result = target->GetPreviousSibling(); |
349 break; | 326 break; |
350 } | 327 } |
351 | 328 |
352 if (!result) { | 329 if (!result) { |
353 end->vt = VT_EMPTY; | 330 end->vt = VT_EMPTY; |
354 return S_FALSE; | 331 return S_FALSE; |
355 } | 332 } |
356 | 333 |
357 end->vt = VT_DISPATCH; | 334 end->vt = VT_DISPATCH; |
358 end->pdispVal = result->ToBrowserAccessibilityWin()->NewReference(); | 335 end->pdispVal = ToBrowserAccessibilityWin(result)->NewReference(); |
359 return S_OK; | 336 return S_OK; |
360 } | 337 } |
361 | 338 |
362 STDMETHODIMP BrowserAccessibilityWin::get_accChild(VARIANT var_child, | 339 STDMETHODIMP BrowserAccessibilityWin::get_accChild(VARIANT var_child, |
363 IDispatch** disp_child) { | 340 IDispatch** disp_child) { |
364 if (!instance_active()) | 341 if (!instance_active()) |
365 return E_FAIL; | 342 return E_FAIL; |
366 | 343 |
367 if (!disp_child) | 344 if (!disp_child) |
368 return E_INVALIDARG; | 345 return E_INVALIDARG; |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 return S_OK; | 481 return S_OK; |
505 } | 482 } |
506 | 483 |
507 STDMETHODIMP BrowserAccessibilityWin::get_accParent(IDispatch** disp_parent) { | 484 STDMETHODIMP BrowserAccessibilityWin::get_accParent(IDispatch** disp_parent) { |
508 if (!instance_active()) | 485 if (!instance_active()) |
509 return E_FAIL; | 486 return E_FAIL; |
510 | 487 |
511 if (!disp_parent) | 488 if (!disp_parent) |
512 return E_INVALIDARG; | 489 return E_INVALIDARG; |
513 | 490 |
514 IAccessible* parent_obj = GetParent()->ToBrowserAccessibilityWin(); | 491 IAccessible* parent_obj = ToBrowserAccessibilityWin(GetParent()); |
515 if (parent_obj == NULL) { | 492 if (parent_obj == NULL) { |
516 // This happens if we're the root of the tree; | 493 // This happens if we're the root of the tree; |
517 // return the IAccessible for the window. | 494 // return the IAccessible for the window. |
518 parent_obj = | 495 parent_obj = |
519 manager()->ToBrowserAccessibilityManagerWin()->GetParentIAccessible(); | 496 manager()->ToBrowserAccessibilityManagerWin()->GetParentIAccessible(); |
520 // |parent| can only be NULL if the manager was created before the parent | 497 // |parent| can only be NULL if the manager was created before the parent |
521 // IAccessible was known and it wasn't subsequently set before a client | 498 // IAccessible was known and it wasn't subsequently set before a client |
522 // requested it. This has been fixed. |parent| may also be NULL during | 499 // requested it. This has been fixed. |parent| may also be NULL during |
523 // destruction. Possible cases where this could occur include tabs being | 500 // destruction. Possible cases where this could occur include tabs being |
524 // dragged to a new window, etc. | 501 // dragged to a new window, etc. |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 if (selected_count == 0) { | 616 if (selected_count == 0) { |
640 selected->vt = VT_EMPTY; | 617 selected->vt = VT_EMPTY; |
641 return S_OK; | 618 return S_OK; |
642 } | 619 } |
643 | 620 |
644 if (selected_count == 1) { | 621 if (selected_count == 1) { |
645 for (size_t i = 0; i < InternalChildCount(); ++i) { | 622 for (size_t i = 0; i < InternalChildCount(); ++i) { |
646 if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) { | 623 if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) { |
647 selected->vt = VT_DISPATCH; | 624 selected->vt = VT_DISPATCH; |
648 selected->pdispVal = | 625 selected->pdispVal = |
649 InternalGetChild(i)->ToBrowserAccessibilityWin()->NewReference(); | 626 ToBrowserAccessibilityWin(InternalGetChild(i))->NewReference(); |
650 return S_OK; | 627 return S_OK; |
651 } | 628 } |
652 } | 629 } |
653 } | 630 } |
654 | 631 |
655 // Multiple items are selected. | 632 // Multiple items are selected. |
656 base::win::EnumVariant* enum_variant = | 633 base::win::EnumVariant* enum_variant = |
657 new base::win::EnumVariant(selected_count); | 634 new base::win::EnumVariant(selected_count); |
658 enum_variant->AddRef(); | 635 enum_variant->AddRef(); |
659 unsigned long index = 0; | 636 unsigned long index = 0; |
660 for (size_t i = 0; i < InternalChildCount(); ++i) { | 637 for (size_t i = 0; i < InternalChildCount(); ++i) { |
661 if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) { | 638 if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) { |
662 enum_variant->ItemAt(index)->vt = VT_DISPATCH; | 639 enum_variant->ItemAt(index)->vt = VT_DISPATCH; |
663 enum_variant->ItemAt(index)->pdispVal = | 640 enum_variant->ItemAt(index)->pdispVal = |
664 InternalGetChild(i)->ToBrowserAccessibilityWin()->NewReference(); | 641 ToBrowserAccessibilityWin(InternalGetChild(i))->NewReference(); |
665 ++index; | 642 ++index; |
666 } | 643 } |
667 } | 644 } |
668 selected->vt = VT_UNKNOWN; | 645 selected->vt = VT_UNKNOWN; |
669 selected->punkVal = static_cast<IUnknown*>( | 646 selected->punkVal = static_cast<IUnknown*>( |
670 static_cast<base::win::IUnknownImpl*>(enum_variant)); | 647 static_cast<base::win::IUnknownImpl*>(enum_variant)); |
671 return S_OK; | 648 return S_OK; |
672 } | 649 } |
673 | 650 |
674 STDMETHODIMP BrowserAccessibilityWin::accSelect( | 651 STDMETHODIMP BrowserAccessibilityWin::accSelect( |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
744 return S_OK; | 721 return S_OK; |
745 } | 722 } |
746 | 723 |
747 STDMETHODIMP BrowserAccessibilityWin::get_uniqueID(LONG* unique_id) { | 724 STDMETHODIMP BrowserAccessibilityWin::get_uniqueID(LONG* unique_id) { |
748 if (!instance_active()) | 725 if (!instance_active()) |
749 return E_FAIL; | 726 return E_FAIL; |
750 | 727 |
751 if (!unique_id) | 728 if (!unique_id) |
752 return E_INVALIDARG; | 729 return E_INVALIDARG; |
753 | 730 |
754 *unique_id = unique_id_win_; | 731 *unique_id = -unique_id_; |
755 return S_OK; | 732 return S_OK; |
756 } | 733 } |
757 | 734 |
758 STDMETHODIMP BrowserAccessibilityWin::get_windowHandle(HWND* window_handle) { | 735 STDMETHODIMP BrowserAccessibilityWin::get_windowHandle(HWND* window_handle) { |
759 if (!instance_active()) | 736 if (!instance_active()) |
760 return E_FAIL; | 737 return E_FAIL; |
761 | 738 |
762 if (!window_handle) | 739 if (!window_handle) |
763 return E_INVALIDARG; | 740 return E_INVALIDARG; |
764 | 741 |
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1282 const std::vector<int32_t>& unique_cell_ids = | 1259 const std::vector<int32_t>& unique_cell_ids = |
1283 GetIntListAttribute(ui::AX_ATTR_UNIQUE_CELL_IDS); | 1260 GetIntListAttribute(ui::AX_ATTR_UNIQUE_CELL_IDS); |
1284 int cell_id_count = static_cast<int>(unique_cell_ids.size()); | 1261 int cell_id_count = static_cast<int>(unique_cell_ids.size()); |
1285 if (cell_index < 0) | 1262 if (cell_index < 0) |
1286 return E_INVALIDARG; | 1263 return E_INVALIDARG; |
1287 if (cell_index >= cell_id_count) | 1264 if (cell_index >= cell_id_count) |
1288 return S_FALSE; | 1265 return S_FALSE; |
1289 | 1266 |
1290 int cell_id = unique_cell_ids[cell_index]; | 1267 int cell_id = unique_cell_ids[cell_index]; |
1291 BrowserAccessibilityWin* cell = | 1268 BrowserAccessibilityWin* cell = |
1292 manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); | 1269 ToBrowserAccessibilityWin(manager()->GetFromID(cell_id)); |
1293 int col_index; | 1270 int col_index; |
1294 if (cell && | 1271 if (cell && |
1295 cell->GetIntAttribute( | 1272 cell->GetIntAttribute( |
1296 ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &col_index)) { | 1273 ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &col_index)) { |
1297 *column_index = col_index; | 1274 *column_index = col_index; |
1298 return S_OK; | 1275 return S_OK; |
1299 } | 1276 } |
1300 | 1277 |
1301 return S_FALSE; | 1278 return S_FALSE; |
1302 } | 1279 } |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1387 } | 1364 } |
1388 | 1365 |
1389 if (row < 0 || row >= rows) | 1366 if (row < 0 || row >= rows) |
1390 return E_INVALIDARG; | 1367 return E_INVALIDARG; |
1391 | 1368 |
1392 const std::vector<int32_t>& cell_ids = | 1369 const std::vector<int32_t>& cell_ids = |
1393 GetIntListAttribute(ui::AX_ATTR_CELL_IDS); | 1370 GetIntListAttribute(ui::AX_ATTR_CELL_IDS); |
1394 for (int i = 0; i < columns; ++i) { | 1371 for (int i = 0; i < columns; ++i) { |
1395 int cell_id = cell_ids[row * columns + i]; | 1372 int cell_id = cell_ids[row * columns + i]; |
1396 BrowserAccessibilityWin* cell = | 1373 BrowserAccessibilityWin* cell = |
1397 manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); | 1374 ToBrowserAccessibilityWin(manager()->GetFromID(cell_id)); |
1398 if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) { | 1375 if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) { |
1399 base::string16 cell_name = cell->GetString16Attribute( | 1376 base::string16 cell_name = cell->GetString16Attribute( |
1400 ui::AX_ATTR_NAME); | 1377 ui::AX_ATTR_NAME); |
1401 if (cell_name.size() > 0) { | 1378 if (cell_name.size() > 0) { |
1402 *description = SysAllocString(cell_name.c_str()); | 1379 *description = SysAllocString(cell_name.c_str()); |
1403 return S_OK; | 1380 return S_OK; |
1404 } | 1381 } |
1405 | 1382 |
1406 if (cell->description().size() > 0) { | 1383 if (cell->description().size() > 0) { |
1407 *description = SysAllocString(cell->description().c_str()); | 1384 *description = SysAllocString(cell->description().c_str()); |
(...skipping 24 matching lines...) Expand all Loading... |
1432 return S_FALSE; | 1409 return S_FALSE; |
1433 } | 1410 } |
1434 | 1411 |
1435 if (row < 0 || row >= rows || column < 0 || column >= columns) | 1412 if (row < 0 || row >= rows || column < 0 || column >= columns) |
1436 return E_INVALIDARG; | 1413 return E_INVALIDARG; |
1437 | 1414 |
1438 const std::vector<int32_t>& cell_ids = | 1415 const std::vector<int32_t>& cell_ids = |
1439 GetIntListAttribute(ui::AX_ATTR_CELL_IDS); | 1416 GetIntListAttribute(ui::AX_ATTR_CELL_IDS); |
1440 int cell_id = cell_ids[row * columns + column]; | 1417 int cell_id = cell_ids[row * columns + column]; |
1441 BrowserAccessibilityWin* cell = | 1418 BrowserAccessibilityWin* cell = |
1442 manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); | 1419 ToBrowserAccessibilityWin(manager()->GetFromID(cell_id)); |
1443 int rowspan; | 1420 int rowspan; |
1444 if (cell && | 1421 if (cell && |
1445 cell->GetIntAttribute( | 1422 cell->GetIntAttribute( |
1446 ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && | 1423 ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && |
1447 rowspan >= 1) { | 1424 rowspan >= 1) { |
1448 *n_rows_spanned = rowspan; | 1425 *n_rows_spanned = rowspan; |
1449 return S_OK; | 1426 return S_OK; |
1450 } | 1427 } |
1451 | 1428 |
1452 return S_FALSE; | 1429 return S_FALSE; |
(...skipping 17 matching lines...) Expand all Loading... |
1470 const std::vector<int32_t>& unique_cell_ids = | 1447 const std::vector<int32_t>& unique_cell_ids = |
1471 GetIntListAttribute(ui::AX_ATTR_UNIQUE_CELL_IDS); | 1448 GetIntListAttribute(ui::AX_ATTR_UNIQUE_CELL_IDS); |
1472 int cell_id_count = static_cast<int>(unique_cell_ids.size()); | 1449 int cell_id_count = static_cast<int>(unique_cell_ids.size()); |
1473 if (cell_index < 0) | 1450 if (cell_index < 0) |
1474 return E_INVALIDARG; | 1451 return E_INVALIDARG; |
1475 if (cell_index >= cell_id_count) | 1452 if (cell_index >= cell_id_count) |
1476 return S_FALSE; | 1453 return S_FALSE; |
1477 | 1454 |
1478 int cell_id = unique_cell_ids[cell_index]; | 1455 int cell_id = unique_cell_ids[cell_index]; |
1479 BrowserAccessibilityWin* cell = | 1456 BrowserAccessibilityWin* cell = |
1480 manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); | 1457 ToBrowserAccessibilityWin(manager()->GetFromID(cell_id)); |
1481 int cell_row_index; | 1458 int cell_row_index; |
1482 if (cell && | 1459 if (cell && |
1483 cell->GetIntAttribute( | 1460 cell->GetIntAttribute( |
1484 ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &cell_row_index)) { | 1461 ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &cell_row_index)) { |
1485 *row_index = cell_row_index; | 1462 *row_index = cell_row_index; |
1486 return S_OK; | 1463 return S_OK; |
1487 } | 1464 } |
1488 | 1465 |
1489 return S_FALSE; | 1466 return S_FALSE; |
1490 } | 1467 } |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1599 const std::vector<int32_t>& unique_cell_ids = | 1576 const std::vector<int32_t>& unique_cell_ids = |
1600 GetIntListAttribute(ui::AX_ATTR_UNIQUE_CELL_IDS); | 1577 GetIntListAttribute(ui::AX_ATTR_UNIQUE_CELL_IDS); |
1601 int cell_id_count = static_cast<int>(unique_cell_ids.size()); | 1578 int cell_id_count = static_cast<int>(unique_cell_ids.size()); |
1602 if (index < 0) | 1579 if (index < 0) |
1603 return E_INVALIDARG; | 1580 return E_INVALIDARG; |
1604 if (index >= cell_id_count) | 1581 if (index >= cell_id_count) |
1605 return S_FALSE; | 1582 return S_FALSE; |
1606 | 1583 |
1607 int cell_id = unique_cell_ids[index]; | 1584 int cell_id = unique_cell_ids[index]; |
1608 BrowserAccessibilityWin* cell = | 1585 BrowserAccessibilityWin* cell = |
1609 manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); | 1586 ToBrowserAccessibilityWin(manager()->GetFromID(cell_id)); |
1610 int rowspan; | 1587 int rowspan; |
1611 int colspan; | 1588 int colspan; |
1612 if (cell && | 1589 if (cell && |
1613 cell->GetIntAttribute( | 1590 cell->GetIntAttribute( |
1614 ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && | 1591 ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && |
1615 cell->GetIntAttribute( | 1592 cell->GetIntAttribute( |
1616 ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && | 1593 ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && |
1617 rowspan >= 1 && | 1594 rowspan >= 1 && |
1618 colspan >= 1) { | 1595 colspan >= 1) { |
1619 *row_extents = rowspan; | 1596 *row_extents = rowspan; |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1758 } | 1735 } |
1759 if (columns <= 0 || rows <= 0 || column < 0 || column >= columns) | 1736 if (columns <= 0 || rows <= 0 || column < 0 || column >= columns) |
1760 return S_FALSE; | 1737 return S_FALSE; |
1761 | 1738 |
1762 const std::vector<int32_t>& cell_ids = | 1739 const std::vector<int32_t>& cell_ids = |
1763 table->GetIntListAttribute(ui::AX_ATTR_CELL_IDS); | 1740 table->GetIntListAttribute(ui::AX_ATTR_CELL_IDS); |
1764 | 1741 |
1765 for (int i = 0; i < rows; ++i) { | 1742 for (int i = 0; i < rows; ++i) { |
1766 int cell_id = cell_ids[i * columns + column]; | 1743 int cell_id = cell_ids[i * columns + column]; |
1767 BrowserAccessibilityWin* cell = | 1744 BrowserAccessibilityWin* cell = |
1768 manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); | 1745 ToBrowserAccessibilityWin(manager()->GetFromID(cell_id)); |
1769 if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) | 1746 if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) |
1770 (*n_column_header_cells)++; | 1747 (*n_column_header_cells)++; |
1771 } | 1748 } |
1772 | 1749 |
1773 *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( | 1750 *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( |
1774 (*n_column_header_cells) * sizeof(cell_accessibles[0]))); | 1751 (*n_column_header_cells) * sizeof(cell_accessibles[0]))); |
1775 int index = 0; | 1752 int index = 0; |
1776 for (int i = 0; i < rows; ++i) { | 1753 for (int i = 0; i < rows; ++i) { |
1777 int cell_id = cell_ids[i * columns + column]; | 1754 int cell_id = cell_ids[i * columns + column]; |
1778 BrowserAccessibility* cell = manager()->GetFromID(cell_id); | 1755 BrowserAccessibility* cell = manager()->GetFromID(cell_id); |
1779 if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) { | 1756 if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) { |
1780 (*cell_accessibles)[index] = static_cast<IAccessible*>( | 1757 (*cell_accessibles)[index] = static_cast<IAccessible*>( |
1781 cell->ToBrowserAccessibilityWin()->NewReference()); | 1758 ToBrowserAccessibilityWin(cell)->NewReference()); |
1782 ++index; | 1759 ++index; |
1783 } | 1760 } |
1784 } | 1761 } |
1785 | 1762 |
1786 return S_OK; | 1763 return S_OK; |
1787 } | 1764 } |
1788 | 1765 |
1789 STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long* column_index) { | 1766 STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long* column_index) { |
1790 if (!instance_active()) | 1767 if (!instance_active()) |
1791 return E_FAIL; | 1768 return E_FAIL; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1868 } | 1845 } |
1869 | 1846 |
1870 *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( | 1847 *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( |
1871 (*n_row_header_cells) * sizeof(cell_accessibles[0]))); | 1848 (*n_row_header_cells) * sizeof(cell_accessibles[0]))); |
1872 int index = 0; | 1849 int index = 0; |
1873 for (int i = 0; i < columns; ++i) { | 1850 for (int i = 0; i < columns; ++i) { |
1874 int cell_id = cell_ids[row * columns + i]; | 1851 int cell_id = cell_ids[row * columns + i]; |
1875 BrowserAccessibility* cell = manager()->GetFromID(cell_id); | 1852 BrowserAccessibility* cell = manager()->GetFromID(cell_id); |
1876 if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) { | 1853 if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) { |
1877 (*cell_accessibles)[index] = static_cast<IAccessible*>( | 1854 (*cell_accessibles)[index] = static_cast<IAccessible*>( |
1878 cell->ToBrowserAccessibilityWin()->NewReference()); | 1855 ToBrowserAccessibilityWin(cell)->NewReference()); |
1879 ++index; | 1856 ++index; |
1880 } | 1857 } |
1881 } | 1858 } |
1882 | 1859 |
1883 return S_OK; | 1860 return S_OK; |
1884 } | 1861 } |
1885 | 1862 |
1886 STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long* row_index) { | 1863 STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long* row_index) { |
1887 if (!instance_active()) | 1864 if (!instance_active()) |
1888 return E_FAIL; | 1865 return E_FAIL; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1963 | 1940 |
1964 BrowserAccessibility* find_table = GetParent(); | 1941 BrowserAccessibility* find_table = GetParent(); |
1965 while (find_table && find_table->GetRole() != ui::AX_ROLE_TABLE) | 1942 while (find_table && find_table->GetRole() != ui::AX_ROLE_TABLE) |
1966 find_table = find_table->GetParent(); | 1943 find_table = find_table->GetParent(); |
1967 if (!find_table) { | 1944 if (!find_table) { |
1968 NOTREACHED(); | 1945 NOTREACHED(); |
1969 return S_FALSE; | 1946 return S_FALSE; |
1970 } | 1947 } |
1971 | 1948 |
1972 *table = static_cast<IAccessibleTable*>( | 1949 *table = static_cast<IAccessibleTable*>( |
1973 find_table->ToBrowserAccessibilityWin()->NewReference()); | 1950 ToBrowserAccessibilityWin(find_table)->NewReference()); |
1974 | 1951 |
1975 return S_OK; | 1952 return S_OK; |
1976 } | 1953 } |
1977 | 1954 |
1978 // | 1955 // |
1979 // IAccessibleText methods. | 1956 // IAccessibleText methods. |
1980 // | 1957 // |
1981 | 1958 |
1982 STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) { | 1959 STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) { |
1983 if (!instance_active()) | 1960 if (!instance_active()) |
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2405 return E_FAIL; | 2382 return E_FAIL; |
2406 | 2383 |
2407 if (!hyperlink || | 2384 if (!hyperlink || |
2408 index < 0 || | 2385 index < 0 || |
2409 index >= static_cast<long>(hyperlinks().size())) { | 2386 index >= static_cast<long>(hyperlinks().size())) { |
2410 return E_INVALIDARG; | 2387 return E_INVALIDARG; |
2411 } | 2388 } |
2412 | 2389 |
2413 int32_t id = hyperlinks()[index]; | 2390 int32_t id = hyperlinks()[index]; |
2414 BrowserAccessibilityWin* child = | 2391 BrowserAccessibilityWin* child = |
2415 manager()->GetFromID(id)->ToBrowserAccessibilityWin(); | 2392 ToBrowserAccessibilityWin(manager()->GetFromID(id)); |
2416 if (child) { | 2393 if (child) { |
2417 *hyperlink = static_cast<IAccessibleHyperlink*>(child->NewReference()); | 2394 *hyperlink = static_cast<IAccessibleHyperlink*>(child->NewReference()); |
2418 return S_OK; | 2395 return S_OK; |
2419 } | 2396 } |
2420 | 2397 |
2421 return E_FAIL; | 2398 return E_FAIL; |
2422 } | 2399 } |
2423 | 2400 |
2424 STDMETHODIMP BrowserAccessibilityWin::get_hyperlinkIndex( | 2401 STDMETHODIMP BrowserAccessibilityWin::get_hyperlinkIndex( |
2425 long char_index, | 2402 long char_index, |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2503 if (!instance_active() || !IsHyperlink()) | 2480 if (!instance_active() || !IsHyperlink()) |
2504 return E_FAIL; | 2481 return E_FAIL; |
2505 | 2482 |
2506 if (!index) | 2483 if (!index) |
2507 return E_INVALIDARG; | 2484 return E_INVALIDARG; |
2508 | 2485 |
2509 int32_t hypertext_offset = 0; | 2486 int32_t hypertext_offset = 0; |
2510 const auto parent = GetParent(); | 2487 const auto parent = GetParent(); |
2511 if (parent) { | 2488 if (parent) { |
2512 hypertext_offset = | 2489 hypertext_offset = |
2513 parent->ToBrowserAccessibilityWin()->GetHypertextOffsetFromChild(*this); | 2490 ToBrowserAccessibilityWin(parent)->GetHypertextOffsetFromChild(*this); |
2514 } | 2491 } |
2515 *index = static_cast<LONG>(hypertext_offset); | 2492 *index = static_cast<LONG>(hypertext_offset); |
2516 return S_OK; | 2493 return S_OK; |
2517 } | 2494 } |
2518 | 2495 |
2519 STDMETHODIMP BrowserAccessibilityWin::get_endIndex(long* index) { | 2496 STDMETHODIMP BrowserAccessibilityWin::get_endIndex(long* index) { |
2520 LONG start_index; | 2497 LONG start_index; |
2521 HRESULT hr = get_startIndex(&start_index); | 2498 HRESULT hr = get_startIndex(&start_index); |
2522 if (hr == S_OK) | 2499 if (hr == S_OK) |
2523 *index = start_index + 1; | 2500 *index = start_index + 1; |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2744 | 2721 |
2745 base::string16 tag; | 2722 base::string16 tag; |
2746 if (GetString16Attribute(ui::AX_ATTR_HTML_TAG, &tag)) | 2723 if (GetString16Attribute(ui::AX_ATTR_HTML_TAG, &tag)) |
2747 *node_name = SysAllocString(tag.c_str()); | 2724 *node_name = SysAllocString(tag.c_str()); |
2748 else | 2725 else |
2749 *node_name = NULL; | 2726 *node_name = NULL; |
2750 | 2727 |
2751 *name_space_id = 0; | 2728 *name_space_id = 0; |
2752 *node_value = SysAllocString(value().c_str()); | 2729 *node_value = SysAllocString(value().c_str()); |
2753 *num_children = PlatformChildCount(); | 2730 *num_children = PlatformChildCount(); |
2754 *unique_id = unique_id_win_; | 2731 *unique_id = -unique_id_; |
2755 | 2732 |
2756 if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA || | 2733 if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA || |
2757 GetRole() == ui::AX_ROLE_WEB_AREA) { | 2734 GetRole() == ui::AX_ROLE_WEB_AREA) { |
2758 *node_type = NODETYPE_DOCUMENT; | 2735 *node_type = NODETYPE_DOCUMENT; |
2759 } else if (IsTextOnlyObject()) { | 2736 } else if (IsTextOnlyObject()) { |
2760 *node_type = NODETYPE_TEXT; | 2737 *node_type = NODETYPE_TEXT; |
2761 } else { | 2738 } else { |
2762 *node_type = NODETYPE_ELEMENT; | 2739 *node_type = NODETYPE_ELEMENT; |
2763 } | 2740 } |
2764 | 2741 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2882 IA2_SCROLL_TYPE_TOP_LEFT : IA2_SCROLL_TYPE_ANYWHERE); | 2859 IA2_SCROLL_TYPE_TOP_LEFT : IA2_SCROLL_TYPE_ANYWHERE); |
2883 } | 2860 } |
2884 | 2861 |
2885 STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) { | 2862 STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) { |
2886 if (!instance_active()) | 2863 if (!instance_active()) |
2887 return E_FAIL; | 2864 return E_FAIL; |
2888 | 2865 |
2889 if (!node) | 2866 if (!node) |
2890 return E_INVALIDARG; | 2867 return E_INVALIDARG; |
2891 | 2868 |
2892 *node = GetParent()->ToBrowserAccessibilityWin()->NewReference(); | 2869 *node = ToBrowserAccessibilityWin(GetParent())->NewReference(); |
2893 return S_OK; | 2870 return S_OK; |
2894 } | 2871 } |
2895 | 2872 |
2896 STDMETHODIMP BrowserAccessibilityWin::get_firstChild(ISimpleDOMNode** node) { | 2873 STDMETHODIMP BrowserAccessibilityWin::get_firstChild(ISimpleDOMNode** node) { |
2897 if (!instance_active()) | 2874 if (!instance_active()) |
2898 return E_FAIL; | 2875 return E_FAIL; |
2899 | 2876 |
2900 if (!node) | 2877 if (!node) |
2901 return E_INVALIDARG; | 2878 return E_INVALIDARG; |
2902 | 2879 |
2903 if (PlatformChildCount() == 0) { | 2880 if (PlatformChildCount() == 0) { |
2904 *node = NULL; | 2881 *node = NULL; |
2905 return S_FALSE; | 2882 return S_FALSE; |
2906 } | 2883 } |
2907 | 2884 |
2908 *node = PlatformGetChild(0)->ToBrowserAccessibilityWin()->NewReference(); | 2885 *node = ToBrowserAccessibilityWin(PlatformGetChild(0))->NewReference(); |
2909 return S_OK; | 2886 return S_OK; |
2910 } | 2887 } |
2911 | 2888 |
2912 STDMETHODIMP BrowserAccessibilityWin::get_lastChild(ISimpleDOMNode** node) { | 2889 STDMETHODIMP BrowserAccessibilityWin::get_lastChild(ISimpleDOMNode** node) { |
2913 if (!instance_active()) | 2890 if (!instance_active()) |
2914 return E_FAIL; | 2891 return E_FAIL; |
2915 | 2892 |
2916 if (!node) | 2893 if (!node) |
2917 return E_INVALIDARG; | 2894 return E_INVALIDARG; |
2918 | 2895 |
2919 if (PlatformChildCount() == 0) { | 2896 if (PlatformChildCount() == 0) { |
2920 *node = NULL; | 2897 *node = NULL; |
2921 return S_FALSE; | 2898 return S_FALSE; |
2922 } | 2899 } |
2923 | 2900 |
2924 *node = PlatformGetChild(PlatformChildCount() - 1) | 2901 *node = ToBrowserAccessibilityWin( |
2925 ->ToBrowserAccessibilityWin()->NewReference(); | 2902 PlatformGetChild(PlatformChildCount() - 1))->NewReference(); |
2926 return S_OK; | 2903 return S_OK; |
2927 } | 2904 } |
2928 | 2905 |
2929 STDMETHODIMP BrowserAccessibilityWin::get_previousSibling( | 2906 STDMETHODIMP BrowserAccessibilityWin::get_previousSibling( |
2930 ISimpleDOMNode** node) { | 2907 ISimpleDOMNode** node) { |
2931 if (!instance_active()) | 2908 if (!instance_active()) |
2932 return E_FAIL; | 2909 return E_FAIL; |
2933 | 2910 |
2934 if (!node) | 2911 if (!node) |
2935 return E_INVALIDARG; | 2912 return E_INVALIDARG; |
2936 | 2913 |
2937 if (!GetParent() || GetIndexInParent() <= 0) { | 2914 if (!GetParent() || GetIndexInParent() <= 0) { |
2938 *node = NULL; | 2915 *node = NULL; |
2939 return S_FALSE; | 2916 return S_FALSE; |
2940 } | 2917 } |
2941 | 2918 |
2942 *node = GetParent()->InternalGetChild(GetIndexInParent() - 1)-> | 2919 *node = ToBrowserAccessibilityWin( |
2943 ToBrowserAccessibilityWin()->NewReference(); | 2920 GetParent()->InternalGetChild(GetIndexInParent() - 1))->NewReference(); |
2944 return S_OK; | 2921 return S_OK; |
2945 } | 2922 } |
2946 | 2923 |
2947 STDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) { | 2924 STDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) { |
2948 if (!instance_active()) | 2925 if (!instance_active()) |
2949 return E_FAIL; | 2926 return E_FAIL; |
2950 | 2927 |
2951 if (!node) | 2928 if (!node) |
2952 return E_INVALIDARG; | 2929 return E_INVALIDARG; |
2953 | 2930 |
2954 if (!GetParent() || | 2931 if (!GetParent() || |
2955 GetIndexInParent() < 0 || | 2932 GetIndexInParent() < 0 || |
2956 GetIndexInParent() >= static_cast<int>( | 2933 GetIndexInParent() >= static_cast<int>( |
2957 GetParent()->InternalChildCount()) - 1) { | 2934 GetParent()->InternalChildCount()) - 1) { |
2958 *node = NULL; | 2935 *node = NULL; |
2959 return S_FALSE; | 2936 return S_FALSE; |
2960 } | 2937 } |
2961 | 2938 |
2962 *node = GetParent()->InternalGetChild(GetIndexInParent() + 1)-> | 2939 *node = ToBrowserAccessibilityWin( |
2963 ToBrowserAccessibilityWin()->NewReference(); | 2940 GetParent()->InternalGetChild(GetIndexInParent() + 1))->NewReference(); |
2964 return S_OK; | 2941 return S_OK; |
2965 } | 2942 } |
2966 | 2943 |
2967 STDMETHODIMP BrowserAccessibilityWin::get_childAt( | 2944 STDMETHODIMP BrowserAccessibilityWin::get_childAt( |
2968 unsigned int child_index, | 2945 unsigned int child_index, |
2969 ISimpleDOMNode** node) { | 2946 ISimpleDOMNode** node) { |
2970 if (!instance_active()) | 2947 if (!instance_active()) |
2971 return E_FAIL; | 2948 return E_FAIL; |
2972 | 2949 |
2973 if (!node) | 2950 if (!node) |
2974 return E_INVALIDARG; | 2951 return E_INVALIDARG; |
2975 | 2952 |
2976 if (child_index >= PlatformChildCount()) | 2953 if (child_index >= PlatformChildCount()) |
2977 return E_INVALIDARG; | 2954 return E_INVALIDARG; |
2978 | 2955 |
2979 BrowserAccessibility* child = PlatformGetChild(child_index); | 2956 BrowserAccessibility* child = PlatformGetChild(child_index); |
2980 if (!child) { | 2957 if (!child) { |
2981 *node = NULL; | 2958 *node = NULL; |
2982 return S_FALSE; | 2959 return S_FALSE; |
2983 } | 2960 } |
2984 | 2961 |
2985 *node = child->ToBrowserAccessibilityWin()->NewReference(); | 2962 *node = ToBrowserAccessibilityWin(child)->NewReference(); |
2986 return S_OK; | 2963 return S_OK; |
2987 } | 2964 } |
2988 | 2965 |
2989 STDMETHODIMP BrowserAccessibilityWin::get_innerHTML(BSTR* innerHTML) { | 2966 STDMETHODIMP BrowserAccessibilityWin::get_innerHTML(BSTR* innerHTML) { |
2990 return E_NOTIMPL; | 2967 return E_NOTIMPL; |
2991 } | 2968 } |
2992 | 2969 |
2993 STDMETHODIMP | 2970 STDMETHODIMP |
2994 BrowserAccessibilityWin::get_localInterface(void** local_interface) { | 2971 BrowserAccessibilityWin::get_localInterface(void** local_interface) { |
2995 return E_NOTIMPL; | 2972 return E_NOTIMPL; |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3094 if (riid == IID_IAccessible2) | 3071 if (riid == IID_IAccessible2) |
3095 BrowserAccessibilityStateImpl::GetInstance()->EnableAccessibility(); | 3072 BrowserAccessibilityStateImpl::GetInstance()->EnableAccessibility(); |
3096 | 3073 |
3097 if (guid_service == GUID_IAccessibleContentDocument) { | 3074 if (guid_service == GUID_IAccessibleContentDocument) { |
3098 // Special Mozilla extension: return the accessible for the root document. | 3075 // Special Mozilla extension: return the accessible for the root document. |
3099 // Screen readers use this to distinguish between a document loaded event | 3076 // Screen readers use this to distinguish between a document loaded event |
3100 // on the root document vs on an iframe. | 3077 // on the root document vs on an iframe. |
3101 BrowserAccessibility* node = this; | 3078 BrowserAccessibility* node = this; |
3102 while (node->GetParent()) | 3079 while (node->GetParent()) |
3103 node = node->GetParent()->manager()->GetRoot(); | 3080 node = node->GetParent()->manager()->GetRoot(); |
3104 return node->ToBrowserAccessibilityWin()->QueryInterface( | 3081 return ToBrowserAccessibilityWin(node)->QueryInterface( |
3105 IID_IAccessible2, object); | 3082 IID_IAccessible2, object); |
3106 } | 3083 } |
3107 | 3084 |
3108 if (guid_service == IID_IAccessible || | 3085 if (guid_service == IID_IAccessible || |
3109 guid_service == IID_IAccessible2 || | 3086 guid_service == IID_IAccessible2 || |
3110 guid_service == IID_IAccessibleAction || | 3087 guid_service == IID_IAccessibleAction || |
3111 guid_service == IID_IAccessibleApplication || | 3088 guid_service == IID_IAccessibleApplication || |
3112 guid_service == IID_IAccessibleHyperlink || | 3089 guid_service == IID_IAccessibleHyperlink || |
3113 guid_service == IID_IAccessibleHypertext || | 3090 guid_service == IID_IAccessibleHypertext || |
3114 guid_service == IID_IAccessibleImage || | 3091 guid_service == IID_IAccessibleImage || |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3451 return; | 3428 return; |
3452 } | 3429 } |
3453 | 3430 |
3454 // Construct the hypertext for this node, which contains the concatenation | 3431 // Construct the hypertext for this node, which contains the concatenation |
3455 // of all of the static text and widespace of this node's children and an | 3432 // of all of the static text and widespace of this node's children and an |
3456 // embedded object character for all the other children. Build up a map from | 3433 // embedded object character for all the other children. Build up a map from |
3457 // the character index of each embedded object character to the id of the | 3434 // the character index of each embedded object character to the id of the |
3458 // child object it points to. | 3435 // child object it points to. |
3459 for (unsigned int i = 0; i < PlatformChildCount(); ++i) { | 3436 for (unsigned int i = 0; i < PlatformChildCount(); ++i) { |
3460 BrowserAccessibilityWin* child = | 3437 BrowserAccessibilityWin* child = |
3461 PlatformGetChild(i)->ToBrowserAccessibilityWin(); | 3438 ToBrowserAccessibilityWin(PlatformGetChild(i)); |
3462 DCHECK(child); | 3439 DCHECK(child); |
3463 // Similar to Firefox, we don't expose text-only objects in IA2 hypertext. | 3440 // Similar to Firefox, we don't expose text-only objects in IA2 hypertext. |
3464 if (child->IsTextOnlyObject()) { | 3441 if (child->IsTextOnlyObject()) { |
3465 win_attributes_->hypertext += child->name(); | 3442 win_attributes_->hypertext += child->name(); |
3466 } else { | 3443 } else { |
3467 int32_t char_offset = static_cast<int32_t>(GetText().size()); | 3444 int32_t char_offset = static_cast<int32_t>(GetText().size()); |
3468 int32_t child_id = child->GetId(); | 3445 int32_t child_id = child->GetId(); |
3469 int32_t index = hyperlinks().size(); | 3446 int32_t index = hyperlinks().size(); |
3470 win_attributes_->hyperlink_offset_to_index[char_offset] = index; | 3447 win_attributes_->hyperlink_offset_to_index[char_offset] = index; |
3471 win_attributes_->hyperlinks.push_back(child_id); | 3448 win_attributes_->hyperlinks.push_back(child_id); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3555 manager->MaybeCallNotifyWinEvent(IA2_EVENT_TEXT_REMOVED, this); | 3532 manager->MaybeCallNotifyWinEvent(IA2_EVENT_TEXT_REMOVED, this); |
3556 } | 3533 } |
3557 if (new_len > 0) { | 3534 if (new_len > 0) { |
3558 // In-process screen readers may call IAccessibleText::get_newText | 3535 // In-process screen readers may call IAccessibleText::get_newText |
3559 // in reaction to this event to retrieve the text that was inserted. | 3536 // in reaction to this event to retrieve the text that was inserted. |
3560 manager->MaybeCallNotifyWinEvent(IA2_EVENT_TEXT_INSERTED, this); | 3537 manager->MaybeCallNotifyWinEvent(IA2_EVENT_TEXT_INSERTED, this); |
3561 } | 3538 } |
3562 | 3539 |
3563 // Changing a static text node can affect the IAccessibleText hypertext | 3540 // Changing a static text node can affect the IAccessibleText hypertext |
3564 // of the parent node, so force an update on the parent. | 3541 // of the parent node, so force an update on the parent. |
3565 BrowserAccessibilityWin* parent = GetParent()->ToBrowserAccessibilityWin(); | 3542 BrowserAccessibilityWin* parent = ToBrowserAccessibilityWin(GetParent()); |
3566 if (parent && IsTextOnlyObject() && | 3543 if (parent && IsTextOnlyObject() && |
3567 name() != old_win_attributes_->name) { | 3544 name() != old_win_attributes_->name) { |
3568 parent->UpdateStep1ComputeWinAttributes(); | 3545 parent->UpdateStep1ComputeWinAttributes(); |
3569 parent->UpdateStep2ComputeHypertext(); | 3546 parent->UpdateStep2ComputeHypertext(); |
3570 parent->UpdateStep3FireEvents(false); | 3547 parent->UpdateStep3FireEvents(false); |
3571 } | 3548 } |
3572 } | 3549 } |
3573 | 3550 |
3574 old_win_attributes_.reset(nullptr); | 3551 old_win_attributes_.reset(nullptr); |
3575 } | 3552 } |
(...skipping 28 matching lines...) Expand all Loading... |
3604 BrowserAccessibilityWin* BrowserAccessibilityWin::GetTargetFromChildID( | 3581 BrowserAccessibilityWin* BrowserAccessibilityWin::GetTargetFromChildID( |
3605 const VARIANT& var_id) { | 3582 const VARIANT& var_id) { |
3606 if (var_id.vt != VT_I4) | 3583 if (var_id.vt != VT_I4) |
3607 return NULL; | 3584 return NULL; |
3608 | 3585 |
3609 LONG child_id = var_id.lVal; | 3586 LONG child_id = var_id.lVal; |
3610 if (child_id == CHILDID_SELF) | 3587 if (child_id == CHILDID_SELF) |
3611 return this; | 3588 return this; |
3612 | 3589 |
3613 if (child_id >= 1 && child_id <= static_cast<LONG>(PlatformChildCount())) | 3590 if (child_id >= 1 && child_id <= static_cast<LONG>(PlatformChildCount())) |
3614 return PlatformGetChild(child_id - 1)->ToBrowserAccessibilityWin(); | 3591 return ToBrowserAccessibilityWin(PlatformGetChild(child_id - 1)); |
3615 | 3592 |
3616 return manager()->ToBrowserAccessibilityManagerWin()-> | 3593 return ToBrowserAccessibilityWin( |
3617 GetFromUniqueIdWin(child_id); | 3594 BrowserAccessibility::GetFromUniqueID(-child_id)); |
3618 } | 3595 } |
3619 | 3596 |
3620 HRESULT BrowserAccessibilityWin::GetStringAttributeAsBstr( | 3597 HRESULT BrowserAccessibilityWin::GetStringAttributeAsBstr( |
3621 ui::AXStringAttribute attribute, | 3598 ui::AXStringAttribute attribute, |
3622 BSTR* value_bstr) { | 3599 BSTR* value_bstr) { |
3623 base::string16 str; | 3600 base::string16 str; |
3624 | 3601 |
3625 if (!GetString16Attribute(attribute, &str)) | 3602 if (!GetString16Attribute(attribute, &str)) |
3626 return S_FALSE; | 3603 return S_FALSE; |
3627 | 3604 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3680 base::ASCIIToUTF16(ia2_attr) + L":" + | 3657 base::ASCIIToUTF16(ia2_attr) + L":" + |
3681 base::IntToString16(value)); | 3658 base::IntToString16(value)); |
3682 } | 3659 } |
3683 } | 3660 } |
3684 | 3661 |
3685 bool BrowserAccessibilityWin::IsHyperlink() const { | 3662 bool BrowserAccessibilityWin::IsHyperlink() const { |
3686 int32_t hyperlink_index = -1; | 3663 int32_t hyperlink_index = -1; |
3687 const auto parent = GetParent(); | 3664 const auto parent = GetParent(); |
3688 if (parent) { | 3665 if (parent) { |
3689 hyperlink_index = | 3666 hyperlink_index = |
3690 parent->ToBrowserAccessibilityWin()->GetHyperlinkIndexFromChild(*this); | 3667 ToBrowserAccessibilityWin(parent)->GetHyperlinkIndexFromChild(*this); |
3691 } | 3668 } |
3692 | 3669 |
3693 if (hyperlink_index >= 0) | 3670 if (hyperlink_index >= 0) |
3694 return true; | 3671 return true; |
3695 return false; | 3672 return false; |
3696 } | 3673 } |
3697 | 3674 |
3698 int32_t BrowserAccessibilityWin::GetHyperlinkIndexFromChild( | 3675 int32_t BrowserAccessibilityWin::GetHyperlinkIndexFromChild( |
3699 const BrowserAccessibilityWin& child) const { | 3676 const BrowserAccessibilityWin& child) const { |
3700 if (hyperlinks().empty()) | 3677 if (hyperlinks().empty()) |
(...skipping 26 matching lines...) Expand all Loading... |
3727 // and so |InternalChild...| functions need to be used. Also, direct text-only | 3704 // and so |InternalChild...| functions need to be used. Also, direct text-only |
3728 // children should not be present at tree roots and so no cross-tree traversal | 3705 // children should not be present at tree roots and so no cross-tree traversal |
3729 // is necessary.) | 3706 // is necessary.) |
3730 if (child.IsTextOnlyObject()) { | 3707 if (child.IsTextOnlyObject()) { |
3731 int32_t hypertextOffset = 0; | 3708 int32_t hypertextOffset = 0; |
3732 int32_t index_in_parent = child.GetIndexInParent(); | 3709 int32_t index_in_parent = child.GetIndexInParent(); |
3733 DCHECK_GE(index_in_parent, 0); | 3710 DCHECK_GE(index_in_parent, 0); |
3734 DCHECK_LT(index_in_parent, static_cast<int32_t>(InternalChildCount())); | 3711 DCHECK_LT(index_in_parent, static_cast<int32_t>(InternalChildCount())); |
3735 for (uint32_t i = 0; i < static_cast<uint32_t>(index_in_parent); ++i) { | 3712 for (uint32_t i = 0; i < static_cast<uint32_t>(index_in_parent); ++i) { |
3736 const BrowserAccessibilityWin* sibling = | 3713 const BrowserAccessibilityWin* sibling = |
3737 InternalGetChild(i)->ToBrowserAccessibilityWin(); | 3714 ToBrowserAccessibilityWin(InternalGetChild(i)); |
3738 DCHECK(sibling); | 3715 DCHECK(sibling); |
3739 if (sibling->IsTextOnlyObject()) | 3716 if (sibling->IsTextOnlyObject()) |
3740 hypertextOffset += sibling->GetText().size(); | 3717 hypertextOffset += sibling->GetText().size(); |
3741 else | 3718 else |
3742 ++hypertextOffset; | 3719 ++hypertextOffset; |
3743 } | 3720 } |
3744 return hypertextOffset; | 3721 return hypertextOffset; |
3745 } | 3722 } |
3746 | 3723 |
3747 int32_t hyperlink_index = GetHyperlinkIndexFromChild(child); | 3724 int32_t hyperlink_index = GetHyperlinkIndexFromChild(child); |
3748 if (hyperlink_index < 0) | 3725 if (hyperlink_index < 0) |
3749 return -1; | 3726 return -1; |
3750 | 3727 |
3751 return GetHypertextOffsetFromHyperlinkIndex(hyperlink_index); | 3728 return GetHypertextOffsetFromHyperlinkIndex(hyperlink_index); |
3752 } | 3729 } |
3753 | 3730 |
3754 int32_t BrowserAccessibilityWin::GetHypertextOffsetFromDescendant( | 3731 int32_t BrowserAccessibilityWin::GetHypertextOffsetFromDescendant( |
3755 const BrowserAccessibilityWin& descendant) const { | 3732 const BrowserAccessibilityWin& descendant) const { |
3756 auto parent_object = descendant.GetParent()->ToBrowserAccessibilityWin(); | 3733 auto parent_object = ToBrowserAccessibilityWin(descendant.GetParent()); |
3757 auto current_object = const_cast<BrowserAccessibilityWin*>(&descendant); | 3734 auto current_object = const_cast<BrowserAccessibilityWin*>(&descendant); |
3758 while (parent_object && parent_object != this) { | 3735 while (parent_object && parent_object != this) { |
3759 current_object = parent_object; | 3736 current_object = parent_object; |
3760 parent_object = current_object->GetParent()->ToBrowserAccessibilityWin(); | 3737 parent_object = ToBrowserAccessibilityWin(current_object->GetParent()); |
3761 } | 3738 } |
3762 if (!parent_object) | 3739 if (!parent_object) |
3763 return -1; | 3740 return -1; |
3764 | 3741 |
3765 return parent_object->GetHypertextOffsetFromChild(*current_object); | 3742 return parent_object->GetHypertextOffsetFromChild(*current_object); |
3766 } | 3743 } |
3767 | 3744 |
3768 int BrowserAccessibilityWin::GetHypertextOffsetFromEndpoint( | 3745 int BrowserAccessibilityWin::GetHypertextOffsetFromEndpoint( |
3769 const BrowserAccessibilityWin& endpoint_object, | 3746 const BrowserAccessibilityWin& endpoint_object, |
3770 int endpoint_offset) const { | 3747 int endpoint_offset) const { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3832 if (endpoint_index_in_common_parent > index_in_common_parent) | 3809 if (endpoint_index_in_common_parent > index_in_common_parent) |
3833 return GetText().size(); | 3810 return GetText().size(); |
3834 | 3811 |
3835 NOTREACHED(); | 3812 NOTREACHED(); |
3836 return -1; | 3813 return -1; |
3837 } | 3814 } |
3838 | 3815 |
3839 int BrowserAccessibilityWin::GetSelectionAnchor() const { | 3816 int BrowserAccessibilityWin::GetSelectionAnchor() const { |
3840 int32_t anchor_id = manager()->GetTreeData().sel_anchor_object_id; | 3817 int32_t anchor_id = manager()->GetTreeData().sel_anchor_object_id; |
3841 const auto anchor_object = | 3818 const auto anchor_object = |
3842 manager()->GetFromID(anchor_id)->ToBrowserAccessibilityWin(); | 3819 ToBrowserAccessibilityWin(manager()->GetFromID(anchor_id)); |
3843 if (!anchor_object) | 3820 if (!anchor_object) |
3844 return -1; | 3821 return -1; |
3845 | 3822 |
3846 int anchor_offset = manager()->GetTreeData().sel_anchor_offset; | 3823 int anchor_offset = manager()->GetTreeData().sel_anchor_offset; |
3847 return GetHypertextOffsetFromEndpoint(*anchor_object, anchor_offset); | 3824 return GetHypertextOffsetFromEndpoint(*anchor_object, anchor_offset); |
3848 } | 3825 } |
3849 | 3826 |
3850 int BrowserAccessibilityWin::GetSelectionFocus() const { | 3827 int BrowserAccessibilityWin::GetSelectionFocus() const { |
3851 int32_t focus_id = manager()->GetTreeData().sel_focus_object_id; | 3828 int32_t focus_id = manager()->GetTreeData().sel_focus_object_id; |
3852 const auto focus_object = | 3829 const auto focus_object = |
3853 manager()->GetFromID(focus_id)->ToBrowserAccessibilityWin(); | 3830 ToBrowserAccessibilityWin(manager()->GetFromID(focus_id)); |
3854 if (!focus_object) | 3831 if (!focus_object) |
3855 return -1; | 3832 return -1; |
3856 | 3833 |
3857 int focus_offset = manager()->GetTreeData().sel_focus_offset; | 3834 int focus_offset = manager()->GetTreeData().sel_focus_offset; |
3858 return GetHypertextOffsetFromEndpoint(*focus_object, focus_offset); | 3835 return GetHypertextOffsetFromEndpoint(*focus_object, focus_offset); |
3859 } | 3836 } |
3860 | 3837 |
3861 void BrowserAccessibilityWin::GetSelectionOffsets( | 3838 void BrowserAccessibilityWin::GetSelectionOffsets( |
3862 int* selection_start, int* selection_end) const { | 3839 int* selection_start, int* selection_end) const { |
3863 DCHECK(selection_start && selection_end); | 3840 DCHECK(selection_start && selection_end); |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4041 return GetWordStartBoundary(static_cast<int>(start_offset), direction); | 4018 return GetWordStartBoundary(static_cast<int>(start_offset), direction); |
4042 | 4019 |
4043 ui::TextBoundaryType boundary = IA2TextBoundaryToTextBoundary(ia2_boundary); | 4020 ui::TextBoundaryType boundary = IA2TextBoundaryToTextBoundary(ia2_boundary); |
4044 const std::vector<int32_t>& line_breaks = | 4021 const std::vector<int32_t>& line_breaks = |
4045 GetIntListAttribute(ui::AX_ATTR_LINE_BREAKS); | 4022 GetIntListAttribute(ui::AX_ATTR_LINE_BREAKS); |
4046 return ui::FindAccessibleTextBoundary( | 4023 return ui::FindAccessibleTextBoundary( |
4047 text, line_breaks, boundary, start_offset, direction); | 4024 text, line_breaks, boundary, start_offset, direction); |
4048 } | 4025 } |
4049 | 4026 |
4050 BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromID(int32_t id) { | 4027 BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromID(int32_t id) { |
4051 return manager()->GetFromID(id)->ToBrowserAccessibilityWin(); | 4028 return ToBrowserAccessibilityWin(manager()->GetFromID(id)); |
4052 } | 4029 } |
4053 | 4030 |
4054 bool BrowserAccessibilityWin::IsListBoxOptionOrMenuListOption() { | 4031 bool BrowserAccessibilityWin::IsListBoxOptionOrMenuListOption() { |
4055 if (!GetParent()) | 4032 if (!GetParent()) |
4056 return false; | 4033 return false; |
4057 | 4034 |
4058 int32_t role = GetRole(); | 4035 int32_t role = GetRole(); |
4059 int32_t parent_role = GetParent()->GetRole(); | 4036 int32_t parent_role = GetParent()->GetRole(); |
4060 | 4037 |
4061 if (role == ui::AX_ROLE_LIST_BOX_OPTION && | 4038 if (role == ui::AX_ROLE_LIST_BOX_OPTION && |
(...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4696 if (!ia2_role) | 4673 if (!ia2_role) |
4697 ia2_role = ia_role; | 4674 ia2_role = ia_role; |
4698 | 4675 |
4699 win_attributes_->ia_role = ia_role; | 4676 win_attributes_->ia_role = ia_role; |
4700 win_attributes_->ia_state = ia_state; | 4677 win_attributes_->ia_state = ia_state; |
4701 win_attributes_->role_name = role_name; | 4678 win_attributes_->role_name = role_name; |
4702 win_attributes_->ia2_role = ia2_role; | 4679 win_attributes_->ia2_role = ia2_role; |
4703 win_attributes_->ia2_state = ia2_state; | 4680 win_attributes_->ia2_state = ia2_state; |
4704 } | 4681 } |
4705 | 4682 |
| 4683 BrowserAccessibilityWin* ToBrowserAccessibilityWin(BrowserAccessibility* obj) { |
| 4684 DCHECK(!obj || obj->IsNative()); |
| 4685 return static_cast<BrowserAccessibilityWin*>(obj); |
| 4686 } |
| 4687 |
| 4688 const BrowserAccessibilityWin* |
| 4689 ToBrowserAccessibilityWin(const BrowserAccessibility* obj) { |
| 4690 DCHECK(!obj || obj->IsNative()); |
| 4691 return static_cast<const BrowserAccessibilityWin*>(obj); |
| 4692 } |
| 4693 |
4706 } // namespace content | 4694 } // namespace content |
OLD | NEW |