MacViews: Get c/b/ui/views/tabs to build on Mac
[chromium-blink-merge.git] / ui / views / widget / native_widget_mac_interactive_uitest.mm
blob7cb6afbbe2678e288d6032b5b7a95704dade6aad
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"
12 namespace views {
13 namespace test {
15 // Tests for NativeWidgetMac that rely on global window manager state, and can
16 // not be parallelized.
17 class NativeWidgetMacInteractiveUITest
18     : public WidgetTest,
19       public ::testing::WithParamInterface<bool> {
20  public:
21   class Observer;
23   NativeWidgetMacInteractiveUITest()
24       : activationCount_(0), deactivationCount_(0) {}
26   Widget* MakeWidget() {
27     return GetParam() ? CreateTopLevelFramelessPlatformWidget()
28                       : CreateTopLevelPlatformWidget();
29   }
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];
37     WidgetTest::SetUp();
38   }
40  protected:
41   scoped_ptr<Observer> observer_;
42   int activationCount_;
43   int deactivationCount_;
45  private:
46   DISALLOW_COPY_AND_ASSIGN(NativeWidgetMacInteractiveUITest);
49 class NativeWidgetMacInteractiveUITest::Observer : public TestWidgetObserver {
50  public:
51   Observer(NativeWidgetMacInteractiveUITest* parent, Widget* widget)
52       : TestWidgetObserver(widget), parent_(parent) {}
54   virtual void OnWidgetActivationChanged(Widget* widget, bool active) override {
55     if (active)
56       parent_->activationCount_++;
57     else
58       parent_->deactivationCount_++;
59   }
61  private:
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_);
74   widget->Show();
75   EXPECT_TRUE(widget->IsActive());
76   RunPendingMessages();
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
82   // works correctly.
83   Widget* widget2 = MakeWidget();  // Note: not observed.
84   EXPECT_EQ(0, deactivationCount_);
85   widget2->Show();
86   EXPECT_EQ(1, deactivationCount_);
88   RunPendingMessages();
89   EXPECT_FALSE(widget->IsActive());
90   EXPECT_EQ(1, deactivationCount_);
91   EXPECT_EQ(1, activationCount_);
93   [widget->GetNativeWindow() makeKeyAndOrderFront:nil];
94   RunPendingMessages();
95   EXPECT_TRUE(widget->IsActive());
96   EXPECT_EQ(1, deactivationCount_);
97   EXPECT_EQ(2, activationCount_);
99   widget2->CloseNow();
100   widget->CloseNow();
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
112   // be key.
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();
121   widget2->Show();
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
131   // key.
132   widget->Activate();
133   EXPECT_TRUE(widget->IsActive());
134   RunPendingMessages();
135   EXPECT_TRUE([widget->GetNativeWindow() isKeyWindow]);
137   widget2->CloseNow();
138   widget->CloseNow();
141 INSTANTIATE_TEST_CASE_P(NativeWidgetMacInteractiveUITestInstance,
142                         NativeWidgetMacInteractiveUITest,
143                         ::testing::Bool());
145 }  // namespace test
146 }  // namespace views