| Index: content/browser/web_contents/aura/overscroll_navigation_overlay_unittest.cc
|
| diff --git a/content/browser/web_contents/aura/overscroll_navigation_overlay_unittest.cc b/content/browser/web_contents/aura/overscroll_navigation_overlay_unittest.cc
|
| index 3182ca579fd46cec8e0bd1a6e056e6736f800b91..bd9ab089c1c2f788b0bd666b99a807d112fd6dd5 100644
|
| --- a/content/browser/web_contents/aura/overscroll_navigation_overlay_unittest.cc
|
| +++ b/content/browser/web_contents/aura/overscroll_navigation_overlay_unittest.cc
|
| @@ -4,12 +4,10 @@
|
|
|
| #include "content/browser/web_contents/aura/overscroll_navigation_overlay.h"
|
|
|
| -#include <vector>
|
| #include "content/browser/frame_host/navigation_entry_impl.h"
|
| #include "content/browser/web_contents/web_contents_view.h"
|
| #include "content/common/frame_messages.h"
|
| #include "content/common/view_messages.h"
|
| -#include "content/public/browser/overscroll_configuration.h"
|
| #include "content/public/test/mock_render_process_host.h"
|
| #include "content/test/test_render_frame_host.h"
|
| #include "content/test/test_render_view_host.h"
|
| @@ -17,62 +15,21 @@
|
| #include "ui/aura/test/test_windows.h"
|
| #include "ui/aura/window.h"
|
| #include "ui/aura_extra/image_window_delegate.h"
|
| -#include "ui/compositor/scoped_animation_duration_scale_mode.h"
|
| -#include "ui/compositor/scoped_layer_animation_settings.h"
|
| -#include "ui/compositor/test/layer_animator_test_controller.h"
|
| -#include "ui/events/gesture_detection/gesture_configuration.h"
|
| -#include "ui/events/test/event_generator.h"
|
| #include "ui/gfx/codec/png_codec.h"
|
| -#include "ui/gfx/frame_time.h"
|
|
|
| namespace content {
|
|
|
| -// A subclass of TestWebContents that offers a fake content window.
|
| -class OverscrollTestWebContents : public TestWebContents {
|
| - public:
|
| - ~OverscrollTestWebContents() override {}
|
| -
|
| - static OverscrollTestWebContents* Create(
|
| - BrowserContext* browser_context,
|
| - SiteInstance* instance,
|
| - scoped_ptr<aura::Window> fake_native_view,
|
| - scoped_ptr<aura::Window> fake_contents_window) {
|
| - OverscrollTestWebContents* web_contents = new OverscrollTestWebContents(
|
| - browser_context, fake_native_view.Pass(), fake_contents_window.Pass());
|
| - web_contents->Init(WebContents::CreateParams(browser_context, instance));
|
| - web_contents->RenderFrameCreated(web_contents->GetMainFrame());
|
| - return web_contents;
|
| - }
|
| -
|
| - gfx::NativeView GetNativeView() override { return fake_native_view_.get(); }
|
| -
|
| - gfx::NativeView GetContentNativeView() override {
|
| - return fake_contents_window_.get();
|
| - }
|
| -
|
| - protected:
|
| - explicit OverscrollTestWebContents(
|
| - BrowserContext* browser_context,
|
| - scoped_ptr<aura::Window> fake_native_view,
|
| - scoped_ptr<aura::Window> fake_contents_window)
|
| - : TestWebContents(browser_context),
|
| - fake_native_view_(fake_native_view.Pass()),
|
| - fake_contents_window_(fake_contents_window.Pass()) {}
|
| -
|
| - private:
|
| - scoped_ptr<aura::Window> fake_native_view_;
|
| - scoped_ptr<aura::Window> fake_contents_window_;
|
| -};
|
| -
|
| class OverscrollNavigationOverlayTest : public RenderViewHostImplTestHarness {
|
| public:
|
| - OverscrollNavigationOverlayTest()
|
| - : first_("https://www.google.com"),
|
| - second_("http://www.chromium.org"),
|
| - third_("https://www.kernel.org/"),
|
| - fourth_("https://github.com/") {}
|
| + OverscrollNavigationOverlayTest() {}
|
| + ~OverscrollNavigationOverlayTest() override {}
|
|
|
| - ~OverscrollNavigationOverlayTest() override {}
|
| + gfx::Image CreateDummyScreenshot() {
|
| + SkBitmap bitmap;
|
| + bitmap.allocN32Pixels(1, 1);
|
| + bitmap.eraseColor(SK_ColorWHITE);
|
| + return gfx::Image::CreateFrom1xBitmap(bitmap);
|
| + }
|
|
|
| void SetDummyScreenshotOnNavEntry(NavigationEntry* entry) {
|
| SkBitmap bitmap;
|
| @@ -94,77 +51,28 @@
|
| }
|
|
|
| void PerformBackNavigationViaSliderCallbacks() {
|
| - // Sets slide direction to BACK, sets screenshot from NavEntry at
|
| + // Sets slide direction to SLIDE_BACK, sets screenshot from NavEntry at
|
| // offset -1 on layer_delegate_.
|
| - scoped_ptr<aura::Window> window(
|
| - GetOverlay()->CreateBackWindow(GetBackSlideWindowBounds()));
|
| + delete GetOverlay()->CreateBackLayer();
|
| // Performs BACK navigation, sets image from layer_delegate_ on
|
| // image_delegate_.
|
| - GetOverlay()->OnOverscrollCompleting();
|
| - if (window) {
|
| - EXPECT_TRUE(contents()->cross_navigation_pending());
|
| - EXPECT_EQ(GetOverlay()->direction_, OverscrollNavigationOverlay::BACK);
|
| - } else {
|
| - EXPECT_FALSE(contents()->cross_navigation_pending());
|
| - EXPECT_EQ(GetOverlay()->direction_, OverscrollNavigationOverlay::NONE);
|
| - }
|
| - window->SetBounds(gfx::Rect(root_window()->bounds().size()));
|
| - GetOverlay()->OnOverscrollCompleted(window.Pass());
|
| + GetOverlay()->OnWindowSlideCompleting();
|
| + GetOverlay()->OnWindowSlideCompleted(scoped_ptr<ui::Layer>());
|
| }
|
| -
|
| - gfx::Rect GetFrontSlideWindowBounds() {
|
| - gfx::Rect bounds = gfx::Rect(root_window()->bounds().size());
|
| - bounds.Offset(root_window()->bounds().size().width(), 0);
|
| - return bounds;
|
| - }
|
| -
|
| - gfx::Rect GetBackSlideWindowBounds() {
|
| - return gfx::Rect(root_window()->bounds().size());
|
| - }
|
| -
|
| - // Const accessors.
|
| - const GURL first() { return first_; }
|
| - const GURL second() { return second_; }
|
| - const GURL third() { return third_; }
|
| - const GURL fourth() { return fourth_; }
|
|
|
| protected:
|
| // RenderViewHostImplTestHarness:
|
| void SetUp() override {
|
| RenderViewHostImplTestHarness::SetUp();
|
|
|
| - // Set up the fake web contents native view.
|
| - scoped_ptr<aura::Window> fake_native_view(new aura::Window(nullptr));
|
| - fake_native_view->Init(ui::LAYER_SOLID_COLOR);
|
| - root_window()->AddChild(fake_native_view.get());
|
| - fake_native_view->SetBounds(gfx::Rect(root_window()->bounds().size()));
|
| -
|
| - // Set up the fake contents window.
|
| - scoped_ptr<aura::Window> fake_contents_window(new aura::Window(nullptr));
|
| - fake_contents_window->Init(ui::LAYER_SOLID_COLOR);
|
| - root_window()->AddChild(fake_contents_window.get());
|
| - fake_contents_window->SetBounds(gfx::Rect(root_window()->bounds().size()));
|
| -
|
| - // Replace the default test web contents with our custom class.
|
| - SetContents(OverscrollTestWebContents::Create(
|
| - browser_context(),
|
| - SiteInstance::Create(browser_context()),
|
| - fake_native_view.Pass(),
|
| - fake_contents_window.Pass()));
|
| -
|
| - contents()->NavigateAndCommit(first());
|
| + const GURL first("https://www.google.com");
|
| + contents()->NavigateAndCommit(first);
|
| EXPECT_TRUE(controller().GetVisibleEntry());
|
| EXPECT_FALSE(controller().CanGoBack());
|
|
|
| - contents()->NavigateAndCommit(second());
|
| + const GURL second("http://www.chromium.org");
|
| + contents()->NavigateAndCommit(second);
|
| EXPECT_TRUE(controller().CanGoBack());
|
| -
|
| - contents()->NavigateAndCommit(third());
|
| - EXPECT_TRUE(controller().CanGoBack());
|
| -
|
| - contents()->NavigateAndCommit(fourth_);
|
| - EXPECT_TRUE(controller().CanGoBack());
|
| - EXPECT_FALSE(controller().CanGoForward());
|
|
|
| // Receive a paint update. This is necessary to make sure the size is set
|
| // correctly in RenderWidgetHostImpl.
|
| @@ -178,7 +86,22 @@
|
| test_rvh()->ResetSizeAndRepaintPendingFlags();
|
|
|
| // Create the overlay, and set the contents of the overlay window.
|
| - overlay_.reset(new OverscrollNavigationOverlay(contents(), root_window()));
|
| + overlay_.reset(new OverscrollNavigationOverlay(contents()));
|
| + aura_extra::ImageWindowDelegate* image_delegate =
|
| + new aura_extra::ImageWindowDelegate();
|
| + scoped_ptr<aura::Window> overlay_window(
|
| + aura::test::CreateTestWindowWithDelegate(
|
| + image_delegate,
|
| + 0,
|
| + gfx::Rect(root_window()->bounds().size()),
|
| + root_window()));
|
| +
|
| + overlay_->SetOverlayWindow(overlay_window.Pass(), image_delegate);
|
| + overlay_->StartObserving();
|
| +
|
| + EXPECT_TRUE(overlay_->web_contents());
|
| + EXPECT_FALSE(overlay_->loading_complete_);
|
| + EXPECT_FALSE(overlay_->received_paint_update_);
|
| }
|
|
|
| void TearDown() override {
|
| @@ -191,95 +114,72 @@
|
| }
|
|
|
| private:
|
| - // Tests URLs.
|
| - const GURL first_;
|
| - const GURL second_;
|
| - const GURL third_;
|
| - const GURL fourth_;
|
| -
|
| scoped_ptr<OverscrollNavigationOverlay> overlay_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(OverscrollNavigationOverlayTest);
|
| };
|
|
|
| -// Tests that if a screenshot is available, it is set in the overlay window
|
| -// delegate.
|
| -TEST_F(OverscrollNavigationOverlayTest, WithScreenshot) {
|
| +TEST_F(OverscrollNavigationOverlayTest, FirstVisuallyNonEmptyPaint_NoImage) {
|
| + ReceivePaintUpdate();
|
| + EXPECT_TRUE(GetOverlay()->received_paint_update_);
|
| + EXPECT_FALSE(GetOverlay()->loading_complete_);
|
| + // The paint update will hide the overlay.
|
| + EXPECT_FALSE(GetOverlay()->web_contents());
|
| +}
|
| +
|
| +TEST_F(OverscrollNavigationOverlayTest, FirstVisuallyNonEmptyPaint_WithImage) {
|
| + GetOverlay()->image_delegate_->SetImage(CreateDummyScreenshot());
|
| +
|
| + ReceivePaintUpdate();
|
| + EXPECT_TRUE(GetOverlay()->received_paint_update_);
|
| + EXPECT_FALSE(GetOverlay()->loading_complete_);
|
| + // The paint update will hide the overlay.
|
| + EXPECT_FALSE(GetOverlay()->web_contents());
|
| +}
|
| +
|
| +TEST_F(OverscrollNavigationOverlayTest, LoadUpdateWithoutNonEmptyPaint) {
|
| + GetOverlay()->image_delegate_->SetImage(CreateDummyScreenshot());
|
| + process()->sink().ClearMessages();
|
| +
|
| + contents()->TestSetIsLoading(false);
|
| + EXPECT_TRUE(GetOverlay()->loading_complete_);
|
| + EXPECT_FALSE(GetOverlay()->received_paint_update_);
|
| + // The page load should hide the overlay.
|
| + EXPECT_FALSE(GetOverlay()->web_contents());
|
| +}
|
| +
|
| +TEST_F(OverscrollNavigationOverlayTest, MultiNavigation_PaintUpdate) {
|
| + GetOverlay()->image_delegate_->SetImage(CreateDummyScreenshot());
|
| SetDummyScreenshotOnNavEntry(controller().GetEntryAtOffset(-1));
|
| +
|
| PerformBackNavigationViaSliderCallbacks();
|
| // Screenshot was set on NavEntry at offset -1.
|
| - EXPECT_TRUE(static_cast<aura_extra::ImageWindowDelegate*>(
|
| - GetOverlay()->window_->delegate())->has_image());
|
| -}
|
| + EXPECT_TRUE(GetOverlay()->image_delegate_->has_image());
|
| + EXPECT_FALSE(GetOverlay()->received_paint_update_);
|
|
|
| -// Tests that if a screenshot is not available, no image is set in the overlay
|
| -// window delegate.
|
| -TEST_F(OverscrollNavigationOverlayTest, WithoutScreenshot) {
|
| - PerformBackNavigationViaSliderCallbacks();
|
| - // No screenshot was set on NavEntry at offset -1.
|
| - EXPECT_FALSE(static_cast<aura_extra::ImageWindowDelegate*>(
|
| - GetOverlay()->window_->delegate())->has_image());
|
| -}
|
| -
|
| -// Tests that if a navigation is attempted but there is nothing to navigate to,
|
| -// we return a null window.
|
| -TEST_F(OverscrollNavigationOverlayTest, CannotNavigate) {
|
| - EXPECT_EQ(GetOverlay()->CreateFrontWindow(GetFrontSlideWindowBounds()),
|
| - nullptr);
|
| -}
|
| -
|
| -// Tests that if a navigation is cancelled, no navigation is performed and the
|
| -// state is restored.
|
| -TEST_F(OverscrollNavigationOverlayTest, CancelNavigation) {
|
| - scoped_ptr<aura::Window> window =
|
| - GetOverlay()->CreateBackWindow(GetBackSlideWindowBounds());
|
| - EXPECT_EQ(GetOverlay()->direction_, OverscrollNavigationOverlay::BACK);
|
| -
|
| - GetOverlay()->OnOverscrollCancelled();
|
| - EXPECT_FALSE(contents()->cross_navigation_pending());
|
| - EXPECT_EQ(GetOverlay()->direction_, OverscrollNavigationOverlay::NONE);
|
| -}
|
| -
|
| -// Performs two navigations. The second navigation is cancelled, tests that the
|
| -// first one worked correctly.
|
| -TEST_F(OverscrollNavigationOverlayTest, CancelAfterSuccessfulNavigation) {
|
| - PerformBackNavigationViaSliderCallbacks();
|
| - scoped_ptr<aura::Window> wrapper =
|
| - GetOverlay()->CreateBackWindow(GetBackSlideWindowBounds());
|
| - EXPECT_EQ(GetOverlay()->direction_, OverscrollNavigationOverlay::BACK);
|
| -
|
| - GetOverlay()->OnOverscrollCancelled();
|
| - EXPECT_EQ(GetOverlay()->direction_, OverscrollNavigationOverlay::NONE);
|
| -
|
| - EXPECT_TRUE(contents()->cross_navigation_pending());
|
| - contents()->CommitPendingNavigation();
|
| - EXPECT_EQ(contents()->GetURL(), third());
|
| -}
|
| -
|
| -// Tests that an overscroll navigation that receives a paint update actually
|
| -// stops observing.
|
| -TEST_F(OverscrollNavigationOverlayTest, Navigation_PaintUpdate) {
|
| - PerformBackNavigationViaSliderCallbacks();
|
| ReceivePaintUpdate();
|
| -
|
| // Paint updates until the navigation is committed typically represent updates
|
| - // for the previous page, so we should still be observing.
|
| - EXPECT_TRUE(GetOverlay()->web_contents());
|
| + // for the previous page, so they shouldn't affect the flag.
|
| + EXPECT_FALSE(GetOverlay()->received_paint_update_);
|
|
|
| contents()->CommitPendingNavigation();
|
| ReceivePaintUpdate();
|
| + // Navigation was committed and the paint update was received - the flag
|
| + // should now be updated.
|
| + EXPECT_TRUE(GetOverlay()->received_paint_update_);
|
|
|
| - // Navigation was committed and the paint update was received - we should no
|
| - // longer be observing.
|
| EXPECT_FALSE(GetOverlay()->web_contents());
|
| - EXPECT_EQ(contents()->GetURL(), third());
|
| }
|
|
|
| -// Tests that an overscroll navigation that receives a loading update actually
|
| -// stops observing.
|
| -TEST_F(OverscrollNavigationOverlayTest, Navigation_LoadingUpdate) {
|
| +TEST_F(OverscrollNavigationOverlayTest, MultiNavigation_LoadingUpdate) {
|
| + GetOverlay()->image_delegate_->SetImage(CreateDummyScreenshot());
|
| +
|
| PerformBackNavigationViaSliderCallbacks();
|
| - EXPECT_TRUE(GetOverlay()->web_contents());
|
| + // No screenshot was set on NavEntry at offset -1.
|
| + EXPECT_FALSE(GetOverlay()->image_delegate_->has_image());
|
| + // Navigation was started, so the loading status flag should be reset.
|
| + EXPECT_FALSE(GetOverlay()->loading_complete_);
|
| +
|
| // DidStopLoading for any navigation should always reset the load flag and
|
| // dismiss the overlay even if the pending navigation wasn't committed -
|
| // this is a "safety net" in case we mis-identify the destination webpage
|
| @@ -287,89 +187,9 @@
|
| // navigation is in progress).
|
| contents()->TestSetIsLoading(true);
|
| contents()->TestSetIsLoading(false);
|
| + EXPECT_TRUE(GetOverlay()->loading_complete_);
|
| +
|
| EXPECT_FALSE(GetOverlay()->web_contents());
|
| - contents()->CommitPendingNavigation();
|
| - EXPECT_EQ(contents()->GetURL(), third());
|
| -}
|
| -
|
| -// Tests that swapping the overlay window at the end of a gesture caused by the
|
| -// start of a new overscroll does not crash and the events still reach the new
|
| -// overlay window.
|
| -TEST_F(OverscrollNavigationOverlayTest, OverlayWindowSwap) {
|
| - PerformBackNavigationViaSliderCallbacks();
|
| - aura::Window* first_overlay_window = GetOverlay()->window_.get();
|
| - EXPECT_TRUE(GetOverlay()->web_contents());
|
| - EXPECT_TRUE(first_overlay_window);
|
| -
|
| - // At this stage, the overlay window is covering the web contents. Configure
|
| - // the animator of the overlay window for the test.
|
| - ui::ScopedAnimationDurationScaleMode normal_duration(
|
| - ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
|
| - ui::LayerAnimator* animator = GetOverlay()->window_->layer()->GetAnimator();
|
| - animator->set_disable_timer_for_test(true);
|
| - ui::LayerAnimatorTestController test_controller(animator);
|
| -
|
| - int overscroll_complete_distance =
|
| - root_window()->bounds().size().width() *
|
| - content::GetOverscrollConfig(
|
| - content::OVERSCROLL_CONFIG_HORIZ_THRESHOLD_COMPLETE) +
|
| - ui::GestureConfiguration::GetInstance()
|
| - ->max_touch_move_in_pixels_for_click() + 1;
|
| -
|
| - // Start and complete a back navigation via a gesture.
|
| - ui::test::EventGenerator generator(root_window());
|
| - generator.GestureScrollSequence(gfx::Point(0, 0),
|
| - gfx::Point(overscroll_complete_distance, 0),
|
| - base::TimeDelta::FromMilliseconds(10),
|
| - 10);
|
| -
|
| - ui::ScopedLayerAnimationSettings settings(animator);
|
| - test_controller.StartThreadedAnimationsIfNeeded();
|
| -
|
| - // The overlay window should now be being animated to the edge of the screen.
|
| - // |first()overlay_window| is the back window.
|
| - // This is what the screen should look like. The X indicates where the next
|
| - // gesture starts for the test.
|
| - // +---------root_window--------+
|
| - // |+-back window--+--front window--+
|
| - // || | | |
|
| - // || 1 |X 2 | |
|
| - // || | | |
|
| - // |+--------------+------------|---+
|
| - // +----------------------------+
|
| - // | overscroll ||
|
| - // | complete ||
|
| - // | distance ||
|
| - // |<------------->||
|
| - // | second |
|
| - // | overscroll |
|
| - // | start distance |
|
| - // |<-------------->|
|
| - EXPECT_EQ(GetOverlay()->window_.get(), first_overlay_window);
|
| -
|
| - // The overlay window is halfway through, start another animation that will
|
| - // cancel the first one. The event that cancels the animation will go to
|
| - // the slide window, which will be used as the overlay window when the new
|
| - // overscroll starts.
|
| - int second_overscroll_start_distance = overscroll_complete_distance + 1;
|
| - generator.GestureScrollSequence(
|
| - gfx::Point(second_overscroll_start_distance, 0),
|
| - gfx::Point(
|
| - second_overscroll_start_distance + overscroll_complete_distance, 0),
|
| - base::TimeDelta::FromMilliseconds(10), 10);
|
| - EXPECT_TRUE(GetOverlay()->window_.get());
|
| - // The overlay window should be a new window.
|
| - EXPECT_NE(GetOverlay()->window_.get(), first_overlay_window);
|
| -
|
| - // Complete the animation.
|
| - GetOverlay()->window_->layer()->GetAnimator()->StopAnimating();
|
| - EXPECT_TRUE(GetOverlay()->window_.get());
|
| -
|
| - // Load the page.
|
| - contents()->CommitPendingNavigation();
|
| - ReceivePaintUpdate();
|
| - EXPECT_FALSE(GetOverlay()->window_.get());
|
| - EXPECT_EQ(contents()->GetURL(), first());
|
| }
|
|
|
| } // namespace content
|
|
|