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

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

Issue 8770021: Initial implementation of IAccessible2 scrollTo and setTextSelection and (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years 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 "content/browser/accessibility/browser_accessibility_win.h" 5 #include "content/browser/accessibility/browser_accessibility_win.h"
6 6
7 #include "base/string_number_conversions.h" 7 #include "base/string_number_conversions.h"
8 #include "base/string_util.h" 8 #include "base/string_util.h"
9 #include "base/utf_string_conversions.h" 9 #include "base/utf_string_conversions.h"
10 #include "base/win/scoped_comptr.h" 10 #include "base/win/scoped_comptr.h"
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after
676 return S_FALSE; 676 return S_FALSE;
677 677
678 for (long i = 0; i < count; ++i) { 678 for (long i = 0; i < count; ++i) {
679 relations_[i]->AddRef(); 679 relations_[i]->AddRef();
680 relations[i] = relations_[i]; 680 relations[i] = relations_[i];
681 } 681 }
682 682
683 return S_OK; 683 return S_OK;
684 } 684 }
685 685
686 STDMETHODIMP BrowserAccessibilityWin::scrollTo(enum IA2ScrollType scroll_type) {
687 if (!instance_active_)
688 return E_FAIL;
689
690 // TODO(dmazzoni): Extend this to scroll every scrollable element as
691 // needed, not just the root.
692 BrowserAccessibility* root = this;
693 while (root->parent())
694 root = root->parent();
695
696 gfx::Rect r = location_;
697 gfx::Rect view(-1000000, -1000000, 1000000, 1000000);
David Tseng 2011/12/02 00:51:51 #include <limits> ... std::numeric_limits<int>::m
dmazzoni 2011/12/03 00:37:10 Done.
698 switch(scroll_type) {
699 case IA2_SCROLL_TYPE_TOP_LEFT:
David Tseng 2011/12/02 00:51:51 indent
dmazzoni 2011/12/03 00:37:10 Done.
700 root->ScrollToMakeVisible(gfx::Rect(r.x(), r.y(), 0, 0), r, view);
701 break;
702 case IA2_SCROLL_TYPE_BOTTOM_RIGHT:
703 root->ScrollToMakeVisible(gfx::Rect(r.right(), r.bottom(), 0, 0), r, view);
704 break;
705 case IA2_SCROLL_TYPE_TOP_EDGE:
706 root->ScrollToMakeVisible(gfx::Rect(r.x(), r.y(), r.width(), 0), r, view);
707 break;
708 case IA2_SCROLL_TYPE_BOTTOM_EDGE:
709 root->ScrollToMakeVisible(
710 gfx::Rect(r.x(), r.bottom(), r.width(), 0), r, view);
711 break;
712 case IA2_SCROLL_TYPE_LEFT_EDGE:
713 root->ScrollToMakeVisible(gfx::Rect(r.x(), r.y(), 0, r.height()), r, view);
714 break;
715 case IA2_SCROLL_TYPE_RIGHT_EDGE:
716 root->ScrollToMakeVisible(
717 gfx::Rect(r.right(), r.y(), 0, r.height()), r, view);
718 break;
719 case IA2_SCROLL_TYPE_ANYWHERE:
720 default:
721 root->ScrollToMakeVisible(r, r, view);
722 break;
723 }
724
725 return S_OK;
726 }
727
728 STDMETHODIMP BrowserAccessibilityWin::scrollToPoint(
729 enum IA2CoordinateType coordinate_type,
730 LONG x,
731 LONG y) {
732 if (!instance_active_)
733 return E_FAIL;
734
735 // TODO(dmazzoni): Extend this to scroll every scrollable element as
736 // needed, not just the root.
737 BrowserAccessibility* root = this;
738 while (root->parent())
739 root = root->parent();
740
741 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) {
David Tseng 2011/12/02 00:51:51 switch? Are we not handling all the cord types?
dmazzoni 2011/12/03 00:37:10 Actually there are only two.
742 gfx::Point top_left = manager_->GetViewBounds().origin();
743 x -= top_left.x();
744 y -= top_left.y();
745 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
746 if (parent_) {
747 gfx::Rect parent_bounds = parent_->location();
748 x += parent_bounds.x();
749 y += parent_bounds.y();
750 }
751 } else {
752 return E_INVALIDARG;
753 }
754
755 gfx::Rect r = location_;
756 root->ScrollToMakeVisible(gfx::Rect(r.x(), r.y(), 0, 0),
757 r,
758 gfx::Rect(x, y, 0, 0));
759
760 return S_OK;
761 }
762
686 // 763 //
687 // IAccessibleImage methods. 764 // IAccessibleImage methods.
688 // 765 //
689 766
690 STDMETHODIMP BrowserAccessibilityWin::get_description(BSTR* desc) { 767 STDMETHODIMP BrowserAccessibilityWin::get_description(BSTR* desc) {
691 if (!instance_active_) 768 if (!instance_active_)
692 return E_FAIL; 769 return E_FAIL;
693 770
694 if (!desc) 771 if (!desc)
695 return E_INVALIDARG; 772 return E_INVALIDARG;
(...skipping 1150 matching lines...) Expand 10 before | Expand all | Expand 10 after
1846 if (!offset) 1923 if (!offset)
1847 return E_INVALIDARG; 1924 return E_INVALIDARG;
1848 1925
1849 // TODO(dmazzoni): implement this. We're returning S_OK for now so that 1926 // TODO(dmazzoni): implement this. We're returning S_OK for now so that
1850 // screen readers still return partially accurate results rather than 1927 // screen readers still return partially accurate results rather than
1851 // completely failing. 1928 // completely failing.
1852 *offset = 0; 1929 *offset = 0;
1853 return S_OK; 1930 return S_OK;
1854 } 1931 }
1855 1932
1933 STDMETHODIMP BrowserAccessibilityWin::scrollSubstringTo(
1934 LONG start_index,
1935 LONG end_index,
1936 enum IA2ScrollType scroll_type) {
1937 // TODO(dmazzoni): adjust this for the start and end index, too.
1938 return scrollTo(scroll_type);
1939 }
1940
1941 STDMETHODIMP BrowserAccessibilityWin::scrollSubstringToPoint(
1942 LONG start_index,
1943 LONG end_index,
1944 enum IA2CoordinateType coordinate_type,
1945 LONG x, LONG y) {
1946 // TODO(dmazzoni): adjust this for the start and end index, too.
1947 return scrollToPoint(coordinate_type, x, y);
1948 }
1949
1950 STDMETHODIMP BrowserAccessibilityWin::addSelection(
David Tseng 2011/12/02 00:51:51 Part of another patch?
dmazzoni 2011/12/03 00:37:10 Yep, sorry. Gone now.
1951 LONG start_offset, LONG end_offset) {
1952 if (!instance_active_)
1953 return E_FAIL;
1954
1955 const string16& text_str = TextForIAccessibleText();
1956 HandleSpecialTextOffset(text_str, &start_offset);
1957 HandleSpecialTextOffset(text_str, &end_offset);
1958
1959 manager_->SetTextSelection(*this, start_offset, end_offset);
1960 return S_OK;
1961 }
1962
1963 STDMETHODIMP BrowserAccessibilityWin::removeSelection(LONG selection_index) {
1964 if (!instance_active_)
1965 return E_FAIL;
1966
1967 if (selection_index != 0)
1968 return E_INVALIDARG;
1969
1970 manager_->SetTextSelection(*this, 0, 0);
1971 return S_OK;
1972 }
1973
1974 STDMETHODIMP BrowserAccessibilityWin::setCaretOffset(LONG offset) {
1975 if (!instance_active_)
1976 return E_FAIL;
1977
1978 const string16& text_str = TextForIAccessibleText();
1979 HandleSpecialTextOffset(text_str, &offset);
1980 manager_->SetTextSelection(*this, offset, offset);
1981 return S_OK;
1982 }
1983
1984 STDMETHODIMP BrowserAccessibilityWin::setSelection(LONG selection_index,
1985 LONG start_offset,
1986 LONG end_offset) {
1987 if (!instance_active_)
1988 return E_FAIL;
1989
1990 if (selection_index != 0)
1991 return E_INVALIDARG;
1992
1993 const string16& text_str = TextForIAccessibleText();
1994 HandleSpecialTextOffset(text_str, &start_offset);
1995 HandleSpecialTextOffset(text_str, &end_offset);
1996
1997 manager_->SetTextSelection(*this, start_offset, end_offset);
1998 return S_OK;
1999 }
2000
1856 // 2001 //
1857 // IAccessibleValue methods. 2002 // IAccessibleValue methods.
1858 // 2003 //
1859 2004
1860 STDMETHODIMP BrowserAccessibilityWin::get_currentValue(VARIANT* value) { 2005 STDMETHODIMP BrowserAccessibilityWin::get_currentValue(VARIANT* value) {
1861 if (!instance_active_) 2006 if (!instance_active_)
1862 return E_FAIL; 2007 return E_FAIL;
1863 2008
1864 if (!value) 2009 if (!value)
1865 return E_INVALIDARG; 2010 return E_INVALIDARG;
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
2108 style_values[i] = SysAllocString(display.c_str()); 2253 style_values[i] = SysAllocString(display.c_str());
2109 } else { 2254 } else {
2110 style_values[i] = NULL; 2255 style_values[i] = NULL;
2111 } 2256 }
2112 } 2257 }
2113 2258
2114 return S_OK; 2259 return S_OK;
2115 } 2260 }
2116 2261
2117 STDMETHODIMP BrowserAccessibilityWin::scrollTo(boolean placeTopLeft) { 2262 STDMETHODIMP BrowserAccessibilityWin::scrollTo(boolean placeTopLeft) {
2118 return E_NOTIMPL; 2263 return scrollTo(placeTopLeft ?
2264 IA2_SCROLL_TYPE_TOP_LEFT :
2265 IA2_SCROLL_TYPE_ANYWHERE);
2119 } 2266 }
2120 2267
2121 STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) { 2268 STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) {
2122 if (!instance_active_) 2269 if (!instance_active_)
2123 return E_FAIL; 2270 return E_FAIL;
2124 2271
2125 if (!node) 2272 if (!node)
2126 return E_INVALIDARG; 2273 return E_INVALIDARG;
2127 2274
2128 *node = parent_->toBrowserAccessibilityWin()->NewReference(); 2275 *node = parent_->toBrowserAccessibilityWin()->NewReference();
(...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after
2966 } 3113 }
2967 3114
2968 // The role should always be set. 3115 // The role should always be set.
2969 DCHECK(!role_name_.empty() || ia_role_); 3116 DCHECK(!role_name_.empty() || ia_role_);
2970 3117
2971 // If we didn't explicitly set the IAccessible2 role, make it the same 3118 // If we didn't explicitly set the IAccessible2 role, make it the same
2972 // as the MSAA role. 3119 // as the MSAA role.
2973 if (!ia2_role_) 3120 if (!ia2_role_)
2974 ia2_role_ = ia_role_; 3121 ia2_role_ = ia_role_;
2975 } 3122 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698