OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <atlbase.h> | 5 #include <atlbase.h> |
6 #include <atlcom.h> | 6 #include <atlcom.h> |
7 #include <limits.h> | 7 #include <limits.h> |
8 #include <oleacc.h> | 8 #include <oleacc.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 | 272 |
273 return -1; | 273 return -1; |
274 } | 274 } |
275 | 275 |
276 // | 276 // |
277 // IAccessible implementation. | 277 // IAccessible implementation. |
278 // | 278 // |
279 | 279 |
280 STDMETHODIMP AXPlatformNodeWin::accHitTest( | 280 STDMETHODIMP AXPlatformNodeWin::accHitTest( |
281 LONG x_left, LONG y_top, VARIANT* child) { | 281 LONG x_left, LONG y_top, VARIANT* child) { |
| 282 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_HIT_TEST); |
282 COM_OBJECT_VALIDATE_1_ARG(child); | 283 COM_OBJECT_VALIDATE_1_ARG(child); |
283 | 284 |
284 gfx::Point point(x_left, y_top); | 285 gfx::Point point(x_left, y_top); |
285 if (!delegate_->GetScreenBoundsRect().Contains(point)) { | 286 if (!delegate_->GetScreenBoundsRect().Contains(point)) { |
286 // Return S_FALSE and VT_EMPTY when outside the object's boundaries. | 287 // Return S_FALSE and VT_EMPTY when outside the object's boundaries. |
287 child->vt = VT_EMPTY; | 288 child->vt = VT_EMPTY; |
288 return S_FALSE; | 289 return S_FALSE; |
289 } | 290 } |
290 | 291 |
291 gfx::NativeViewAccessible hit_child = delegate_->HitTestSync(x_left, y_top); | 292 gfx::NativeViewAccessible hit_child = delegate_->HitTestSync(x_left, y_top); |
(...skipping 22 matching lines...) Expand all Loading... |
314 if (S_OK == result && child->vt == VT_I4 && child->lVal == CHILDID_SELF) { | 315 if (S_OK == result && child->vt == VT_I4 && child->lVal == CHILDID_SELF) { |
315 child->vt = VT_DISPATCH; | 316 child->vt = VT_DISPATCH; |
316 child->pdispVal = hit_child; | 317 child->pdispVal = hit_child; |
317 // Always increment ref when returning a reference to a COM object. | 318 // Always increment ref when returning a reference to a COM object. |
318 child->pdispVal->AddRef(); | 319 child->pdispVal->AddRef(); |
319 } | 320 } |
320 return result; | 321 return result; |
321 } | 322 } |
322 | 323 |
323 HRESULT AXPlatformNodeWin::accDoDefaultAction(VARIANT var_id) { | 324 HRESULT AXPlatformNodeWin::accDoDefaultAction(VARIANT var_id) { |
| 325 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_DO_DEFAULT_ACTION); |
324 AXPlatformNodeWin* target; | 326 AXPlatformNodeWin* target; |
325 COM_OBJECT_VALIDATE_VAR_ID_AND_GET_TARGET(var_id, target); | 327 COM_OBJECT_VALIDATE_VAR_ID_AND_GET_TARGET(var_id, target); |
326 AXActionData data; | 328 AXActionData data; |
327 data.action = ui::AX_ACTION_DO_DEFAULT; | 329 data.action = ui::AX_ACTION_DO_DEFAULT; |
328 | 330 |
329 if (target->delegate_->AccessibilityPerformAction(data)) | 331 if (target->delegate_->AccessibilityPerformAction(data)) |
330 return S_OK; | 332 return S_OK; |
331 return E_FAIL; | 333 return E_FAIL; |
332 } | 334 } |
333 | 335 |
334 STDMETHODIMP AXPlatformNodeWin::accLocation( | 336 STDMETHODIMP AXPlatformNodeWin::accLocation( |
335 LONG* x_left, LONG* y_top, LONG* width, LONG* height, VARIANT var_id) { | 337 LONG* x_left, LONG* y_top, LONG* width, LONG* height, VARIANT var_id) { |
| 338 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_LOCATION); |
336 AXPlatformNodeWin* target; | 339 AXPlatformNodeWin* target; |
337 COM_OBJECT_VALIDATE_VAR_ID_4_ARGS_AND_GET_TARGET(var_id, x_left, y_top, width, | 340 COM_OBJECT_VALIDATE_VAR_ID_4_ARGS_AND_GET_TARGET(var_id, x_left, y_top, width, |
338 height, target); | 341 height, target); |
339 | 342 |
340 gfx::Rect bounds = target->delegate_->GetScreenBoundsRect(); | 343 gfx::Rect bounds = target->delegate_->GetScreenBoundsRect(); |
341 *x_left = bounds.x(); | 344 *x_left = bounds.x(); |
342 *y_top = bounds.y(); | 345 *y_top = bounds.y(); |
343 *width = bounds.width(); | 346 *width = bounds.width(); |
344 *height = bounds.height(); | 347 *height = bounds.height(); |
345 | 348 |
346 if (bounds.IsEmpty()) | 349 if (bounds.IsEmpty()) |
347 return S_FALSE; | 350 return S_FALSE; |
348 | 351 |
349 return S_OK; | 352 return S_OK; |
350 } | 353 } |
351 | 354 |
352 STDMETHODIMP AXPlatformNodeWin::accNavigate( | 355 STDMETHODIMP AXPlatformNodeWin::accNavigate( |
353 LONG nav_dir, VARIANT start, VARIANT* end) { | 356 LONG nav_dir, VARIANT start, VARIANT* end) { |
| 357 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_NAVIGATE); |
354 AXPlatformNodeWin* target; | 358 AXPlatformNodeWin* target; |
355 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(start, end, target); | 359 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(start, end, target); |
356 end->vt = VT_EMPTY; | 360 end->vt = VT_EMPTY; |
357 if ((nav_dir == NAVDIR_FIRSTCHILD || nav_dir == NAVDIR_LASTCHILD) && | 361 if ((nav_dir == NAVDIR_FIRSTCHILD || nav_dir == NAVDIR_LASTCHILD) && |
358 V_VT(&start) == VT_I4 && V_I4(&start) != CHILDID_SELF) { | 362 V_VT(&start) == VT_I4 && V_I4(&start) != CHILDID_SELF) { |
359 // MSAA states that navigating to first/last child can only be from self. | 363 // MSAA states that navigating to first/last child can only be from self. |
360 return E_INVALIDARG; | 364 return E_INVALIDARG; |
361 } | 365 } |
362 | 366 |
363 IAccessible* result = nullptr; | 367 IAccessible* result = nullptr; |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 end->vt = VT_DISPATCH; | 459 end->vt = VT_DISPATCH; |
456 end->pdispVal = result; | 460 end->pdispVal = result; |
457 // Always increment ref when returning a reference to a COM object. | 461 // Always increment ref when returning a reference to a COM object. |
458 end->pdispVal->AddRef(); | 462 end->pdispVal->AddRef(); |
459 | 463 |
460 return S_OK; | 464 return S_OK; |
461 } | 465 } |
462 | 466 |
463 STDMETHODIMP AXPlatformNodeWin::get_accChild(VARIANT var_child, | 467 STDMETHODIMP AXPlatformNodeWin::get_accChild(VARIANT var_child, |
464 IDispatch** disp_child) { | 468 IDispatch** disp_child) { |
| 469 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_CHILD); |
| 470 |
465 *disp_child = nullptr; | 471 *disp_child = nullptr; |
466 AXPlatformNodeWin* target; | 472 AXPlatformNodeWin* target; |
467 COM_OBJECT_VALIDATE_VAR_ID_AND_GET_TARGET(var_child, target); | 473 COM_OBJECT_VALIDATE_VAR_ID_AND_GET_TARGET(var_child, target); |
468 | 474 |
469 *disp_child = target; | 475 *disp_child = target; |
470 (*disp_child)->AddRef(); | 476 (*disp_child)->AddRef(); |
471 return S_OK; | 477 return S_OK; |
472 } | 478 } |
473 | 479 |
474 STDMETHODIMP AXPlatformNodeWin::get_accChildCount(LONG* child_count) { | 480 STDMETHODIMP AXPlatformNodeWin::get_accChildCount(LONG* child_count) { |
| 481 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_CHILD_COUNT); |
| 482 |
475 COM_OBJECT_VALIDATE_1_ARG(child_count); | 483 COM_OBJECT_VALIDATE_1_ARG(child_count); |
476 *child_count = delegate_->GetChildCount(); | 484 *child_count = delegate_->GetChildCount(); |
477 return S_OK; | 485 return S_OK; |
478 } | 486 } |
479 | 487 |
480 STDMETHODIMP AXPlatformNodeWin::get_accDefaultAction( | 488 STDMETHODIMP AXPlatformNodeWin::get_accDefaultAction( |
481 VARIANT var_id, BSTR* def_action) { | 489 VARIANT var_id, BSTR* def_action) { |
| 490 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_DEFAULT_ACTION); |
482 AXPlatformNodeWin* target; | 491 AXPlatformNodeWin* target; |
483 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, def_action, target); | 492 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, def_action, target); |
484 | 493 |
485 int action; | 494 int action; |
486 if (!target->GetIntAttribute(AX_ATTR_DEFAULT_ACTION_VERB, &action)) { | 495 if (!target->GetIntAttribute(AX_ATTR_DEFAULT_ACTION_VERB, &action)) { |
487 *def_action = nullptr; | 496 *def_action = nullptr; |
488 return S_FALSE; | 497 return S_FALSE; |
489 } | 498 } |
490 | 499 |
491 base::string16 action_verb = | 500 base::string16 action_verb = |
492 ActionVerbToLocalizedString(static_cast<AXDefaultActionVerb>(action)); | 501 ActionVerbToLocalizedString(static_cast<AXDefaultActionVerb>(action)); |
493 if (action_verb.empty()) { | 502 if (action_verb.empty()) { |
494 *def_action = nullptr; | 503 *def_action = nullptr; |
495 return S_FALSE; | 504 return S_FALSE; |
496 } | 505 } |
497 | 506 |
498 *def_action = SysAllocString(action_verb.c_str()); | 507 *def_action = SysAllocString(action_verb.c_str()); |
499 DCHECK(def_action); | 508 DCHECK(def_action); |
500 return S_OK; | 509 return S_OK; |
501 } | 510 } |
502 | 511 |
503 STDMETHODIMP AXPlatformNodeWin::get_accDescription( | 512 STDMETHODIMP AXPlatformNodeWin::get_accDescription( |
504 VARIANT var_id, BSTR* desc) { | 513 VARIANT var_id, BSTR* desc) { |
| 514 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_DESCRIPTION); |
505 AXPlatformNodeWin* target; | 515 AXPlatformNodeWin* target; |
506 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, desc, target); | 516 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, desc, target); |
507 | 517 |
508 return target->GetStringAttributeAsBstr(ui::AX_ATTR_DESCRIPTION, desc); | 518 return target->GetStringAttributeAsBstr(ui::AX_ATTR_DESCRIPTION, desc); |
509 } | 519 } |
510 | 520 |
511 STDMETHODIMP AXPlatformNodeWin::get_accFocus(VARIANT* focus_child) { | 521 STDMETHODIMP AXPlatformNodeWin::get_accFocus(VARIANT* focus_child) { |
| 522 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_FOCUS); |
512 COM_OBJECT_VALIDATE_1_ARG(focus_child); | 523 COM_OBJECT_VALIDATE_1_ARG(focus_child); |
513 gfx::NativeViewAccessible focus_accessible = delegate_->GetFocus(); | 524 gfx::NativeViewAccessible focus_accessible = delegate_->GetFocus(); |
514 if (focus_accessible == this) { | 525 if (focus_accessible == this) { |
515 focus_child->vt = VT_I4; | 526 focus_child->vt = VT_I4; |
516 focus_child->lVal = CHILDID_SELF; | 527 focus_child->lVal = CHILDID_SELF; |
517 } else if (focus_accessible) { | 528 } else if (focus_accessible) { |
518 focus_child->vt = VT_DISPATCH; | 529 focus_child->vt = VT_DISPATCH; |
519 focus_child->pdispVal = focus_accessible; | 530 focus_child->pdispVal = focus_accessible; |
520 focus_child->pdispVal->AddRef(); | 531 focus_child->pdispVal->AddRef(); |
521 return S_OK; | 532 return S_OK; |
522 } else { | 533 } else { |
523 focus_child->vt = VT_EMPTY; | 534 focus_child->vt = VT_EMPTY; |
524 } | 535 } |
525 | 536 |
526 return S_OK; | 537 return S_OK; |
527 } | 538 } |
528 | 539 |
529 STDMETHODIMP AXPlatformNodeWin::get_accKeyboardShortcut( | 540 STDMETHODIMP AXPlatformNodeWin::get_accKeyboardShortcut( |
530 VARIANT var_id, BSTR* acc_key) { | 541 VARIANT var_id, BSTR* acc_key) { |
| 542 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_KEYBOARD_SHORTCUT); |
531 AXPlatformNodeWin* target; | 543 AXPlatformNodeWin* target; |
532 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, acc_key, target); | 544 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, acc_key, target); |
533 | 545 |
534 return target->GetStringAttributeAsBstr(ui::AX_ATTR_KEY_SHORTCUTS, acc_key); | 546 return target->GetStringAttributeAsBstr(ui::AX_ATTR_KEY_SHORTCUTS, acc_key); |
535 } | 547 } |
536 | 548 |
537 STDMETHODIMP AXPlatformNodeWin::get_accName( | 549 STDMETHODIMP AXPlatformNodeWin::get_accName( |
538 VARIANT var_id, BSTR* name) { | 550 VARIANT var_id, BSTR* name) { |
| 551 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_NAME); |
539 AXPlatformNodeWin* target; | 552 AXPlatformNodeWin* target; |
540 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, name, target); | 553 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, name, target); |
541 | 554 |
542 HRESULT result = target->GetStringAttributeAsBstr(ui::AX_ATTR_NAME, name); | 555 HRESULT result = target->GetStringAttributeAsBstr(ui::AX_ATTR_NAME, name); |
543 if (FAILED(result) && MSAARole() == ROLE_SYSTEM_DOCUMENT && GetParent()) { | 556 if (FAILED(result) && MSAARole() == ROLE_SYSTEM_DOCUMENT && GetParent()) { |
544 // Hack: Some versions of JAWS crash if they get an empty name on | 557 // Hack: Some versions of JAWS crash if they get an empty name on |
545 // a document that's the child of an iframe, so always return a | 558 // a document that's the child of an iframe, so always return a |
546 // nonempty string for this role. https://crbug.com/583057 | 559 // nonempty string for this role. https://crbug.com/583057 |
547 base::string16 str = L" "; | 560 base::string16 str = L" "; |
548 | 561 |
549 *name = SysAllocString(str.c_str()); | 562 *name = SysAllocString(str.c_str()); |
550 DCHECK(*name); | 563 DCHECK(*name); |
551 } | 564 } |
552 | 565 |
553 return result; | 566 return result; |
554 } | 567 } |
555 | 568 |
556 STDMETHODIMP AXPlatformNodeWin::get_accParent( | 569 STDMETHODIMP AXPlatformNodeWin::get_accParent( |
557 IDispatch** disp_parent) { | 570 IDispatch** disp_parent) { |
| 571 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_PARENT); |
558 COM_OBJECT_VALIDATE_1_ARG(disp_parent); | 572 COM_OBJECT_VALIDATE_1_ARG(disp_parent); |
559 *disp_parent = GetParent(); | 573 *disp_parent = GetParent(); |
560 if (*disp_parent) { | 574 if (*disp_parent) { |
561 (*disp_parent)->AddRef(); | 575 (*disp_parent)->AddRef(); |
562 return S_OK; | 576 return S_OK; |
563 } | 577 } |
564 | 578 |
565 return S_FALSE; | 579 return S_FALSE; |
566 } | 580 } |
567 | 581 |
568 STDMETHODIMP AXPlatformNodeWin::get_accRole( | 582 STDMETHODIMP AXPlatformNodeWin::get_accRole( |
569 VARIANT var_id, VARIANT* role) { | 583 VARIANT var_id, VARIANT* role) { |
| 584 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_ROLE); |
570 AXPlatformNodeWin* target; | 585 AXPlatformNodeWin* target; |
571 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, role, target); | 586 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, role, target); |
572 | 587 |
573 // For historical reasons, we return a string (typically | 588 // For historical reasons, we return a string (typically |
574 // containing the HTML tag name) as the MSAA role, rather | 589 // containing the HTML tag name) as the MSAA role, rather |
575 // than a int. | 590 // than a int. |
576 std::string role_string = | 591 std::string role_string = |
577 base::ToUpperASCII(target->StringOverrideForMSAARole()); | 592 base::ToUpperASCII(target->StringOverrideForMSAARole()); |
578 if (!role_string.empty()) { | 593 if (!role_string.empty()) { |
579 role->vt = VT_BSTR; | 594 role->vt = VT_BSTR; |
580 std::wstring wsTmp(role_string.begin(), role_string.end()); | 595 std::wstring wsTmp(role_string.begin(), role_string.end()); |
581 role->bstrVal = SysAllocString(wsTmp.c_str()); | 596 role->bstrVal = SysAllocString(wsTmp.c_str()); |
582 return S_OK; | 597 return S_OK; |
583 } | 598 } |
584 | 599 |
585 role->vt = VT_I4; | 600 role->vt = VT_I4; |
586 role->lVal = target->MSAARole(); | 601 role->lVal = target->MSAARole(); |
587 return S_OK; | 602 return S_OK; |
588 } | 603 } |
589 | 604 |
590 STDMETHODIMP AXPlatformNodeWin::get_accState( | 605 STDMETHODIMP AXPlatformNodeWin::get_accState( |
591 VARIANT var_id, VARIANT* state) { | 606 VARIANT var_id, VARIANT* state) { |
| 607 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_STATE); |
592 AXPlatformNodeWin* target; | 608 AXPlatformNodeWin* target; |
593 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, state, target); | 609 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, state, target); |
594 state->vt = VT_I4; | 610 state->vt = VT_I4; |
595 state->lVal = target->MSAAState(); | 611 state->lVal = target->MSAAState(); |
596 return S_OK; | 612 return S_OK; |
597 } | 613 } |
598 | 614 |
599 STDMETHODIMP AXPlatformNodeWin::get_accHelp( | 615 STDMETHODIMP AXPlatformNodeWin::get_accHelp( |
600 VARIANT var_id, BSTR* help) { | 616 VARIANT var_id, BSTR* help) { |
| 617 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_HELP); |
601 COM_OBJECT_VALIDATE_1_ARG(help); | 618 COM_OBJECT_VALIDATE_1_ARG(help); |
602 return S_FALSE; | 619 return S_FALSE; |
603 } | 620 } |
604 | 621 |
605 STDMETHODIMP AXPlatformNodeWin::get_accValue(VARIANT var_id, BSTR* value) { | 622 STDMETHODIMP AXPlatformNodeWin::get_accValue(VARIANT var_id, BSTR* value) { |
| 623 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_VALUE); |
606 AXPlatformNodeWin* target; | 624 AXPlatformNodeWin* target; |
607 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, value, target); | 625 COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, value, target); |
608 | 626 |
609 // get_accValue() has two sets of special cases depending on the node's role. | 627 // get_accValue() has two sets of special cases depending on the node's role. |
610 // The first set apply without regard for the nodes |value| attribute. That is | 628 // The first set apply without regard for the nodes |value| attribute. That is |
611 // the nodes value attribute isn't consider for the first set of special | 629 // the nodes value attribute isn't consider for the first set of special |
612 // cases. For example, if the node role is AX_ROLE_COLOR_WELL, we do not care | 630 // cases. For example, if the node role is AX_ROLE_COLOR_WELL, we do not care |
613 // at all about the node's AX_ATTR_VALUE attribute. The second set of special | 631 // at all about the node's AX_ATTR_VALUE attribute. The second set of special |
614 // cases only apply if the value attribute for the node is empty. That is, if | 632 // cases only apply if the value attribute for the node is empty. That is, if |
615 // AX_ATTR_VALUE is empty, we do something special. | 633 // AX_ATTR_VALUE is empty, we do something special. |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 | 712 |
695 AXActionData data; | 713 AXActionData data; |
696 data.action = ui::AX_ACTION_SET_VALUE; | 714 data.action = ui::AX_ACTION_SET_VALUE; |
697 data.value = new_value; | 715 data.value = new_value; |
698 if (target->delegate_->AccessibilityPerformAction(data)) | 716 if (target->delegate_->AccessibilityPerformAction(data)) |
699 return S_OK; | 717 return S_OK; |
700 return E_FAIL; | 718 return E_FAIL; |
701 } | 719 } |
702 | 720 |
703 STDMETHODIMP AXPlatformNodeWin::get_accSelection(VARIANT* selected) { | 721 STDMETHODIMP AXPlatformNodeWin::get_accSelection(VARIANT* selected) { |
| 722 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_SELECTION); |
704 COM_OBJECT_VALIDATE_1_ARG(selected); | 723 COM_OBJECT_VALIDATE_1_ARG(selected); |
705 | 724 |
706 if (GetData().role != ui::AX_ROLE_LIST_BOX) | 725 if (GetData().role != ui::AX_ROLE_LIST_BOX) |
707 return E_NOTIMPL; | 726 return E_NOTIMPL; |
708 | 727 |
709 unsigned long selected_count = 0; | 728 unsigned long selected_count = 0; |
710 for (auto i = 0; i < delegate_->GetChildCount(); ++i) { | 729 for (auto i = 0; i < delegate_->GetChildCount(); ++i) { |
711 AXPlatformNodeWin* node = static_cast<AXPlatformNodeWin*>( | 730 AXPlatformNodeWin* node = static_cast<AXPlatformNodeWin*>( |
712 FromNativeViewAccessible(delegate_->ChildAtIndex(i))); | 731 FromNativeViewAccessible(delegate_->ChildAtIndex(i))); |
713 | 732 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 } | 770 } |
752 } | 771 } |
753 selected->vt = VT_UNKNOWN; | 772 selected->vt = VT_UNKNOWN; |
754 selected->punkVal = static_cast<IUnknown*>( | 773 selected->punkVal = static_cast<IUnknown*>( |
755 static_cast<base::win::IUnknownImpl*>(enum_variant)); | 774 static_cast<base::win::IUnknownImpl*>(enum_variant)); |
756 return S_OK; | 775 return S_OK; |
757 } | 776 } |
758 | 777 |
759 STDMETHODIMP AXPlatformNodeWin::accSelect( | 778 STDMETHODIMP AXPlatformNodeWin::accSelect( |
760 LONG flagsSelect, VARIANT var_id) { | 779 LONG flagsSelect, VARIANT var_id) { |
| 780 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_SELECT); |
761 AXPlatformNodeWin* target; | 781 AXPlatformNodeWin* target; |
762 COM_OBJECT_VALIDATE_VAR_ID_AND_GET_TARGET(var_id, target); | 782 COM_OBJECT_VALIDATE_VAR_ID_AND_GET_TARGET(var_id, target); |
763 | 783 |
764 if (flagsSelect & SELFLAG_TAKEFOCUS) { | 784 if (flagsSelect & SELFLAG_TAKEFOCUS) { |
765 ui::AXActionData action_data; | 785 ui::AXActionData action_data; |
766 action_data.action = ui::AX_ACTION_FOCUS; | 786 action_data.action = ui::AX_ACTION_FOCUS; |
767 target->delegate_->AccessibilityPerformAction(action_data); | 787 target->delegate_->AccessibilityPerformAction(action_data); |
768 return S_OK; | 788 return S_OK; |
769 } | 789 } |
770 | 790 |
771 return S_FALSE; | 791 return S_FALSE; |
772 } | 792 } |
773 | 793 |
774 STDMETHODIMP AXPlatformNodeWin::get_accHelpTopic( | 794 STDMETHODIMP AXPlatformNodeWin::get_accHelpTopic( |
775 BSTR* help_file, VARIANT var_id, LONG* topic_id) { | 795 BSTR* help_file, VARIANT var_id, LONG* topic_id) { |
| 796 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_HELP_TOPIC); |
776 AXPlatformNodeWin* target; | 797 AXPlatformNodeWin* target; |
777 COM_OBJECT_VALIDATE_VAR_ID_2_ARGS_AND_GET_TARGET(var_id, help_file, topic_id, | 798 COM_OBJECT_VALIDATE_VAR_ID_2_ARGS_AND_GET_TARGET(var_id, help_file, topic_id, |
778 target); | 799 target); |
779 if (help_file) { | 800 if (help_file) { |
780 *help_file = nullptr; | 801 *help_file = nullptr; |
781 } | 802 } |
782 if (topic_id) { | 803 if (topic_id) { |
783 *topic_id = static_cast<LONG>(-1); | 804 *topic_id = static_cast<LONG>(-1); |
784 } | 805 } |
785 return E_NOTIMPL; | 806 return E_NOTIMPL; |
786 } | 807 } |
787 | 808 |
788 STDMETHODIMP AXPlatformNodeWin::put_accName( | 809 STDMETHODIMP AXPlatformNodeWin::put_accName( |
789 VARIANT var_id, BSTR put_name) { | 810 VARIANT var_id, BSTR put_name) { |
| 811 // TODO(dougt): We may want to collect an API histogram here. |
790 // Deprecated. | 812 // Deprecated. |
791 return E_NOTIMPL; | 813 return E_NOTIMPL; |
792 } | 814 } |
793 | 815 |
794 // | 816 // |
795 // IAccessible2 implementation. | 817 // IAccessible2 implementation. |
796 // | 818 // |
797 | 819 |
798 STDMETHODIMP AXPlatformNodeWin::role(LONG* role) { | 820 STDMETHODIMP AXPlatformNodeWin::role(LONG* role) { |
| 821 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ROLE); |
799 COM_OBJECT_VALIDATE_1_ARG(role); | 822 COM_OBJECT_VALIDATE_1_ARG(role); |
800 | 823 |
801 *role = IA2Role(); | 824 *role = IA2Role(); |
802 // If we didn't explicitly set the IAccessible2 role, make it the same | 825 // If we didn't explicitly set the IAccessible2 role, make it the same |
803 // as the MSAA role. | 826 // as the MSAA role. |
804 if (!*role) | 827 if (!*role) |
805 *role = MSAARole(); | 828 *role = MSAARole(); |
806 return S_OK; | 829 return S_OK; |
807 } | 830 } |
808 | 831 |
809 STDMETHODIMP AXPlatformNodeWin::get_states(AccessibleStates* states) { | 832 STDMETHODIMP AXPlatformNodeWin::get_states(AccessibleStates* states) { |
| 833 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_STATES); |
810 COM_OBJECT_VALIDATE_1_ARG(states); | 834 COM_OBJECT_VALIDATE_1_ARG(states); |
811 *states = IA2State(); | 835 *states = IA2State(); |
812 return S_OK; | 836 return S_OK; |
813 } | 837 } |
814 | 838 |
815 STDMETHODIMP AXPlatformNodeWin::get_uniqueID(LONG* unique_id) { | 839 STDMETHODIMP AXPlatformNodeWin::get_uniqueID(LONG* unique_id) { |
816 COM_OBJECT_VALIDATE_1_ARG(unique_id); | 840 COM_OBJECT_VALIDATE_1_ARG(unique_id); |
817 *unique_id = -unique_id_; | 841 *unique_id = -unique_id_; |
818 return S_OK; | 842 return S_OK; |
819 } | 843 } |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
961 return E_NOTIMPL; | 985 return E_NOTIMPL; |
962 } | 986 } |
963 | 987 |
964 // | 988 // |
965 // IAccessibleTable methods. | 989 // IAccessibleTable methods. |
966 // | 990 // |
967 | 991 |
968 STDMETHODIMP AXPlatformNodeWin::get_accessibleAt(long row, | 992 STDMETHODIMP AXPlatformNodeWin::get_accessibleAt(long row, |
969 long column, | 993 long column, |
970 IUnknown** accessible) { | 994 IUnknown** accessible) { |
| 995 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACCESSIBLE_AT); |
971 if (!accessible) | 996 if (!accessible) |
972 return E_INVALIDARG; | 997 return E_INVALIDARG; |
973 | 998 |
974 AXPlatformNodeBase* cell = | 999 AXPlatformNodeBase* cell = |
975 GetTableCell(static_cast<int>(row), static_cast<int>(column)); | 1000 GetTableCell(static_cast<int>(row), static_cast<int>(column)); |
976 if (cell) { | 1001 if (cell) { |
977 auto* node_win = static_cast<AXPlatformNodeWin*>(cell); | 1002 auto* node_win = static_cast<AXPlatformNodeWin*>(cell); |
978 node_win->AddRef(); | 1003 node_win->AddRef(); |
979 | 1004 |
980 *accessible = static_cast<IAccessible*>(node_win); | 1005 *accessible = static_cast<IAccessible*>(node_win); |
981 return S_OK; | 1006 return S_OK; |
982 } | 1007 } |
983 | 1008 |
984 *accessible = nullptr; | 1009 *accessible = nullptr; |
985 return E_INVALIDARG; | 1010 return E_INVALIDARG; |
986 } | 1011 } |
987 | 1012 |
988 STDMETHODIMP AXPlatformNodeWin::get_caption(IUnknown** accessible) { | 1013 STDMETHODIMP AXPlatformNodeWin::get_caption(IUnknown** accessible) { |
| 1014 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_CAPTION); |
989 if (!accessible) | 1015 if (!accessible) |
990 return E_INVALIDARG; | 1016 return E_INVALIDARG; |
991 | 1017 |
992 // TODO(dmazzoni): implement | 1018 // TODO(dmazzoni): implement |
993 *accessible = nullptr; | 1019 *accessible = nullptr; |
994 return S_FALSE; | 1020 return S_FALSE; |
995 } | 1021 } |
996 | 1022 |
997 STDMETHODIMP AXPlatformNodeWin::get_childIndex(long row, | 1023 STDMETHODIMP AXPlatformNodeWin::get_childIndex(long row, |
998 long column, | 1024 long column, |
999 long* cell_index) { | 1025 long* cell_index) { |
| 1026 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_CHILD_INDEX); |
1000 if (!cell_index) | 1027 if (!cell_index) |
1001 return E_INVALIDARG; | 1028 return E_INVALIDARG; |
1002 | 1029 |
1003 auto* cell = GetTableCell(static_cast<int>(row), static_cast<int>(column)); | 1030 auto* cell = GetTableCell(static_cast<int>(row), static_cast<int>(column)); |
1004 if (cell) { | 1031 if (cell) { |
1005 *cell_index = static_cast<LONG>(cell->GetTableCellIndex()); | 1032 *cell_index = static_cast<LONG>(cell->GetTableCellIndex()); |
1006 return S_OK; | 1033 return S_OK; |
1007 } | 1034 } |
1008 | 1035 |
1009 *cell_index = 0; | 1036 *cell_index = 0; |
1010 return E_INVALIDARG; | 1037 return E_INVALIDARG; |
1011 } | 1038 } |
1012 | 1039 |
1013 STDMETHODIMP AXPlatformNodeWin::get_columnDescription(long column, | 1040 STDMETHODIMP AXPlatformNodeWin::get_columnDescription(long column, |
1014 BSTR* description) { | 1041 BSTR* description) { |
| 1042 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_COLUMN_DESCRIPTION); |
1015 if (!description) | 1043 if (!description) |
1016 return E_INVALIDARG; | 1044 return E_INVALIDARG; |
1017 | 1045 |
1018 int columns = GetTableColumnCount(); | 1046 int columns = GetTableColumnCount(); |
1019 if (column < 0 || column >= columns) | 1047 if (column < 0 || column >= columns) |
1020 return E_INVALIDARG; | 1048 return E_INVALIDARG; |
1021 | 1049 |
1022 int rows = GetTableRowCount(); | 1050 int rows = GetTableRowCount(); |
1023 if (rows <= 0) { | 1051 if (rows <= 0) { |
1024 *description = nullptr; | 1052 *description = nullptr; |
(...skipping 17 matching lines...) Expand all Loading... |
1042 } | 1070 } |
1043 } | 1071 } |
1044 | 1072 |
1045 *description = nullptr; | 1073 *description = nullptr; |
1046 return S_FALSE; | 1074 return S_FALSE; |
1047 } | 1075 } |
1048 | 1076 |
1049 STDMETHODIMP AXPlatformNodeWin::get_columnExtentAt(long row, | 1077 STDMETHODIMP AXPlatformNodeWin::get_columnExtentAt(long row, |
1050 long column, | 1078 long column, |
1051 long* n_columns_spanned) { | 1079 long* n_columns_spanned) { |
| 1080 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_COLUMN_EXTENT_AT); |
1052 if (!n_columns_spanned) | 1081 if (!n_columns_spanned) |
1053 return E_INVALIDARG; | 1082 return E_INVALIDARG; |
1054 | 1083 |
1055 auto* cell = GetTableCell(static_cast<int>(row), static_cast<int>(column)); | 1084 auto* cell = GetTableCell(static_cast<int>(row), static_cast<int>(column)); |
1056 if (!cell) | 1085 if (!cell) |
1057 return E_INVALIDARG; | 1086 return E_INVALIDARG; |
1058 | 1087 |
1059 *n_columns_spanned = cell->GetTableColumnSpan(); | 1088 *n_columns_spanned = cell->GetTableColumnSpan(); |
1060 return S_OK; | 1089 return S_OK; |
1061 } | 1090 } |
1062 | 1091 |
1063 STDMETHODIMP AXPlatformNodeWin::get_columnHeader( | 1092 STDMETHODIMP AXPlatformNodeWin::get_columnHeader( |
1064 IAccessibleTable** accessible_table, | 1093 IAccessibleTable** accessible_table, |
1065 long* starting_row_index) { | 1094 long* starting_row_index) { |
| 1095 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_COLUMN_HEADER); |
1066 // TODO(dmazzoni): implement | 1096 // TODO(dmazzoni): implement |
1067 return E_NOTIMPL; | 1097 return E_NOTIMPL; |
1068 } | 1098 } |
1069 | 1099 |
1070 STDMETHODIMP AXPlatformNodeWin::get_columnIndex(long cell_index, | 1100 STDMETHODIMP AXPlatformNodeWin::get_columnIndex(long cell_index, |
1071 long* column_index) { | 1101 long* column_index) { |
| 1102 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_COLUMN_INDEX); |
1072 if (!column_index) | 1103 if (!column_index) |
1073 return E_INVALIDARG; | 1104 return E_INVALIDARG; |
1074 | 1105 |
1075 auto* cell = GetTableCell(cell_index); | 1106 auto* cell = GetTableCell(cell_index); |
1076 if (!cell) | 1107 if (!cell) |
1077 return E_INVALIDARG; | 1108 return E_INVALIDARG; |
1078 *column_index = cell->GetTableColumn(); | 1109 *column_index = cell->GetTableColumn(); |
1079 return S_OK; | 1110 return S_OK; |
1080 } | 1111 } |
1081 | 1112 |
1082 STDMETHODIMP AXPlatformNodeWin::get_nColumns(long* column_count) { | 1113 STDMETHODIMP AXPlatformNodeWin::get_nColumns(long* column_count) { |
| 1114 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_COLUMNS); |
1083 if (!column_count) | 1115 if (!column_count) |
1084 return E_INVALIDARG; | 1116 return E_INVALIDARG; |
1085 | 1117 |
1086 *column_count = GetTableColumnCount(); | 1118 *column_count = GetTableColumnCount(); |
1087 return S_OK; | 1119 return S_OK; |
1088 } | 1120 } |
1089 | 1121 |
1090 STDMETHODIMP AXPlatformNodeWin::get_nRows(long* row_count) { | 1122 STDMETHODIMP AXPlatformNodeWin::get_nRows(long* row_count) { |
| 1123 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_ROWS); |
1091 if (!row_count) | 1124 if (!row_count) |
1092 return E_INVALIDARG; | 1125 return E_INVALIDARG; |
1093 | 1126 |
1094 *row_count = GetTableRowCount(); | 1127 *row_count = GetTableRowCount(); |
1095 return S_OK; | 1128 return S_OK; |
1096 } | 1129 } |
1097 | 1130 |
1098 STDMETHODIMP AXPlatformNodeWin::get_nSelectedChildren(long* cell_count) { | 1131 STDMETHODIMP AXPlatformNodeWin::get_nSelectedChildren(long* cell_count) { |
| 1132 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_SELECTED_CHILDREN); |
1099 if (!cell_count) | 1133 if (!cell_count) |
1100 return E_INVALIDARG; | 1134 return E_INVALIDARG; |
1101 | 1135 |
1102 // TODO(dmazzoni): add support for selected cells/rows/columns in tables. | 1136 // TODO(dmazzoni): add support for selected cells/rows/columns in tables. |
1103 *cell_count = 0; | 1137 *cell_count = 0; |
1104 return S_FALSE; | 1138 return S_FALSE; |
1105 } | 1139 } |
1106 | 1140 |
1107 STDMETHODIMP AXPlatformNodeWin::get_nSelectedColumns(long* column_count) { | 1141 STDMETHODIMP AXPlatformNodeWin::get_nSelectedColumns(long* column_count) { |
| 1142 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_SELECTED_COLUMNS); |
1108 if (!column_count) | 1143 if (!column_count) |
1109 return E_INVALIDARG; | 1144 return E_INVALIDARG; |
1110 | 1145 |
1111 *column_count = 0; | 1146 *column_count = 0; |
1112 return S_FALSE; | 1147 return S_FALSE; |
1113 } | 1148 } |
1114 | 1149 |
1115 STDMETHODIMP AXPlatformNodeWin::get_nSelectedRows(long* row_count) { | 1150 STDMETHODIMP AXPlatformNodeWin::get_nSelectedRows(long* row_count) { |
| 1151 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_SELECTED_ROWS); |
1116 if (!row_count) | 1152 if (!row_count) |
1117 return E_INVALIDARG; | 1153 return E_INVALIDARG; |
1118 | 1154 |
1119 *row_count = 0; | 1155 *row_count = 0; |
1120 return S_FALSE; | 1156 return S_FALSE; |
1121 } | 1157 } |
1122 | 1158 |
1123 STDMETHODIMP AXPlatformNodeWin::get_rowDescription(long row, | 1159 STDMETHODIMP AXPlatformNodeWin::get_rowDescription(long row, |
1124 BSTR* description) { | 1160 BSTR* description) { |
| 1161 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ROW_DESCRIPTION); |
1125 if (!description) | 1162 if (!description) |
1126 return E_INVALIDARG; | 1163 return E_INVALIDARG; |
1127 | 1164 |
1128 if (row < 0 || row >= GetTableRowCount()) | 1165 if (row < 0 || row >= GetTableRowCount()) |
1129 return E_INVALIDARG; | 1166 return E_INVALIDARG; |
1130 | 1167 |
1131 int columns = GetTableColumnCount(); | 1168 int columns = GetTableColumnCount(); |
1132 if (columns <= 0) { | 1169 if (columns <= 0) { |
1133 *description = nullptr; | 1170 *description = nullptr; |
1134 return S_FALSE; | 1171 return S_FALSE; |
(...skipping 15 matching lines...) Expand all Loading... |
1150 } | 1187 } |
1151 } | 1188 } |
1152 | 1189 |
1153 *description = nullptr; | 1190 *description = nullptr; |
1154 return S_FALSE; | 1191 return S_FALSE; |
1155 } | 1192 } |
1156 | 1193 |
1157 STDMETHODIMP AXPlatformNodeWin::get_rowExtentAt(long row, | 1194 STDMETHODIMP AXPlatformNodeWin::get_rowExtentAt(long row, |
1158 long column, | 1195 long column, |
1159 long* n_rows_spanned) { | 1196 long* n_rows_spanned) { |
| 1197 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ROW_EXTENT_AT); |
1160 if (!n_rows_spanned) | 1198 if (!n_rows_spanned) |
1161 return E_INVALIDARG; | 1199 return E_INVALIDARG; |
1162 | 1200 |
1163 auto* cell = GetTableCell(row, column); | 1201 auto* cell = GetTableCell(row, column); |
1164 if (!cell) | 1202 if (!cell) |
1165 return E_INVALIDARG; | 1203 return E_INVALIDARG; |
1166 | 1204 |
1167 *n_rows_spanned = GetTableRowSpan(); | 1205 *n_rows_spanned = GetTableRowSpan(); |
1168 return S_OK; | 1206 return S_OK; |
1169 } | 1207 } |
1170 | 1208 |
1171 STDMETHODIMP AXPlatformNodeWin::get_rowHeader( | 1209 STDMETHODIMP AXPlatformNodeWin::get_rowHeader( |
1172 IAccessibleTable** accessible_table, | 1210 IAccessibleTable** accessible_table, |
1173 long* starting_column_index) { | 1211 long* starting_column_index) { |
| 1212 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ROW_HEADER); |
1174 // TODO(dmazzoni): implement | 1213 // TODO(dmazzoni): implement |
1175 return E_NOTIMPL; | 1214 return E_NOTIMPL; |
1176 } | 1215 } |
1177 | 1216 |
1178 STDMETHODIMP AXPlatformNodeWin::get_rowIndex(long cell_index, long* row_index) { | 1217 STDMETHODIMP AXPlatformNodeWin::get_rowIndex(long cell_index, long* row_index) { |
1179 if (!row_index) | 1218 if (!row_index) |
1180 return E_INVALIDARG; | 1219 return E_INVALIDARG; |
1181 | 1220 |
1182 auto* cell = GetTableCell(cell_index); | 1221 auto* cell = GetTableCell(cell_index); |
1183 if (!cell) | 1222 if (!cell) |
(...skipping 1576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2760 if (container && container->GetData().role == ui::AX_ROLE_GROUP) | 2799 if (container && container->GetData().role == ui::AX_ROLE_GROUP) |
2761 container = FromNativeViewAccessible(container->GetParent()); | 2800 container = FromNativeViewAccessible(container->GetParent()); |
2762 | 2801 |
2763 if (!container) | 2802 if (!container) |
2764 return false; | 2803 return false; |
2765 | 2804 |
2766 return container->GetData().role == ui::AX_ROLE_TREE_GRID; | 2805 return container->GetData().role == ui::AX_ROLE_TREE_GRID; |
2767 } | 2806 } |
2768 | 2807 |
2769 } // namespace ui | 2808 } // namespace ui |
OLD | NEW |