Commit d56bc78f authored by dmazzoni's avatar dmazzoni Committed by Commit bot

Make cursor highlighting feature work across multiple displays

BUG=654221

Review-Url: https://codereview.chromium.org/2432583002
Cr-Commit-Position: refs/heads/master@{#427127}
parent 08f73f5e
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "content/public/browser/notification_service.h" #include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_types.h" #include "content/public/browser/notification_types.h"
#include "ui/aura/window_tree_host.h" #include "ui/aura/window_tree_host.h"
#include "ui/wm/core/coordinate_conversion.h"
#include "ui/wm/core/cursor_manager.h" #include "ui/wm/core/cursor_manager.h"
namespace chromeos { namespace chromeos {
...@@ -77,7 +78,11 @@ void AccessibilityHighlightManager::RegisterObservers() { ...@@ -77,7 +78,11 @@ void AccessibilityHighlightManager::RegisterObservers() {
void AccessibilityHighlightManager::OnMouseEvent(ui::MouseEvent* event) { void AccessibilityHighlightManager::OnMouseEvent(ui::MouseEvent* event) {
if (event->type() == ui::ET_MOUSE_MOVED) { if (event->type() == ui::ET_MOUSE_MOVED) {
cursor_point_ = event->root_location(); cursor_point_ = event->location();
if (event->target()) {
::wm::ConvertPointToScreen(static_cast<aura::Window*>(event->target()),
&cursor_point_);
}
UpdateCursorHighlight(); UpdateCursorHighlight();
} }
} }
......
...@@ -36,6 +36,9 @@ class AccessibilityHighlightManager ...@@ -36,6 +36,9 @@ class AccessibilityHighlightManager
void RegisterObservers(); void RegisterObservers();
protected: protected:
FRIEND_TEST_ALL_PREFIXES(AccessibilityFocusRingControllerTest,
CursorWorksOnMultipleDisplays);
// ui::EventHandler overrides: // ui::EventHandler overrides:
void OnMouseEvent(ui::MouseEvent* event) override; void OnMouseEvent(ui::MouseEvent* event) override;
void OnKeyEvent(ui::KeyEvent* event) override; void OnKeyEvent(ui::KeyEvent* event) override;
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "chrome/browser/chromeos/ui/accessibility_cursor_ring_layer.h" #include "chrome/browser/chromeos/ui/accessibility_cursor_ring_layer.h"
#include "ash/aura/wm_window_aura.h"
#include "ash/display/window_tree_host_manager.h" #include "ash/display/window_tree_host_manager.h"
#include "ash/shell.h" #include "ash/shell.h"
#include "base/bind.h" #include "base/bind.h"
...@@ -50,6 +51,8 @@ void AccessibilityCursorRingLayer::Set(const gfx::Point& location) { ...@@ -50,6 +51,8 @@ void AccessibilityCursorRingLayer::Set(const gfx::Point& location) {
aura::Window* root_window = ash::Shell::GetInstance() aura::Window* root_window = ash::Shell::GetInstance()
->window_tree_host_manager() ->window_tree_host_manager()
->GetRootWindowForDisplayId(display.id()); ->GetRootWindowForDisplayId(display.id());
ash::WmWindow* root_wm_window = ash::WmWindowAura::Get(root_window);
bounds = root_wm_window->ConvertRectFromScreen(bounds);
CreateOrUpdateLayer(root_window, "AccessibilityCursorRing", bounds); CreateOrUpdateLayer(root_window, "AccessibilityCursorRing", bounds);
} }
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <vector> #include <vector>
#include "base/gtest_prod_util.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/scoped_vector.h" #include "base/memory/scoped_vector.h"
#include "base/memory/singleton.h" #include "base/memory/singleton.h"
...@@ -59,6 +60,9 @@ class AccessibilityFocusRingController : public FocusRingLayerDelegate { ...@@ -59,6 +60,9 @@ class AccessibilityFocusRingController : public FocusRingLayerDelegate {
virtual int GetMargin() const; virtual int GetMargin() const;
private: private:
FRIEND_TEST_ALL_PREFIXES(AccessibilityFocusRingControllerTest,
CursorWorksOnMultipleDisplays);
// FocusRingLayerDelegate overrides. // FocusRingLayerDelegate overrides.
void OnDeviceScaleFactorChanged() override; void OnDeviceScaleFactorChanged() override;
void OnAnimationStep(base::TimeTicks timestamp) override; void OnAnimationStep(base::TimeTicks timestamp) override;
......
...@@ -2,9 +2,14 @@ ...@@ -2,9 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "ash/shell.h"
#include "ash/test/ash_test_base.h"
#include "chrome/browser/chromeos/accessibility/accessibility_highlight_manager.h"
#include "chrome/browser/chromeos/ui/accessibility_cursor_ring_layer.h"
#include "chrome/browser/chromeos/ui/accessibility_focus_ring_controller.h" #include "chrome/browser/chromeos/ui/accessibility_focus_ring_controller.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
namespace chromeos { namespace chromeos {
...@@ -28,7 +33,7 @@ class TestableAccessibilityFocusRingController ...@@ -28,7 +33,7 @@ class TestableAccessibilityFocusRingController
int margin_; int margin_;
}; };
class AccessibilityFocusRingControllerTest : public testing::Test { class AccessibilityFocusRingControllerTest : public ash::test::AshTestBase {
public: public:
AccessibilityFocusRingControllerTest() {} AccessibilityFocusRingControllerTest() {}
~AccessibilityFocusRingControllerTest() override {} ~AccessibilityFocusRingControllerTest() override {}
...@@ -128,4 +133,44 @@ TEST_F(AccessibilityFocusRingControllerTest, RectsToRingsParagraphShape) { ...@@ -128,4 +133,44 @@ TEST_F(AccessibilityFocusRingControllerTest, RectsToRingsParagraphShape) {
EXPECT_EQ(gfx::Point(0, 100), points[35]); EXPECT_EQ(gfx::Point(0, 100), points[35]);
} }
TEST_F(AccessibilityFocusRingControllerTest, CursorWorksOnMultipleDisplays) {
if (!SupportsMultipleDisplays())
return;
UpdateDisplay("400x400,500x500");
aura::Window::Windows root_windows =
ash::Shell::GetInstance()->GetAllRootWindows();
ASSERT_EQ(2u, root_windows.size());
AccessibilityHighlightManager highlight_manager;
highlight_manager.HighlightCursor(true);
gfx::Point location(90, 90);
ui::MouseEvent event0(ui::ET_MOUSE_MOVED, location, location,
ui::EventTimeForNow(), 0, 0);
ui::Event::DispatcherApi event_mod(&event0);
event_mod.set_target(root_windows[0]);
highlight_manager.OnMouseEvent(&event0);
AccessibilityFocusRingController* controller =
AccessibilityFocusRingController::GetInstance();
AccessibilityCursorRingLayer* cursor_layer = controller->cursor_layer_.get();
EXPECT_EQ(root_windows[0], cursor_layer->root_window());
EXPECT_LT(abs(cursor_layer->layer()->GetTargetBounds().x() - location.x()),
50);
EXPECT_LT(abs(cursor_layer->layer()->GetTargetBounds().y() - location.y()),
50);
ui::MouseEvent event1(ui::ET_MOUSE_MOVED, location, location,
ui::EventTimeForNow(), 0, 0);
ui::Event::DispatcherApi event_mod1(&event1);
event_mod1.set_target(root_windows[1]);
highlight_manager.OnMouseEvent(&event1);
cursor_layer = controller->cursor_layer_.get();
EXPECT_EQ(root_windows[1], cursor_layer->root_window());
EXPECT_LT(abs(cursor_layer->layer()->GetTargetBounds().x() - location.x()),
50);
EXPECT_LT(abs(cursor_layer->layer()->GetTargetBounds().y() - location.y()),
50);
}
} // namespace chromeos } // namespace chromeos
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