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

Unified 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, 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/accessibility/browser_accessibility_win.cc
===================================================================
--- content/browser/accessibility/browser_accessibility_win.cc (revision 112482)
+++ content/browser/accessibility/browser_accessibility_win.cc (working copy)
@@ -683,6 +683,83 @@
return S_OK;
}
+STDMETHODIMP BrowserAccessibilityWin::scrollTo(enum IA2ScrollType scroll_type) {
+ if (!instance_active_)
+ return E_FAIL;
+
+ // TODO(dmazzoni): Extend this to scroll every scrollable element as
+ // needed, not just the root.
+ BrowserAccessibility* root = this;
+ while (root->parent())
+ root = root->parent();
+
+ gfx::Rect r = location_;
+ 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.
+ switch(scroll_type) {
+ case IA2_SCROLL_TYPE_TOP_LEFT:
David Tseng 2011/12/02 00:51:51 indent
dmazzoni 2011/12/03 00:37:10 Done.
+ root->ScrollToMakeVisible(gfx::Rect(r.x(), r.y(), 0, 0), r, view);
+ break;
+ case IA2_SCROLL_TYPE_BOTTOM_RIGHT:
+ root->ScrollToMakeVisible(gfx::Rect(r.right(), r.bottom(), 0, 0), r, view);
+ break;
+ case IA2_SCROLL_TYPE_TOP_EDGE:
+ root->ScrollToMakeVisible(gfx::Rect(r.x(), r.y(), r.width(), 0), r, view);
+ break;
+ case IA2_SCROLL_TYPE_BOTTOM_EDGE:
+ root->ScrollToMakeVisible(
+ gfx::Rect(r.x(), r.bottom(), r.width(), 0), r, view);
+ break;
+ case IA2_SCROLL_TYPE_LEFT_EDGE:
+ root->ScrollToMakeVisible(gfx::Rect(r.x(), r.y(), 0, r.height()), r, view);
+ break;
+ case IA2_SCROLL_TYPE_RIGHT_EDGE:
+ root->ScrollToMakeVisible(
+ gfx::Rect(r.right(), r.y(), 0, r.height()), r, view);
+ break;
+ case IA2_SCROLL_TYPE_ANYWHERE:
+ default:
+ root->ScrollToMakeVisible(r, r, view);
+ break;
+ }
+
+ return S_OK;
+}
+
+STDMETHODIMP BrowserAccessibilityWin::scrollToPoint(
+ enum IA2CoordinateType coordinate_type,
+ LONG x,
+ LONG y) {
+ if (!instance_active_)
+ return E_FAIL;
+
+ // TODO(dmazzoni): Extend this to scroll every scrollable element as
+ // needed, not just the root.
+ BrowserAccessibility* root = this;
+ while (root->parent())
+ root = root->parent();
+
+ 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.
+ gfx::Point top_left = manager_->GetViewBounds().origin();
+ x -= top_left.x();
+ y -= top_left.y();
+ } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
+ if (parent_) {
+ gfx::Rect parent_bounds = parent_->location();
+ x += parent_bounds.x();
+ y += parent_bounds.y();
+ }
+ } else {
+ return E_INVALIDARG;
+ }
+
+ gfx::Rect r = location_;
+ root->ScrollToMakeVisible(gfx::Rect(r.x(), r.y(), 0, 0),
+ r,
+ gfx::Rect(x, y, 0, 0));
+
+ return S_OK;
+}
+
//
// IAccessibleImage methods.
//
@@ -1853,6 +1930,74 @@
return S_OK;
}
+STDMETHODIMP BrowserAccessibilityWin::scrollSubstringTo(
+ LONG start_index,
+ LONG end_index,
+ enum IA2ScrollType scroll_type) {
+ // TODO(dmazzoni): adjust this for the start and end index, too.
+ return scrollTo(scroll_type);
+}
+
+STDMETHODIMP BrowserAccessibilityWin::scrollSubstringToPoint(
+ LONG start_index,
+ LONG end_index,
+ enum IA2CoordinateType coordinate_type,
+ LONG x, LONG y) {
+ // TODO(dmazzoni): adjust this for the start and end index, too.
+ return scrollToPoint(coordinate_type, x, y);
+}
+
+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.
+ LONG start_offset, LONG end_offset) {
+ if (!instance_active_)
+ return E_FAIL;
+
+ const string16& text_str = TextForIAccessibleText();
+ HandleSpecialTextOffset(text_str, &start_offset);
+ HandleSpecialTextOffset(text_str, &end_offset);
+
+ manager_->SetTextSelection(*this, start_offset, end_offset);
+ return S_OK;
+}
+
+STDMETHODIMP BrowserAccessibilityWin::removeSelection(LONG selection_index) {
+ if (!instance_active_)
+ return E_FAIL;
+
+ if (selection_index != 0)
+ return E_INVALIDARG;
+
+ manager_->SetTextSelection(*this, 0, 0);
+ return S_OK;
+}
+
+STDMETHODIMP BrowserAccessibilityWin::setCaretOffset(LONG offset) {
+ if (!instance_active_)
+ return E_FAIL;
+
+ const string16& text_str = TextForIAccessibleText();
+ HandleSpecialTextOffset(text_str, &offset);
+ manager_->SetTextSelection(*this, offset, offset);
+ return S_OK;
+}
+
+STDMETHODIMP BrowserAccessibilityWin::setSelection(LONG selection_index,
+ LONG start_offset,
+ LONG end_offset) {
+ if (!instance_active_)
+ return E_FAIL;
+
+ if (selection_index != 0)
+ return E_INVALIDARG;
+
+ const string16& text_str = TextForIAccessibleText();
+ HandleSpecialTextOffset(text_str, &start_offset);
+ HandleSpecialTextOffset(text_str, &end_offset);
+
+ manager_->SetTextSelection(*this, start_offset, end_offset);
+ return S_OK;
+}
+
//
// IAccessibleValue methods.
//
@@ -2115,7 +2260,9 @@
}
STDMETHODIMP BrowserAccessibilityWin::scrollTo(boolean placeTopLeft) {
- return E_NOTIMPL;
+ return scrollTo(placeTopLeft ?
+ IA2_SCROLL_TYPE_TOP_LEFT :
+ IA2_SCROLL_TYPE_ANYWHERE);
}
STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) {

Powered by Google App Engine
This is Rietveld 408576698