Commit 56a75817 authored by Qiang Xu's avatar Qiang Xu Committed by Commit Bot

mash: create AccessibilityFocusRingController mojo interface

changes:
Declare methods in AccessibilityFocusRingController that chrome needs
in mojo interface.

Bug: 594887
Change-Id: I5d8b47eb91301e848e2a2d3d13ad60b946db8a65
Reviewed-on: https://chromium-review.googlesource.com/957524
Commit-Queue: Qiang Xu <warx@google.com>
Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Reviewed-by: default avatarJames Cook <jamescook@chromium.org>
Cr-Commit-Position: refs/heads/master@{#543254}
parent a504f941
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <algorithm> #include <algorithm>
#include <memory> #include <memory>
#include <set> #include <set>
#include <utility>
#include <vector> #include <vector>
#include "ash/accessibility/accessibility_highlight_layer.h" #include "ash/accessibility/accessibility_highlight_layer.h"
...@@ -68,7 +69,8 @@ AccessibilityFocusRingController::GetInstance() { ...@@ -68,7 +69,8 @@ AccessibilityFocusRingController::GetInstance() {
return base::Singleton<AccessibilityFocusRingController>::get(); return base::Singleton<AccessibilityFocusRingController>::get();
} }
AccessibilityFocusRingController::AccessibilityFocusRingController() { AccessibilityFocusRingController::AccessibilityFocusRingController()
: binding_(this) {
focus_animation_info_.fade_in_time = focus_animation_info_.fade_in_time =
base::TimeDelta::FromMilliseconds(kFocusFadeInTimeMilliseconds); base::TimeDelta::FromMilliseconds(kFocusFadeInTimeMilliseconds);
focus_animation_info_.fade_out_time = focus_animation_info_.fade_out_time =
...@@ -85,6 +87,11 @@ AccessibilityFocusRingController::AccessibilityFocusRingController() { ...@@ -85,6 +87,11 @@ AccessibilityFocusRingController::AccessibilityFocusRingController() {
AccessibilityFocusRingController::~AccessibilityFocusRingController() = default; AccessibilityFocusRingController::~AccessibilityFocusRingController() = default;
void AccessibilityFocusRingController::BindRequest(
mojom::AccessibilityFocusRingControllerRequest request) {
binding_.Bind(std::move(request));
}
void AccessibilityFocusRingController::SetFocusRingColor(SkColor color) { void AccessibilityFocusRingController::SetFocusRingColor(SkColor color) {
focus_ring_color_ = color; focus_ring_color_ = color;
UpdateFocusRingsFromFocusRects(); UpdateFocusRingsFromFocusRects();
...@@ -97,7 +104,7 @@ void AccessibilityFocusRingController::ResetFocusRingColor() { ...@@ -97,7 +104,7 @@ void AccessibilityFocusRingController::ResetFocusRingColor() {
void AccessibilityFocusRingController::SetFocusRing( void AccessibilityFocusRingController::SetFocusRing(
const std::vector<gfx::Rect>& rects, const std::vector<gfx::Rect>& rects,
AccessibilityFocusRingController::FocusRingBehavior focus_ring_behavior) { mojom::FocusRingBehavior focus_ring_behavior) {
std::vector<gfx::Rect> clean_rects(rects); std::vector<gfx::Rect> clean_rects(rects);
// Remove duplicates // Remove duplicates
if (rects.size() > 1) { if (rects.size() > 1) {
...@@ -112,15 +119,25 @@ void AccessibilityFocusRingController::SetFocusRing( ...@@ -112,15 +119,25 @@ void AccessibilityFocusRingController::SetFocusRing(
OnLayerChange(&focus_animation_info_); OnLayerChange(&focus_animation_info_);
focus_rects_ = clean_rects; focus_rects_ = clean_rects;
UpdateFocusRingsFromFocusRects(); UpdateFocusRingsFromFocusRects();
if (focus_ring_observer_for_testing_)
focus_ring_observer_for_testing_.Run();
} }
void AccessibilityFocusRingController::HideFocusRing() { void AccessibilityFocusRingController::HideFocusRing() {
focus_rects_.clear(); focus_rects_.clear();
UpdateFocusRingsFromFocusRects(); UpdateFocusRingsFromFocusRects();
if (focus_ring_observer_for_testing_) }
focus_ring_observer_for_testing_.Run();
void AccessibilityFocusRingController::SetHighlights(
const std::vector<gfx::Rect>& rects,
SkColor color) {
highlight_rects_ = rects;
GetColorAndOpacityFromColor(color, kHighlightOpacity, &highlight_color_,
&highlight_opacity_);
UpdateHighlightFromHighlightRects();
}
void AccessibilityFocusRingController::HideHighlights() {
highlight_rects_.clear();
UpdateHighlightFromHighlightRects();
} }
void AccessibilityFocusRingController::UpdateFocusRingsFromFocusRects() { void AccessibilityFocusRingController::UpdateFocusRingsFromFocusRects() {
...@@ -136,7 +153,7 @@ void AccessibilityFocusRingController::UpdateFocusRingsFromFocusRects() { ...@@ -136,7 +153,7 @@ void AccessibilityFocusRingController::UpdateFocusRingsFromFocusRects() {
focus_layers_[i] = std::make_unique<AccessibilityFocusRingLayer>(this); focus_layers_[i] = std::make_unique<AccessibilityFocusRingLayer>(this);
} }
if (focus_ring_behavior_ == PERSIST_FOCUS_RING && if (focus_ring_behavior_ == mojom::FocusRingBehavior::PERSIST_FOCUS_RING &&
focus_layers_[0]->CanAnimate()) { focus_layers_[0]->CanAnimate()) {
// In PERSIST mode, animate the first ring to its destination // In PERSIST mode, animate the first ring to its destination
// location, then set the rest of the rings directly. // location, then set the rest of the rings directly.
...@@ -203,20 +220,6 @@ void AccessibilityFocusRingController::HideCaretRing() { ...@@ -203,20 +220,6 @@ void AccessibilityFocusRingController::HideCaretRing() {
caret_layer_.reset(); caret_layer_.reset();
} }
void AccessibilityFocusRingController::SetHighlights(
const std::vector<gfx::Rect>& rects,
SkColor color) {
highlight_rects_ = rects;
GetColorAndOpacityFromColor(color, kHighlightOpacity, &highlight_color_,
&highlight_opacity_);
UpdateHighlightFromHighlightRects();
}
void AccessibilityFocusRingController::HideHighlights() {
highlight_rects_.clear();
UpdateHighlightFromHighlightRects();
}
void AccessibilityFocusRingController::SetNoFadeForTesting() { void AccessibilityFocusRingController::SetNoFadeForTesting() {
focus_animation_info_.fade_in_time = base::TimeDelta(); focus_animation_info_.fade_in_time = base::TimeDelta();
focus_animation_info_.fade_out_time = base::TimeDelta::FromHours(1); focus_animation_info_.fade_out_time = base::TimeDelta::FromHours(1);
...@@ -455,7 +458,7 @@ void AccessibilityFocusRingController::AnimateFocusRings( ...@@ -455,7 +458,7 @@ void AccessibilityFocusRingController::AnimateFocusRings(
if (timestamp < focus_animation_info_.change_time) if (timestamp < focus_animation_info_.change_time)
timestamp = focus_animation_info_.change_time; timestamp = focus_animation_info_.change_time;
if (focus_ring_behavior_ == PERSIST_FOCUS_RING) { if (focus_ring_behavior_ == mojom::FocusRingBehavior::PERSIST_FOCUS_RING) {
base::TimeDelta delta = timestamp - focus_animation_info_.change_time; base::TimeDelta delta = timestamp - focus_animation_info_.change_time;
base::TimeDelta transition_time = base::TimeDelta transition_time =
base::TimeDelta::FromMilliseconds(kTransitionTimeMilliseconds); base::TimeDelta::FromMilliseconds(kTransitionTimeMilliseconds);
......
...@@ -12,11 +12,13 @@ ...@@ -12,11 +12,13 @@
#include "ash/accessibility/accessibility_focus_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/ash_export.h" #include "ash/ash_export.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/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 "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect.h"
...@@ -24,25 +26,25 @@ namespace ash { ...@@ -24,25 +26,25 @@ namespace ash {
// 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.
// TODO(mash): Provide mojo API for access from chrome.
class ASH_EXPORT AccessibilityFocusRingController class ASH_EXPORT AccessibilityFocusRingController
: public AccessibilityLayerDelegate { : public AccessibilityLayerDelegate,
public mojom::AccessibilityFocusRingController {
public: public:
// Get the single instance of this class. // Get the single instance of this class.
static AccessibilityFocusRingController* GetInstance(); static AccessibilityFocusRingController* GetInstance();
enum FocusRingBehavior { FADE_OUT_FOCUS_RING, PERSIST_FOCUS_RING }; // Binds the mojom::AccessibilityFocusRingController interface to this object.
void BindRequest(mojom::AccessibilityFocusRingControllerRequest request);
// Set the focus ring color, or reset it back to the default. // mojom::AccessibilityFocusRingController overrides:
void SetFocusRingColor(SkColor color); void SetFocusRingColor(SkColor color) override;
void ResetFocusRingColor(); void ResetFocusRingColor() override;
// Draw a focus ring around the given set of rects, in global screen
// coordinates. Use |focus_ring_behavior| to specify whether the focus
// ring should persist or fade out.
void SetFocusRing(const std::vector<gfx::Rect>& rects, void SetFocusRing(const std::vector<gfx::Rect>& rects,
FocusRingBehavior focus_ring_behavior); mojom::FocusRingBehavior focus_ring_behavior) override;
void HideFocusRing(); void HideFocusRing() override;
void SetHighlights(const std::vector<gfx::Rect>& rects,
SkColor color) override;
void HideHighlights() override;
// Draw a ring around the mouse cursor. It fades out automatically. // Draw a ring around the mouse cursor. It fades out automatically.
void SetCursorRing(const gfx::Point& location); void SetCursorRing(const gfx::Point& location);
...@@ -52,13 +54,6 @@ class ASH_EXPORT AccessibilityFocusRingController ...@@ -52,13 +54,6 @@ class ASH_EXPORT AccessibilityFocusRingController
void SetCaretRing(const gfx::Point& location); void SetCaretRing(const gfx::Point& location);
void HideCaretRing(); void HideCaretRing();
// Draw a highlight at the given rects, in global screen coordinates.
// Rects may be overlapping and will be merged into one layer.
// This looks similar to selecting a region with the cursor, except
// it is drawn in the foreground rather than behind a text layer.
void SetHighlights(const std::vector<gfx::Rect>& rects, SkColor color);
void HideHighlights();
// Don't fade in / out, for testing. // Don't fade in / out, for testing.
void SetNoFadeForTesting(); void SetNoFadeForTesting();
...@@ -77,12 +72,6 @@ class ASH_EXPORT AccessibilityFocusRingController ...@@ -77,12 +72,6 @@ class ASH_EXPORT AccessibilityFocusRingController
return highlight_layer_.get(); return highlight_layer_.get();
} }
// Sets an observer of focus ring layer changes.
void set_focus_ring_observer_for_testing(
base::RepeatingCallback<void()> observer) {
focus_ring_observer_for_testing_ = observer;
}
protected: protected:
AccessibilityFocusRingController(); AccessibilityFocusRingController();
~AccessibilityFocusRingController() override; ~AccessibilityFocusRingController() override;
...@@ -137,12 +126,16 @@ class ASH_EXPORT AccessibilityFocusRingController ...@@ -137,12 +126,16 @@ class ASH_EXPORT AccessibilityFocusRingController
void ComputeOpacity(LayerAnimationInfo* animation_info, void ComputeOpacity(LayerAnimationInfo* animation_info,
base::TimeTicks timestamp); base::TimeTicks timestamp);
// Binding for mojom::AccessibilityFocusRingController interface.
mojo::Binding<mojom::AccessibilityFocusRingController> binding_;
LayerAnimationInfo focus_animation_info_; LayerAnimationInfo focus_animation_info_;
std::vector<gfx::Rect> focus_rects_; std::vector<gfx::Rect> focus_rects_;
std::vector<AccessibilityFocusRing> previous_focus_rings_; std::vector<AccessibilityFocusRing> previous_focus_rings_;
std::vector<AccessibilityFocusRing> focus_rings_; std::vector<AccessibilityFocusRing> focus_rings_;
std::vector<std::unique_ptr<AccessibilityFocusRingLayer>> focus_layers_; std::vector<std::unique_ptr<AccessibilityFocusRingLayer>> focus_layers_;
FocusRingBehavior focus_ring_behavior_ = FADE_OUT_FOCUS_RING; mojom::FocusRingBehavior focus_ring_behavior_ =
mojom::FocusRingBehavior::FADE_OUT_FOCUS_RING;
base::Optional<SkColor> focus_ring_color_; base::Optional<SkColor> focus_ring_color_;
LayerAnimationInfo cursor_animation_info_; LayerAnimationInfo cursor_animation_info_;
...@@ -160,8 +153,6 @@ class ASH_EXPORT AccessibilityFocusRingController ...@@ -160,8 +153,6 @@ class ASH_EXPORT AccessibilityFocusRingController
friend struct base::DefaultSingletonTraits<AccessibilityFocusRingController>; friend struct base::DefaultSingletonTraits<AccessibilityFocusRingController>;
base::RepeatingCallback<void()> focus_ring_observer_for_testing_;
DISALLOW_COPY_AND_ASSIGN(AccessibilityFocusRingController); DISALLOW_COPY_AND_ASSIGN(AccessibilityFocusRingController);
}; };
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "ash/accessibility/accessibility_focus_ring_controller.h" #include "ash/accessibility/accessibility_focus_ring_controller.h"
#include "ash/public/cpp/config.h" #include "ash/public/cpp/config.h"
#include "ash/public/interfaces/accessibility_focus_ring_controller.mojom.h"
#include "ash/shell.h" #include "ash/shell.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
#include "ui/aura/window_tree_host.h" #include "ui/aura/window_tree_host.h"
...@@ -42,8 +43,7 @@ AccessibilityHighlightController::AccessibilityHighlightController() { ...@@ -42,8 +43,7 @@ AccessibilityHighlightController::AccessibilityHighlightController() {
AccessibilityHighlightController::~AccessibilityHighlightController() { AccessibilityHighlightController::~AccessibilityHighlightController() {
AccessibilityFocusRingController::GetInstance()->SetFocusRing( AccessibilityFocusRingController::GetInstance()->SetFocusRing(
std::vector<gfx::Rect>(), std::vector<gfx::Rect>(), mojom::FocusRingBehavior::FADE_OUT_FOCUS_RING);
AccessibilityFocusRingController::FADE_OUT_FOCUS_RING);
AccessibilityFocusRingController::GetInstance()->HideCaretRing(); AccessibilityFocusRingController::GetInstance()->HideCaretRing();
AccessibilityFocusRingController::GetInstance()->HideCursorRing(); AccessibilityFocusRingController::GetInstance()->HideCursorRing();
...@@ -147,21 +147,19 @@ void AccessibilityHighlightController::UpdateFocusAndCaretHighlights() { ...@@ -147,21 +147,19 @@ void AccessibilityHighlightController::UpdateFocusAndCaretHighlights() {
// both are visible. // both are visible.
if (caret_ && caret_visible_) { if (caret_ && caret_visible_) {
controller->SetCaretRing(caret_point_); controller->SetCaretRing(caret_point_);
controller->SetFocusRing( controller->SetFocusRing(std::vector<gfx::Rect>(),
std::vector<gfx::Rect>(), mojom::FocusRingBehavior::FADE_OUT_FOCUS_RING);
AccessibilityFocusRingController::FADE_OUT_FOCUS_RING);
} else if (focus_) { } else if (focus_) {
controller->HideCaretRing(); controller->HideCaretRing();
std::vector<gfx::Rect> rects; std::vector<gfx::Rect> rects;
if (!focus_rect_.IsEmpty()) if (!focus_rect_.IsEmpty())
rects.push_back(focus_rect_); rects.push_back(focus_rect_);
controller->SetFocusRing( controller->SetFocusRing(rects,
rects, AccessibilityFocusRingController::FADE_OUT_FOCUS_RING); mojom::FocusRingBehavior::FADE_OUT_FOCUS_RING);
} else { } else {
controller->HideCaretRing(); controller->HideCaretRing();
controller->SetFocusRing( controller->SetFocusRing(std::vector<gfx::Rect>(),
std::vector<gfx::Rect>(), mojom::FocusRingBehavior::FADE_OUT_FOCUS_RING);
AccessibilityFocusRingController::FADE_OUT_FOCUS_RING);
} }
} }
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "ash/accessibility/touch_exploration_controller.h" #include "ash/accessibility/touch_exploration_controller.h"
#include "ash/keyboard/keyboard_observer_register.h" #include "ash/keyboard/keyboard_observer_register.h"
#include "ash/public/cpp/app_types.h" #include "ash/public/cpp/app_types.h"
#include "ash/public/interfaces/accessibility_focus_ring_controller.mojom.h"
#include "ash/root_window_controller.h" #include "ash/root_window_controller.h"
#include "ash/shell.h" #include "ash/shell.h"
#include "ash/wm/window_util.h" #include "ash/wm/window_util.h"
...@@ -213,7 +214,7 @@ void TouchExplorationManager::UpdateTouchExplorationState() { ...@@ -213,7 +214,7 @@ void TouchExplorationManager::UpdateTouchExplorationState() {
// Clear the focus highlight. // Clear the focus highlight.
AccessibilityFocusRingController::GetInstance()->SetFocusRing( AccessibilityFocusRingController::GetInstance()->SetFocusRing(
std::vector<gfx::Rect>(), std::vector<gfx::Rect>(),
AccessibilityFocusRingController::PERSIST_FOCUS_RING); mojom::FocusRingBehavior::PERSIST_FOCUS_RING);
} else { } else {
touch_exploration_controller_->SetExcludeBounds(gfx::Rect()); touch_exploration_controller_->SetExcludeBounds(gfx::Rect());
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
"app_list::mojom::AppList", "app_list::mojom::AppList",
"ash::mojom::AcceleratorController", "ash::mojom::AcceleratorController",
"ash::mojom::AccessibilityController", "ash::mojom::AccessibilityController",
"ash::mojom::AccessibilityFocusRingController",
"ash::mojom::AppListController", "ash::mojom::AppListController",
"ash::mojom::AshMessageCenterController", "ash::mojom::AshMessageCenterController",
"ash::mojom::CastConfig", "ash::mojom::CastConfig",
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "ash/accelerators/accelerator_controller.h" #include "ash/accelerators/accelerator_controller.h"
#include "ash/accessibility/accessibility_controller.h" #include "ash/accessibility/accessibility_controller.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/cast_config_controller.h" #include "ash/cast_config_controller.h"
#include "ash/display/ash_display_controller.h" #include "ash/display/ash_display_controller.h"
...@@ -57,6 +58,12 @@ void BindAccessibilityControllerRequestOnMainThread( ...@@ -57,6 +58,12 @@ void BindAccessibilityControllerRequestOnMainThread(
Shell::Get()->accessibility_controller()->BindRequest(std::move(request)); Shell::Get()->accessibility_controller()->BindRequest(std::move(request));
} }
void BindAccessibilityFocusRingControllerRequestOnMainThread(
mojom::AccessibilityFocusRingControllerRequest request) {
AccessibilityFocusRingController::GetInstance()->BindRequest(
std::move(request));
}
void BindAppListControllerRequestOnMainThread( void BindAppListControllerRequestOnMainThread(
mojom::AppListControllerRequest request) { mojom::AppListControllerRequest request) {
Shell::Get()->app_list_controller()->BindRequest(std::move(request)); Shell::Get()->app_list_controller()->BindRequest(std::move(request));
...@@ -182,6 +189,9 @@ void RegisterInterfaces( ...@@ -182,6 +189,9 @@ void RegisterInterfaces(
registry->AddInterface( registry->AddInterface(
base::Bind(&BindAccessibilityControllerRequestOnMainThread), base::Bind(&BindAccessibilityControllerRequestOnMainThread),
main_thread_task_runner); main_thread_task_runner);
registry->AddInterface(
base::Bind(&BindAccessibilityFocusRingControllerRequestOnMainThread),
main_thread_task_runner);
registry->AddInterface(base::Bind(&BindAppListControllerRequestOnMainThread), registry->AddInterface(base::Bind(&BindAppListControllerRequestOnMainThread),
main_thread_task_runner); main_thread_task_runner);
registry->AddInterface( registry->AddInterface(
......
...@@ -14,6 +14,7 @@ mojom("interfaces_internal") { ...@@ -14,6 +14,7 @@ mojom("interfaces_internal") {
sources = [ sources = [
"accelerator_controller.mojom", "accelerator_controller.mojom",
"accessibility_controller.mojom", "accessibility_controller.mojom",
"accessibility_focus_ring_controller.mojom",
"app_list.mojom", "app_list.mojom",
"ash_display_controller.mojom", "ash_display_controller.mojom",
"ash_message_center_controller.mojom", "ash_message_center_controller.mojom",
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
module ash.mojom;
import "ui/gfx/geometry/mojo/geometry.mojom";
enum FocusRingBehavior { FADE_OUT_FOCUS_RING, PERSIST_FOCUS_RING };
// Interface for ash client (e.g. Chrome) to control and query accessibility
// focus ring features.
interface AccessibilityFocusRingController {
// Sets the focus ring color.
SetFocusRingColor(uint32 skcolor);
// Resets the focus ring color back to the default.
ResetFocusRingColor();
// Draws a focus ring around the given set of rects in screen coordinates. Use
// |focus_ring_behavior| to specify whether the focus ring should persist or
// fade out.
SetFocusRing(array<gfx.mojom.Rect> rects_in_screen,
FocusRingBehavior focus_ring_behavior);
// Hides focus ring on screen.
HideFocusRing();
// Draws a highlight at the given rects in screen coordinates. Rects may be
// overlapping and will be merged into one layer. This looks similar to
// selecting a region with the cursor, except it is drawn in the foreground
// rather than behind a text layer.
SetHighlights(array<gfx.mojom.Rect> rects_in_screen, uint32 skcolor);
// Hides highlight on screen.
HideHighlights();
};
...@@ -5,6 +5,9 @@ ...@@ -5,6 +5,9 @@
#include "chrome/browser/accessibility/accessibility_extension_api.h" #include "chrome/browser/accessibility/accessibility_extension_api.h"
#include <stddef.h> #include <stddef.h>
#include <memory>
#include <set>
#include <vector>
#include "base/json/json_writer.h" #include "base/json/json_writer.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
...@@ -30,14 +33,12 @@ ...@@ -30,14 +33,12 @@
#include "ui/events/keycodes/keyboard_codes.h" #include "ui/events/keycodes/keyboard_codes.h"
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
#include "ash/accessibility/accessibility_focus_ring_controller.h" #include "ash/public/interfaces/accessibility_focus_ring_controller.mojom.h"
#include "ash/shell.h" #include "ash/shell.h"
#include "chrome/browser/chromeos/accessibility/accessibility_manager.h" #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
#include "chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.h" #include "chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.h"
#include "ui/aura/window_tree_host.h" #include "ui/aura/window_tree_host.h"
#include "ui/events/event_sink.h" #include "ui/events/event_sink.h"
using ash::AccessibilityFocusRingController;
#endif #endif
namespace accessibility_private = extensions::api::accessibility_private; namespace accessibility_private = extensions::api::accessibility_private;
...@@ -78,18 +79,19 @@ AccessibilityPrivateSetFocusRingFunction::Run() { ...@@ -78,18 +79,19 @@ AccessibilityPrivateSetFocusRingFunction::Run() {
rects.push_back(gfx::Rect(rect.left, rect.top, rect.width, rect.height)); rects.push_back(gfx::Rect(rect.left, rect.top, rect.width, rect.height));
} }
auto* accessibility_manager = chromeos::AccessibilityManager::Get();
if (params->color) { if (params->color) {
SkColor color; SkColor color;
if (!extensions::image_util::ParseHexColorString(*(params->color), &color)) if (!extensions::image_util::ParseHexColorString(*(params->color), &color))
return RespondNow(Error("Could not parse hex color")); return RespondNow(Error("Could not parse hex color"));
AccessibilityFocusRingController::GetInstance()->SetFocusRingColor(color); accessibility_manager->SetFocusRingColor(color);
} else { } else {
AccessibilityFocusRingController::GetInstance()->ResetFocusRingColor(); accessibility_manager->ResetFocusRingColor();
} }
// Move the visible focus ring to cover all of these rects. // Move the visible focus ring to cover all of these rects.
AccessibilityFocusRingController::GetInstance()->SetFocusRing( accessibility_manager->SetFocusRing(
rects, AccessibilityFocusRingController::PERSIST_FOCUS_RING); rects, ash::mojom::FocusRingBehavior::PERSIST_FOCUS_RING);
// Also update the touch exploration controller so that synthesized // Also update the touch exploration controller so that synthesized
// touch events are anchored within the focused object. // touch events are anchored within the focused object.
...@@ -125,7 +127,7 @@ AccessibilityPrivateSetHighlightsFunction::Run() { ...@@ -125,7 +127,7 @@ AccessibilityPrivateSetHighlightsFunction::Run() {
return RespondNow(Error("Could not parse hex color")); return RespondNow(Error("Could not parse hex color"));
// Set the highlights to cover all of these rects. // Set the highlights to cover all of these rects.
AccessibilityFocusRingController::GetInstance()->SetHighlights(rects, color); chromeos::AccessibilityManager::Get()->SetHighlights(rects, color);
return RespondNow(NoArguments()); return RespondNow(NoArguments());
#endif // defined(OS_CHROMEOS) #endif // defined(OS_CHROMEOS)
......
...@@ -12,8 +12,8 @@ ...@@ -12,8 +12,8 @@
#include <vector> #include <vector>
#include "ash/accessibility/accessibility_controller.h" #include "ash/accessibility/accessibility_controller.h"
#include "ash/accessibility/accessibility_focus_ring_controller.h"
#include "ash/public/cpp/ash_pref_names.h" #include "ash/public/cpp/ash_pref_names.h"
#include "ash/public/interfaces/accessibility_focus_ring_controller.mojom.h"
#include "ash/public/interfaces/constants.mojom.h" #include "ash/public/interfaces/constants.mojom.h"
#include "ash/root_window_controller.h" #include "ash/root_window_controller.h"
#include "ash/shell.h" #include "ash/shell.h"
...@@ -317,6 +317,12 @@ AccessibilityManager::AccessibilityManager() ...@@ -317,6 +317,12 @@ AccessibilityManager::AccessibilityManager()
content::ServiceManagerConnection::GetForProcess() content::ServiceManagerConnection::GetForProcess()
->GetConnector() ->GetConnector()
->BindInterface(ash::mojom::kServiceName, &accessibility_controller_); ->BindInterface(ash::mojom::kServiceName, &accessibility_controller_);
// Connect to ash's AccessibilityFocusRingController interface.
content::ServiceManagerConnection::GetForProcess()
->GetConnector()
->BindInterface(ash::mojom::kServiceName,
&accessibility_focus_ring_controller_);
} }
AccessibilityManager::~AccessibilityManager() { AccessibilityManager::~AccessibilityManager() {
...@@ -1079,7 +1085,7 @@ AccessibilityManager::RegisterCallback(const AccessibilityStatusCallback& cb) { ...@@ -1079,7 +1085,7 @@ AccessibilityManager::RegisterCallback(const AccessibilityStatusCallback& cb) {
} }
void AccessibilityManager::NotifyAccessibilityStatusChanged( void AccessibilityManager::NotifyAccessibilityStatusChanged(
AccessibilityStatusEventDetails& details) { const AccessibilityStatusEventDetails& details) {
callback_list_.Notify(details); callback_list_.Notify(details);
// TODO(crbug.com/594887): Fix for mash by moving pref into ash. // TODO(crbug.com/594887): Fix for mash by moving pref into ash.
...@@ -1274,9 +1280,8 @@ void AccessibilityManager::PostUnloadChromeVox() { ...@@ -1274,9 +1280,8 @@ void AccessibilityManager::PostUnloadChromeVox() {
PlayEarcon(SOUND_SPOKEN_FEEDBACK_DISABLED, PlaySoundOption::ALWAYS); PlayEarcon(SOUND_SPOKEN_FEEDBACK_DISABLED, PlaySoundOption::ALWAYS);
// Clear the accessibility focus ring. // Clear the accessibility focus ring.
ash::AccessibilityFocusRingController::GetInstance()->SetFocusRing( SetFocusRing(std::vector<gfx::Rect>(),
std::vector<gfx::Rect>(), ash::mojom::FocusRingBehavior::PERSIST_FOCUS_RING);
ash::AccessibilityFocusRingController::PERSIST_FOCUS_RING);
if (chromevox_panel_) { if (chromevox_panel_) {
chromevox_panel_->Close(); chromevox_panel_->Close();
...@@ -1320,8 +1325,8 @@ void AccessibilityManager::PostUnloadSelectToSpeak() { ...@@ -1320,8 +1325,8 @@ void AccessibilityManager::PostUnloadSelectToSpeak() {
// unloads. // unloads.
// Clear the accessibility focus ring and highlight. // Clear the accessibility focus ring and highlight.
ash::AccessibilityFocusRingController::GetInstance()->HideFocusRing(); HideFocusRing();
ash::AccessibilityFocusRingController::GetInstance()->HideHighlights(); HideHighlights();
// Stop speech. // Stop speech.
TtsController::GetInstance()->Stop(); TtsController::GetInstance()->Stop();
...@@ -1353,6 +1358,39 @@ void AccessibilityManager::ToggleDictation() { ...@@ -1353,6 +1358,39 @@ void AccessibilityManager::ToggleDictation() {
dictation_->OnToggleDictation(); dictation_->OnToggleDictation();
} }
void AccessibilityManager::SetFocusRingColor(SkColor color) {
accessibility_focus_ring_controller_->SetFocusRingColor(color);
}
void AccessibilityManager::ResetFocusRingColor() {
accessibility_focus_ring_controller_->ResetFocusRingColor();
}
void AccessibilityManager::SetFocusRing(
const std::vector<gfx::Rect>& rects_in_screen,
ash::mojom::FocusRingBehavior focus_ring_behavior) {
accessibility_focus_ring_controller_->SetFocusRing(rects_in_screen,
focus_ring_behavior);
if (focus_ring_observer_for_test_)
focus_ring_observer_for_test_.Run();
}
void AccessibilityManager::HideFocusRing() {
accessibility_focus_ring_controller_->HideFocusRing();
if (focus_ring_observer_for_test_)
focus_ring_observer_for_test_.Run();
}
void AccessibilityManager::SetHighlights(
const std::vector<gfx::Rect>& rects_in_screen,
SkColor color) {
accessibility_focus_ring_controller_->SetHighlights(rects_in_screen, color);
}
void AccessibilityManager::HideHighlights() {
accessibility_focus_ring_controller_->HideHighlights();
}
void AccessibilityManager::SetProfileForTest(Profile* profile) { void AccessibilityManager::SetProfileForTest(Profile* profile) {
SetProfile(profile); SetProfile(profile);
} }
...@@ -1367,4 +1405,9 @@ void AccessibilityManager::FlushForTesting() { ...@@ -1367,4 +1405,9 @@ void AccessibilityManager::FlushForTesting() {
accessibility_controller_.FlushForTesting(); accessibility_controller_.FlushForTesting();
} }
void AccessibilityManager::SetFocusRingObserverForTest(
base::RepeatingCallback<void()> observer) {
focus_ring_observer_for_test_ = observer;
}
} // namespace chromeos } // namespace chromeos
...@@ -5,11 +5,14 @@ ...@@ -5,11 +5,14 @@
#ifndef CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_ACCESSIBILITY_MANAGER_H_ #ifndef CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_ACCESSIBILITY_MANAGER_H_
#define CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_ACCESSIBILITY_MANAGER_H_ #define CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_ACCESSIBILITY_MANAGER_H_
#include <memory>
#include <set> #include <set>
#include <string> #include <string>
#include <vector>
#include "ash/public/cpp/accessibility_types.h" #include "ash/public/cpp/accessibility_types.h"
#include "ash/public/interfaces/accessibility_controller.mojom.h" #include "ash/public/interfaces/accessibility_controller.mojom.h"
#include "ash/public/interfaces/accessibility_focus_ring_controller.mojom.h"
#include "base/callback_forward.h" #include "base/callback_forward.h"
#include "base/callback_list.h" #include "base/callback_list.h"
#include "base/macros.h" #include "base/macros.h"
...@@ -230,7 +233,7 @@ class AccessibilityManager ...@@ -230,7 +233,7 @@ class AccessibilityManager
// Notify registered callbacks of a status change in an accessibility setting. // Notify registered callbacks of a status change in an accessibility setting.
void NotifyAccessibilityStatusChanged( void NotifyAccessibilityStatusChanged(
AccessibilityStatusEventDetails& details); const AccessibilityStatusEventDetails& details);
// Notify accessibility when locale changes occur. // Notify accessibility when locale changes occur.
void OnLocaleChanged(); void OnLocaleChanged();
...@@ -292,11 +295,37 @@ class AccessibilityManager ...@@ -292,11 +295,37 @@ class AccessibilityManager
// Starts or stops dictation (type what you speak). // Starts or stops dictation (type what you speak).
void ToggleDictation(); void ToggleDictation();
// Sets the focus ring color.
void SetFocusRingColor(SkColor color);
// Resets the focus ring color back to the default.
void ResetFocusRingColor();
// Draws a focus ring around the given set of rects in screen coordinates. Use
// |focus_ring_behavior| to specify whether the focus ring should persist or
// fade out.
void SetFocusRing(const std::vector<gfx::Rect>& rects_in_screen,
ash::mojom::FocusRingBehavior focus_ring_behavior);
// Hides focus ring on screen.
void HideFocusRing();
// Draws a highlight at the given rects in screen coordinates. Rects may be
// overlapping and will be merged into one layer. This looks similar to
// selecting a region with the cursor, except it is drawn in the foreground
// rather than behind a text layer.
void SetHighlights(const std::vector<gfx::Rect>& rects_in_screen,
SkColor color);
// Hides highlight on screen.
void HideHighlights();
// Test helpers: // Test helpers:
void SetProfileForTest(Profile* profile); void SetProfileForTest(Profile* profile);
static void SetBrailleControllerForTest( static void SetBrailleControllerForTest(
extensions::api::braille_display_private::BrailleController* controller); extensions::api::braille_display_private::BrailleController* controller);
void FlushForTesting(); void FlushForTesting();
void SetFocusRingObserverForTest(base::RepeatingCallback<void()> observer);
protected: protected:
AccessibilityManager(); AccessibilityManager();
...@@ -423,10 +452,17 @@ class AccessibilityManager ...@@ -423,10 +452,17 @@ class AccessibilityManager
// Ash's mojom::AccessibilityController used to request Ash's a11y feature. // Ash's mojom::AccessibilityController used to request Ash's a11y feature.
ash::mojom::AccessibilityControllerPtr accessibility_controller_; ash::mojom::AccessibilityControllerPtr accessibility_controller_;
// Ash's mojom::AccessibilityFocusRingController used to request Ash's a11y
// focus ring feature.
ash::mojom::AccessibilityFocusRingControllerPtr
accessibility_focus_ring_controller_;
bool app_terminating_ = false; bool app_terminating_ = false;
std::unique_ptr<DictationChromeos> dictation_; std::unique_ptr<DictationChromeos> dictation_;
base::RepeatingCallback<void()> focus_ring_observer_for_test_;
base::WeakPtrFactory<AccessibilityManager> weak_ptr_factory_; base::WeakPtrFactory<AccessibilityManager> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(AccessibilityManager); DISALLOW_COPY_AND_ASSIGN(AccessibilityManager);
......
...@@ -190,13 +190,13 @@ IN_PROC_BROWSER_TEST_F(SelectToSpeakTest, BreaksAtParagraphBounds) { ...@@ -190,13 +190,13 @@ IN_PROC_BROWSER_TEST_F(SelectToSpeakTest, BreaksAtParagraphBounds) {
} }
IN_PROC_BROWSER_TEST_F(SelectToSpeakTest, FocusRingMovesWithMouse) { IN_PROC_BROWSER_TEST_F(SelectToSpeakTest, FocusRingMovesWithMouse) {
ash::AccessibilityFocusRingController* controller =
ash::AccessibilityFocusRingController::GetInstance();
// Create a callback for the focus ring observer. // Create a callback for the focus ring observer.
base::RepeatingCallback<void()> callback = base::RepeatingCallback<void()> callback =
base::BindRepeating(&SelectToSpeakTest::OnFocusRingChanged, GetWeakPtr()); base::BindRepeating(&SelectToSpeakTest::OnFocusRingChanged, GetWeakPtr());
controller->set_focus_ring_observer_for_testing(callback); chromeos::AccessibilityManager::Get()->SetFocusRingObserverForTest(callback);
ash::AccessibilityFocusRingController* controller =
ash::AccessibilityFocusRingController::GetInstance();
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