1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/views/widget/native_widget_mac.h"
7 #import <Cocoa/Cocoa.h>
9 #include "ui/views/test/widget_test.h"
10 #include "ui/views/test/test_widget_observer.h"
15 // Tests for NativeWidgetMac that rely on global window manager state, and can
16 // not be parallelized.
17 class NativeWidgetMacInteractiveUITest
19 public ::testing::WithParamInterface<bool> {
23 NativeWidgetMacInteractiveUITest()
24 : activationCount_(0), deactivationCount_(0) {}
26 Widget* MakeWidget() {
27 return GetParam() ? CreateTopLevelFramelessPlatformWidget()
28 : CreateTopLevelPlatformWidget();
31 // Overridden form testing::Test:
32 virtual void SetUp() {
33 // Unbundled applications (those without Info.plist) default to
34 // NSApplicationActivationPolicyProhibited, which prohibits the application
35 // obtaining key status.
36 [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
41 scoped_ptr<Observer> observer_;
43 int deactivationCount_;
46 DISALLOW_COPY_AND_ASSIGN(NativeWidgetMacInteractiveUITest);
49 class NativeWidgetMacInteractiveUITest::Observer : public TestWidgetObserver {
51 Observer(NativeWidgetMacInteractiveUITest* parent, Widget* widget)
52 : TestWidgetObserver(widget), parent_(parent) {}
54 virtual void OnWidgetActivationChanged(Widget* widget, bool active) override {
56 parent_->activationCount_++;
58 parent_->deactivationCount_++;
62 NativeWidgetMacInteractiveUITest* parent_;
64 DISALLOW_COPY_AND_ASSIGN(Observer);
67 // Test that showing a window causes it to attain global keyWindow status.
68 TEST_P(NativeWidgetMacInteractiveUITest, ShowAttainsKeyStatus) {
69 Widget* widget = MakeWidget();
70 observer_.reset(new Observer(this, widget));
72 EXPECT_FALSE(widget->IsActive());
73 EXPECT_EQ(0, activationCount_);
75 EXPECT_TRUE(widget->IsActive());
77 EXPECT_TRUE([widget->GetNativeWindow() isKeyWindow]);
78 EXPECT_EQ(1, activationCount_);
79 EXPECT_EQ(0, deactivationCount_);
81 // Now check that losing and gaining key status due events outside of Widget
83 Widget* widget2 = MakeWidget(); // Note: not observed.
84 EXPECT_EQ(0, deactivationCount_);
86 EXPECT_EQ(1, deactivationCount_);
89 EXPECT_FALSE(widget->IsActive());
90 EXPECT_EQ(1, deactivationCount_);
91 EXPECT_EQ(1, activationCount_);
93 [widget->GetNativeWindow() makeKeyAndOrderFront:nil];
95 EXPECT_TRUE(widget->IsActive());
96 EXPECT_EQ(1, deactivationCount_);
97 EXPECT_EQ(2, activationCount_);
102 EXPECT_EQ(1, deactivationCount_);
103 EXPECT_EQ(2, activationCount_);
106 // Test that ShowInactive does not take keyWindow status from an active window.
107 TEST_P(NativeWidgetMacInteractiveUITest, ShowInactiveIgnoresKeyStatus) {
108 Widget* widget = MakeWidget();
110 // In an application with only a single window, that window is always "active"
111 // for the application unless that window is not visible. However, it will not
113 EXPECT_FALSE(widget->IsActive());
114 widget->ShowInactive();
115 EXPECT_TRUE(widget->IsActive());
116 RunPendingMessages();
117 EXPECT_FALSE([widget->GetNativeWindow() isKeyWindow]);
119 // Creating a second widget should now keep that widget active.
120 Widget* widget2 = MakeWidget();
122 widget->ShowInactive();
124 EXPECT_FALSE(widget->IsActive());
125 EXPECT_TRUE(widget2->IsActive());
126 RunPendingMessages();
127 EXPECT_FALSE([widget->GetNativeWindow() isKeyWindow]);
128 EXPECT_TRUE([widget2->GetNativeWindow() isKeyWindow]);
130 // And finally activating the inactive widget should activate it and make it
133 EXPECT_TRUE(widget->IsActive());
134 RunPendingMessages();
135 EXPECT_TRUE([widget->GetNativeWindow() isKeyWindow]);
141 INSTANTIATE_TEST_CASE_P(NativeWidgetMacInteractiveUITestInstance,
142 NativeWidgetMacInteractiveUITest,