diff options
Diffstat (limited to 'content/browser/web_contents/web_contents_view_aura.cc')
-rw-r--r-- | content/browser/web_contents/web_contents_view_aura.cc | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc index c4505c1..4ca716d 100644 --- a/content/browser/web_contents/web_contents_view_aura.cc +++ b/content/browser/web_contents/web_contents_view_aura.cc @@ -100,7 +100,8 @@ class OverscrollWindowDelegate : public aura::WindowDelegate { OverscrollWindowDelegate(WebContentsImpl* web_contents, OverscrollMode overscroll_mode) : web_contents_(web_contents), - show_shadow_(false) { + show_shadow_(false), + forward_events_(true) { const NavigationControllerImpl& controller = web_contents->GetController(); const NavigationEntryImpl* entry = NULL; if (ShouldNavigateForward(controller, overscroll_mode)) { @@ -127,6 +128,8 @@ class OverscrollWindowDelegate : public aura::WindowDelegate { show_shadow_ = show; } + void stop_forwarding_events() { forward_events_ = false; } + private: virtual ~OverscrollWindowDelegate() {} @@ -224,12 +227,12 @@ class OverscrollWindowDelegate : public aura::WindowDelegate { // Overridden from ui::EventHandler. virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE { - if (web_contents_window()) + if (forward_events_ && web_contents_window()) web_contents_window()->delegate()->OnScrollEvent(event); } virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { - if (web_contents_window()) + if (forward_events_ && web_contents_window()) web_contents_window()->delegate()->OnGestureEvent(event); } @@ -237,6 +240,14 @@ class OverscrollWindowDelegate : public aura::WindowDelegate { gfx::Image image_; bool show_shadow_; + // The window is displayed both during the gesture, and after the gesture + // while the navigation is in progress. During the gesture, it is necessary to + // forward input events to the content page (e.g. when the overscroll window + // slides under the cursor and starts receiving scroll events). However, once + // the gesture is complete, and the window is being displayed as an overlay + // window during navigation, events should not be forwarded anymore. + bool forward_events_; + DISALLOW_COPY_AND_ASSIGN(OverscrollWindowDelegate); }; @@ -597,7 +608,8 @@ class OverscrollNavigationOverlay : loading_complete_(false), received_paint_update_(false), compositor_updated_(false), - has_screenshot_(false) { + has_screenshot_(false), + need_paint_update_(true) { } virtual ~OverscrollNavigationOverlay() { @@ -629,6 +641,10 @@ class OverscrollNavigationOverlay : has_screenshot_ = has_screenshot; } + void SetupForTesting() { + need_paint_update_ = false; + } + private: // Stop observing the page if the page-load has completed and the page has // been painted. @@ -638,8 +654,10 @@ class OverscrollNavigationOverlay : // hiding the overlay. // If there is no screenshot in the overlay window, then hide this view // as soon as there is any new painting notification. - if (!received_paint_update_ || (has_screenshot_ && !loading_complete_)) + if ((need_paint_update_ && !received_paint_update_) || + (has_screenshot_ && !loading_complete_)) { return; + } window_.reset(); if (view_) { @@ -681,6 +699,11 @@ class OverscrollNavigationOverlay : bool compositor_updated_; bool has_screenshot_; + // During tests, the aura windows don't get any paint updates. So the overlay + // container keeps waiting for a paint update it never receives, causing a + // timeout. So during tests, disable the wait for paint updates. + bool need_paint_update_; + DISALLOW_COPY_AND_ASSIGN(OverscrollNavigationOverlay); }; @@ -858,6 +881,11 @@ WebContentsViewAura::~WebContentsViewAura() { window_.reset(); } +void WebContentsViewAura::SetupOverlayWindowForTesting() { + if (navigation_overlay_.get()) + navigation_overlay_->SetupForTesting(); +} + void WebContentsViewAura::SizeChangedCommon(const gfx::Size& size) { if (web_contents_->GetInterstitialPage()) web_contents_->GetInterstitialPage()->SetSize(size); @@ -1051,6 +1079,7 @@ void WebContentsViewAura::PrepareOverscrollNavigationOverlay() { OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>( overscroll_window_->delegate()); delegate->set_show_shadow(false); + delegate->stop_forwarding_events(); overscroll_window_->SchedulePaintInRect( gfx::Rect(overscroll_window_->bounds().size())); navigation_overlay_->SetOverlayWindow(overscroll_window_.Pass(), @@ -1379,7 +1408,8 @@ void WebContentsViewAura::OnOverscrollModeChange(OverscrollMode old_mode, // Reset any in-progress overscroll animation first. ResetOverscrollTransform(); - if (new_mode == OVERSCROLL_NONE) { + if (new_mode == OVERSCROLL_NONE || + (navigation_overlay_.get() && navigation_overlay_->has_window())) { current_overscroll_gesture_ = OVERSCROLL_NONE; } else { // Cleanup state of the content window first, because that can reset the |