Index: ui/views/mus/native_widget_mus_unittest.cc |
diff --git a/ui/views/mus/native_widget_mus_unittest.cc b/ui/views/mus/native_widget_mus_unittest.cc |
index 8dcebbcd8015e20124e8ab3bb7c1dd944a37160b..78155814861fb88c03508605cb6f2cae8f2db6e8 100644 |
--- a/ui/views/mus/native_widget_mus_unittest.cc |
+++ b/ui/views/mus/native_widget_mus_unittest.cc |
@@ -16,9 +16,11 @@ |
#include "ui/gfx/geometry/rect.h" |
#include "ui/gfx/image/image_skia.h" |
#include "ui/gfx/skia_util.h" |
+#include "ui/views/test/focus_manager_test.h" |
#include "ui/views/test/views_test_base.h" |
#include "ui/views/widget/widget.h" |
#include "ui/views/widget/widget_delegate.h" |
+#include "ui/views/widget/widget_observer.h" |
namespace views { |
namespace { |
@@ -31,6 +33,32 @@ SkBitmap MakeBitmap(SkColor color) { |
return bitmap; |
} |
+// An observer that tracks widget activation changes. |
+class WidgetActivationObserver : public WidgetObserver { |
+ public: |
+ explicit WidgetActivationObserver(Widget* widget) : widget_(widget) { |
+ widget_->AddObserver(this); |
+ } |
+ |
+ ~WidgetActivationObserver() override { |
+ widget_->RemoveObserver(this); |
+ } |
+ |
+ const std::vector<bool>& changes() const { return changes_; } |
+ |
+ // WidgetObserver: |
+ void OnWidgetActivationChanged(Widget* widget, bool active) override { |
+ ASSERT_EQ(widget_, widget); |
+ changes_.push_back(active); |
+ } |
+ |
+ private: |
+ Widget* widget_; |
+ std::vector<bool> changes_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(WidgetActivationObserver); |
+}; |
+ |
// A WidgetDelegate that supplies an app icon. |
class TestWidgetDelegate : public WidgetDelegateView { |
public: |
@@ -58,8 +86,8 @@ class NativeWidgetMusTest : public ViewsTestBase { |
~NativeWidgetMusTest() override {} |
// Creates a test widget. Takes ownership of |delegate|. |
- Widget* CreateWidget(TestWidgetDelegate* delegate) { |
- Widget* widget = new Widget(); |
+ scoped_ptr<Widget> CreateWidget(TestWidgetDelegate* delegate) { |
+ scoped_ptr<Widget> widget(new Widget()); |
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); |
params.delegate = delegate; |
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
@@ -72,6 +100,38 @@ class NativeWidgetMusTest : public ViewsTestBase { |
DISALLOW_COPY_AND_ASSIGN(NativeWidgetMusTest); |
}; |
+// Tests communication of activation and focus between Widget and |
+// NativeWidgetMus. |
+TEST_F(NativeWidgetMusTest, OnActivationChanged) { |
+ scoped_ptr<Widget> widget(CreateWidget(nullptr)); |
+ widget->Show(); |
+ |
+ // Track activation, focus and blur events. |
+ WidgetActivationObserver activation_observer(widget.get()); |
+ TestWidgetFocusChangeListener focus_listener; |
+ WidgetFocusManager::GetInstance()->AddFocusChangeListener(&focus_listener); |
+ |
+ // Deactivate the Widget, which deactivates the NativeWidgetMus. |
+ widget->Deactivate(); |
+ |
+ // The widget is blurred and deactivated. |
+ ASSERT_EQ(1u, focus_listener.focus_changes().size()); |
+ EXPECT_EQ(nullptr, focus_listener.focus_changes()[0]); |
+ ASSERT_EQ(1u, activation_observer.changes().size()); |
+ EXPECT_EQ(false, activation_observer.changes()[0]); |
+ |
+ // Re-activate the Widget, which actives the NativeWidgetMus. |
+ widget->Activate(); |
+ |
+ // The widget is focused and activated. |
+ ASSERT_EQ(2u, focus_listener.focus_changes().size()); |
+ EXPECT_EQ(widget->GetNativeView(), focus_listener.focus_changes()[1]); |
+ ASSERT_EQ(2u, activation_observer.changes().size()); |
+ EXPECT_TRUE(activation_observer.changes()[1]); |
+ |
+ WidgetFocusManager::GetInstance()->RemoveFocusChangeListener(&focus_listener); |
+} |
+ |
// Tests that a window with an icon sets the mus::Window icon property. |
TEST_F(NativeWidgetMusTest, AppIcon) { |
// Create a Widget with a bitmap as the icon. |