OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/views/controls/native/native_view_host_aura.h" | 5 #include "ui/views/controls/native/native_view_host_aura.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "ui/aura/window.h" | 9 #include "ui/aura/window.h" |
10 #include "ui/views/controls/native/native_view_host.h" | 10 #include "ui/views/controls/native/native_view_host.h" |
11 #include "ui/views/test/views_test_base.h" | 11 #include "ui/views/test/views_test_base.h" |
12 #include "ui/views/view.h" | 12 #include "ui/views/view.h" |
13 #include "ui/views/view_constants_aura.h" | 13 #include "ui/views/view_constants_aura.h" |
14 #include "ui/views/widget/widget.h" | 14 #include "ui/views/widget/widget.h" |
15 | 15 |
16 namespace { | |
17 | |
18 // Static class used to track if the NativeViewHostTesting has been destroyed. | |
19 class DestroyedCount { | |
sky
2013/10/10 20:25:32
Why have this in a separate object rather than par
rharrison
2013/10/13 13:54:57
No good reason, Done.
| |
20 public: | |
21 static void Increment() { | |
22 count_++; | |
23 } | |
24 | |
25 static void Reset() { | |
26 count_ = 0; | |
27 } | |
28 | |
29 static int count() { | |
30 return count_; | |
31 } | |
32 | |
33 private: | |
34 static int count_; | |
35 }; | |
36 int DestroyedCount::count_ = 0; | |
37 | |
38 } // namespace | |
39 | |
16 namespace views { | 40 namespace views { |
17 | 41 |
42 // Testing wrapper of the NativeViewHost | |
43 class NativeViewHostTesting : public NativeViewHost { | |
44 public: | |
45 NativeViewHostTesting() {} | |
46 virtual ~NativeViewHostTesting() { | |
47 DestroyedCount::Increment(); | |
48 } | |
49 }; | |
50 | |
18 class NativeViewHostAuraTest : public ViewsTestBase { | 51 class NativeViewHostAuraTest : public ViewsTestBase { |
19 public: | 52 public: |
20 NativeViewHostAuraTest() { | 53 NativeViewHostAuraTest() { |
21 } | 54 } |
22 | 55 |
23 NativeViewHostAura* native_host() { | 56 NativeViewHostAura* native_host() { |
24 return static_cast<NativeViewHostAura*>(host_->native_wrapper_.get()); | 57 return static_cast<NativeViewHostAura*>(host_->native_wrapper_.get()); |
25 } | 58 } |
26 | 59 |
27 NativeViewHost* host() { | 60 NativeViewHost* host() { |
28 return host_.get(); | 61 return host_.get(); |
29 } | 62 } |
30 | 63 |
31 Widget* child() { | 64 Widget* child() { |
32 return child_.get(); | 65 return child_.get(); |
33 } | 66 } |
34 | 67 |
68 aura::Window* clipping_window() { | |
69 return &(native_host()->clipping_window_); | |
70 } | |
71 | |
72 Widget* toplevel() { | |
73 return toplevel_.get(); | |
74 } | |
75 | |
35 void CreateHost() { | 76 void CreateHost() { |
36 // Create the top level widget. | 77 // Create the top level widget. |
37 toplevel_.reset(new Widget); | 78 toplevel_.reset(new Widget); |
38 Widget::InitParams toplevel_params = | 79 Widget::InitParams toplevel_params = |
39 CreateParams(Widget::InitParams::TYPE_WINDOW); | 80 CreateParams(Widget::InitParams::TYPE_WINDOW); |
40 toplevel_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 81 toplevel_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
41 toplevel_->Init(toplevel_params); | 82 toplevel_->Init(toplevel_params); |
42 | 83 |
43 // And the child widget. | 84 // And the child widget. |
44 View* test_view = new View; | 85 View* test_view = new View; |
45 child_.reset(new Widget); | 86 child_.reset(new Widget); |
46 Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL); | 87 Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL); |
47 child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 88 child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
48 child_params.parent = toplevel_->GetNativeView(); | 89 child_params.parent = toplevel_->GetNativeView(); |
49 child_->Init(child_params); | 90 child_->Init(child_params); |
50 child_->SetContentsView(test_view); | 91 child_->SetContentsView(test_view); |
51 | 92 |
52 // Owned by |toplevel|. | 93 // Owned by |toplevel|. |
53 host_.reset(new NativeViewHost); | 94 host_.reset(new NativeViewHostTesting); |
54 toplevel_->GetRootView()->AddChildView(host_.get()); | 95 toplevel_->GetRootView()->AddChildView(host_.get()); |
55 host_->Attach(child_->GetNativeView()); | 96 host_->Attach(child_->GetNativeView()); |
56 } | 97 } |
57 | 98 |
58 void DestroyHost() { | 99 void DestroyHost() { |
59 host_.reset(); | 100 host_.reset(); |
60 } | 101 } |
61 | 102 |
103 NativeViewHostTesting* ReleaseHost() { | |
104 return host_.release(); | |
105 } | |
106 | |
107 void DestroyTopLevel() { | |
108 toplevel_.reset(); | |
109 } | |
110 | |
111 gfx::Point CalculateNativeViewOrigin(gfx::Rect input_rect, | |
112 gfx::Rect native_rect) { | |
113 return native_host()->CalculateNativeViewOrigin(input_rect, native_rect); | |
114 } | |
115 | |
62 private: | 116 private: |
63 scoped_ptr<Widget> toplevel_; | 117 scoped_ptr<Widget> toplevel_; |
64 scoped_ptr<NativeViewHost> host_; | 118 scoped_ptr<NativeViewHostTesting> host_; |
65 scoped_ptr<Widget> child_; | 119 scoped_ptr<Widget> child_; |
66 | 120 |
67 DISALLOW_COPY_AND_ASSIGN(NativeViewHostAuraTest); | 121 DISALLOW_COPY_AND_ASSIGN(NativeViewHostAuraTest); |
68 }; | 122 }; |
69 | 123 |
70 // Verifies NativeViewHostAura stops observing native view on destruction. | 124 // Verifies NativeViewHostAura stops observing native view on destruction. |
71 TEST_F(NativeViewHostAuraTest, StopObservingNativeViewOnDestruct) { | 125 TEST_F(NativeViewHostAuraTest, StopObservingNativeViewOnDestruct) { |
72 CreateHost(); | 126 CreateHost(); |
73 aura::Window* child_win = child()->GetNativeView(); | 127 aura::Window* child_win = child()->GetNativeView(); |
74 NativeViewHostAura* aura_host = native_host(); | 128 NativeViewHostAura* aura_host = native_host(); |
(...skipping 13 matching lines...) Expand all Loading... | |
88 host()->Detach(); | 142 host()->Detach(); |
89 EXPECT_FALSE(child_win->GetProperty(views::kHostViewKey)); | 143 EXPECT_FALSE(child_win->GetProperty(views::kHostViewKey)); |
90 | 144 |
91 host()->Attach(child_win); | 145 host()->Attach(child_win); |
92 EXPECT_EQ(host(), child_win->GetProperty(views::kHostViewKey)); | 146 EXPECT_EQ(host(), child_win->GetProperty(views::kHostViewKey)); |
93 | 147 |
94 DestroyHost(); | 148 DestroyHost(); |
95 EXPECT_FALSE(child_win->GetProperty(views::kHostViewKey)); | 149 EXPECT_FALSE(child_win->GetProperty(views::kHostViewKey)); |
96 } | 150 } |
97 | 151 |
152 // Tests that the values being calculated by CalculateNativeViewOrigin are | |
153 // correct. | |
154 TEST_F(NativeViewHostAuraTest, CalculateNewNativeViewOrigin) { | |
155 CreateHost(); | |
156 | |
157 gfx::Rect clip_rect(0, 0, 50, 50); | |
158 gfx::Rect contents_rect(50, 50, 100, 100); | |
159 | |
160 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_NORTHWEST); | |
161 EXPECT_EQ(gfx::Point(0, 0), | |
sky
2013/10/10 20:25:32
Comparing strinsg (ToString()) on all points (and
rharrison
2013/10/13 13:54:57
Done.
| |
162 CalculateNativeViewOrigin(clip_rect, contents_rect)); | |
163 | |
164 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_NORTH); | |
165 EXPECT_EQ(gfx::Point(-25, 0), | |
166 CalculateNativeViewOrigin(clip_rect, contents_rect)); | |
167 | |
168 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_NORTHEAST); | |
169 EXPECT_EQ(gfx::Point(-50, 0), | |
170 CalculateNativeViewOrigin(clip_rect, contents_rect)); | |
171 | |
172 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_EAST); | |
173 EXPECT_EQ(gfx::Point(-50, -25), | |
174 CalculateNativeViewOrigin(clip_rect, contents_rect)); | |
175 | |
176 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_SOUTHEAST); | |
177 EXPECT_EQ(gfx::Point(-50, -50), | |
178 CalculateNativeViewOrigin(clip_rect, contents_rect)); | |
179 | |
180 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_SOUTH); | |
181 EXPECT_EQ(gfx::Point(-25, -50), | |
182 CalculateNativeViewOrigin(clip_rect, contents_rect)); | |
183 | |
184 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_SOUTHWEST); | |
185 EXPECT_EQ(gfx::Point(0, -50), | |
186 CalculateNativeViewOrigin(clip_rect, contents_rect)); | |
187 | |
188 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_WEST); | |
189 EXPECT_EQ(gfx::Point(0, -25), | |
190 CalculateNativeViewOrigin(clip_rect, contents_rect)); | |
191 | |
192 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_CENTER); | |
193 EXPECT_EQ(gfx::Point(-25, -25), | |
194 CalculateNativeViewOrigin(clip_rect, contents_rect)); | |
195 | |
196 DestroyHost(); | |
197 } | |
198 | |
199 // Test that the fast resize path places the clipping and content windows were | |
200 // they are supposed to be. | |
201 TEST_F(NativeViewHostAuraTest, FastResizePath) { | |
202 CreateHost(); | |
203 host()->set_fast_resize(false); | |
204 toplevel()->SetBounds(gfx::Rect(0, 0, 100, 100)); | |
205 native_host()->ShowWidget(0, 0, 100, 100); | |
206 host()->set_fast_resize(true); | |
207 | |
208 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_CENTER); | |
209 EXPECT_EQ(gfx::Rect(0, 0, 100, 100), | |
210 host()->native_view()->layer()->bounds()); | |
211 EXPECT_EQ(gfx::Rect(0, 0, 100, 100), clipping_window()->layer()->bounds()); | |
212 LOG(ERROR) << clipping_window()->layer()->bounds().ToString(); | |
213 | |
214 | |
215 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_NORTHWEST); | |
216 native_host()->ShowWidget(0, 0, 50, 50); | |
217 EXPECT_EQ(gfx::Rect(0, 0, 100, 100), | |
218 host()->native_view()->layer()->bounds()); | |
219 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), clipping_window()->layer()->bounds()); | |
220 | |
221 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_SOUTHEAST); | |
222 native_host()->ShowWidget(0, 0, 50, 50); | |
223 EXPECT_EQ(gfx::Rect(-50, -50, 100, 100), | |
224 host()->native_view()->layer()->bounds()); | |
225 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), clipping_window()->layer()->bounds()); | |
226 | |
227 DestroyHost(); | |
228 } | |
229 | |
230 // Test that destroying the top level widget before destroying the attached | |
231 // NativeViewHost works correctly. Specifically the associated NVH should be | |
232 // destroyed and there shouldn't be any errors. | |
233 TEST_F(NativeViewHostAuraTest, DestroyWidget) { | |
234 DestroyedCount::Reset(); | |
235 CreateHost(); | |
236 ReleaseHost(); | |
237 EXPECT_EQ(0, DestroyedCount::count()); | |
238 DestroyTopLevel(); | |
239 EXPECT_EQ(1, DestroyedCount::count()); | |
240 } | |
241 | |
98 } // namespace views | 242 } // namespace views |
OLD | NEW |