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 "content/browser/web_contents/aura/window_slider.h" | 5 #include "content/browser/web_contents/aura/window_slider.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 #include "ui/aura/root_window.h" | 9 #include "ui/aura/root_window.h" |
10 #include "ui/aura/test/aura_test_base.h" | 10 #include "ui/aura/test/aura_test_base.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 private: | 53 private: |
54 // Overridden from aura::WindowDelegate: | 54 // Overridden from aura::WindowDelegate: |
55 virtual bool HasHitTestMask() const OVERRIDE { return true; } | 55 virtual bool HasHitTestMask() const OVERRIDE { return true; } |
56 | 56 |
57 DISALLOW_COPY_AND_ASSIGN(NoEventWindowDelegate); | 57 DISALLOW_COPY_AND_ASSIGN(NoEventWindowDelegate); |
58 }; | 58 }; |
59 | 59 |
60 class WindowSliderDelegateTest : public WindowSlider::Delegate { | 60 class WindowSliderDelegateTest : public WindowSlider::Delegate { |
61 public: | 61 public: |
62 WindowSliderDelegateTest() | 62 WindowSliderDelegateTest() |
63 : created_back_layer_(false), | 63 : can_create_layer_(true), |
| 64 created_back_layer_(false), |
64 created_front_layer_(false), | 65 created_front_layer_(false), |
65 slide_completed_(false), | 66 slide_completed_(false), |
66 slide_aborted_(false), | 67 slide_aborted_(false), |
67 slider_destroyed_(false) { | 68 slider_destroyed_(false) { |
68 } | 69 } |
69 virtual ~WindowSliderDelegateTest() {} | 70 virtual ~WindowSliderDelegateTest() {} |
70 | 71 |
71 void Reset() { | 72 void Reset() { |
| 73 can_create_layer_ = true; |
72 created_back_layer_ = false; | 74 created_back_layer_ = false; |
73 created_front_layer_ = false; | 75 created_front_layer_ = false; |
74 slide_completed_ = false; | 76 slide_completed_ = false; |
75 slide_aborted_ = false; | 77 slide_aborted_ = false; |
76 slider_destroyed_ = false; | 78 slider_destroyed_ = false; |
77 } | 79 } |
78 | 80 |
| 81 void SetCanCreateLayer(bool can_create_layer) { |
| 82 can_create_layer_ = can_create_layer; |
| 83 } |
| 84 |
79 bool created_back_layer() const { return created_back_layer_; } | 85 bool created_back_layer() const { return created_back_layer_; } |
80 bool created_front_layer() const { return created_front_layer_; } | 86 bool created_front_layer() const { return created_front_layer_; } |
81 bool slide_completed() const { return slide_completed_; } | 87 bool slide_completed() const { return slide_completed_; } |
82 bool slide_aborted() const { return slide_aborted_; } | 88 bool slide_aborted() const { return slide_aborted_; } |
83 bool slider_destroyed() const { return slider_destroyed_; } | 89 bool slider_destroyed() const { return slider_destroyed_; } |
84 | 90 |
85 private: | 91 protected: |
86 ui::Layer* CreateLayerForTest() { | 92 ui::Layer* CreateLayerForTest() { |
| 93 CHECK(can_create_layer_); |
87 ui::Layer* layer = new ui::Layer(ui::LAYER_SOLID_COLOR); | 94 ui::Layer* layer = new ui::Layer(ui::LAYER_SOLID_COLOR); |
88 layer->SetColor(SK_ColorRED); | 95 layer->SetColor(SK_ColorRED); |
89 return layer; | 96 return layer; |
90 } | 97 } |
91 | 98 |
92 // Overridden from WindowSlider::Delegate: | 99 // Overridden from WindowSlider::Delegate: |
93 virtual ui::Layer* CreateBackLayer() OVERRIDE { | 100 virtual ui::Layer* CreateBackLayer() OVERRIDE { |
| 101 if (!can_create_layer_) |
| 102 return NULL; |
94 created_back_layer_ = true; | 103 created_back_layer_ = true; |
95 return CreateLayerForTest(); | 104 return CreateLayerForTest(); |
96 } | 105 } |
97 | 106 |
98 virtual ui::Layer* CreateFrontLayer() OVERRIDE { | 107 virtual ui::Layer* CreateFrontLayer() OVERRIDE { |
| 108 if (!can_create_layer_) |
| 109 return NULL; |
99 created_front_layer_ = true; | 110 created_front_layer_ = true; |
100 return CreateLayerForTest(); | 111 return CreateLayerForTest(); |
101 } | 112 } |
102 | 113 |
103 virtual void OnWindowSlideComplete() OVERRIDE { | 114 virtual void OnWindowSlideComplete() OVERRIDE { |
104 slide_completed_ = true; | 115 slide_completed_ = true; |
105 } | 116 } |
106 | 117 |
107 virtual void OnWindowSlideAborted() OVERRIDE { | 118 virtual void OnWindowSlideAborted() OVERRIDE { |
108 slide_aborted_ = true; | 119 slide_aborted_ = true; |
109 } | 120 } |
110 | 121 |
111 virtual void OnWindowSliderDestroyed() OVERRIDE { | 122 virtual void OnWindowSliderDestroyed() OVERRIDE { |
112 slider_destroyed_ = true; | 123 slider_destroyed_ = true; |
113 } | 124 } |
114 | 125 |
| 126 private: |
| 127 bool can_create_layer_; |
115 bool created_back_layer_; | 128 bool created_back_layer_; |
116 bool created_front_layer_; | 129 bool created_front_layer_; |
117 bool slide_completed_; | 130 bool slide_completed_; |
118 bool slide_aborted_; | 131 bool slide_aborted_; |
119 bool slider_destroyed_; | 132 bool slider_destroyed_; |
120 | 133 |
121 DISALLOW_COPY_AND_ASSIGN(WindowSliderDelegateTest); | 134 DISALLOW_COPY_AND_ASSIGN(WindowSliderDelegateTest); |
122 }; | 135 }; |
123 | 136 |
| 137 // This delegate destroys the owner window when the slider is destroyed. |
| 138 class WindowSliderDeleteOwnerOnDestroy : public WindowSliderDelegateTest { |
| 139 public: |
| 140 explicit WindowSliderDeleteOwnerOnDestroy(aura::Window* owner) |
| 141 : owner_(owner) { |
| 142 } |
| 143 virtual ~WindowSliderDeleteOwnerOnDestroy() {} |
| 144 |
| 145 private: |
| 146 // Overridden from WindowSlider::Delegate: |
| 147 virtual void OnWindowSliderDestroyed() OVERRIDE { |
| 148 WindowSliderDelegateTest::OnWindowSliderDestroyed(); |
| 149 delete owner_; |
| 150 } |
| 151 |
| 152 aura::Window* owner_; |
| 153 DISALLOW_COPY_AND_ASSIGN(WindowSliderDeleteOwnerOnDestroy); |
| 154 }; |
| 155 |
| 156 // This delegate destroyes the owner window when a slide is completed. |
| 157 class WindowSliderDeleteOwnerOnComplete : public WindowSliderDelegateTest { |
| 158 public: |
| 159 explicit WindowSliderDeleteOwnerOnComplete(aura::Window* owner) |
| 160 : owner_(owner) { |
| 161 } |
| 162 virtual ~WindowSliderDeleteOwnerOnComplete() {} |
| 163 |
| 164 private: |
| 165 // Overridden from WindowSlider::Delegate: |
| 166 virtual void OnWindowSlideComplete() OVERRIDE { |
| 167 WindowSliderDelegateTest::OnWindowSlideComplete(); |
| 168 delete owner_; |
| 169 } |
| 170 |
| 171 aura::Window* owner_; |
| 172 DISALLOW_COPY_AND_ASSIGN(WindowSliderDeleteOwnerOnComplete); |
| 173 }; |
| 174 |
124 typedef aura::test::AuraTestBase WindowSliderTest; | 175 typedef aura::test::AuraTestBase WindowSliderTest; |
125 | 176 |
126 TEST_F(WindowSliderTest, WindowSlideUsingGesture) { | 177 TEST_F(WindowSliderTest, WindowSlideUsingGesture) { |
127 scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL)); | 178 scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL)); |
128 window->SetBounds(gfx::Rect(0, 0, 400, 400)); | 179 window->SetBounds(gfx::Rect(0, 0, 400, 400)); |
129 WindowSliderDelegateTest slider_delegate; | 180 WindowSliderDelegateTest slider_delegate; |
130 | 181 |
131 aura::test::EventGenerator generator(root_window()); | 182 aura::test::EventGenerator generator(root_window()); |
132 | 183 |
133 // Generate a horizontal overscroll. | 184 // Generate a horizontal overscroll. |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 aura::Window* new_window = window.get(); | 312 aura::Window* new_window = window.get(); |
262 EXPECT_NE(old_window, new_window); | 313 EXPECT_NE(old_window, new_window); |
263 | 314 |
264 EXPECT_TRUE(slider_delegate.created_back_layer()); | 315 EXPECT_TRUE(slider_delegate.created_back_layer()); |
265 EXPECT_TRUE(slider_delegate.slide_completed()); | 316 EXPECT_TRUE(slider_delegate.slide_completed()); |
266 EXPECT_FALSE(slider_delegate.created_front_layer()); | 317 EXPECT_FALSE(slider_delegate.created_front_layer()); |
267 EXPECT_FALSE(slider_delegate.slide_aborted()); | 318 EXPECT_FALSE(slider_delegate.slide_aborted()); |
268 EXPECT_TRUE(slider_delegate.slider_destroyed()); | 319 EXPECT_TRUE(slider_delegate.slider_destroyed()); |
269 } | 320 } |
270 | 321 |
| 322 TEST_F(WindowSliderTest, NoSlideWhenLayerCantBeCreated) { |
| 323 scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL)); |
| 324 window->SetBounds(gfx::Rect(0, 0, 400, 400)); |
| 325 WindowSliderDelegateTest slider_delegate; |
| 326 slider_delegate.SetCanCreateLayer(false); |
| 327 |
| 328 aura::test::EventGenerator generator(root_window()); |
| 329 |
| 330 // Generate a horizontal overscroll. |
| 331 new WindowSlider(&slider_delegate, root_window(), window.get()); |
| 332 generator.GestureScrollSequence(gfx::Point(10, 10), |
| 333 gfx::Point(160, 10), |
| 334 base::TimeDelta::FromMilliseconds(10), |
| 335 10); |
| 336 EXPECT_FALSE(slider_delegate.created_back_layer()); |
| 337 EXPECT_FALSE(slider_delegate.slide_completed()); |
| 338 EXPECT_FALSE(slider_delegate.created_front_layer()); |
| 339 EXPECT_FALSE(slider_delegate.slide_aborted()); |
| 340 EXPECT_FALSE(slider_delegate.slider_destroyed()); |
| 341 window->SetTransform(gfx::Transform()); |
| 342 |
| 343 slider_delegate.SetCanCreateLayer(true); |
| 344 generator.GestureScrollSequence(gfx::Point(10, 10), |
| 345 gfx::Point(160, 10), |
| 346 base::TimeDelta::FromMilliseconds(10), |
| 347 10); |
| 348 EXPECT_TRUE(slider_delegate.created_back_layer()); |
| 349 EXPECT_TRUE(slider_delegate.slide_completed()); |
| 350 EXPECT_FALSE(slider_delegate.created_front_layer()); |
| 351 EXPECT_FALSE(slider_delegate.slide_aborted()); |
| 352 EXPECT_TRUE(slider_delegate.slider_destroyed()); |
| 353 } |
| 354 |
| 355 // Tests that the owner window can be destroyed from |OnWindowSliderDestroyed()| |
| 356 // delegate callback without causing a crash. |
| 357 TEST_F(WindowSliderTest, OwnerIsDestroyedOnSliderDestroy) { |
| 358 size_t child_windows = root_window()->children().size(); |
| 359 aura::Window* window = CreateNormalWindow(0, root_window(), NULL); |
| 360 window->SetBounds(gfx::Rect(0, 0, 400, 400)); |
| 361 EXPECT_EQ(child_windows + 1, root_window()->children().size()); |
| 362 |
| 363 WindowSliderDeleteOwnerOnDestroy slider_delegate(window); |
| 364 aura::test::EventGenerator generator(root_window()); |
| 365 |
| 366 // Generate a horizontal overscroll. |
| 367 new WindowSlider(&slider_delegate, root_window(), window); |
| 368 generator.GestureScrollSequence(gfx::Point(10, 10), |
| 369 gfx::Point(160, 10), |
| 370 base::TimeDelta::FromMilliseconds(10), |
| 371 10); |
| 372 EXPECT_TRUE(slider_delegate.created_back_layer()); |
| 373 EXPECT_TRUE(slider_delegate.slide_completed()); |
| 374 EXPECT_FALSE(slider_delegate.created_front_layer()); |
| 375 EXPECT_FALSE(slider_delegate.slide_aborted()); |
| 376 EXPECT_TRUE(slider_delegate.slider_destroyed()); |
| 377 |
| 378 // Destroying the slider would have destroyed |window| too. So |window| should |
| 379 // not need to be destroyed here. |
| 380 EXPECT_EQ(child_windows, root_window()->children().size()); |
| 381 } |
| 382 |
| 383 // Tests that the owner window can be destroyed from |OnWindowSlideComplete()| |
| 384 // delegate callback without causing a crash. |
| 385 TEST_F(WindowSliderTest, OwnerIsDestroyedOnSlideComplete) { |
| 386 size_t child_windows = root_window()->children().size(); |
| 387 aura::Window* window = CreateNormalWindow(0, root_window(), NULL); |
| 388 window->SetBounds(gfx::Rect(0, 0, 400, 400)); |
| 389 EXPECT_EQ(child_windows + 1, root_window()->children().size()); |
| 390 |
| 391 WindowSliderDeleteOwnerOnComplete slider_delegate(window); |
| 392 aura::test::EventGenerator generator(root_window()); |
| 393 |
| 394 // Generate a horizontal overscroll. |
| 395 new WindowSlider(&slider_delegate, root_window(), window); |
| 396 generator.GestureScrollSequence(gfx::Point(10, 10), |
| 397 gfx::Point(160, 10), |
| 398 base::TimeDelta::FromMilliseconds(10), |
| 399 10); |
| 400 EXPECT_TRUE(slider_delegate.created_back_layer()); |
| 401 EXPECT_TRUE(slider_delegate.slide_completed()); |
| 402 EXPECT_FALSE(slider_delegate.created_front_layer()); |
| 403 EXPECT_FALSE(slider_delegate.slide_aborted()); |
| 404 EXPECT_TRUE(slider_delegate.slider_destroyed()); |
| 405 |
| 406 // Destroying the slider would have destroyed |window| too. So |window| should |
| 407 // not need to be destroyed here. |
| 408 EXPECT_EQ(child_windows, root_window()->children().size()); |
| 409 } |
| 410 |
271 } // namespace content | 411 } // namespace content |
OLD | NEW |