Commit a9591001 authored by Qiang Xu's avatar Qiang Xu Committed by Commit Bot

ash: make AccessibilityFocusRingController owned by Shell

Bug: None
Test: compiles & trybots
Change-Id: I29d5c39a018e6a2ddc0df3e123780f0bffd7aa99
Reviewed-on: https://chromium-review.googlesource.com/963650
Commit-Queue: Qiang Xu <warx@google.com>
Reviewed-by: default avatarJames Cook <jamescook@chromium.org>
Cr-Commit-Position: refs/heads/master@{#543519}
parent 5a15a8ca
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include "ash/accessibility/accessibility_cursor_ring_layer.h"
#include "ash/accessibility/accessibility_focus_ring_layer.h"
#include "ash/accessibility/accessibility_highlight_layer.h" #include "ash/accessibility/accessibility_highlight_layer.h"
#include "ash/accessibility/focus_ring_layer.h" #include "ash/accessibility/focus_ring_layer.h"
#include "base/logging.h" #include "base/logging.h"
...@@ -23,31 +25,31 @@ namespace { ...@@ -23,31 +25,31 @@ namespace {
// The number of pixels the focus ring is outset from the object it outlines, // The number of pixels the focus ring is outset from the object it outlines,
// which also determines the border radius of the rounded corners. // which also determines the border radius of the rounded corners.
// TODO(dmazzoni): take display resolution into account. // TODO(dmazzoni): take display resolution into account.
const int kAccessibilityFocusRingMargin = 7; constexpr int kAccessibilityFocusRingMargin = 7;
// Time to transition between one location and the next. // Time to transition between one location and the next.
const int kTransitionTimeMilliseconds = 300; constexpr int kTransitionTimeMilliseconds = 300;
// Focus constants. // Focus constants.
const int kFocusFadeInTimeMilliseconds = 100; constexpr int kFocusFadeInTimeMilliseconds = 100;
const int kFocusFadeOutTimeMilliseconds = 1600; constexpr int kFocusFadeOutTimeMilliseconds = 1600;
// Cursor constants. // Cursor constants.
const int kCursorFadeInTimeMilliseconds = 400; constexpr int kCursorFadeInTimeMilliseconds = 400;
const int kCursorFadeOutTimeMilliseconds = 1200; constexpr int kCursorFadeOutTimeMilliseconds = 1200;
const int kCursorRingColorRed = 255; constexpr int kCursorRingColorRed = 255;
const int kCursorRingColorGreen = 51; constexpr int kCursorRingColorGreen = 51;
const int kCursorRingColorBlue = 51; constexpr int kCursorRingColorBlue = 51;
// Caret constants. // Caret constants.
const int kCaretFadeInTimeMilliseconds = 100; constexpr int kCaretFadeInTimeMilliseconds = 100;
const int kCaretFadeOutTimeMilliseconds = 1600; constexpr int kCaretFadeOutTimeMilliseconds = 1600;
const int kCaretRingColorRed = 51; constexpr int kCaretRingColorRed = 51;
const int kCaretRingColorGreen = 51; constexpr int kCaretRingColorGreen = 51;
const int kCaretRingColorBlue = 255; constexpr int kCaretRingColorBlue = 255;
// Highlight constants. // Highlight constants.
const float kHighlightOpacity = 0.3f; constexpr float kHighlightOpacity = 0.3f;
// A Region is an unordered collection of Rects that maintains its // A Region is an unordered collection of Rects that maintains its
// bounding box. Used in the middle of an algorithm that groups // bounding box. Used in the middle of an algorithm that groups
...@@ -63,12 +65,6 @@ struct Region { ...@@ -63,12 +65,6 @@ struct Region {
} // namespace } // namespace
// static
AccessibilityFocusRingController*
AccessibilityFocusRingController::GetInstance() {
return base::Singleton<AccessibilityFocusRingController>::get();
}
AccessibilityFocusRingController::AccessibilityFocusRingController() AccessibilityFocusRingController::AccessibilityFocusRingController()
: binding_(this) { : binding_(this) {
focus_animation_info_.fade_in_time = focus_animation_info_.fade_in_time =
......
...@@ -8,14 +8,12 @@ ...@@ -8,14 +8,12 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
#include "ash/accessibility/accessibility_cursor_ring_layer.h" #include "ash/accessibility/accessibility_focus_ring.h"
#include "ash/accessibility/accessibility_focus_ring_layer.h" #include "ash/accessibility/accessibility_layer.h"
#include "ash/accessibility/accessibility_highlight_layer.h"
#include "ash/ash_export.h" #include "ash/ash_export.h"
#include "ash/public/interfaces/accessibility_focus_ring_controller.mojom.h" #include "ash/public/interfaces/accessibility_focus_ring_controller.mojom.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/singleton.h"
#include "base/optional.h" #include "base/optional.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
...@@ -24,14 +22,18 @@ ...@@ -24,14 +22,18 @@
namespace ash { namespace ash {
class AccessibilityCursorRingLayer;
class AccessibilityFocusRingLayer;
class AccessibilityHighlightLayer;
// AccessibilityFocusRingController handles drawing custom rings around // AccessibilityFocusRingController handles drawing custom rings around
// the focused object, cursor, and/or caret for accessibility. // the focused object, cursor, and/or caret for accessibility.
class ASH_EXPORT AccessibilityFocusRingController class ASH_EXPORT AccessibilityFocusRingController
: public AccessibilityLayerDelegate, : public AccessibilityLayerDelegate,
public mojom::AccessibilityFocusRingController { public mojom::AccessibilityFocusRingController {
public: public:
// Get the single instance of this class. AccessibilityFocusRingController();
static AccessibilityFocusRingController* GetInstance(); ~AccessibilityFocusRingController() override;
// Binds the mojom::AccessibilityFocusRingController interface to this object. // Binds the mojom::AccessibilityFocusRingController interface to this object.
void BindRequest(mojom::AccessibilityFocusRingControllerRequest request); void BindRequest(mojom::AccessibilityFocusRingControllerRequest request);
...@@ -68,14 +70,8 @@ class ASH_EXPORT AccessibilityFocusRingController ...@@ -68,14 +70,8 @@ class ASH_EXPORT AccessibilityFocusRingController
focus_ring_layers_for_testing() { focus_ring_layers_for_testing() {
return focus_layers_; return focus_layers_;
} }
AccessibilityHighlightLayer* highlight_layer_for_testing() {
return highlight_layer_.get();
}
protected: protected:
AccessibilityFocusRingController();
~AccessibilityFocusRingController() override;
// Given an unordered vector of bounding rectangles that cover everything // Given an unordered vector of bounding rectangles that cover everything
// that currently has focus, populate a vector of one or more // that currently has focus, populate a vector of one or more
// AccessibilityFocusRings that surround the rectangles. Adjacent or // AccessibilityFocusRings that surround the rectangles. Adjacent or
...@@ -151,8 +147,6 @@ class ASH_EXPORT AccessibilityFocusRingController ...@@ -151,8 +147,6 @@ class ASH_EXPORT AccessibilityFocusRingController
SkColor highlight_color_ = SK_ColorBLACK; SkColor highlight_color_ = SK_ColorBLACK;
float highlight_opacity_ = 0.f; float highlight_opacity_ = 0.f;
friend struct base::DefaultSingletonTraits<AccessibilityFocusRingController>;
DISALLOW_COPY_AND_ASSIGN(AccessibilityFocusRingController); DISALLOW_COPY_AND_ASSIGN(AccessibilityFocusRingController);
}; };
......
...@@ -148,7 +148,7 @@ TEST_F(AccessibilityFocusRingControllerTest, CursorWorksOnMultipleDisplays) { ...@@ -148,7 +148,7 @@ TEST_F(AccessibilityFocusRingControllerTest, CursorWorksOnMultipleDisplays) {
// Simulate a mouse event on the primary display. // Simulate a mouse event on the primary display.
AccessibilityFocusRingController* controller = AccessibilityFocusRingController* controller =
AccessibilityFocusRingController::GetInstance(); Shell::Get()->accessibility_focus_ring_controller();
gfx::Point location(90, 90); gfx::Point location(90, 90);
controller->SetCursorRing(location); controller->SetCursorRing(location);
AccessibilityCursorRingLayer* cursor_layer = AccessibilityCursorRingLayer* cursor_layer =
......
...@@ -42,10 +42,12 @@ AccessibilityHighlightController::AccessibilityHighlightController() { ...@@ -42,10 +42,12 @@ AccessibilityHighlightController::AccessibilityHighlightController() {
} }
AccessibilityHighlightController::~AccessibilityHighlightController() { AccessibilityHighlightController::~AccessibilityHighlightController() {
AccessibilityFocusRingController::GetInstance()->SetFocusRing( AccessibilityFocusRingController* controller =
std::vector<gfx::Rect>(), mojom::FocusRingBehavior::FADE_OUT_FOCUS_RING); Shell::Get()->accessibility_focus_ring_controller();
AccessibilityFocusRingController::GetInstance()->HideCaretRing(); controller->SetFocusRing(std::vector<gfx::Rect>(),
AccessibilityFocusRingController::GetInstance()->HideCursorRing(); mojom::FocusRingBehavior::FADE_OUT_FOCUS_RING);
controller->HideCaretRing();
controller->HideCursorRing();
aura::Window* root_window = Shell::GetPrimaryRootWindow(); aura::Window* root_window = Shell::GetPrimaryRootWindow();
ui::InputMethod* input_method = GetInputMethod(root_window); ui::InputMethod* input_method = GetInputMethod(root_window);
...@@ -141,7 +143,8 @@ bool AccessibilityHighlightController::IsCaretVisible( ...@@ -141,7 +143,8 @@ bool AccessibilityHighlightController::IsCaretVisible(
} }
void AccessibilityHighlightController::UpdateFocusAndCaretHighlights() { void AccessibilityHighlightController::UpdateFocusAndCaretHighlights() {
auto* controller = AccessibilityFocusRingController::GetInstance(); AccessibilityFocusRingController* controller =
Shell::Get()->accessibility_focus_ring_controller();
// The caret highlight takes precedence over the focus highlight if // The caret highlight takes precedence over the focus highlight if
// both are visible. // both are visible.
...@@ -164,12 +167,12 @@ void AccessibilityHighlightController::UpdateFocusAndCaretHighlights() { ...@@ -164,12 +167,12 @@ void AccessibilityHighlightController::UpdateFocusAndCaretHighlights() {
} }
void AccessibilityHighlightController::UpdateCursorHighlight() { void AccessibilityHighlightController::UpdateCursorHighlight() {
if (cursor_ && IsCursorVisible()) { AccessibilityFocusRingController* controller =
AccessibilityFocusRingController::GetInstance()->SetCursorRing( Shell::Get()->accessibility_focus_ring_controller();
cursor_point_); if (cursor_ && IsCursorVisible())
} else { controller->SetCursorRing(cursor_point_);
AccessibilityFocusRingController::GetInstance()->HideCursorRing(); else
} controller->HideCursorRing();
} }
} // namespace ash } // namespace ash
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "ash/accessibility/accessibility_highlight_controller.h" #include "ash/accessibility/accessibility_highlight_controller.h"
#include <cmath> #include <cmath>
#include <memory>
#include "ash/accessibility/accessibility_cursor_ring_layer.h" #include "ash/accessibility/accessibility_cursor_ring_layer.h"
#include "ash/accessibility/accessibility_focus_ring_controller.h" #include "ash/accessibility/accessibility_focus_ring_controller.h"
...@@ -72,7 +73,7 @@ class AccessibilityHighlightControllerTest : public AshTestBase { ...@@ -72,7 +73,7 @@ class AccessibilityHighlightControllerTest : public AshTestBase {
base::CommandLine::ForCurrentProcess()->AppendSwitch( base::CommandLine::ForCurrentProcess()->AppendSwitch(
::switches::kEnablePixelOutputInTests); ::switches::kEnablePixelOutputInTests);
AshTestBase::SetUp(); AshTestBase::SetUp();
AccessibilityFocusRingController::GetInstance()->SetNoFadeForTesting(); Shell::Get()->accessibility_focus_ring_controller()->SetNoFadeForTesting();
} }
void CaptureBeforeImage(const gfx::Rect& bounds) { void CaptureBeforeImage(const gfx::Rect& bounds) {
...@@ -226,7 +227,8 @@ TEST_F(AccessibilityHighlightControllerTest, CursorWorksOnMultipleDisplays) { ...@@ -226,7 +227,8 @@ TEST_F(AccessibilityHighlightControllerTest, CursorWorksOnMultipleDisplays) {
event_mod.set_target(root_windows[0]); event_mod.set_target(root_windows[0]);
highlight_controller.OnMouseEvent(&event0); highlight_controller.OnMouseEvent(&event0);
auto* focus_ring_controller = AccessibilityFocusRingController::GetInstance(); AccessibilityFocusRingController* focus_ring_controller =
Shell::Get()->accessibility_focus_ring_controller();
auto* cursor_layer = focus_ring_controller->cursor_layer_for_testing(); auto* cursor_layer = focus_ring_controller->cursor_layer_for_testing();
EXPECT_EQ(root_windows[0], cursor_layer->root_window()); EXPECT_EQ(root_windows[0], cursor_layer->root_window());
EXPECT_LT( EXPECT_LT(
...@@ -267,7 +269,8 @@ TEST_F(AccessibilityHighlightControllerTest, CaretRingDrawnOnlyWithinBounds) { ...@@ -267,7 +269,8 @@ TEST_F(AccessibilityHighlightControllerTest, CaretRingDrawnOnlyWithinBounds) {
text_input_client.SetCaretBounds(caret_bounds); text_input_client.SetCaretBounds(caret_bounds);
highlight_controller.OnCaretBoundsChanged(&text_input_client); highlight_controller.OnCaretBoundsChanged(&text_input_client);
auto* focus_ring_controller = AccessibilityFocusRingController::GetInstance(); AccessibilityFocusRingController* focus_ring_controller =
Shell::Get()->accessibility_focus_ring_controller();
auto* caret_layer = focus_ring_controller->caret_layer_for_testing(); auto* caret_layer = focus_ring_controller->caret_layer_for_testing();
EXPECT_EQ( EXPECT_EQ(
std::abs(caret_layer->layer()->GetTargetBounds().x() - caret_bounds.x()), std::abs(caret_layer->layer()->GetTargetBounds().x() - caret_bounds.x()),
......
...@@ -212,7 +212,7 @@ void TouchExplorationManager::UpdateTouchExplorationState() { ...@@ -212,7 +212,7 @@ void TouchExplorationManager::UpdateTouchExplorationState() {
touch_exploration_controller_->SetExcludeBounds(work_area); touch_exploration_controller_->SetExcludeBounds(work_area);
SilenceSpokenFeedback(); SilenceSpokenFeedback();
// Clear the focus highlight. // Clear the focus highlight.
AccessibilityFocusRingController::GetInstance()->SetFocusRing( Shell::Get()->accessibility_focus_ring_controller()->SetFocusRing(
std::vector<gfx::Rect>(), std::vector<gfx::Rect>(),
mojom::FocusRingBehavior::PERSIST_FOCUS_RING); mojom::FocusRingBehavior::PERSIST_FOCUS_RING);
} else { } else {
......
...@@ -60,7 +60,7 @@ void BindAccessibilityControllerRequestOnMainThread( ...@@ -60,7 +60,7 @@ void BindAccessibilityControllerRequestOnMainThread(
void BindAccessibilityFocusRingControllerRequestOnMainThread( void BindAccessibilityFocusRingControllerRequestOnMainThread(
mojom::AccessibilityFocusRingControllerRequest request) { mojom::AccessibilityFocusRingControllerRequest request) {
AccessibilityFocusRingController::GetInstance()->BindRequest( Shell::Get()->accessibility_focus_ring_controller()->BindRequest(
std::move(request)); std::move(request));
} }
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "ash/accelerators/spoken_feedback_toggler.h" #include "ash/accelerators/spoken_feedback_toggler.h"
#include "ash/accessibility/accessibility_controller.h" #include "ash/accessibility/accessibility_controller.h"
#include "ash/accessibility/accessibility_delegate.h" #include "ash/accessibility/accessibility_delegate.h"
#include "ash/accessibility/accessibility_focus_ring_controller.h"
#include "ash/app_list/app_list_controller_impl.h" #include "ash/app_list/app_list_controller_impl.h"
#include "ash/ash_constants.h" #include "ash/ash_constants.h"
#include "ash/autoclick/autoclick_controller.h" #include "ash/autoclick/autoclick_controller.h"
...@@ -808,6 +809,7 @@ Shell::~Shell() { ...@@ -808,6 +809,7 @@ Shell::~Shell() {
wallpaper_controller_.reset(); wallpaper_controller_.reset();
accessibility_controller_.reset(); accessibility_controller_.reset();
accessibility_delegate_.reset(); accessibility_delegate_.reset();
accessibility_focus_ring_controller_.reset();
// Balances the Install() in Initialize(). // Balances the Install() in Initialize().
views::FocusManagerFactory::Install(nullptr); views::FocusManagerFactory::Install(nullptr);
...@@ -914,6 +916,8 @@ void Shell::Init(ui::ContextFactory* context_factory, ...@@ -914,6 +916,8 @@ void Shell::Init(ui::ContextFactory* context_factory,
// Some delegates access ShellPort during their construction. Create them here // Some delegates access ShellPort during their construction. Create them here
// instead of the ShellPort constructor. // instead of the ShellPort constructor.
accessibility_focus_ring_controller_ =
std::make_unique<AccessibilityFocusRingController>();
accessibility_delegate_.reset(shell_delegate_->CreateAccessibilityDelegate()); accessibility_delegate_.reset(shell_delegate_->CreateAccessibilityDelegate());
accessibility_controller_ = std::make_unique<AccessibilityController>( accessibility_controller_ = std::make_unique<AccessibilityController>(
shell_delegate_->GetShellConnector()); shell_delegate_->GetShellConnector());
......
...@@ -77,6 +77,7 @@ namespace ash { ...@@ -77,6 +77,7 @@ namespace ash {
class AcceleratorController; class AcceleratorController;
class AccessibilityController; class AccessibilityController;
class AccessibilityDelegate; class AccessibilityDelegate;
class AccessibilityFocusRingController;
class AshDisplayController; class AshDisplayController;
class AppListControllerImpl; class AppListControllerImpl;
class NativeCursorManagerAsh; class NativeCursorManagerAsh;
...@@ -307,6 +308,9 @@ class ASH_EXPORT Shell : public SessionObserver, ...@@ -307,6 +308,9 @@ class ASH_EXPORT Shell : public SessionObserver,
AccessibilityDelegate* accessibility_delegate() { AccessibilityDelegate* accessibility_delegate() {
return accessibility_delegate_.get(); return accessibility_delegate_.get();
} }
AccessibilityFocusRingController* accessibility_focus_ring_controller() {
return accessibility_focus_ring_controller_.get();
}
::wm::ActivationClient* activation_client(); ::wm::ActivationClient* activation_client();
AppListControllerImpl* app_list_controller() { AppListControllerImpl* app_list_controller() {
return app_list_controller_.get(); return app_list_controller_.get();
...@@ -659,6 +663,8 @@ class ASH_EXPORT Shell : public SessionObserver, ...@@ -659,6 +663,8 @@ class ASH_EXPORT Shell : public SessionObserver,
std::unique_ptr<AcceleratorController> accelerator_controller_; std::unique_ptr<AcceleratorController> accelerator_controller_;
std::unique_ptr<AccessibilityController> accessibility_controller_; std::unique_ptr<AccessibilityController> accessibility_controller_;
std::unique_ptr<AccessibilityDelegate> accessibility_delegate_; std::unique_ptr<AccessibilityDelegate> accessibility_delegate_;
std::unique_ptr<AccessibilityFocusRingController>
accessibility_focus_ring_controller_;
std::unique_ptr<AppListControllerImpl> app_list_controller_; std::unique_ptr<AppListControllerImpl> app_list_controller_;
std::unique_ptr<AshDisplayController> ash_display_controller_; std::unique_ptr<AshDisplayController> ash_display_controller_;
std::unique_ptr<BacklightsForcedOffSetter> backlights_forced_off_setter_; std::unique_ptr<BacklightsForcedOffSetter> backlights_forced_off_setter_;
......
...@@ -196,7 +196,7 @@ IN_PROC_BROWSER_TEST_F(SelectToSpeakTest, FocusRingMovesWithMouse) { ...@@ -196,7 +196,7 @@ IN_PROC_BROWSER_TEST_F(SelectToSpeakTest, FocusRingMovesWithMouse) {
chromeos::AccessibilityManager::Get()->SetFocusRingObserverForTest(callback); chromeos::AccessibilityManager::Get()->SetFocusRingObserverForTest(callback);
ash::AccessibilityFocusRingController* controller = ash::AccessibilityFocusRingController* controller =
ash::AccessibilityFocusRingController::GetInstance(); ash::Shell::Get()->accessibility_focus_ring_controller();
std::vector<std::unique_ptr<ash::AccessibilityFocusRingLayer>> const& std::vector<std::unique_ptr<ash::AccessibilityFocusRingLayer>> const&
focus_rings = controller->focus_ring_layers_for_testing(); focus_rings = controller->focus_ring_layers_for_testing();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment