Index: content/browser/web_contents/aura/window_slider_unittest.cc |
diff --git a/content/browser/web_contents/aura/window_slider_unittest.cc b/content/browser/web_contents/aura/window_slider_unittest.cc |
index 369d951e254233decc3ff8e0f2677ccaf3945204..9b9261cc34151002197bfa3bc60afdfab5de460b 100644 |
--- a/content/browser/web_contents/aura/window_slider_unittest.cc |
+++ b/content/browser/web_contents/aura/window_slider_unittest.cc |
@@ -60,7 +60,8 @@ class NoEventWindowDelegate : public aura::test::TestWindowDelegate { |
class WindowSliderDelegateTest : public WindowSlider::Delegate { |
public: |
WindowSliderDelegateTest() |
- : created_back_layer_(false), |
+ : can_create_layer_(true), |
+ created_back_layer_(false), |
created_front_layer_(false), |
slide_completed_(false), |
slide_aborted_(false), |
@@ -69,6 +70,7 @@ class WindowSliderDelegateTest : public WindowSlider::Delegate { |
virtual ~WindowSliderDelegateTest() {} |
void Reset() { |
+ can_create_layer_ = true; |
created_back_layer_ = false; |
created_front_layer_ = false; |
slide_completed_ = false; |
@@ -76,14 +78,19 @@ class WindowSliderDelegateTest : public WindowSlider::Delegate { |
slider_destroyed_ = false; |
} |
+ void SetCanCreateLayer(bool can_create_layer) { |
+ can_create_layer_ = can_create_layer; |
+ } |
+ |
bool created_back_layer() const { return created_back_layer_; } |
bool created_front_layer() const { return created_front_layer_; } |
bool slide_completed() const { return slide_completed_; } |
bool slide_aborted() const { return slide_aborted_; } |
bool slider_destroyed() const { return slider_destroyed_; } |
- private: |
+ protected: |
ui::Layer* CreateLayerForTest() { |
+ CHECK(can_create_layer_); |
ui::Layer* layer = new ui::Layer(ui::LAYER_SOLID_COLOR); |
layer->SetColor(SK_ColorRED); |
return layer; |
@@ -91,11 +98,15 @@ class WindowSliderDelegateTest : public WindowSlider::Delegate { |
// Overridden from WindowSlider::Delegate: |
virtual ui::Layer* CreateBackLayer() OVERRIDE { |
+ if (!can_create_layer_) |
+ return NULL; |
created_back_layer_ = true; |
return CreateLayerForTest(); |
} |
virtual ui::Layer* CreateFrontLayer() OVERRIDE { |
+ if (!can_create_layer_) |
+ return NULL; |
created_front_layer_ = true; |
return CreateLayerForTest(); |
} |
@@ -112,6 +123,8 @@ class WindowSliderDelegateTest : public WindowSlider::Delegate { |
slider_destroyed_ = true; |
} |
+ private: |
+ bool can_create_layer_; |
bool created_back_layer_; |
bool created_front_layer_; |
bool slide_completed_; |
@@ -121,6 +134,44 @@ class WindowSliderDelegateTest : public WindowSlider::Delegate { |
DISALLOW_COPY_AND_ASSIGN(WindowSliderDelegateTest); |
}; |
+// This delegate destroys the owner window when the slider is destroyed. |
+class WindowSliderDeleteOwnerOnDestroy : public WindowSliderDelegateTest { |
+ public: |
+ explicit WindowSliderDeleteOwnerOnDestroy(aura::Window* owner) |
+ : owner_(owner) { |
+ } |
+ virtual ~WindowSliderDeleteOwnerOnDestroy() {} |
+ |
+ private: |
+ // Overridden from WindowSlider::Delegate: |
+ virtual void OnWindowSliderDestroyed() OVERRIDE { |
+ WindowSliderDelegateTest::OnWindowSliderDestroyed(); |
+ delete owner_; |
+ } |
+ |
+ aura::Window* owner_; |
+ DISALLOW_COPY_AND_ASSIGN(WindowSliderDeleteOwnerOnDestroy); |
+}; |
+ |
+// This delegate destroyes the owner window when a slide is completed. |
+class WindowSliderDeleteOwnerOnComplete : public WindowSliderDelegateTest { |
+ public: |
+ explicit WindowSliderDeleteOwnerOnComplete(aura::Window* owner) |
+ : owner_(owner) { |
+ } |
+ virtual ~WindowSliderDeleteOwnerOnComplete() {} |
+ |
+ private: |
+ // Overridden from WindowSlider::Delegate: |
+ virtual void OnWindowSlideComplete() OVERRIDE { |
+ WindowSliderDelegateTest::OnWindowSlideComplete(); |
+ delete owner_; |
+ } |
+ |
+ aura::Window* owner_; |
+ DISALLOW_COPY_AND_ASSIGN(WindowSliderDeleteOwnerOnComplete); |
+}; |
+ |
typedef aura::test::AuraTestBase WindowSliderTest; |
TEST_F(WindowSliderTest, WindowSlideUsingGesture) { |
@@ -268,4 +319,93 @@ TEST_F(WindowSliderTest, OwnerWindowChangesDuringWindowSlide) { |
EXPECT_TRUE(slider_delegate.slider_destroyed()); |
} |
+TEST_F(WindowSliderTest, NoSlideWhenLayerCantBeCreated) { |
+ scoped_ptr<aura::Window> window(CreateNormalWindow(0, root_window(), NULL)); |
+ window->SetBounds(gfx::Rect(0, 0, 400, 400)); |
+ WindowSliderDelegateTest slider_delegate; |
+ slider_delegate.SetCanCreateLayer(false); |
+ |
+ aura::test::EventGenerator generator(root_window()); |
+ |
+ // Generate a horizontal overscroll. |
+ new WindowSlider(&slider_delegate, root_window(), window.get()); |
+ generator.GestureScrollSequence(gfx::Point(10, 10), |
+ gfx::Point(160, 10), |
+ base::TimeDelta::FromMilliseconds(10), |
+ 10); |
+ EXPECT_FALSE(slider_delegate.created_back_layer()); |
+ EXPECT_FALSE(slider_delegate.slide_completed()); |
+ EXPECT_FALSE(slider_delegate.created_front_layer()); |
+ EXPECT_FALSE(slider_delegate.slide_aborted()); |
+ EXPECT_FALSE(slider_delegate.slider_destroyed()); |
+ window->SetTransform(gfx::Transform()); |
+ |
+ slider_delegate.SetCanCreateLayer(true); |
+ generator.GestureScrollSequence(gfx::Point(10, 10), |
+ gfx::Point(160, 10), |
+ base::TimeDelta::FromMilliseconds(10), |
+ 10); |
+ EXPECT_TRUE(slider_delegate.created_back_layer()); |
+ EXPECT_TRUE(slider_delegate.slide_completed()); |
+ EXPECT_FALSE(slider_delegate.created_front_layer()); |
+ EXPECT_FALSE(slider_delegate.slide_aborted()); |
+ EXPECT_TRUE(slider_delegate.slider_destroyed()); |
+} |
+ |
+// Tests that the owner window can be destroyed from |OnWindowSliderDestroyed()| |
+// delegate callback without causing a crash. |
+TEST_F(WindowSliderTest, OwnerIsDestroyedOnSliderDestroy) { |
+ size_t child_windows = root_window()->children().size(); |
+ aura::Window* window = CreateNormalWindow(0, root_window(), NULL); |
+ window->SetBounds(gfx::Rect(0, 0, 400, 400)); |
+ EXPECT_EQ(child_windows + 1, root_window()->children().size()); |
+ |
+ WindowSliderDeleteOwnerOnDestroy slider_delegate(window); |
+ aura::test::EventGenerator generator(root_window()); |
+ |
+ // Generate a horizontal overscroll. |
+ new WindowSlider(&slider_delegate, root_window(), window); |
+ generator.GestureScrollSequence(gfx::Point(10, 10), |
+ gfx::Point(160, 10), |
+ base::TimeDelta::FromMilliseconds(10), |
+ 10); |
+ EXPECT_TRUE(slider_delegate.created_back_layer()); |
+ EXPECT_TRUE(slider_delegate.slide_completed()); |
+ EXPECT_FALSE(slider_delegate.created_front_layer()); |
+ EXPECT_FALSE(slider_delegate.slide_aborted()); |
+ EXPECT_TRUE(slider_delegate.slider_destroyed()); |
+ |
+ // Destroying the slider would have destroyed |window| too. So |window| should |
+ // not need to be destroyed here. |
+ EXPECT_EQ(child_windows, root_window()->children().size()); |
+} |
+ |
+// Tests that the owner window can be destroyed from |OnWindowSlideComplete()| |
+// delegate callback without causing a crash. |
+TEST_F(WindowSliderTest, OwnerIsDestroyedOnSlideComplete) { |
+ size_t child_windows = root_window()->children().size(); |
+ aura::Window* window = CreateNormalWindow(0, root_window(), NULL); |
+ window->SetBounds(gfx::Rect(0, 0, 400, 400)); |
+ EXPECT_EQ(child_windows + 1, root_window()->children().size()); |
+ |
+ WindowSliderDeleteOwnerOnComplete slider_delegate(window); |
+ aura::test::EventGenerator generator(root_window()); |
+ |
+ // Generate a horizontal overscroll. |
+ new WindowSlider(&slider_delegate, root_window(), window); |
+ generator.GestureScrollSequence(gfx::Point(10, 10), |
+ gfx::Point(160, 10), |
+ base::TimeDelta::FromMilliseconds(10), |
+ 10); |
+ EXPECT_TRUE(slider_delegate.created_back_layer()); |
+ EXPECT_TRUE(slider_delegate.slide_completed()); |
+ EXPECT_FALSE(slider_delegate.created_front_layer()); |
+ EXPECT_FALSE(slider_delegate.slide_aborted()); |
+ EXPECT_TRUE(slider_delegate.slider_destroyed()); |
+ |
+ // Destroying the slider would have destroyed |window| too. So |window| should |
+ // not need to be destroyed here. |
+ EXPECT_EQ(child_windows, root_window()->children().size()); |
+} |
+ |
} // namespace content |