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

Side by Side 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 a nit. 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "ash/magnifier/magnification_controller.h" 5 #include "ash/magnifier/magnification_controller.h"
6 6
7 #include "ash/accelerators/accelerator_controller.h" 7 #include "ash/accelerators/accelerator_controller.h"
8 #include "ash/accessibility_delegate.h" 8 #include "ash/accessibility_delegate.h"
9 #include "ash/ash_switches.h" 9 #include "ash/ash_switches.h"
10 #include "ash/display/root_window_transformers.h" 10 #include "ash/display/root_window_transformers.h"
11 #include "ash/host/ash_window_tree_host.h" 11 #include "ash/host/ash_window_tree_host.h"
12 #include "ash/host/root_window_transformer.h" 12 #include "ash/host/root_window_transformer.h"
13 #include "ash/root_window_controller.h" 13 #include "ash/root_window_controller.h"
14 #include "ash/screen_util.h"
14 #include "ash/shell.h" 15 #include "ash/shell.h"
15 #include "ash/system/tray/system_tray_delegate.h" 16 #include "ash/system/tray/system_tray_delegate.h"
16 #include "base/command_line.h" 17 #include "base/command_line.h"
17 #include "base/synchronization/waitable_event.h" 18 #include "base/synchronization/waitable_event.h"
18 #include "ui/aura/client/aura_constants.h" 19 #include "ui/aura/client/aura_constants.h"
19 #include "ui/aura/client/cursor_client.h" 20 #include "ui/aura/client/cursor_client.h"
20 #include "ui/aura/window.h" 21 #include "ui/aura/window.h"
21 #include "ui/aura/window_tree_host.h" 22 #include "ui/aura/window_tree_host.h"
22 #include "ui/base/ime/input_method.h" 23 #include "ui/base/ime/input_method.h"
23 #include "ui/base/ime/input_method_observer.h" 24 #include "ui/base/ime/input_method_observer.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 void SetEnabled(bool enabled) override; 82 void SetEnabled(bool enabled) override;
82 bool IsEnabled() const override; 83 bool IsEnabled() const override;
83 void SetScale(float scale, bool animate) override; 84 void SetScale(float scale, bool animate) override;
84 float GetScale() const override { return scale_; } 85 float GetScale() const override { return scale_; }
85 void MoveWindow(int x, int y, bool animate) override; 86 void MoveWindow(int x, int y, bool animate) override;
86 void MoveWindow(const gfx::Point& point, bool animate) override; 87 void MoveWindow(const gfx::Point& point, bool animate) override;
87 gfx::Point GetWindowPosition() const override { 88 gfx::Point GetWindowPosition() const override {
88 return gfx::ToFlooredPoint(origin_); 89 return gfx::ToFlooredPoint(origin_);
89 } 90 }
90 void SetScrollDirection(ScrollDirection direction) override; 91 void SetScrollDirection(ScrollDirection direction) override;
92 gfx::Rect GetViewportRect() override;
93 void HandleFocusedNodeChanged(
94 bool is_editable_node,
95 const gfx::Rect& node_bounds_in_screen) override;
91 96
92 // For test 97 // For test
93 gfx::Point GetPointOfInterestForTesting() override { 98 gfx::Point GetPointOfInterestForTesting() override {
94 return point_of_interest_; 99 return point_of_interest_;
95 } 100 }
96 101
97 private: 102 private:
98 // ui::ImplicitAnimationObserver overrides: 103 // ui::ImplicitAnimationObserver overrides:
99 void OnImplicitAnimationsCompleted() override; 104 void OnImplicitAnimationsCompleted() override;
100 105
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 bool redraw_original_root_window); 143 bool redraw_original_root_window);
139 144
140 // Returns if the magnification scale is 1.0 or not (larger then 1.0). 145 // Returns if the magnification scale is 1.0 or not (larger then 1.0).
141 bool IsMagnified() const; 146 bool IsMagnified() const;
142 147
143 // Returns the rect of the magnification window. 148 // Returns the rect of the magnification window.
144 gfx::RectF GetWindowRectDIP(float scale) const; 149 gfx::RectF GetWindowRectDIP(float scale) const;
145 // Returns the size of the root window. 150 // Returns the size of the root window.
146 gfx::Size GetHostSizeDIP() const; 151 gfx::Size GetHostSizeDIP() const;
147 152
148 // Correct the givin scale value if nessesary. 153 // Correct the given scale value if necessary.
149 void ValidateScale(float* scale); 154 void ValidateScale(float* scale);
150 155
151 // ui::EventHandler overrides: 156 // ui::EventHandler overrides:
152 void OnMouseEvent(ui::MouseEvent* event) override; 157 void OnMouseEvent(ui::MouseEvent* event) override;
153 void OnScrollEvent(ui::ScrollEvent* event) override; 158 void OnScrollEvent(ui::ScrollEvent* event) override;
154 void OnTouchEvent(ui::TouchEvent* event) override; 159 void OnTouchEvent(ui::TouchEvent* event) override;
155 160
156 // Moves the view port when |point| is located within 161 // Moves the view port when |point| is located within
157 // |x_panning_margin| and |y_pannin_margin| to the edge of the visible 162 // |x_panning_margin| and |y_pannin_margin| to the edge of the visible
158 // window region. The view port will be moved so that the |point| will be 163 // window region. The view port will be moved so that the |point| will be
159 // moved to the point where it has |x_target_margin| and |y_target_margin| 164 // moved to the point where it has |x_target_margin| and |y_target_margin|
160 // to the edge of the visible region. 165 // to the edge of the visible region.
161 void MoveMagnifierWindow(const gfx::Point& point, 166 void MoveMagnifierWindowFollowPoint(const gfx::Point& point,
162 int x_panning_margin, 167 int x_panning_margin,
163 int y_panning_margin, 168 int y_panning_margin,
164 int x_target_margin, 169 int x_target_margin,
165 int y_target_margin); 170 int y_target_margin);
171
172 // Moves the view port to follow |rect|, if |rect| is partially or completely
oshima 2014/12/12 00:48:44 Move the viewport so that rect is fully visible. (
jennyz 2014/12/12 23:14:44 Done.
173 // outside of the view port.
174 void MoveMaginifierWindowFollowRect(const gfx::Rect& rect);
166 175
167 // ui::InputMethodObserver: 176 // ui::InputMethodObserver:
168 void OnTextInputTypeChanged(const ui::TextInputClient* client) override {} 177 void OnTextInputTypeChanged(const ui::TextInputClient* client) override {}
169 void OnFocus() override {} 178 void OnFocus() override {}
170 void OnBlur() override {} 179 void OnBlur() override {}
171 void OnTextInputStateChanged(const ui::TextInputClient* client) override {} 180 void OnTextInputStateChanged(const ui::TextInputClient* client) override {}
172 void OnInputMethodDestroyed(const ui::InputMethod* input_method) override {} 181 void OnInputMethodDestroyed(const ui::InputMethod* input_method) override {}
173 void OnShowImeIfNeeded() override {} 182 void OnShowImeIfNeeded() override {}
174 void OnCaretBoundsChanged(const ui::TextInputClient* client) override; 183 void OnCaretBoundsChanged(const ui::TextInputClient* client) override;
175 184
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 break; 355 break;
347 } 356 }
348 RedrawDIP(new_origin, scale_, true); 357 RedrawDIP(new_origin, scale_, true);
349 } 358 }
350 359
351 void MagnificationControllerImpl::OnMouseMove(const gfx::Point& location) { 360 void MagnificationControllerImpl::OnMouseMove(const gfx::Point& location) {
352 DCHECK(root_window_); 361 DCHECK(root_window_);
353 362
354 gfx::Point mouse(location); 363 gfx::Point mouse(location);
355 int margin = kPanningMergin / scale_; // No need to consider DPI. 364 int margin = kPanningMergin / scale_; // No need to consider DPI.
356 MoveMagnifierWindow(mouse, margin, margin, margin, margin); 365 MoveMagnifierWindowFollowPoint(mouse, margin, margin, margin, margin);
366 }
367
368 gfx::Rect MagnificationControllerImpl::GetViewportRect() {
369 return gfx::ToEnclosingRect(GetWindowRectDIP(scale_));
370 }
371
372 void MagnificationControllerImpl::HandleFocusedNodeChanged(
373 bool is_editable_node,
374 const gfx::Rect& node_bounds_in_screen) {
375 // The editable node is handled by OnCaretBoundsChanged.
376 if (is_editable_node)
377 return;
378
379 gfx::Rect node_bounds_in_root =
380 ScreenUtil::ConvertRectFromScreen(root_window_, node_bounds_in_screen);
381 if (GetViewportRect().Contains(node_bounds_in_root))
382 return;
383
384 MoveMaginifierWindowFollowRect(node_bounds_in_root);
357 } 385 }
358 386
359 void MagnificationControllerImpl::AfterAnimationMoveCursorTo( 387 void MagnificationControllerImpl::AfterAnimationMoveCursorTo(
360 const gfx::Point& location) { 388 const gfx::Point& location) {
361 DCHECK(root_window_); 389 DCHECK(root_window_);
362 390
363 aura::client::CursorClient* cursor_client = 391 aura::client::CursorClient* cursor_client =
364 aura::client::GetCursorClient(root_window_); 392 aura::client::GetCursorClient(root_window_);
365 if (cursor_client) { 393 if (cursor_client) {
366 // When cursor is invisible, do not move or show the cursor after the 394 // When cursor is invisible, do not move or show the cursor after the
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 void MagnificationControllerImpl::OnTouchEvent(ui::TouchEvent* event) { 618 void MagnificationControllerImpl::OnTouchEvent(ui::TouchEvent* event) {
591 aura::Window* target = static_cast<aura::Window*>(event->target()); 619 aura::Window* target = static_cast<aura::Window*>(event->target());
592 aura::Window* current_root = target->GetRootWindow(); 620 aura::Window* current_root = target->GetRootWindow();
593 if (current_root == root_window_) { 621 if (current_root == root_window_) {
594 gfx::Rect root_bounds = current_root->bounds(); 622 gfx::Rect root_bounds = current_root->bounds();
595 if (root_bounds.Contains(event->root_location())) 623 if (root_bounds.Contains(event->root_location()))
596 point_of_interest_ = event->root_location(); 624 point_of_interest_ = event->root_location();
597 } 625 }
598 } 626 }
599 627
600 void MagnificationControllerImpl::MoveMagnifierWindow(const gfx::Point& point, 628 void MagnificationControllerImpl::MoveMagnifierWindowFollowPoint(
601 int x_panning_margin, 629 const gfx::Point& point,
602 int y_panning_margin, 630 int x_panning_margin,
603 int x_target_margin, 631 int y_panning_margin,
604 int y_target_margin) { 632 int x_target_margin,
633 int y_target_margin) {
605 DCHECK(root_window_); 634 DCHECK(root_window_);
606 int x = origin_.x();
607 int y = origin_.y();
608 bool start_zoom = false; 635 bool start_zoom = false;
609 636
610 const gfx::Rect window_rect = gfx::ToEnclosingRect(GetWindowRectDIP(scale_)); 637 const gfx::Rect window_rect = GetViewportRect();
611 const int left = window_rect.x(); 638 const int left = window_rect.x();
612 const int right = window_rect.right(); 639 const int right = window_rect.right();
613 640
614 int x_diff = 0; 641 int x_diff = 0;
615 if (point.x() < left + x_panning_margin) { 642 if (point.x() < left + x_panning_margin) {
616 // Panning left. 643 // Panning left.
617 x_diff = point.x() - (left + x_target_margin); 644 x_diff = point.x() - (left + x_target_margin);
618 start_zoom = true; 645 start_zoom = true;
619 } else if (right - x_panning_margin < point.x()) { 646 } else if (right - x_panning_margin < point.x()) {
620 // Panning right. 647 // Panning right.
621 x_diff = point.x() - (right - x_target_margin); 648 x_diff = point.x() - (right - x_target_margin);
622 start_zoom = true; 649 start_zoom = true;
623 } 650 }
624 x = left + x_diff; 651 int x = left + x_diff;
625 652
626 const int top = window_rect.y(); 653 const int top = window_rect.y();
627 const int bottom = window_rect.bottom(); 654 const int bottom = window_rect.bottom();
628 655
629 int y_diff = 0; 656 int y_diff = 0;
630 if (point.y() < top + y_panning_margin) { 657 if (point.y() < top + y_panning_margin) {
631 // Panning up. 658 // Panning up.
632 y_diff = point.y() - (top + y_target_margin); 659 y_diff = point.y() - (top + y_target_margin);
633 start_zoom = true; 660 start_zoom = true;
634 } else if (bottom - y_panning_margin < point.y()) { 661 } else if (bottom - y_panning_margin < point.y()) {
635 // Panning down. 662 // Panning down.
636 y_diff = point.y() - (bottom - y_target_margin); 663 y_diff = point.y() - (bottom - y_target_margin);
637 start_zoom = true; 664 start_zoom = true;
638 } 665 }
639 y = top + y_diff; 666 int y = top + y_diff;
640 if (start_zoom && !is_on_animation_) { 667 if (start_zoom && !is_on_animation_) {
641 // No animation on panning. 668 // No animation on panning.
642 bool animate = false; 669 bool animate = false;
643 bool ret = RedrawDIP(gfx::Point(x, y), scale_, animate); 670 bool ret = RedrawDIP(gfx::Point(x, y), scale_, animate);
644 671
645 if (ret) { 672 if (ret) {
646 // If the magnified region is moved, hides the mouse cursor and moves it. 673 // If the magnified region is moved, hides the mouse cursor and moves it.
647 if (x_diff != 0 || y_diff != 0) 674 if (x_diff != 0 || y_diff != 0)
648 MoveCursorTo(root_window_->GetHost(), point); 675 MoveCursorTo(root_window_->GetHost(), point);
649 } 676 }
650 } 677 }
651 } 678 }
652 679
680 void MagnificationControllerImpl::MoveMaginifierWindowFollowRect(
681 const gfx::Rect& rect) {
682 DCHECK(root_window_);
683 bool start_zoom = false;
oshima 2014/12/12 00:48:45 shouldn't this be called "should_pan/should_scroll
jennyz 2014/12/12 23:14:44 Done.
684
685 const gfx::Rect window_rect = GetViewportRect();
oshima 2014/12/12 00:48:45 viewport_rect
jennyz 2014/12/12 23:14:45 Done.
686 const int left = window_rect.x();
687 const int right = window_rect.right();
688 const gfx::Point rect_center = rect.CenterPoint();
689 const gfx::Point window_center = window_rect.CenterPoint();
690
691 int x_diff = 0;
692 if (rect.x() < left || right < rect.right()) {
693 // Panning horizontally.
694 x_diff = rect_center.x() - window_center.x();
oshima 2014/12/12 00:48:45 I didn't fully understand why this is using center
jennyz 2014/12/12 23:14:44 For the non-editable control, we move the viewport
oshima 2014/12/12 23:23:43 ok, so x can just be rect_center.x() - window_rec
jennyz 2014/12/13 00:09:30 Done.
695 start_zoom = true;
696 }
697 int x = left + x_diff;
698
699 const int top = window_rect.y();
700 const int bottom = window_rect.bottom();
701
702 int y_diff = 0;
703 if (rect.y() < top || bottom < rect.bottom()) {
704 // Panning vertically.
705 y_diff = rect_center.y() - window_center.y();
oshima 2014/12/12 23:23:43 ditto
706 start_zoom = true;
707 }
708 int y = top + y_diff;
709
710 if (start_zoom && !is_on_animation_) {
oshima 2014/12/12 00:48:45 shouldn't we stop the current animation, and pan?
jennyz 2014/12/12 23:14:45 Done.
711 RedrawDIP(gfx::Point(x, y), scale_, false); // No animation on panning.
712 }
713 }
714
653 void MagnificationControllerImpl::OnCaretBoundsChanged( 715 void MagnificationControllerImpl::OnCaretBoundsChanged(
654 const ui::TextInputClient* client) { 716 const ui::TextInputClient* client) {
655 // caret bounds in screen coordinates. 717 // caret bounds in screen coordinates.
656 const gfx::Rect caret_bounds = client->GetCaretBounds(); 718 const gfx::Rect caret_bounds = client->GetCaretBounds();
657 // Note: OnCaretBoundsChanged could be fired OnTextInputTypeChanged during 719 // Note: OnCaretBoundsChanged could be fired OnTextInputTypeChanged during
658 // which the caret position is not set a meaning position, and we do not 720 // which the caret position is not set a meaning position, and we do not
659 // need to adjust the view port position based on the bogus caret position. 721 // need to adjust the view port position based on the bogus caret position.
660 // This is only a transition period, the caret position will be fixed upon 722 // This is only a transition period, the caret position will be fixed upon
661 // focusing right after. 723 // focusing right after.
662 if (caret_bounds.width() == 0 && caret_bounds.height() == 0) 724 if (caret_bounds.width() == 0 && caret_bounds.height() == 0)
663 return; 725 return;
664 726
665 gfx::Point caret_origin = caret_bounds.origin(); 727 gfx::Point caret_origin = caret_bounds.origin();
666 // caret_origin in |root_window_| coordinates. 728 // caret_origin in |root_window_| coordinates.
667 wm::ConvertPointFromScreen(root_window_, &caret_origin); 729 wm::ConvertPointFromScreen(root_window_, &caret_origin);
668 730
669 // Visible window_rect in |root_window_| coordinates. 731 // Visible window_rect in |root_window_| coordinates.
670 const gfx::Rect visible_window_rect = 732 const gfx::Rect visible_window_rect = GetViewportRect();
671 gfx::ToEnclosingRect(GetWindowRectDIP(scale_));
672 733
673 const int panning_margin = kCaretPanningMargin / scale_; 734 const int panning_margin = kCaretPanningMargin / scale_;
674 MoveMagnifierWindow(caret_origin, 735 MoveMagnifierWindowFollowPoint(caret_origin, panning_margin, panning_margin,
675 panning_margin, 736 visible_window_rect.width() / 2,
676 panning_margin, 737 visible_window_rect.height() / 2);
677 visible_window_rect.width() / 2,
678 visible_window_rect.height() / 2);
679 } 738 }
680 739
681 //////////////////////////////////////////////////////////////////////////////// 740 ////////////////////////////////////////////////////////////////////////////////
682 // MagnificationController: 741 // MagnificationController:
683 742
684 // static 743 // static
685 MagnificationController* MagnificationController::CreateInstance() { 744 MagnificationController* MagnificationController::CreateInstance() {
686 return new MagnificationControllerImpl(); 745 return new MagnificationControllerImpl();
687 } 746 }
688 747
689 } // namespace ash 748 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698