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

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, 2 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 | 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 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 IDispatch** disp_child) { 204 IDispatch** disp_child) {
201 if (var_child.vt != VT_I4 || !disp_child) 205 if (var_child.vt != VT_I4 || !disp_child)
202 return E_INVALIDARG; 206 return E_INVALIDARG;
203 207
204 if (!view_) 208 if (!view_)
205 return E_FAIL; 209 return E_FAIL;
206 210
207 LONG child_id = V_I4(&var_child); 211 LONG child_id = V_I4(&var_child);
208 212
209 if (child_id == CHILDID_SELF) { 213 if (child_id == CHILDID_SELF) {
210 // Remain with the same dispatch. 214 // Remain with the same dispatch.
sky 2011/10/25 20:08:45 Update this comment. Also document who does the re
dmazzoni 2011/10/26 16:46:13 I'll move this to a separate changelist, it's not
215 AddRef();
216 *disp_child = this;
211 return S_OK; 217 return S_OK;
212 } 218 }
213 219
214 views::View* child_view = NULL; 220 views::View* child_view = NULL;
215 if (child_id > 0) { 221 if (child_id > 0) {
216 int child_id_as_index = child_id - 1; 222 int child_id_as_index = child_id - 1;
217 if (child_id_as_index < view_->child_count()) { 223 if (child_id_as_index < view_->child_count()) {
218 // Note: child_id is a one based index when indexing children. 224 // Note: child_id is a one based index when indexing children.
219 child_view = view_->child_at(child_id_as_index); 225 child_view = view_->child_at(child_id_as_index);
220 } else { 226 } else {
221 // Attempt to retrieve a child view with the specified id. 227 // Attempt to retrieve a child view with the specified id.
222 child_view = view_->GetViewByID(child_id); 228 child_view = view_->GetViewByID(child_id);
223 } 229 }
224 } else { 230 } else {
225 // Negative values are used for events fired using the view's 231 // Negative values are used for events fired using the view's
226 // NativeWidgetWin. 232 // NativeWidgetWin.
227 views::NativeWidgetWin* widget = static_cast<views::NativeWidgetWin*>( 233 views::NativeWidgetWin* widget = static_cast<views::NativeWidgetWin*>(
228 view_->GetWidget()->native_widget()); 234 view_->GetWidget()->native_widget());
229 child_view = widget->GetAccessibilityViewEventAt(child_id); 235 child_view = widget->GetAccessibilityViewFromChildId(child_id);
230 } 236 }
231 237
232 if (!child_view) { 238 if (!child_view) {
233 // No child found. 239 // No child found.
234 *disp_child = NULL; 240 *disp_child = NULL;
235 return E_FAIL; 241 return E_FAIL;
236 } 242 }
237 243
238 *disp_child = child_view->GetNativeViewAccessible(); 244 *disp_child = child_view->GetNativeViewAccessible();
239 (*disp_child)->AddRef(); 245 (*disp_child)->AddRef();
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 418
413 ui::AccessibleViewState state; 419 ui::AccessibleViewState state;
414 view_->GetAccessibleState(&state); 420 view_->GetAccessibleState(&state);
415 role->vt = VT_I4; 421 role->vt = VT_I4;
416 role->lVal = MSAARole(state.role); 422 role->lVal = MSAARole(state.role);
417 return S_OK; 423 return S_OK;
418 } 424 }
419 425
420 STDMETHODIMP NativeViewAccessibilityWin::get_accState( 426 STDMETHODIMP NativeViewAccessibilityWin::get_accState(
421 VARIANT var_id, VARIANT* state) { 427 VARIANT var_id, VARIANT* state) {
428 // This returns MSAA states. See also the IAccessible2 interface
429 // get_states().
430
422 if (!IsValidId(var_id) || !state) 431 if (!IsValidId(var_id) || !state)
423 return E_INVALIDARG; 432 return E_INVALIDARG;
424 433
425 if (!view_) 434 if (!view_)
426 return E_FAIL; 435 return E_FAIL;
427 436
428 state->vt = VT_I4; 437 state->vt = VT_I4;
429 438
430 // Retrieve all currently applicable states of the parent. 439 // Retrieve all currently applicable states of the parent.
431 SetState(state, view_); 440 SetState(state, view_);
(...skipping 23 matching lines...) Expand all
455 *value = SysAllocString(temp_value.c_str()); 464 *value = SysAllocString(temp_value.c_str());
456 } else { 465 } else {
457 // If view has no value, fall back into the default implementation. 466 // If view has no value, fall back into the default implementation.
458 *value = NULL; 467 *value = NULL;
459 return E_NOTIMPL; 468 return E_NOTIMPL;
460 } 469 }
461 470
462 return S_OK; 471 return S_OK;
463 } 472 }
464 473
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. 474 // IAccessible functions not supported.
522 475
523 STDMETHODIMP NativeViewAccessibilityWin::get_accSelection(VARIANT* selected) { 476 STDMETHODIMP NativeViewAccessibilityWin::get_accSelection(VARIANT* selected) {
524 if (selected) 477 if (selected)
525 selected->vt = VT_EMPTY; 478 selected->vt = VT_EMPTY;
526 return E_NOTIMPL; 479 return E_NOTIMPL;
527 } 480 }
528 481
529 STDMETHODIMP NativeViewAccessibilityWin::accSelect( 482 STDMETHODIMP NativeViewAccessibilityWin::accSelect(
530 LONG flagsSelect, VARIANT var_id) { 483 LONG flagsSelect, VARIANT var_id) {
(...skipping 23 matching lines...) Expand all
554 // Deprecated. 507 // Deprecated.
555 return E_NOTIMPL; 508 return E_NOTIMPL;
556 } 509 }
557 510
558 STDMETHODIMP NativeViewAccessibilityWin::put_accValue( 511 STDMETHODIMP NativeViewAccessibilityWin::put_accValue(
559 VARIANT var_id, BSTR put_val) { 512 VARIANT var_id, BSTR put_val) {
560 // Deprecated. 513 // Deprecated.
561 return E_NOTIMPL; 514 return E_NOTIMPL;
562 } 515 }
563 516
517 //
518 // IAccessible2
519 //
520
521 STDMETHODIMP NativeViewAccessibilityWin::role(LONG* role) {
522 if (!view_)
523 return E_FAIL;
524
525 if (!role)
526 return E_INVALIDARG;
527
528 ui::AccessibleViewState state;
529 view_->GetAccessibleState(&state);
530 *role = MSAARole(state.role);
531 return S_OK;
532 }
533
534 STDMETHODIMP NativeViewAccessibilityWin::get_states(AccessibleStates* states) {
535 // This returns IAccessible2 states, which supplement MSAA states.
536 // See also the MSAA interface get_accState.
537
538 if (!view_)
539 return E_FAIL;
540
541 if (!states)
542 return E_INVALIDARG;
543
544 ui::AccessibleViewState state;
545 view_->GetAccessibleState(&state);
546
547 // There are only a couple of states we need to support
548 // in IAccessible2. If any more are added, we may want to
549 // add a helper function like MSAAState.
550 *states = IA2_STATE_OPAQUE;
551 if (state.state & AccessibilityTypes::STATE_EDITABLE)
552 *states |= IA2_STATE_EDITABLE;
553
554 return S_OK;
555 }
556
557 STDMETHODIMP NativeViewAccessibilityWin::get_uniqueID(LONG* unique_id) {
558 if (!view_)
559 return E_FAIL;
560
561 if (!unique_id)
562 return E_INVALIDARG;
563
564 *unique_id = unique_id_;
565 return S_OK;
566 }
567
568 STDMETHODIMP NativeViewAccessibilityWin::get_windowHandle(HWND* window_handle) {
569 if (!view_)
570 return E_FAIL;
571
572 if (!window_handle)
573 return E_INVALIDARG;
574
575 *window_handle = view_->GetWidget()->GetNativeView();
576 return S_OK;
577 }
578
579 //
580 // IAccessibleText
581 //
582
583 STDMETHODIMP NativeViewAccessibilityWin::get_nCharacters(LONG* n_characters) {
584 if (!view_)
585 return E_FAIL;
586
587 if (!n_characters)
588 return E_INVALIDARG;
589
590 string16 text = TextForIAccessibleText();
591 *n_characters = static_cast<LONG>(text.size());
592 return S_OK;
593 }
594
595 STDMETHODIMP NativeViewAccessibilityWin::get_caretOffset(LONG* offset) {
596 if (!view_)
597 return E_FAIL;
598
599 if (!offset)
600 return E_INVALIDARG;
601
602 ui::AccessibleViewState state;
603 view_->GetAccessibleState(&state);
604 *offset = static_cast<LONG>(state.selection_end);
605 return S_OK;
606 }
607
608 STDMETHODIMP NativeViewAccessibilityWin::get_nSelections(LONG* n_selections) {
609 if (!view_)
610 return E_FAIL;
611
612 if (!n_selections)
613 return E_INVALIDARG;
614
615 ui::AccessibleViewState state;
616 view_->GetAccessibleState(&state);
617 if (state.selection_start != state.selection_end)
618 *n_selections = 1;
619 else
620 *n_selections = 0;
621 return S_OK;
622 }
623
624 STDMETHODIMP NativeViewAccessibilityWin::get_selection(LONG selection_index,
625 LONG* start_offset,
626 LONG* end_offset) {
627 if (!view_)
628 return E_FAIL;
629
630 if (!start_offset || !end_offset || selection_index != 0)
631 return E_INVALIDARG;
632
633 ui::AccessibleViewState state;
634 view_->GetAccessibleState(&state);
635 *start_offset = static_cast<LONG>(state.selection_start);
636 *end_offset = static_cast<LONG>(state.selection_end);
637 return S_OK;
638 }
639
640 STDMETHODIMP NativeViewAccessibilityWin::get_text(LONG start_offset,
641 LONG end_offset,
642 BSTR* text) {
643 if (!view_)
644 return E_FAIL;
645
646 ui::AccessibleViewState state;
647 view_->GetAccessibleState(&state);
648 string16 text_str = TextForIAccessibleText();
649 LONG len = static_cast<LONG>(text_str.size());
650
651 if (start_offset == IA2_TEXT_OFFSET_LENGTH) {
652 start_offset = len;
653 } else if (start_offset == IA2_TEXT_OFFSET_CARET) {
654 start_offset = static_cast<LONG>(state.selection_end);
655 }
656 if (end_offset == IA2_TEXT_OFFSET_LENGTH) {
657 end_offset = static_cast<LONG>(text_str.size());
658 } else if (end_offset == IA2_TEXT_OFFSET_CARET) {
659 end_offset = static_cast<LONG>(state.selection_end);
660 }
661
662 // The spec allows the arguments to be reversed.
663 if (start_offset > end_offset) {
664 LONG tmp = start_offset;
665 start_offset = end_offset;
666 end_offset = tmp;
667 }
668
669 // The spec does not allow the start or end offsets to be out or range;
670 // we must return an error if so.
671 if (start_offset < 0)
672 return E_INVALIDARG;
673 if (end_offset > len)
674 return E_INVALIDARG;
675
676 string16 substr = text_str.substr(start_offset, end_offset - start_offset);
677 if (substr.empty())
678 return S_FALSE;
679
680 *text = SysAllocString(substr.c_str());
681 DCHECK(*text);
682 return S_OK;
683 }
684
685 STDMETHODIMP NativeViewAccessibilityWin::get_offsetAtPoint(
686 LONG x, LONG y, enum IA2CoordinateType coord_type, LONG* offset) {
687 if (!view_)
688 return E_FAIL;
689
690 if (!offset)
691 return E_INVALIDARG;
692
693 // We don't support this method, but we have to return something
694 // rather than E_NOTIMPL or screen readers will complain.
695 *offset = 0;
696 return S_OK;
697 }
698
699 //
700 // IServiceProvider methods.
701 //
702
703 STDMETHODIMP NativeViewAccessibilityWin::QueryService(
704 REFGUID guidService, REFIID riid, void** object) {
705 if (!view_)
706 return E_FAIL;
707
708 if (guidService == IID_IAccessible ||
709 guidService == IID_IAccessible2 ||
710 guidService == IID_IAccessibleText) {
711 return QueryInterface(riid, object);
712 }
713
714 *object = NULL;
715 return E_FAIL;
716 }
717
718 //
719 // Static methods.
720 //
721
564 int32 NativeViewAccessibilityWin::MSAAEvent(AccessibilityTypes::Event event) { 722 int32 NativeViewAccessibilityWin::MSAAEvent(AccessibilityTypes::Event event) {
565 switch (event) { 723 switch (event) {
566 case AccessibilityTypes::EVENT_ALERT: 724 case AccessibilityTypes::EVENT_ALERT:
567 return EVENT_SYSTEM_ALERT; 725 return EVENT_SYSTEM_ALERT;
568 case AccessibilityTypes::EVENT_FOCUS: 726 case AccessibilityTypes::EVENT_FOCUS:
569 return EVENT_OBJECT_FOCUS; 727 return EVENT_OBJECT_FOCUS;
570 case AccessibilityTypes::EVENT_MENUSTART: 728 case AccessibilityTypes::EVENT_MENUSTART:
571 return EVENT_SYSTEM_MENUSTART; 729 return EVENT_SYSTEM_MENUSTART;
572 case AccessibilityTypes::EVENT_MENUEND: 730 case AccessibilityTypes::EVENT_MENUEND:
573 return EVENT_SYSTEM_MENUEND; 731 return EVENT_SYSTEM_MENUEND;
574 case AccessibilityTypes::EVENT_MENUPOPUPSTART: 732 case AccessibilityTypes::EVENT_MENUPOPUPSTART:
575 return EVENT_SYSTEM_MENUPOPUPSTART; 733 return EVENT_SYSTEM_MENUPOPUPSTART;
576 case AccessibilityTypes::EVENT_MENUPOPUPEND: 734 case AccessibilityTypes::EVENT_MENUPOPUPEND:
577 return EVENT_SYSTEM_MENUPOPUPEND; 735 return EVENT_SYSTEM_MENUPOPUPEND;
578 case AccessibilityTypes::EVENT_NAME_CHANGED: 736 case AccessibilityTypes::EVENT_NAME_CHANGED:
579 return EVENT_OBJECT_NAMECHANGE; 737 return EVENT_OBJECT_NAMECHANGE;
580 case AccessibilityTypes::EVENT_TEXT_CHANGED: 738 case AccessibilityTypes::EVENT_TEXT_CHANGED:
581 return EVENT_OBJECT_VALUECHANGE; 739 return EVENT_OBJECT_VALUECHANGE;
582 case AccessibilityTypes::EVENT_SELECTION_CHANGED: 740 case AccessibilityTypes::EVENT_SELECTION_CHANGED:
583 return EVENT_OBJECT_TEXTSELECTIONCHANGED; 741 return IA2_EVENT_TEXT_CARET_MOVED;
584 case AccessibilityTypes::EVENT_VALUE_CHANGED: 742 case AccessibilityTypes::EVENT_VALUE_CHANGED:
585 return EVENT_OBJECT_VALUECHANGE; 743 return EVENT_OBJECT_VALUECHANGE;
586 default: 744 default:
587 // Not supported or invalid event. 745 // Not supported or invalid event.
588 NOTREACHED(); 746 NOTREACHED();
589 return -1; 747 return -1;
590 } 748 }
591 } 749 }
592 750
593 int32 NativeViewAccessibilityWin::MSAARole(AccessibilityTypes::Role role) { 751 int32 NativeViewAccessibilityWin::MSAARole(AccessibilityTypes::Role role) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 case AccessibilityTypes::ROLE_WINDOW: 809 case AccessibilityTypes::ROLE_WINDOW:
652 return ROLE_SYSTEM_WINDOW; 810 return ROLE_SYSTEM_WINDOW;
653 case AccessibilityTypes::ROLE_CLIENT: 811 case AccessibilityTypes::ROLE_CLIENT:
654 default: 812 default:
655 // This is the default role for MSAA. 813 // This is the default role for MSAA.
656 return ROLE_SYSTEM_CLIENT; 814 return ROLE_SYSTEM_CLIENT;
657 } 815 }
658 } 816 }
659 817
660 int32 NativeViewAccessibilityWin::MSAAState(AccessibilityTypes::State state) { 818 int32 NativeViewAccessibilityWin::MSAAState(AccessibilityTypes::State state) {
819 // This maps MSAA states for get_accState(). See also the IAccessible2
820 // interface get_states().
821
661 int32 msaa_state = 0; 822 int32 msaa_state = 0;
662 if (state & AccessibilityTypes::STATE_CHECKED) 823 if (state & AccessibilityTypes::STATE_CHECKED)
663 msaa_state |= STATE_SYSTEM_CHECKED; 824 msaa_state |= STATE_SYSTEM_CHECKED;
664 if (state & AccessibilityTypes::STATE_COLLAPSED) 825 if (state & AccessibilityTypes::STATE_COLLAPSED)
665 msaa_state |= STATE_SYSTEM_COLLAPSED; 826 msaa_state |= STATE_SYSTEM_COLLAPSED;
666 if (state & AccessibilityTypes::STATE_DEFAULT) 827 if (state & AccessibilityTypes::STATE_DEFAULT)
667 msaa_state |= STATE_SYSTEM_DEFAULT; 828 msaa_state |= STATE_SYSTEM_DEFAULT;
668 if (state & AccessibilityTypes::STATE_EXPANDED) 829 if (state & AccessibilityTypes::STATE_EXPANDED)
669 msaa_state |= STATE_SYSTEM_EXPANDED; 830 msaa_state |= STATE_SYSTEM_EXPANDED;
670 if (state & AccessibilityTypes::STATE_HASPOPUP) 831 if (state & AccessibilityTypes::STATE_HASPOPUP)
(...skipping 13 matching lines...) Expand all
684 if (state & AccessibilityTypes::STATE_READONLY) 845 if (state & AccessibilityTypes::STATE_READONLY)
685 msaa_state |= STATE_SYSTEM_READONLY; 846 msaa_state |= STATE_SYSTEM_READONLY;
686 if (state & AccessibilityTypes::STATE_SELECTED) 847 if (state & AccessibilityTypes::STATE_SELECTED)
687 msaa_state |= STATE_SYSTEM_SELECTED; 848 msaa_state |= STATE_SYSTEM_SELECTED;
688 if (state & AccessibilityTypes::STATE_FOCUSED) 849 if (state & AccessibilityTypes::STATE_FOCUSED)
689 msaa_state |= STATE_SYSTEM_FOCUSED; 850 msaa_state |= STATE_SYSTEM_FOCUSED;
690 if (state & AccessibilityTypes::STATE_UNAVAILABLE) 851 if (state & AccessibilityTypes::STATE_UNAVAILABLE)
691 msaa_state |= STATE_SYSTEM_UNAVAILABLE; 852 msaa_state |= STATE_SYSTEM_UNAVAILABLE;
692 return msaa_state; 853 return msaa_state;
693 } 854 }
855
856 //
857 // Private methods.
858 //
859
860 bool NativeViewAccessibilityWin::IsNavDirNext(int nav_dir) const {
861 if (nav_dir == NAVDIR_RIGHT || nav_dir == NAVDIR_DOWN ||
sky 2011/10/25 20:08:45 nit: make this the return statement, eg: return (
dmazzoni 2011/10/26 16:46:13 Done.
862 nav_dir == NAVDIR_NEXT) {
863 return true;
864 }
865 return false;
866 }
867
868 bool NativeViewAccessibilityWin::IsValidNav(
869 int nav_dir, int start_id, int lower_bound, int upper_bound) const {
870 if (IsNavDirNext(nav_dir)) {
871 if ((start_id + 1) > upper_bound) {
872 return false;
873 }
874 } else {
875 if ((start_id - 1) <= lower_bound) {
876 return false;
877 }
878 }
879 return true;
880 }
881
882 bool NativeViewAccessibilityWin::IsValidId(const VARIANT& child) const {
883 // View accessibility returns an IAccessible for each view so we only support
884 // the CHILDID_SELF id.
885 return (VT_I4 == child.vt) && (CHILDID_SELF == child.lVal);
886 }
887
888 void NativeViewAccessibilityWin::SetState(
889 VARIANT* msaa_state, views::View* view) {
890 // Ensure the output param is initialized to zero.
891 msaa_state->lVal = 0;
892
893 // Default state; all views can have accessibility focus.
894 msaa_state->lVal |= STATE_SYSTEM_FOCUSABLE;
895
896 if (!view)
897 return;
898
899 if (!view->IsEnabled())
900 msaa_state->lVal |= STATE_SYSTEM_UNAVAILABLE;
901 if (!view->IsVisible())
902 msaa_state->lVal |= STATE_SYSTEM_INVISIBLE;
903 if (view->IsHotTracked())
904 msaa_state->lVal |= STATE_SYSTEM_HOTTRACKED;
905 if (view->HasFocus())
906 msaa_state->lVal |= STATE_SYSTEM_FOCUSED;
907
908 // Add on any view-specific states.
909 ui::AccessibleViewState view_state;
910 view->GetAccessibleState(&view_state);
911 msaa_state->lVal |= MSAAState(view_state.state);
912 }
913
914 string16 NativeViewAccessibilityWin::TextForIAccessibleText() {
915 ui::AccessibleViewState state;
916 view_->GetAccessibleState(&state);
917 if (state.role == AccessibilityTypes::ROLE_TEXT)
918 return state.value;
919 else
920 return state.name;
921 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698