Index: ui/views/widget/desktop_aura/desktop_focus_rules_unittest.cc |
diff --git a/ui/views/widget/desktop_aura/desktop_focus_rules_unittest.cc b/ui/views/widget/desktop_aura/desktop_focus_rules_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..596750823dc365664c1c97a4d72ac641f113c051 |
--- /dev/null |
+++ b/ui/views/widget/desktop_aura/desktop_focus_rules_unittest.cc |
@@ -0,0 +1,58 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ui/views/widget/desktop_aura/desktop_focus_rules.h" |
+ |
+#include "ui/aura/client/focus_client.h" |
+#include "ui/aura/test/test_window_delegate.h" |
+#include "ui/aura/window.h" |
+#include "ui/aura/window_event_dispatcher.h" |
+#include "ui/aura/window_layer_type.h" |
+#include "ui/views/corewm/window_util.h" |
+#include "ui/views/test/views_test_base.h" |
+#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" |
+#include "ui/views/widget/widget.h" |
+ |
+namespace views { |
+ |
+namespace { |
+ |
+scoped_ptr<Widget> CreateDesktopWidget() { |
+ scoped_ptr<Widget> widget(new Widget); |
+ Widget::InitParams params = Widget::InitParams( |
+ Widget::InitParams::TYPE_WINDOW); |
+ params.bounds = gfx::Rect(0, 0, 200, 200); |
+ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
+ params.native_widget = new DesktopNativeWidgetAura(widget.get()); |
+ widget->Init(params); |
+ return widget.Pass(); |
+} |
+ |
+} // namespace |
+ |
+typedef ViewsTestBase DesktopFocusRulesTest; |
+ |
+// Verifies we don't attempt to activate a window in another widget. |
+TEST_F(DesktopFocusRulesTest, DontFocusWindowsInOtherHierarchies) { |
+ // Two widgets (each with a DesktopNativeWidgetAura). |w2| has a child Window |
+ // |w2_child| that is not focusable. |w2_child|'s has a transient parent in |
+ // |w1|. |
+ scoped_ptr<views::Widget> w1(CreateDesktopWidget()); |
+ scoped_ptr<views::Widget> w2(CreateDesktopWidget()); |
+ aura::test::TestWindowDelegate w2_child_delegate; |
+ w2_child_delegate.set_can_focus(false); |
+ aura::Window* w2_child = new aura::Window(&w2_child_delegate); |
+ w2_child->Init(aura::WINDOW_LAYER_SOLID_COLOR); |
+ w2->GetNativeView()->AddChild(w2_child); |
+ views::corewm::AddTransientChild(w1->GetNativeView(), w2_child); |
+ aura::client::GetFocusClient(w2->GetNativeView())->FocusWindow(w2_child); |
+ aura::Window* focused = |
+ aura::client::GetFocusClient(w2->GetNativeView())->GetFocusedWindow(); |
+ EXPECT_TRUE((focused == NULL) || w2->GetNativeView()->Contains(focused)); |
+ views::corewm::RemoveTransientChild(w1->GetNativeView(), w2_child); |
+ w1.reset(); |
+ w2.reset(); |
+} |
+ |
+} // namespace views |