| 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 views { | 16 namespace views { |
| 17 | 17 |
| 18 // Testing wrapper of the NativeViewHost |
| 19 class NativeViewHostTesting : public NativeViewHost { |
| 20 public: |
| 21 NativeViewHostTesting() {} |
| 22 virtual ~NativeViewHostTesting() { |
| 23 destroyed_count_++; |
| 24 } |
| 25 |
| 26 static void ResetDestroyedCount() { |
| 27 destroyed_count_ = 0; |
| 28 } |
| 29 |
| 30 static int destroyed_count() { |
| 31 return destroyed_count_; |
| 32 } |
| 33 |
| 34 private: |
| 35 static int destroyed_count_; |
| 36 }; |
| 37 int NativeViewHostTesting::destroyed_count_ = 0; |
| 38 |
| 18 class NativeViewHostAuraTest : public ViewsTestBase { | 39 class NativeViewHostAuraTest : public ViewsTestBase { |
| 19 public: | 40 public: |
| 20 NativeViewHostAuraTest() { | 41 NativeViewHostAuraTest() { |
| 21 } | 42 } |
| 22 | 43 |
| 23 NativeViewHostAura* native_host() { | 44 NativeViewHostAura* native_host() { |
| 24 return static_cast<NativeViewHostAura*>(host_->native_wrapper_.get()); | 45 return static_cast<NativeViewHostAura*>(host_->native_wrapper_.get()); |
| 25 } | 46 } |
| 26 | 47 |
| 27 NativeViewHost* host() { | 48 NativeViewHost* host() { |
| 28 return host_.get(); | 49 return host_.get(); |
| 29 } | 50 } |
| 30 | 51 |
| 31 Widget* child() { | 52 Widget* child() { |
| 32 return child_.get(); | 53 return child_.get(); |
| 33 } | 54 } |
| 34 | 55 |
| 56 aura::Window* clipping_window() { |
| 57 return &(native_host()->clipping_window_); |
| 58 } |
| 59 |
| 60 Widget* toplevel() { |
| 61 return toplevel_.get(); |
| 62 } |
| 63 |
| 35 void CreateHost() { | 64 void CreateHost() { |
| 36 // Create the top level widget. | 65 // Create the top level widget. |
| 37 toplevel_.reset(new Widget); | 66 toplevel_.reset(new Widget); |
| 38 Widget::InitParams toplevel_params = | 67 Widget::InitParams toplevel_params = |
| 39 CreateParams(Widget::InitParams::TYPE_WINDOW); | 68 CreateParams(Widget::InitParams::TYPE_WINDOW); |
| 40 toplevel_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 69 toplevel_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| 41 toplevel_->Init(toplevel_params); | 70 toplevel_->Init(toplevel_params); |
| 42 | 71 |
| 43 // And the child widget. | 72 // And the child widget. |
| 44 View* test_view = new View; | 73 View* test_view = new View; |
| 45 child_.reset(new Widget); | 74 child_.reset(new Widget); |
| 46 Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL); | 75 Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL); |
| 47 child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 76 child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| 48 child_params.parent = toplevel_->GetNativeView(); | 77 child_params.parent = toplevel_->GetNativeView(); |
| 49 child_->Init(child_params); | 78 child_->Init(child_params); |
| 50 child_->SetContentsView(test_view); | 79 child_->SetContentsView(test_view); |
| 51 | 80 |
| 52 // Owned by |toplevel|. | 81 // Owned by |toplevel|. |
| 53 host_.reset(new NativeViewHost); | 82 host_.reset(new NativeViewHostTesting); |
| 54 toplevel_->GetRootView()->AddChildView(host_.get()); | 83 toplevel_->GetRootView()->AddChildView(host_.get()); |
| 55 host_->Attach(child_->GetNativeView()); | 84 host_->Attach(child_->GetNativeView()); |
| 56 } | 85 } |
| 57 | 86 |
| 58 void DestroyHost() { | 87 void DestroyHost() { |
| 59 host_.reset(); | 88 host_.reset(); |
| 60 } | 89 } |
| 61 | 90 |
| 91 NativeViewHostTesting* ReleaseHost() { |
| 92 return host_.release(); |
| 93 } |
| 94 |
| 95 void DestroyTopLevel() { |
| 96 toplevel_.reset(); |
| 97 } |
| 98 |
| 99 gfx::Point CalculateNativeViewOrigin(gfx::Rect input_rect, |
| 100 gfx::Rect native_rect) { |
| 101 return native_host()->CalculateNativeViewOrigin(input_rect, native_rect); |
| 102 } |
| 103 |
| 62 private: | 104 private: |
| 63 scoped_ptr<Widget> toplevel_; | 105 scoped_ptr<Widget> toplevel_; |
| 64 scoped_ptr<NativeViewHost> host_; | 106 scoped_ptr<NativeViewHostTesting> host_; |
| 65 scoped_ptr<Widget> child_; | 107 scoped_ptr<Widget> child_; |
| 66 | 108 |
| 67 DISALLOW_COPY_AND_ASSIGN(NativeViewHostAuraTest); | 109 DISALLOW_COPY_AND_ASSIGN(NativeViewHostAuraTest); |
| 68 }; | 110 }; |
| 69 | 111 |
| 70 // Verifies NativeViewHostAura stops observing native view on destruction. | 112 // Verifies NativeViewHostAura stops observing native view on destruction. |
| 71 TEST_F(NativeViewHostAuraTest, StopObservingNativeViewOnDestruct) { | 113 TEST_F(NativeViewHostAuraTest, StopObservingNativeViewOnDestruct) { |
| 72 CreateHost(); | 114 CreateHost(); |
| 73 aura::Window* child_win = child()->GetNativeView(); | 115 aura::Window* child_win = child()->GetNativeView(); |
| 74 NativeViewHostAura* aura_host = native_host(); | 116 NativeViewHostAura* aura_host = native_host(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 88 host()->Detach(); | 130 host()->Detach(); |
| 89 EXPECT_FALSE(child_win->GetProperty(views::kHostViewKey)); | 131 EXPECT_FALSE(child_win->GetProperty(views::kHostViewKey)); |
| 90 | 132 |
| 91 host()->Attach(child_win); | 133 host()->Attach(child_win); |
| 92 EXPECT_EQ(host(), child_win->GetProperty(views::kHostViewKey)); | 134 EXPECT_EQ(host(), child_win->GetProperty(views::kHostViewKey)); |
| 93 | 135 |
| 94 DestroyHost(); | 136 DestroyHost(); |
| 95 EXPECT_FALSE(child_win->GetProperty(views::kHostViewKey)); | 137 EXPECT_FALSE(child_win->GetProperty(views::kHostViewKey)); |
| 96 } | 138 } |
| 97 | 139 |
| 140 // Tests that the values being calculated by CalculateNativeViewOrigin are |
| 141 // correct. |
| 142 TEST_F(NativeViewHostAuraTest, CalculateNewNativeViewOrigin) { |
| 143 CreateHost(); |
| 144 |
| 145 gfx::Rect clip_rect(0, 0, 50, 50); |
| 146 gfx::Rect contents_rect(50, 50, 100, 100); |
| 147 |
| 148 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_NORTHWEST); |
| 149 EXPECT_EQ(gfx::Point(0, 0).ToString(), |
| 150 CalculateNativeViewOrigin(clip_rect, contents_rect).ToString()); |
| 151 |
| 152 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_NORTH); |
| 153 EXPECT_EQ(gfx::Point(-25, 0).ToString(), |
| 154 CalculateNativeViewOrigin(clip_rect, contents_rect).ToString()); |
| 155 |
| 156 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_NORTHEAST); |
| 157 EXPECT_EQ(gfx::Point(-50, 0).ToString(), |
| 158 CalculateNativeViewOrigin(clip_rect, contents_rect).ToString()); |
| 159 |
| 160 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_EAST); |
| 161 EXPECT_EQ(gfx::Point(-50, -25).ToString(), |
| 162 CalculateNativeViewOrigin(clip_rect, contents_rect).ToString()); |
| 163 |
| 164 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_SOUTHEAST); |
| 165 EXPECT_EQ(gfx::Point(-50, -50).ToString(), |
| 166 CalculateNativeViewOrigin(clip_rect, contents_rect).ToString()); |
| 167 |
| 168 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_SOUTH); |
| 169 EXPECT_EQ(gfx::Point(-25, -50).ToString(), |
| 170 CalculateNativeViewOrigin(clip_rect, contents_rect).ToString()); |
| 171 |
| 172 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_SOUTHWEST); |
| 173 EXPECT_EQ(gfx::Point(0, -50).ToString(), |
| 174 CalculateNativeViewOrigin(clip_rect, contents_rect).ToString()); |
| 175 |
| 176 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_WEST); |
| 177 EXPECT_EQ(gfx::Point(0, -25).ToString(), |
| 178 CalculateNativeViewOrigin(clip_rect, contents_rect).ToString()); |
| 179 |
| 180 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_CENTER); |
| 181 EXPECT_EQ(gfx::Point(-25, -25).ToString(), |
| 182 CalculateNativeViewOrigin(clip_rect, contents_rect).ToString()); |
| 183 |
| 184 DestroyHost(); |
| 185 } |
| 186 |
| 187 // Test that the fast resize path places the clipping and content windows were |
| 188 // they are supposed to be. |
| 189 TEST_F(NativeViewHostAuraTest, FastResizePath) { |
| 190 CreateHost(); |
| 191 host()->set_fast_resize(false); |
| 192 toplevel()->SetBounds(gfx::Rect(0, 0, 100, 100)); |
| 193 native_host()->ShowWidget(0, 0, 100, 100); |
| 194 host()->set_fast_resize(true); |
| 195 |
| 196 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_CENTER); |
| 197 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
| 198 host()->native_view()->layer()->bounds().ToString()); |
| 199 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
| 200 clipping_window()->layer()->bounds().ToString()); |
| 201 |
| 202 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_NORTHWEST); |
| 203 native_host()->ShowWidget(0, 0, 50, 50); |
| 204 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
| 205 host()->native_view()->layer()->bounds().ToString()); |
| 206 EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), |
| 207 clipping_window()->layer()->bounds().ToString()); |
| 208 |
| 209 host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_SOUTHEAST); |
| 210 native_host()->ShowWidget(0, 0, 50, 50); |
| 211 EXPECT_EQ(gfx::Rect(-50, -50, 100, 100).ToString(), |
| 212 host()->native_view()->layer()->bounds().ToString()); |
| 213 EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), |
| 214 clipping_window()->layer()->bounds().ToString()); |
| 215 |
| 216 DestroyHost(); |
| 217 } |
| 218 |
| 219 // Test that destroying the top level widget before destroying the attached |
| 220 // NativeViewHost works correctly. Specifically the associated NVH should be |
| 221 // destroyed and there shouldn't be any errors. |
| 222 TEST_F(NativeViewHostAuraTest, DestroyWidget) { |
| 223 NativeViewHostTesting::ResetDestroyedCount(); |
| 224 CreateHost(); |
| 225 ReleaseHost(); |
| 226 EXPECT_EQ(0, NativeViewHostTesting::destroyed_count()); |
| 227 DestroyTopLevel(); |
| 228 EXPECT_EQ(1, NativeViewHostTesting::destroyed_count()); |
| 229 } |
| 230 |
| 98 } // namespace views | 231 } // namespace views |
| OLD | NEW |