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

Unified Diff: ash/magnifier/magnification_controller.cc

Issue 790413002: Focus following for the non-editable controls on web page in magnifier mode. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix nits. Created 6 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 side-by-side diff with in-line comments
Download patch
Index: ash/magnifier/magnification_controller.cc
diff --git a/ash/magnifier/magnification_controller.cc b/ash/magnifier/magnification_controller.cc
index f43154f1026c7e90e30943086e894b15b6f71ea6..8b40d255d6fba39c2369dfd0fce827998d4be9de 100644
--- a/ash/magnifier/magnification_controller.cc
+++ b/ash/magnifier/magnification_controller.cc
@@ -11,6 +11,7 @@
#include "ash/host/ash_window_tree_host.h"
#include "ash/host/root_window_transformer.h"
#include "ash/root_window_controller.h"
+#include "ash/screen_util.h"
#include "ash/shell.h"
#include "ash/system/tray/system_tray_delegate.h"
#include "base/command_line.h"
@@ -88,6 +89,10 @@ class MagnificationControllerImpl : virtual public MagnificationController,
return gfx::ToFlooredPoint(origin_);
}
void SetScrollDirection(ScrollDirection direction) override;
+ gfx::Rect GetViewportRect() const override;
+ void HandleFocusedNodeChanged(
+ bool is_editable_node,
+ const gfx::Rect& node_bounds_in_screen) override;
// For test
gfx::Point GetPointOfInterestForTesting() override {
@@ -145,7 +150,7 @@ class MagnificationControllerImpl : virtual public MagnificationController,
// Returns the size of the root window.
gfx::Size GetHostSizeDIP() const;
- // Correct the givin scale value if nessesary.
+ // Correct the given scale value if necessary.
void ValidateScale(float* scale);
// ui::EventHandler overrides:
@@ -158,11 +163,16 @@ class MagnificationControllerImpl : virtual public MagnificationController,
// window region. The view port will be moved so that the |point| will be
// moved to the point where it has |x_target_margin| and |y_target_margin|
// to the edge of the visible region.
- void MoveMagnifierWindow(const gfx::Point& point,
- int x_panning_margin,
- int y_panning_margin,
- int x_target_margin,
- int y_target_margin);
+ void MoveMagnifierWindowFollowPoint(const gfx::Point& point,
+ int x_panning_margin,
+ int y_panning_margin,
+ int x_target_margin,
+ int y_target_margin);
+
+ // Moves the viewport so that |rect| is fully visible. If |rect| is larger
+ // than the viewport horizontally or vertically, the viewport will be moved
+ // to center the |rect| in that dimension.
+ void MoveMagnifierWindowFollowRect(const gfx::Rect& rect);
// ui::InputMethodObserver:
void OnTextInputTypeChanged(const ui::TextInputClient* client) override {}
@@ -353,7 +363,26 @@ void MagnificationControllerImpl::OnMouseMove(const gfx::Point& location) {
gfx::Point mouse(location);
int margin = kPanningMergin / scale_; // No need to consider DPI.
- MoveMagnifierWindow(mouse, margin, margin, margin, margin);
+ MoveMagnifierWindowFollowPoint(mouse, margin, margin, margin, margin);
+}
+
+gfx::Rect MagnificationControllerImpl::GetViewportRect() const {
+ return gfx::ToEnclosingRect(GetWindowRectDIP(scale_));
+}
+
+void MagnificationControllerImpl::HandleFocusedNodeChanged(
+ bool is_editable_node,
+ const gfx::Rect& node_bounds_in_screen) {
+ // The editable node is handled by OnCaretBoundsChanged.
+ if (is_editable_node)
+ return;
+
+ gfx::Rect node_bounds_in_root =
+ ScreenUtil::ConvertRectFromScreen(root_window_, node_bounds_in_screen);
+ if (GetViewportRect().Contains(node_bounds_in_root))
+ return;
+
+ MoveMagnifierWindowFollowRect(node_bounds_in_root);
}
void MagnificationControllerImpl::AfterAnimationMoveCursorTo(
@@ -597,17 +626,16 @@ void MagnificationControllerImpl::OnTouchEvent(ui::TouchEvent* event) {
}
}
-void MagnificationControllerImpl::MoveMagnifierWindow(const gfx::Point& point,
- int x_panning_margin,
- int y_panning_margin,
- int x_target_margin,
- int y_target_margin) {
+void MagnificationControllerImpl::MoveMagnifierWindowFollowPoint(
+ const gfx::Point& point,
+ int x_panning_margin,
+ int y_panning_margin,
+ int x_target_margin,
+ int y_target_margin) {
DCHECK(root_window_);
- int x = origin_.x();
- int y = origin_.y();
bool start_zoom = false;
- const gfx::Rect window_rect = gfx::ToEnclosingRect(GetWindowRectDIP(scale_));
+ const gfx::Rect window_rect = GetViewportRect();
const int left = window_rect.x();
const int right = window_rect.right();
@@ -621,7 +649,7 @@ void MagnificationControllerImpl::MoveMagnifierWindow(const gfx::Point& point,
x_diff = point.x() - (right - x_target_margin);
start_zoom = true;
}
- x = left + x_diff;
+ int x = left + x_diff;
const int top = window_rect.y();
const int bottom = window_rect.bottom();
@@ -636,7 +664,7 @@ void MagnificationControllerImpl::MoveMagnifierWindow(const gfx::Point& point,
y_diff = point.y() - (bottom - y_target_margin);
start_zoom = true;
}
- y = top + y_diff;
+ int y = top + y_diff;
if (start_zoom && !is_on_animation_) {
// No animation on panning.
bool animate = false;
@@ -650,6 +678,43 @@ void MagnificationControllerImpl::MoveMagnifierWindow(const gfx::Point& point,
}
}
+void MagnificationControllerImpl::MoveMagnifierWindowFollowRect(
+ const gfx::Rect& rect) {
+ DCHECK(root_window_);
+ bool should_pan = false;
+
+ const gfx::Rect viewport_rect = GetViewportRect();
+ const int left = viewport_rect.x();
+ const int right = viewport_rect.right();
+ const gfx::Point rect_center = rect.CenterPoint();
+ const gfx::Point window_center = viewport_rect.CenterPoint();
+
+ int x = left;
+ if (rect.x() < left || right < rect.right()) {
+ // Panning horizontally.
+ x = rect_center.x() - viewport_rect.width() / 2;
+ should_pan = true;
+ }
+
+ const int top = viewport_rect.y();
+ const int bottom = viewport_rect.bottom();
+
+ int y = top;
+ if (rect.y() < top || bottom < rect.bottom()) {
+ // Panning vertically.
+ y = rect_center.y() - viewport_rect.height() / 2;
+ should_pan = true;
+ }
+
+ if (should_pan) {
+ if (is_on_animation_) {
+ root_window_->layer()->GetAnimator()->StopAnimating();
+ is_on_animation_ = false;
+ }
+ RedrawDIP(gfx::Point(x, y), scale_, false); // No animation on panning.
+ }
+}
+
void MagnificationControllerImpl::OnCaretBoundsChanged(
const ui::TextInputClient* client) {
// caret bounds in screen coordinates.
@@ -667,15 +732,12 @@ void MagnificationControllerImpl::OnCaretBoundsChanged(
wm::ConvertPointFromScreen(root_window_, &caret_origin);
// Visible window_rect in |root_window_| coordinates.
- const gfx::Rect visible_window_rect =
- gfx::ToEnclosingRect(GetWindowRectDIP(scale_));
+ const gfx::Rect visible_window_rect = GetViewportRect();
const int panning_margin = kCaretPanningMargin / scale_;
- MoveMagnifierWindow(caret_origin,
- panning_margin,
- panning_margin,
- visible_window_rect.width() / 2,
- visible_window_rect.height() / 2);
+ MoveMagnifierWindowFollowPoint(caret_origin, panning_margin, panning_margin,
+ visible_window_rect.width() / 2,
+ visible_window_rect.height() / 2);
}
////////////////////////////////////////////////////////////////////////////////

Powered by Google App Engine
This is Rietveld 408576698