Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(640)

Unified Diff: views/focus/focus_manager_unittest.cc

Issue 214029: Adding focus to NaviteViewHost. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « views/controls/native_control_win.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/focus/focus_manager_unittest.cc
===================================================================
--- views/focus/focus_manager_unittest.cc (revision 27081)
+++ views/focus/focus_manager_unittest.cc (working copy)
@@ -165,6 +165,46 @@
virtual void InitContentView() {
}
+ gfx::NativeView CreateChildNativeView(gfx::NativeView parent) {
+#if defined(OS_WIN)
+ const wchar_t* kChildClassName = L"FocusTestChildClass";
+ WNDCLASS wnd_class = { 0 };
+ if (!::GetClassInfo(::GetModuleHandle(NULL), kChildClassName, &wnd_class)) {
+ // Let's register our dummy class.
+ wnd_class.lpfnWndProc = ::DefWindowProc;
+ wnd_class.hInstance = ::GetModuleHandle(NULL);
+ wnd_class.lpszClassName = kChildClassName;
+ ATOM atom = RegisterClass(&wnd_class);
+ }
+ return ::CreateWindow(kChildClassName, NULL, WS_CHILD, 0, 0, 0, 0, parent,
+ NULL, NULL, NULL);
+#else
+ GtkWidget* widget = gtk_link_button_new("stupid button");
+ if (parent)
+ gtk_container_add(GTK_CONTAINER(parent), widget);
+ return widget;
+#endif
+ }
+
+ gfx::NativeView CreateContainerNativeView() {
+#if defined(OS_WIN)
+ const wchar_t* kTopClassName = L"FocusTestTopClass";
+ WNDCLASS wnd_class = { 0 };
+ if (!::GetClassInfo(::GetModuleHandle(NULL), kTopClassName, &wnd_class)) {
+ // Let's register our dummy class.
+ wnd_class.lpfnWndProc = ::DefWindowProc;
+ wnd_class.hInstance = ::GetModuleHandle(NULL);
+ wnd_class.lpszClassName = kTopClassName;
+ ATOM atom = RegisterClass(&wnd_class);
+ }
+ // Create a top window HWND
+ return ::CreateWindow(kTopClassName, NULL, 0, 0, 0, 0, 0, 0,
+ NULL, NULL, NULL);
+#else
+ return gtk_fixed_new();
+#endif
+ }
+
protected:
virtual gfx::Rect bounds() {
return gfx::Rect(0, 0, 500, 500);
@@ -215,7 +255,9 @@
public:
explicit BorderView(View* child) : child_(child), widget_(NULL) {
DCHECK(child);
- SetFocusable(false);
+ // This is a container and no view should get focused when its associated
+ // native view gets the focus.
+ set_focus_view(NULL);
}
virtual ~BorderView() {}
@@ -816,6 +858,66 @@
}
#endif
+// A simple view we use to contain a NativeViewHost.
+// The only thing it does is not mess with the native focus when focused.
+class NoNativeFocusView : public View {
+ public:
+ NoNativeFocusView() {
+ SetFocusable(true);
+ }
+ virtual void Focus() {
+ }
+};
+
+// Tests that the NativeViewHost class sets the focus View appropriately on the
+// FocusManager.
+TEST_F(FocusManagerTest, FocusNativeViewHost) {
+ {
+ // Test wrapping a simple native view.
+ gfx::NativeView native_view =
+ CreateChildNativeView(window_->GetNativeWindow());
+ NativeViewHost* native_view_host = new NativeViewHost();
+ content_view_->AddChildView(native_view_host);
+ native_view_host->Attach(native_view);
+ FocusNativeView(native_view);
+ EXPECT_EQ(native_view_host, GetFocusManager()->GetFocusedView());
+ GetFocusManager()->ClearFocus();
+ }
+
+ {
+ // Test with nested native views, making sure set_focus_native_view() works.
+ gfx::NativeView top_native_view = CreateContainerNativeView();
+ gfx::NativeView child_native_view = CreateChildNativeView(top_native_view);
+ NativeViewHost* native_view_host = new NativeViewHost();
+ native_view_host->set_focus_native_view(child_native_view);
+ content_view_->AddChildView(native_view_host);
+ native_view_host->Attach(top_native_view);
+
+ // Focus the top native view, that shouldn't change the focus.
+ // (Note this isn't a case that we expect to happen.)
+ FocusNativeView(top_native_view);
+ EXPECT_EQ(NULL, GetFocusManager()->GetFocusedView());
+ // Focus the inner HWND, the focused view should change.
+ FocusNativeView(child_native_view);
+ EXPECT_EQ(native_view_host, GetFocusManager()->GetFocusedView());
+ GetFocusManager()->ClearFocus();
+ }
+
+ {
+ // Now also make sure set_focused_view() works.
+ gfx::NativeView native_view = CreateChildNativeView(
+ window_->GetNativeWindow());
+ NativeViewHost* native_view_host = new NativeViewHost();
+ NoNativeFocusView* container_view = new NoNativeFocusView();
+ container_view->AddChildView(native_view_host);
+ content_view_->AddChildView(container_view);
+ native_view_host->set_focus_view(container_view);
+ native_view_host->Attach(native_view);
+ FocusNativeView(native_view);
+ EXPECT_EQ(container_view, GetFocusManager()->GetFocusedView());
+ }
+}
+
// Test that when activating/deactivating the top window, the focus is stored/
// restored properly.
TEST_F(FocusManagerTest, FocusStoreRestore) {
« no previous file with comments | « views/controls/native_control_win.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698