summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortdanderson@chromium.org <tdanderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-13 21:24:27 +0000
committertdanderson@chromium.org <tdanderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-13 21:24:27 +0000
commit6c6a47f9435c03986a6305a68697af704d3e733c (patch)
treeaee5b15f0fedbf155b3a2799b882be4de22b5351
parent541ca6c2c6fdc2be9f8b8b9f032da8e81aac6cdb (diff)
downloadchromium_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.cc6
-rw-r--r--ui/views/controls/native/native_view_host.h1
-rw-r--r--ui/views/controls/native/native_view_host_aura.cc7
-rw-r--r--ui/views/controls/native/native_view_host_aura.h1
-rw-r--r--ui/views/controls/native/native_view_host_aura_unittest.cc19
-rw-r--r--ui/views/controls/native/native_view_host_wrapper.h4
-rw-r--r--ui/views/widget/root_view.cc3
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) {