| 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
|
|
|