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

Side by Side Diff: content/browser/accessibility/browser_accessibility_com_win.cc

Issue 2891913005: Implement a few BrowserAccessibilityComWin methods with AXPlatformNodeWin. (Closed)
Patch Set: rebase Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/browser/accessibility/browser_accessibility.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2017 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_com_win.h" 5 #include "content/browser/accessibility/browser_accessibility_com_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 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 // * There are some methods that don't touch any state such as get_toolkitName. 423 // * There are some methods that don't touch any state such as get_toolkitName.
424 // For these rare cases, you may not need to call owner(). 424 // For these rare cases, you may not need to call owner().
425 // 425 //
426 426
427 HRESULT BrowserAccessibilityComWin::accDoDefaultAction(VARIANT var_id) { 427 HRESULT BrowserAccessibilityComWin::accDoDefaultAction(VARIANT var_id) {
428 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_DO_DEFAULT_ACTION); 428 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_DO_DEFAULT_ACTION);
429 429
430 if (!owner()) 430 if (!owner())
431 return E_FAIL; 431 return E_FAIL;
432 432
433 auto* manager = Manager(); 433 return AXPlatformNodeWin::accDoDefaultAction(var_id);
434 if (!manager)
435 return E_FAIL;
436
437 BrowserAccessibilityComWin* target = GetTargetFromChildID(var_id);
438 if (!target)
439 return E_INVALIDARG;
440
441 // Return an error if it hasn't got a custom action verb to describe what
442 // happens on click.
443 if (!target->owner()->HasIntAttribute(ui::AX_ATTR_DEFAULT_ACTION_VERB))
444 return DISP_E_MEMBERNOTFOUND;
445
446 manager->DoDefaultAction(*target->owner());
447 return S_OK;
448 } 434 }
449 435
450 STDMETHODIMP BrowserAccessibilityComWin::accHitTest(LONG x_left, 436 STDMETHODIMP BrowserAccessibilityComWin::accHitTest(LONG x_left,
451 LONG y_top, 437 LONG y_top,
452 VARIANT* child) { 438 VARIANT* child) {
453 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_HIT_TEST); 439 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_HIT_TEST);
454 440
455 if (!owner()) 441 if (!owner())
456 return E_FAIL; 442 return E_FAIL;
457 443
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 end->pdispVal = ToBrowserAccessibilityComWin(result)->NewReference(); 533 end->pdispVal = ToBrowserAccessibilityComWin(result)->NewReference();
548 return S_OK; 534 return S_OK;
549 } 535 }
550 536
551 STDMETHODIMP BrowserAccessibilityComWin::get_accChild(VARIANT var_child, 537 STDMETHODIMP BrowserAccessibilityComWin::get_accChild(VARIANT var_child,
552 IDispatch** disp_child) { 538 IDispatch** disp_child) {
553 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_CHILD); 539 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_CHILD);
554 if (!owner()) 540 if (!owner())
555 return E_FAIL; 541 return E_FAIL;
556 542
557 if (!disp_child) 543 return AXPlatformNodeWin::get_accChild(var_child, disp_child);
558 return E_INVALIDARG;
559
560 *disp_child = NULL;
561
562 BrowserAccessibilityComWin* target = GetTargetFromChildID(var_child);
563 if (!target)
564 return E_INVALIDARG;
565
566 (*disp_child) = target->NewReference();
567 return S_OK;
568 } 544 }
569 545
570 STDMETHODIMP BrowserAccessibilityComWin::get_accChildCount(LONG* child_count) { 546 STDMETHODIMP BrowserAccessibilityComWin::get_accChildCount(LONG* child_count) {
571 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_CHILD_COUNT); 547 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_CHILD_COUNT);
572 if (!owner()) 548 if (!owner())
573 return E_FAIL; 549 return E_FAIL;
574 550
575 if (!child_count) 551 return AXPlatformNodeWin::get_accChildCount(child_count);
576 return E_INVALIDARG;
577
578 *child_count = owner()->PlatformChildCount();
579
580 return S_OK;
581 } 552 }
582 553
583 STDMETHODIMP BrowserAccessibilityComWin::get_accDefaultAction( 554 STDMETHODIMP BrowserAccessibilityComWin::get_accDefaultAction(
584 VARIANT var_id, 555 VARIANT var_id,
585 BSTR* def_action) { 556 BSTR* def_action) {
586 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_DEFAULT_ACTION); 557 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_DEFAULT_ACTION);
587 if (!owner()) 558 if (!owner())
588 return E_FAIL; 559 return E_FAIL;
589 560
590 if (!def_action) 561 AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
591 return E_INVALIDARG; 562 return AXPlatformNodeWin::get_accDefaultAction(var_id, def_action);
592
593 BrowserAccessibilityComWin* target = GetTargetFromChildID(var_id);
594 if (!target)
595 return E_INVALIDARG;
596
597 return target->get_localizedName(0, def_action);
598 } 563 }
599 564
600 STDMETHODIMP BrowserAccessibilityComWin::get_accDescription(VARIANT var_id, 565 STDMETHODIMP BrowserAccessibilityComWin::get_accDescription(VARIANT var_id,
601 BSTR* desc) { 566 BSTR* desc) {
602 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_DESCRIPTION); 567 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_DESCRIPTION);
603 if (!owner()) 568 if (!owner())
604 return E_FAIL; 569 return E_FAIL;
605 570
606 if (!desc) 571 return AXPlatformNodeWin::get_accDescription(var_id, desc);
607 return E_INVALIDARG;
608
609 BrowserAccessibilityComWin* target = GetTargetFromChildID(var_id);
610 if (!target)
611 return E_INVALIDARG;
612
613 base::string16 description_str = target->description();
614 if (description_str.empty())
615 return S_FALSE;
616
617 *desc = SysAllocString(description_str.c_str());
618
619 DCHECK(*desc);
620 return S_OK;
621 } 572 }
622 573
623 STDMETHODIMP BrowserAccessibilityComWin::get_accFocus(VARIANT* focus_child) { 574 STDMETHODIMP BrowserAccessibilityComWin::get_accFocus(VARIANT* focus_child) {
624 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_FOCUS); 575 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_FOCUS);
625 if (!owner()) 576 if (!owner())
626 return E_FAIL; 577 return E_FAIL;
627 578
628 auto* manager = Manager(); 579 return AXPlatformNodeWin::get_accFocus(focus_child);
629 if (!manager)
630 return E_FAIL;
631
632 if (!focus_child)
633 return E_INVALIDARG;
634
635 BrowserAccessibilityWin* focus =
636 static_cast<BrowserAccessibilityWin*>(manager->GetFocus());
637 if (focus == owner()) {
638 focus_child->vt = VT_I4;
639 focus_child->lVal = CHILDID_SELF;
640 } else if (focus == NULL) {
641 focus_child->vt = VT_EMPTY;
642 } else {
643 focus_child->vt = VT_DISPATCH;
644 focus_child->pdispVal = focus->GetCOM()->NewReference();
645 }
646
647 return S_OK;
648 } 580 }
649 581
650 STDMETHODIMP BrowserAccessibilityComWin::get_accHelp(VARIANT var_id, 582 STDMETHODIMP BrowserAccessibilityComWin::get_accHelp(VARIANT var_id,
651 BSTR* help) { 583 BSTR* help) {
652 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_HELP); 584 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_HELP);
653 if (!owner()) 585 if (!owner())
654 return E_FAIL; 586 return E_FAIL;
655 587
656 return AXPlatformNodeWin::get_accHelp(var_id, help); 588 return AXPlatformNodeWin::get_accHelp(var_id, help);
657 } 589 }
(...skipping 27 matching lines...) Expand all
685 617
686 return AXPlatformNodeWin::get_accName(var_id, name); 618 return AXPlatformNodeWin::get_accName(var_id, name);
687 } 619 }
688 620
689 STDMETHODIMP BrowserAccessibilityComWin::get_accParent( 621 STDMETHODIMP BrowserAccessibilityComWin::get_accParent(
690 IDispatch** disp_parent) { 622 IDispatch** disp_parent) {
691 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_PARENT); 623 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_PARENT);
692 if (!owner()) 624 if (!owner())
693 return E_FAIL; 625 return E_FAIL;
694 626
695 if (!disp_parent) 627 return AXPlatformNodeWin::get_accParent(disp_parent);
696 return E_INVALIDARG;
697
698 IAccessible* parent_obj =
699 ToBrowserAccessibilityComWin(owner()->PlatformGetParent());
700 if (parent_obj == NULL) {
701 // This happens if we're the root of the tree;
702 // return the IAccessible for the window.
703 parent_obj =
704 Manager()->ToBrowserAccessibilityManagerWin()->GetParentIAccessible();
705 // |parent| can only be NULL if the manager was created before the parent
706 // IAccessible was known and it wasn't subsequently set before a client
707 // requested it. This has been fixed. |parent| may also be NULL during
708 // destruction. Possible cases where this could occur include tabs being
709 // dragged to a new window, etc.
710 if (!parent_obj) {
711 DVLOG(1) << "In Function: " << __func__
712 << ". Parent IAccessible interface is NULL. Returning failure";
713 return E_FAIL;
714 }
715 }
716 parent_obj->AddRef();
717 *disp_parent = parent_obj;
718 return S_OK;
719 } 628 }
720 629
721 STDMETHODIMP BrowserAccessibilityComWin::get_accRole(VARIANT var_id, 630 STDMETHODIMP BrowserAccessibilityComWin::get_accRole(VARIANT var_id,
722 VARIANT* role) { 631 VARIANT* role) {
723 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_ROLE); 632 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_ROLE);
724 if (!owner()) 633 if (!owner())
725 return E_FAIL; 634 return E_FAIL;
726 635
727 if (!role) 636 if (!role)
728 return E_INVALIDARG; 637 return E_INVALIDARG;
(...skipping 4994 matching lines...) Expand 10 before | Expand all | Expand 10 after
5723 5632
5724 BrowserAccessibilityComWin* ToBrowserAccessibilityComWin( 5633 BrowserAccessibilityComWin* ToBrowserAccessibilityComWin(
5725 BrowserAccessibility* obj) { 5634 BrowserAccessibility* obj) {
5726 if (!obj || !obj->IsNative()) 5635 if (!obj || !obj->IsNative())
5727 return nullptr; 5636 return nullptr;
5728 auto* result = static_cast<BrowserAccessibilityWin*>(obj)->GetCOM(); 5637 auto* result = static_cast<BrowserAccessibilityWin*>(obj)->GetCOM();
5729 return result; 5638 return result;
5730 } 5639 }
5731 5640
5732 } // namespace content 5641 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/accessibility/browser_accessibility.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698