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

Unified Diff: content/browser/accessibility/browser_accessibility.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.cc
===================================================================
--- content/browser/accessibility/browser_accessibility.cc (revision 112482)
+++ content/browser/accessibility/browser_accessibility.cc (working copy)
@@ -133,8 +133,8 @@
BrowserAccessibility* root = manager_->GetRoot();
int scroll_x = 0;
int scroll_y = 0;
- root->GetIntAttribute(WebAccessibility::ATTR_DOC_SCROLLX, &scroll_x);
- root->GetIntAttribute(WebAccessibility::ATTR_DOC_SCROLLY, &scroll_y);
+ root->GetIntAttribute(WebAccessibility::ATTR_SCROLL_X, &scroll_x);
+ root->GetIntAttribute(WebAccessibility::ATTR_SCROLL_Y, &scroll_y);
bounds.Offset(-scroll_x, -scroll_y);
return bounds;
@@ -163,6 +163,94 @@
return this;
}
+void BrowserAccessibility::ScrollToMakeVisible(const gfx::Rect& subfocus,
+ const gfx::Rect& focus,
+ const gfx::Rect& viewport) {
+ int scroll_x = 0;
+ int scroll_x_min = 0;
+ int scroll_x_max = 0;
+ int scroll_y = 0;
+ int scroll_y_min = 0;
+ int scroll_y_max = 0;
+ if (!GetIntAttribute(WebAccessibility::ATTR_SCROLL_X, &scroll_x) ||
+ !GetIntAttribute(WebAccessibility::ATTR_SCROLL_X_MIN, &scroll_x_min) ||
+ !GetIntAttribute(WebAccessibility::ATTR_SCROLL_X_MAX, &scroll_x_max) ||
+ !GetIntAttribute(WebAccessibility::ATTR_SCROLL_Y, &scroll_y) ||
+ !GetIntAttribute(WebAccessibility::ATTR_SCROLL_Y_MIN, &scroll_y_min) ||
+ !GetIntAttribute(WebAccessibility::ATTR_SCROLL_Y_MAX, &scroll_y_max)) {
+ return;
+ }
+
+ int viewport_left = std::max(viewport.x(), 0);
David Tseng 2011/12/02 00:02:17 Why isn't this std::max(viewport.x(), location_.x(
dmazzoni 2011/12/03 00:37:10 location_ is in global coordinates. We want things
+ int viewport_top = std::max(viewport.y(), 0);
David Tseng 2011/12/02 00:02:17 ditto.
+ int viewport_right = std::min(viewport.right(), location_.right());
+ int viewport_bottom = std::min(viewport.bottom(), location_.bottom());
+
+ int new_scroll_x = ComputeBestScrollOffset(
David Tseng 2011/12/02 00:02:17 Did you try using Rect's as primitives to perform
dmazzoni 2011/12/03 00:37:10 Used Intersect, above. Good idea. I don't think t
+ scroll_x,
+ subfocus.x(), subfocus.right(),
+ focus.x(), focus.right(),
+ viewport_left, viewport_right);
+ new_scroll_x = std::max(new_scroll_x, scroll_x_min);
+ new_scroll_x = std::min(new_scroll_x, scroll_x_max);
+
+ int new_scroll_y = ComputeBestScrollOffset(
+ scroll_y,
+ subfocus.y(), subfocus.bottom(),
+ focus.y(), focus.bottom(),
+ viewport_top, viewport_bottom);
+ new_scroll_y = std::max(new_scroll_y, scroll_y_min);
+ new_scroll_y = std::min(new_scroll_y, scroll_y_max);
+
+ manager_->ChangeScrollPosition(*this, new_scroll_x, new_scroll_y);
+}
+
+// static
+int BrowserAccessibility::ComputeBestScrollOffset(
+ int current_scroll_offset,
+ int subfocus_min, int subfocus_max,
+ int focus_min, int focus_max,
+ int viewport_min, int viewport_max) {
+ int viewport_size = viewport_max - viewport_min;
+
+ // If the focus size is larger than the viewport size, shrink it in the
+ // direction of subfocus.
+ if (focus_max - focus_min > viewport_size) {
+ // Subfocus must be within focus:
+ subfocus_min = std::max(subfocus_min, focus_min);
+ subfocus_max = std::min(subfocus_max, focus_max);
+
+ // Subfocus must be no larger than the viewport size; favor top/left.
+ if (subfocus_max - subfocus_min > viewport_size)
+ subfocus_max = subfocus_min + viewport_size;
+
+ if (subfocus_min + viewport_size > focus_max) {
+ focus_min = focus_max - viewport_size;
+ } else {
+ focus_min = subfocus_min;
+ focus_max = subfocus_min + viewport_size;
+ }
+ }
+
+ // Exit now if the focus is already within the viewport.
+ if (focus_min - current_scroll_offset >= viewport_min &&
+ focus_max - current_scroll_offset <= viewport_max) {
+ return current_scroll_offset;
+ }
+
+ // Scroll left if we're too far to the right.
+ if (focus_max - current_scroll_offset > viewport_max)
+ return focus_max - viewport_max;
+
+ // Scroll right if we're too far to the left.
+ if (focus_min - current_scroll_offset < viewport_min)
+ return focus_min - viewport_min;
+
+ // This shouldn't happen.
+ NOTREACHED();
+ return current_scroll_offset;
+}
+
void BrowserAccessibility::InternalAddReference() {
ref_count_++;
}

Powered by Google App Engine
This is Rietveld 408576698