Commit 783d36f5 authored by dmazzoni's avatar dmazzoni Committed by Commit bot

Chrome OS highlighting: show only focus or caret, never both.

When the text caret is visible, show that highlight, otherwise if something
has focus, show the focus highlight - never both since they too often
overlap.

BUG=314889

Review-Url: https://codereview.chromium.org/2036343003
Cr-Commit-Position: refs/heads/master@{#397796}
parent 28fa941b
......@@ -68,10 +68,7 @@ AccessibilityHighlightManager::~AccessibilityHighlightManager() {
void AccessibilityHighlightManager::HighlightFocus(bool focus) {
focus_ = focus;
std::vector<gfx::Rect> rects;
rects.push_back(focus_ ? focus_rect_ : OffscreenRect());
AccessibilityFocusRingController::GetInstance()->SetFocusRing(rects);
UpdateFocusAndCaretHighlights();
}
void AccessibilityHighlightManager::HighlightCursor(bool cursor) {
......@@ -83,9 +80,7 @@ void AccessibilityHighlightManager::HighlightCursor(bool cursor) {
void AccessibilityHighlightManager::HighlightCaret(bool caret) {
caret_ = caret;
AccessibilityFocusRingController::GetInstance()->SetCaretRing(
caret_ ? caret_point_ : OffscreenPoint());
UpdateFocusAndCaretHighlights();
}
void AccessibilityHighlightManager::OnMouseEvent(ui::MouseEvent* event) {
......@@ -104,34 +99,44 @@ void AccessibilityHighlightManager::Observe(
content::FocusedNodeDetails* node_details =
content::Details<content::FocusedNodeDetails>(details).ptr();
focus_rect_ = node_details->node_bounds_in_screen;
if (focus_) {
std::vector<gfx::Rect> rects;
rects.push_back(focus_rect_);
AccessibilityFocusRingController::GetInstance()->SetFocusRing(rects);
}
UpdateFocusAndCaretHighlights();
}
void AccessibilityHighlightManager::OnTextInputStateChanged(
const ui::TextInputClient* client) {
if (!client || client->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) {
caret_point_ = OffscreenPoint();
if (caret_) {
AccessibilityFocusRingController::GetInstance()->SetCaretRing(
caret_point_);
}
caret_visible_ = false;
UpdateFocusAndCaretHighlights();
}
}
void AccessibilityHighlightManager::OnCaretBoundsChanged(
const ui::TextInputClient* client) {
gfx::Rect caret_bounds = client->GetCaretBounds();
if (caret_bounds.width() == 0 && caret_bounds.height() == 0)
caret_bounds = OffscreenRect();
caret_point_ = caret_bounds.CenterPoint();
caret_visible_ = client->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE &&
(caret_bounds.width() || caret_bounds.height());
UpdateFocusAndCaretHighlights();
}
void AccessibilityHighlightManager::UpdateFocusAndCaretHighlights() {
auto controller = AccessibilityFocusRingController::GetInstance();
if (caret_)
AccessibilityFocusRingController::GetInstance()->SetCaretRing(caret_point_);
// The caret highlight takes precedence over the focus highlight if
// both are visible.
if (caret_ && caret_visible_) {
controller->SetCaretRing(caret_point_);
controller->SetFocusRing(std::vector<gfx::Rect>());
} else if (focus_) {
controller->SetCaretRing(OffscreenPoint());
std::vector<gfx::Rect> rects;
if (!focus_rect_.IsEmpty())
rects.push_back(focus_rect_);
controller->SetFocusRing(rects);
} else {
controller->SetCaretRing(OffscreenPoint());
controller->SetFocusRing(std::vector<gfx::Rect>());
}
}
} // namespace chromeos
......@@ -48,6 +48,8 @@ class AccessibilityHighlightManager : public ui::EventHandler,
void OnTextInputStateChanged(const ui::TextInputClient* client) override;
void OnCaretBoundsChanged(const ui::TextInputClient* client) override;
void UpdateFocusAndCaretHighlights();
bool focus_ = false;
gfx::Rect focus_rect_;
......@@ -55,6 +57,7 @@ class AccessibilityHighlightManager : public ui::EventHandler,
gfx::Point cursor_point_;
bool caret_ = false;
bool caret_visible_ = false;
gfx::Point caret_point_;
content::NotificationRegistrar registrar_;
......
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