diff options
author | tdanderson@chromium.org <tdanderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-13 21:24:27 +0000 |
---|---|---|
committer | tdanderson@chromium.org <tdanderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-13 21:24:27 +0000 |
commit | 6c6a47f9435c03986a6305a68697af704d3e733c (patch) | |
tree | aee5b15f0fedbf155b3a2799b882be4de22b5351 | |
parent | 541ca6c2c6fdc2be9f8b8b9f032da8e81aac6cdb (diff) | |
download | chromium_src-6c6a47f9435c03986a6305a68697af704d3e733c.zip chromium_src-6c6a47f9435c03986a6305a68697af704d3e733c.tar.gz chromium_src-6c6a47f9435c03986a6305a68697af704d3e733c.tar.bz2 |
NativeViewHost should query its native view for the current cursor
Add an override of View::GetCursor() to NativeViewHost so
that the native view can be queried for the current mouse
cursor. Currently no such override exists, and the default
implementation in View::GetCursor() does not always return
the correct value.
BUG=349118,351469
TEST=NativeViewHostAuraTest.CursorForNativeView
Review URL: https://codereview.chromium.org/195723002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@256934 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | ui/views/controls/native/native_view_host.cc | 6 | ||||
-rw-r--r-- | ui/views/controls/native/native_view_host.h | 1 | ||||
-rw-r--r-- | ui/views/controls/native/native_view_host_aura.cc | 7 | ||||
-rw-r--r-- | ui/views/controls/native/native_view_host_aura.h | 1 | ||||
-rw-r--r-- | ui/views/controls/native/native_view_host_aura_unittest.cc | 19 | ||||
-rw-r--r-- | ui/views/controls/native/native_view_host_wrapper.h | 4 | ||||
-rw-r--r-- | ui/views/widget/root_view.cc | 3 |
7 files changed, 40 insertions, 1 deletions
diff --git a/ui/views/controls/native/native_view_host.cc b/ui/views/controls/native/native_view_host.cc index 6940708..c7e49f4 100644 --- a/ui/views/controls/native/native_view_host.cc +++ b/ui/views/controls/native/native_view_host.cc @@ -5,6 +5,7 @@ #include "ui/views/controls/native/native_view_host.h" #include "base/logging.h" +#include "ui/base/cursor/cursor.h" #include "ui/gfx/canvas.h" #include "ui/views/accessibility/native_view_accessibility.h" #include "ui/views/controls/native/native_view_host_wrapper.h" @@ -191,6 +192,10 @@ gfx::NativeViewAccessible NativeViewHost::GetNativeViewAccessible() { return View::GetNativeViewAccessible(); } +gfx::NativeCursor NativeViewHost::GetCursor(const ui::MouseEvent& event) { + return native_wrapper_->GetCursor(event.x(), event.y()); +} + //////////////////////////////////////////////////////////////////////////////// // NativeViewHost, private: @@ -221,5 +226,4 @@ void NativeViewHost::ClearFocus() { } } - } // namespace views diff --git a/ui/views/controls/native/native_view_host.h b/ui/views/controls/native/native_view_host.h index bdc5151..59d8af1 100644 --- a/ui/views/controls/native/native_view_host.h +++ b/ui/views/controls/native/native_view_host.h @@ -86,6 +86,7 @@ class VIEWS_EXPORT NativeViewHost : public View { virtual void VisibilityChanged(View* starting_from, bool is_visible) OVERRIDE; virtual void OnFocus() OVERRIDE; virtual gfx::NativeViewAccessible GetNativeViewAccessible() OVERRIDE; + virtual gfx::NativeCursor GetCursor(const ui::MouseEvent& event) OVERRIDE; protected: virtual bool NeedsNotificationWhenVisibleBoundsChange() const OVERRIDE; diff --git a/ui/views/controls/native/native_view_host_aura.cc b/ui/views/controls/native/native_view_host_aura.cc index a71e230..49bf733 100644 --- a/ui/views/controls/native/native_view_host_aura.cc +++ b/ui/views/controls/native/native_view_host_aura.cc @@ -7,6 +7,7 @@ #include "base/logging.h" #include "ui/aura/client/focus_client.h" #include "ui/aura/window.h" +#include "ui/base/cursor/cursor.h" #include "ui/views/controls/native/native_view_host.h" #include "ui/views/view_constants_aura.h" #include "ui/views/widget/widget.h" @@ -100,6 +101,12 @@ gfx::NativeViewAccessible NativeViewHostAura::GetNativeViewAccessible() { return NULL; } +gfx::NativeCursor NativeViewHostAura::GetCursor(int x, int y) { + if (host_->native_view()) + return host_->native_view()->GetCursor(gfx::Point(x, y)); + return gfx::kNullCursor; +} + void NativeViewHostAura::OnWindowDestroyed(aura::Window* window) { DCHECK(window == host_->native_view()); host_->NativeViewDestroyed(); diff --git a/ui/views/controls/native/native_view_host_aura.h b/ui/views/controls/native/native_view_host_aura.h index eba4b99..8ef4e45 100644 --- a/ui/views/controls/native/native_view_host_aura.h +++ b/ui/views/controls/native/native_view_host_aura.h @@ -34,6 +34,7 @@ class VIEWS_EXPORT NativeViewHostAura : public NativeViewHostWrapper, virtual void HideWidget() OVERRIDE; virtual void SetFocus() OVERRIDE; virtual gfx::NativeViewAccessible GetNativeViewAccessible() OVERRIDE; + virtual gfx::NativeCursor GetCursor(int x, int y) OVERRIDE; private: // Overridden from aura::WindowObserver: diff --git a/ui/views/controls/native/native_view_host_aura_unittest.cc b/ui/views/controls/native/native_view_host_aura_unittest.cc index 7653cc9..f6dc561 100644 --- a/ui/views/controls/native/native_view_host_aura_unittest.cc +++ b/ui/views/controls/native/native_view_host_aura_unittest.cc @@ -7,6 +7,7 @@ #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "ui/aura/window.h" +#include "ui/base/cursor/cursor.h" #include "ui/views/controls/native/native_view_host.h" #include "ui/views/test/views_test_base.h" #include "ui/views/view.h" @@ -24,6 +25,10 @@ class NativeViewHostAuraTest : public ViewsTestBase { return static_cast<NativeViewHostAura*>(host_->native_wrapper_.get()); } + Widget* toplevel() { + return toplevel_.get(); + } + NativeViewHost* host() { return host_.get(); } @@ -95,4 +100,18 @@ TEST_F(NativeViewHostAuraTest, HostViewPropertyKey) { EXPECT_FALSE(child_win->GetProperty(views::kHostViewKey)); } +// Tests that the NativeViewHost reports the cursor set on its native view. +TEST_F(NativeViewHostAuraTest, CursorForNativeView) { + CreateHost(); + + toplevel()->SetCursor(ui::kCursorHand); + child()->SetCursor(ui::kCursorWait); + ui::MouseEvent move_event(ui::ET_MOUSE_MOVED, gfx::Point(0, 0), + gfx::Point(0, 0), 0, 0); + + EXPECT_EQ(ui::kCursorWait, host()->GetCursor(move_event).native_type()); + + DestroyHost(); +} + } // namespace views diff --git a/ui/views/controls/native/native_view_host_wrapper.h b/ui/views/controls/native/native_view_host_wrapper.h index 3b3cb37..306aa01 100644 --- a/ui/views/controls/native/native_view_host_wrapper.h +++ b/ui/views/controls/native/native_view_host_wrapper.h @@ -62,6 +62,10 @@ class VIEWS_EXPORT NativeViewHostWrapper { // view. virtual gfx::NativeViewAccessible GetNativeViewAccessible() = 0; + // Returns the native cursor corresponding to the point (x, y) + // in the native view. + virtual gfx::NativeCursor GetCursor(int x, int y) = 0; + // Creates a platform-specific instance of an object implementing this // interface. static NativeViewHostWrapper* CreateWrapper(NativeViewHost* host); diff --git a/ui/views/widget/root_view.cc b/ui/views/widget/root_view.cc index 277f2a9..c916333 100644 --- a/ui/views/widget/root_view.cc +++ b/ui/views/widget/root_view.cc @@ -388,6 +388,9 @@ void RootView::OnMouseMoved(const ui::MouseEvent& event) { ui::MouseEvent moved_event(event, static_cast<View*>(this), mouse_move_handler_); mouse_move_handler_->OnMouseMoved(moved_event); + // TODO(tdanderson): It may be possible to avoid setting the cursor twice + // (once here and once from CompoundEventFilter) on a + // mousemove. See crbug.com/351469. if (!(moved_event.flags() & ui::EF_IS_NON_CLIENT)) widget_->SetCursor(mouse_move_handler_->GetCursor(moved_event)); } else if (mouse_move_handler_ != NULL) { |