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

Side by Side Diff: views/accessibility/native_view_accessibility_win.cc

Issue 8391010: Improve omnibox accessibility on Windows. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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>
6 #include <atlcom.h>
7
5 #include "views/accessibility/native_view_accessibility_win.h" 8 #include "views/accessibility/native_view_accessibility_win.h"
6 9
10 #include "third_party/iaccessible2/ia2_api_all.h"
7 #include "ui/base/accessibility/accessible_view_state.h" 11 #include "ui/base/accessibility/accessible_view_state.h"
8 #include "ui/base/view_prop.h" 12 #include "ui/base/view_prop.h"
9 #include "views/widget/native_widget_win.h" 13 #include "views/widget/native_widget_win.h"
10 #include "views/widget/widget.h" 14 #include "views/widget/widget.h"
11 15
12 using ui::AccessibilityTypes; 16 using ui::AccessibilityTypes;
13 17
14 namespace views { 18 // static
15 const char kViewsNativeHostPropForAccessibility[] = 19 long NativeViewAccessibilityWin::next_unique_id_ = 1;
16 "Views_NativeViewHostHWNDForAccessibility";
17 }
18 20
19 // static 21 // static
20 scoped_refptr<NativeViewAccessibilityWin> NativeViewAccessibilityWin::Create( 22 scoped_refptr<NativeViewAccessibilityWin> NativeViewAccessibilityWin::Create(
21 views::View* view) { 23 views::View* view) {
22 CComObject<NativeViewAccessibilityWin>* instance = NULL; 24 CComObject<NativeViewAccessibilityWin>* instance = NULL;
23 HRESULT hr = CComObject<NativeViewAccessibilityWin>::CreateInstance( 25 HRESULT hr = CComObject<NativeViewAccessibilityWin>::CreateInstance(
24 &instance); 26 &instance);
25 DCHECK(SUCCEEDED(hr)); 27 DCHECK(SUCCEEDED(hr));
26 instance->set_view(view); 28 instance->set_view(view);
27 return scoped_refptr<NativeViewAccessibilityWin>(instance); 29 return scoped_refptr<NativeViewAccessibilityWin>(instance);
28 } 30 }
29 31
30 NativeViewAccessibilityWin::NativeViewAccessibilityWin() : view_(NULL) { 32 NativeViewAccessibilityWin::NativeViewAccessibilityWin()
33 : view_(NULL),
34 unique_id_(next_unique_id_++) {
31 } 35 }
32 36
33 NativeViewAccessibilityWin::~NativeViewAccessibilityWin() { 37 NativeViewAccessibilityWin::~NativeViewAccessibilityWin() {
34 } 38 }
35 39
36 // TODO(ctguil): Handle case where child View is not contained by parent. 40 // TODO(ctguil): Handle case where child View is not contained by parent.
37 STDMETHODIMP NativeViewAccessibilityWin::accHitTest( 41 STDMETHODIMP NativeViewAccessibilityWin::accHitTest(
38 LONG x_left, LONG y_top, VARIANT* child) { 42 LONG x_left, LONG y_top, VARIANT* child) {
39 if (!child) 43 if (!child)
40 return E_INVALIDARG; 44 return E_INVALIDARG;
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 child_view = view_->child_at(child_id_as_index); 223 child_view = view_->child_at(child_id_as_index);
220 } else { 224 } else {
221 // Attempt to retrieve a child view with the specified id. 225 // Attempt to retrieve a child view with the specified id.
222 child_view = view_->GetViewByID(child_id); 226 child_view = view_->GetViewByID(child_id);
223 } 227 }
224 } else { 228 } else {
225 // Negative values are used for events fired using the view's 229 // Negative values are used for events fired using the view's
226 // NativeWidgetWin. 230 // NativeWidgetWin.
227 views::NativeWidgetWin* widget = static_cast<views::NativeWidgetWin*>( 231 views::NativeWidgetWin* widget = static_cast<views::NativeWidgetWin*>(
228 view_->GetWidget()->native_widget()); 232 view_->GetWidget()->native_widget());
229 child_view = widget->GetAccessibilityViewEventAt(child_id); 233 child_view = widget->GetViewByAccessibleId(child_id);
230 } 234 }
231 235
232 if (!child_view) { 236 if (!child_view) {
233 // No child found. 237 // No child found.
234 *disp_child = NULL; 238 *disp_child = NULL;
235 return E_FAIL; 239 return E_FAIL;
236 } 240 }
237 241
238 *disp_child = child_view->GetNativeViewAccessible(); 242 *disp_child = child_view->GetNativeViewAccessible();
239 (*disp_child)->AddRef(); 243 (*disp_child)->AddRef();
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 416
413 ui::AccessibleViewState state; 417 ui::AccessibleViewState state;
414 view_->GetAccessibleState(&state); 418 view_->GetAccessibleState(&state);
415 role->vt = VT_I4; 419 role->vt = VT_I4;
416 role->lVal = MSAARole(state.role); 420 role->lVal = MSAARole(state.role);
417 return S_OK; 421 return S_OK;
418 } 422 }
419 423
420 STDMETHODIMP NativeViewAccessibilityWin::get_accState( 424 STDMETHODIMP NativeViewAccessibilityWin::get_accState(
421 VARIANT var_id, VARIANT* state) { 425 VARIANT var_id, VARIANT* state) {
426 // This returns MSAA states. See also the IAccessible2 interface
427 // get_states().
428
422 if (!IsValidId(var_id) || !state) 429 if (!IsValidId(var_id) || !state)
423 return E_INVALIDARG; 430 return E_INVALIDARG;
424 431
425 if (!view_) 432 if (!view_)
426 return E_FAIL; 433 return E_FAIL;
427 434
428 state->vt = VT_I4; 435 state->vt = VT_I4;
429 436
430 // Retrieve all currently applicable states of the parent. 437 // Retrieve all currently applicable states of the parent.
431 SetState(state, view_); 438 SetState(state, view_);
(...skipping 23 matching lines...) Expand all
455 *value = SysAllocString(temp_value.c_str()); 462 *value = SysAllocString(temp_value.c_str());
456 } else { 463 } else {
457 // If view has no value, fall back into the default implementation. 464 // If view has no value, fall back into the default implementation.
458 *value = NULL; 465 *value = NULL;
459 return E_NOTIMPL; 466 return E_NOTIMPL;
460 } 467 }
461 468
462 return S_OK; 469 return S_OK;
463 } 470 }
464 471
465 // Helper functions.
466
467 bool NativeViewAccessibilityWin::IsNavDirNext(int nav_dir) const {
468 if (nav_dir == NAVDIR_RIGHT || nav_dir == NAVDIR_DOWN ||
469 nav_dir == NAVDIR_NEXT) {
470 return true;
471 }
472 return false;
473 }
474
475 bool NativeViewAccessibilityWin::IsValidNav(
476 int nav_dir, int start_id, int lower_bound, int upper_bound) const {
477 if (IsNavDirNext(nav_dir)) {
478 if ((start_id + 1) > upper_bound) {
479 return false;
480 }
481 } else {
482 if ((start_id - 1) <= lower_bound) {
483 return false;
484 }
485 }
486 return true;
487 }
488
489 bool NativeViewAccessibilityWin::IsValidId(const VARIANT& child) const {
490 // View accessibility returns an IAccessible for each view so we only support
491 // the CHILDID_SELF id.
492 return (VT_I4 == child.vt) && (CHILDID_SELF == child.lVal);
493 }
494
495 void NativeViewAccessibilityWin::SetState(
496 VARIANT* msaa_state, views::View* view) {
497 // Ensure the output param is initialized to zero.
498 msaa_state->lVal = 0;
499
500 // Default state; all views can have accessibility focus.
501 msaa_state->lVal |= STATE_SYSTEM_FOCUSABLE;
502
503 if (!view)
504 return;
505
506 if (!view->IsEnabled())
507 msaa_state->lVal |= STATE_SYSTEM_UNAVAILABLE;
508 if (!view->IsVisible())
509 msaa_state->lVal |= STATE_SYSTEM_INVISIBLE;
510 if (view->IsHotTracked())
511 msaa_state->lVal |= STATE_SYSTEM_HOTTRACKED;
512 if (view->HasFocus())
513 msaa_state->lVal |= STATE_SYSTEM_FOCUSED;
514
515 // Add on any view-specific states.
516 ui::AccessibleViewState view_state;
517 view->GetAccessibleState(&view_state);
518 msaa_state->lVal |= MSAAState(view_state.state);
519 }
520
521 // IAccessible functions not supported. 472 // IAccessible functions not supported.
522 473
523 STDMETHODIMP NativeViewAccessibilityWin::get_accSelection(VARIANT* selected) { 474 STDMETHODIMP NativeViewAccessibilityWin::get_accSelection(VARIANT* selected) {
524 if (selected) 475 if (selected)
525 selected->vt = VT_EMPTY; 476 selected->vt = VT_EMPTY;
526 return E_NOTIMPL; 477 return E_NOTIMPL;
527 } 478 }
528 479
529 STDMETHODIMP NativeViewAccessibilityWin::accSelect( 480 STDMETHODIMP NativeViewAccessibilityWin::accSelect(
530 LONG flagsSelect, VARIANT var_id) { 481 LONG flagsSelect, VARIANT var_id) {
(...skipping 23 matching lines...) Expand all
554 // Deprecated. 505 // Deprecated.
555 return E_NOTIMPL; 506 return E_NOTIMPL;
556 } 507 }
557 508
558 STDMETHODIMP NativeViewAccessibilityWin::put_accValue( 509 STDMETHODIMP NativeViewAccessibilityWin::put_accValue(
559 VARIANT var_id, BSTR put_val) { 510 VARIANT var_id, BSTR put_val) {
560 // Deprecated. 511 // Deprecated.
561 return E_NOTIMPL; 512 return E_NOTIMPL;
562 } 513 }
563 514
515 //
516 // IAccessible2
517 //
518
519 STDMETHODIMP NativeViewAccessibilityWin::role(LONG* role) {
520 if (!view_)
521 return E_FAIL;
522
523 if (!role)
524 return E_INVALIDARG;
525
526 ui::AccessibleViewState state;
527 view_->GetAccessibleState(&state);
528 *role = MSAARole(state.role);
529 return S_OK;
530 }
531
532 STDMETHODIMP NativeViewAccessibilityWin::get_states(AccessibleStates* states) {
533 // This returns IAccessible2 states, which supplement MSAA states.
534 // See also the MSAA interface get_accState.
535
536 if (!view_)
537 return E_FAIL;
538
539 if (!states)
540 return E_INVALIDARG;
541
542 ui::AccessibleViewState state;
543 view_->GetAccessibleState(&state);
544
545 // There are only a couple of states we need to support
546 // in IAccessible2. If any more are added, we may want to
547 // add a helper function like MSAAState.
548 *states = IA2_STATE_OPAQUE;
549 if (state.state & AccessibilityTypes::STATE_EDITABLE)
550 *states |= IA2_STATE_EDITABLE;
551
552 return S_OK;
553 }
554
555 STDMETHODIMP NativeViewAccessibilityWin::get_uniqueID(LONG* unique_id) {
556 if (!view_)
557 return E_FAIL;
558
559 if (!unique_id)
560 return E_INVALIDARG;
561
562 *unique_id = unique_id_;
563 return S_OK;
564 }
565
566 STDMETHODIMP NativeViewAccessibilityWin::get_windowHandle(HWND* window_handle) {
567 if (!view_)
568 return E_FAIL;
569
570 if (!window_handle)
571 return E_INVALIDARG;
572
573 *window_handle = view_->GetWidget()->GetNativeView();
574 return S_OK;
575 }
576
577 //
578 // IAccessibleText
579 //
580
581 STDMETHODIMP NativeViewAccessibilityWin::get_nCharacters(LONG* n_characters) {
582 if (!view_)
583 return E_FAIL;
584
585 if (!n_characters)
586 return E_INVALIDARG;
587
588 string16 text = TextForIAccessibleText();
589 *n_characters = static_cast<LONG>(text.size());
590 return S_OK;
591 }
592
593 STDMETHODIMP NativeViewAccessibilityWin::get_caretOffset(LONG* offset) {
594 if (!view_)
595 return E_FAIL;
596
597 if (!offset)
598 return E_INVALIDARG;
599
600 ui::AccessibleViewState state;
601 view_->GetAccessibleState(&state);
602 *offset = static_cast<LONG>(state.selection_end);
603 return S_OK;
604 }
605
606 STDMETHODIMP NativeViewAccessibilityWin::get_nSelections(LONG* n_selections) {
607 if (!view_)
608 return E_FAIL;
609
610 if (!n_selections)
611 return E_INVALIDARG;
612
613 ui::AccessibleViewState state;
614 view_->GetAccessibleState(&state);
615 if (state.selection_start != state.selection_end)
616 *n_selections = 1;
617 else
618 *n_selections = 0;
619 return S_OK;
620 }
621
622 STDMETHODIMP NativeViewAccessibilityWin::get_selection(LONG selection_index,
623 LONG* start_offset,
624 LONG* end_offset) {
625 if (!view_)
626 return E_FAIL;
627
628 if (!start_offset || !end_offset || selection_index != 0)
629 return E_INVALIDARG;
630
631 ui::AccessibleViewState state;
632 view_->GetAccessibleState(&state);
633 *start_offset = static_cast<LONG>(state.selection_start);
634 *end_offset = static_cast<LONG>(state.selection_end);
635 return S_OK;
636 }
637
638 STDMETHODIMP NativeViewAccessibilityWin::get_text(LONG start_offset,
639 LONG end_offset,
640 BSTR* text) {
641 if (!view_)
642 return E_FAIL;
643
644 ui::AccessibleViewState state;
645 view_->GetAccessibleState(&state);
646 string16 text_str = TextForIAccessibleText();
647 LONG len = static_cast<LONG>(text_str.size());
648
649 if (start_offset == IA2_TEXT_OFFSET_LENGTH) {
650 start_offset = len;
651 } else if (start_offset == IA2_TEXT_OFFSET_CARET) {
652 start_offset = static_cast<LONG>(state.selection_end);
653 }
654 if (end_offset == IA2_TEXT_OFFSET_LENGTH) {
655 end_offset = static_cast<LONG>(text_str.size());
656 } else if (end_offset == IA2_TEXT_OFFSET_CARET) {
657 end_offset = static_cast<LONG>(state.selection_end);
658 }
659
660 // The spec allows the arguments to be reversed.
661 if (start_offset > end_offset) {
662 LONG tmp = start_offset;
663 start_offset = end_offset;
664 end_offset = tmp;
665 }
666
667 // The spec does not allow the start or end offsets to be out or range;
668 // we must return an error if so.
669 if (start_offset < 0)
670 return E_INVALIDARG;
671 if (end_offset > len)
672 return E_INVALIDARG;
673
674 string16 substr = text_str.substr(start_offset, end_offset - start_offset);
675 if (substr.empty())
676 return S_FALSE;
677
678 *text = SysAllocString(substr.c_str());
679 DCHECK(*text);
680 return S_OK;
681 }
682
683 STDMETHODIMP NativeViewAccessibilityWin::get_offsetAtPoint(
684 LONG x, LONG y, enum IA2CoordinateType coord_type, LONG* offset) {
685 if (!view_)
686 return E_FAIL;
687
688 if (!offset)
689 return E_INVALIDARG;
690
691 // We don't support this method, but we have to return something
692 // rather than E_NOTIMPL or screen readers will complain.
693 *offset = 0;
694 return S_OK;
695 }
696
697 //
698 // IServiceProvider methods.
699 //
700
701 STDMETHODIMP NativeViewAccessibilityWin::QueryService(
702 REFGUID guidService, REFIID riid, void** object) {
703 if (!view_)
704 return E_FAIL;
705
706 if (guidService == IID_IAccessible ||
707 guidService == IID_IAccessible2 ||
708 guidService == IID_IAccessibleText) {
709 return QueryInterface(riid, object);
710 }
711
712 *object = NULL;
713 return E_FAIL;
714 }
715
716 //
717 // Static methods.
718 //
719
564 int32 NativeViewAccessibilityWin::MSAAEvent(AccessibilityTypes::Event event) { 720 int32 NativeViewAccessibilityWin::MSAAEvent(AccessibilityTypes::Event event) {
565 switch (event) { 721 switch (event) {
566 case AccessibilityTypes::EVENT_ALERT: 722 case AccessibilityTypes::EVENT_ALERT:
567 return EVENT_SYSTEM_ALERT; 723 return EVENT_SYSTEM_ALERT;
568 case AccessibilityTypes::EVENT_FOCUS: 724 case AccessibilityTypes::EVENT_FOCUS:
569 return EVENT_OBJECT_FOCUS; 725 return EVENT_OBJECT_FOCUS;
570 case AccessibilityTypes::EVENT_MENUSTART: 726 case AccessibilityTypes::EVENT_MENUSTART:
571 return EVENT_SYSTEM_MENUSTART; 727 return EVENT_SYSTEM_MENUSTART;
572 case AccessibilityTypes::EVENT_MENUEND: 728 case AccessibilityTypes::EVENT_MENUEND:
573 return EVENT_SYSTEM_MENUEND; 729 return EVENT_SYSTEM_MENUEND;
574 case AccessibilityTypes::EVENT_MENUPOPUPSTART: 730 case AccessibilityTypes::EVENT_MENUPOPUPSTART:
575 return EVENT_SYSTEM_MENUPOPUPSTART; 731 return EVENT_SYSTEM_MENUPOPUPSTART;
576 case AccessibilityTypes::EVENT_MENUPOPUPEND: 732 case AccessibilityTypes::EVENT_MENUPOPUPEND:
577 return EVENT_SYSTEM_MENUPOPUPEND; 733 return EVENT_SYSTEM_MENUPOPUPEND;
578 case AccessibilityTypes::EVENT_NAME_CHANGED: 734 case AccessibilityTypes::EVENT_NAME_CHANGED:
579 return EVENT_OBJECT_NAMECHANGE; 735 return EVENT_OBJECT_NAMECHANGE;
580 case AccessibilityTypes::EVENT_TEXT_CHANGED: 736 case AccessibilityTypes::EVENT_TEXT_CHANGED:
581 return EVENT_OBJECT_VALUECHANGE; 737 return EVENT_OBJECT_VALUECHANGE;
582 case AccessibilityTypes::EVENT_SELECTION_CHANGED: 738 case AccessibilityTypes::EVENT_SELECTION_CHANGED:
583 return EVENT_OBJECT_TEXTSELECTIONCHANGED; 739 return IA2_EVENT_TEXT_CARET_MOVED;
584 case AccessibilityTypes::EVENT_VALUE_CHANGED: 740 case AccessibilityTypes::EVENT_VALUE_CHANGED:
585 return EVENT_OBJECT_VALUECHANGE; 741 return EVENT_OBJECT_VALUECHANGE;
586 default: 742 default:
587 // Not supported or invalid event. 743 // Not supported or invalid event.
588 NOTREACHED(); 744 NOTREACHED();
589 return -1; 745 return -1;
590 } 746 }
591 } 747 }
592 748
593 int32 NativeViewAccessibilityWin::MSAARole(AccessibilityTypes::Role role) { 749 int32 NativeViewAccessibilityWin::MSAARole(AccessibilityTypes::Role role) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 case AccessibilityTypes::ROLE_WINDOW: 807 case AccessibilityTypes::ROLE_WINDOW:
652 return ROLE_SYSTEM_WINDOW; 808 return ROLE_SYSTEM_WINDOW;
653 case AccessibilityTypes::ROLE_CLIENT: 809 case AccessibilityTypes::ROLE_CLIENT:
654 default: 810 default:
655 // This is the default role for MSAA. 811 // This is the default role for MSAA.
656 return ROLE_SYSTEM_CLIENT; 812 return ROLE_SYSTEM_CLIENT;
657 } 813 }
658 } 814 }
659 815
660 int32 NativeViewAccessibilityWin::MSAAState(AccessibilityTypes::State state) { 816 int32 NativeViewAccessibilityWin::MSAAState(AccessibilityTypes::State state) {
817 // This maps MSAA states for get_accState(). See also the IAccessible2
818 // interface get_states().
819
661 int32 msaa_state = 0; 820 int32 msaa_state = 0;
662 if (state & AccessibilityTypes::STATE_CHECKED) 821 if (state & AccessibilityTypes::STATE_CHECKED)
663 msaa_state |= STATE_SYSTEM_CHECKED; 822 msaa_state |= STATE_SYSTEM_CHECKED;
664 if (state & AccessibilityTypes::STATE_COLLAPSED) 823 if (state & AccessibilityTypes::STATE_COLLAPSED)
665 msaa_state |= STATE_SYSTEM_COLLAPSED; 824 msaa_state |= STATE_SYSTEM_COLLAPSED;
666 if (state & AccessibilityTypes::STATE_DEFAULT) 825 if (state & AccessibilityTypes::STATE_DEFAULT)
667 msaa_state |= STATE_SYSTEM_DEFAULT; 826 msaa_state |= STATE_SYSTEM_DEFAULT;
668 if (state & AccessibilityTypes::STATE_EXPANDED) 827 if (state & AccessibilityTypes::STATE_EXPANDED)
669 msaa_state |= STATE_SYSTEM_EXPANDED; 828 msaa_state |= STATE_SYSTEM_EXPANDED;
670 if (state & AccessibilityTypes::STATE_HASPOPUP) 829 if (state & AccessibilityTypes::STATE_HASPOPUP)
(...skipping 13 matching lines...) Expand all
684 if (state & AccessibilityTypes::STATE_READONLY) 843 if (state & AccessibilityTypes::STATE_READONLY)
685 msaa_state |= STATE_SYSTEM_READONLY; 844 msaa_state |= STATE_SYSTEM_READONLY;
686 if (state & AccessibilityTypes::STATE_SELECTED) 845 if (state & AccessibilityTypes::STATE_SELECTED)
687 msaa_state |= STATE_SYSTEM_SELECTED; 846 msaa_state |= STATE_SYSTEM_SELECTED;
688 if (state & AccessibilityTypes::STATE_FOCUSED) 847 if (state & AccessibilityTypes::STATE_FOCUSED)
689 msaa_state |= STATE_SYSTEM_FOCUSED; 848 msaa_state |= STATE_SYSTEM_FOCUSED;
690 if (state & AccessibilityTypes::STATE_UNAVAILABLE) 849 if (state & AccessibilityTypes::STATE_UNAVAILABLE)
691 msaa_state |= STATE_SYSTEM_UNAVAILABLE; 850 msaa_state |= STATE_SYSTEM_UNAVAILABLE;
692 return msaa_state; 851 return msaa_state;
693 } 852 }
853
854 //
855 // Private methods.
856 //
857
858 bool NativeViewAccessibilityWin::IsNavDirNext(int nav_dir) const {
859 return (nav_dir == NAVDIR_RIGHT ||
860 nav_dir == NAVDIR_DOWN ||
861 nav_dir == NAVDIR_NEXT);
862 }
863
864 bool NativeViewAccessibilityWin::IsValidNav(
865 int nav_dir, int start_id, int lower_bound, int upper_bound) const {
866 if (IsNavDirNext(nav_dir)) {
867 if ((start_id + 1) > upper_bound) {
868 return false;
869 }
870 } else {
871 if ((start_id - 1) <= lower_bound) {
872 return false;
873 }
874 }
875 return true;
876 }
877
878 bool NativeViewAccessibilityWin::IsValidId(const VARIANT& child) const {
879 // View accessibility returns an IAccessible for each view so we only support
880 // the CHILDID_SELF id.
881 return (VT_I4 == child.vt) && (CHILDID_SELF == child.lVal);
882 }
883
884 void NativeViewAccessibilityWin::SetState(
885 VARIANT* msaa_state, views::View* view) {
886 // Ensure the output param is initialized to zero.
887 msaa_state->lVal = 0;
888
889 // Default state; all views can have accessibility focus.
890 msaa_state->lVal |= STATE_SYSTEM_FOCUSABLE;
891
892 if (!view)
893 return;
894
895 if (!view->IsEnabled())
896 msaa_state->lVal |= STATE_SYSTEM_UNAVAILABLE;
897 if (!view->IsVisible())
898 msaa_state->lVal |= STATE_SYSTEM_INVISIBLE;
899 if (view->IsHotTracked())
900 msaa_state->lVal |= STATE_SYSTEM_HOTTRACKED;
901 if (view->HasFocus())
902 msaa_state->lVal |= STATE_SYSTEM_FOCUSED;
903
904 // Add on any view-specific states.
905 ui::AccessibleViewState view_state;
906 view->GetAccessibleState(&view_state);
907 msaa_state->lVal |= MSAAState(view_state.state);
908 }
909
910 string16 NativeViewAccessibilityWin::TextForIAccessibleText() {
911 ui::AccessibleViewState state;
912 view_->GetAccessibleState(&state);
913 if (state.role == AccessibilityTypes::ROLE_TEXT)
914 return state.value;
915 else
916 return state.name;
917 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698