Index: content/browser/web_contents/web_contents_view_overscroll_animator_slider_mac.mm |
diff --git a/content/browser/web_contents/web_contents_view_overscroll_animator_slider_mac.mm b/content/browser/web_contents/web_contents_view_overscroll_animator_slider_mac.mm |
deleted file mode 100644 |
index b614fb13dea0fdc0f46a06b62bb0590d29665251..0000000000000000000000000000000000000000 |
--- a/content/browser/web_contents/web_contents_view_overscroll_animator_slider_mac.mm |
+++ /dev/null |
@@ -1,259 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#import <QuartzCore/QuartzCore.h> |
- |
-#include "content/browser/web_contents/web_contents_view_overscroll_animator_slider_mac.h" |
- |
-#include "content/browser/web_contents/web_contents_impl.h" |
-#include "content/public/browser/web_contents_observer.h" |
- |
-namespace { |
-// The minimum possible progress of an overscroll animation. |
-CGFloat kMinProgress = 0; |
-// The maximum possible progress of an overscroll animation. |
-CGFloat kMaxProgress = 2.0; |
-// The maximum duration of the completion or cancellation animations. The |
-// effective maximum is half of this value, since the longest animation is from |
-// progress = 1.0 to progress = 2.0; |
-CGFloat kMaxAnimationDuration = 0.2; |
-} // namespace |
- |
-// OverscrollAnimatorSliderView Private Category ------------------------------- |
- |
-@interface OverscrollAnimatorSliderView () |
-// Callback from WebContentsPaintObserver. |
-- (void)webContentsFinishedNonEmptyPaint; |
- |
-// Resets overscroll animation state. |
-- (void)reset; |
- |
-// Given a |progress| from 0 to 2, the expected frame origin of the -movingView. |
-- (NSPoint)frameOriginWithProgress:(CGFloat)progress; |
- |
-// The NSView that is moving during the overscroll animation. |
-- (NSView*)movingView; |
- |
-// The expected duration of an animation from progress_ to |progress| |
-- (CGFloat)animationDurationForProgress:(CGFloat)progress; |
- |
-// NSView override. During an overscroll animation, the cursor may no longer |
-// rest on the RenderWidgetHost's NativeView, which prevents wheel events from |
-// reaching the NativeView. The overscroll animation is driven by wheel events |
-// so they must be explicitly forwarded to the NativeView. |
-- (void)scrollWheel:(NSEvent*)event; |
-@end |
- |
-// Helper Class (ResizingView) ------------------------------------------------- |
- |
-// This NSView subclass is intended to be the RenderWidgetHost's NativeView's |
-// parent NSView. It is possible for the RenderWidgetHost's NativeView's size to |
-// become out of sync with its parent NSView. The override of |
-// -resizeSubviewsWithOldSize: ensures that the sizes will eventually become |
-// consistent. |
-// http://crbug.com/264207 |
-@interface ResizingView : NSView |
-@end |
- |
-@implementation ResizingView |
-- (void)resizeSubviewsWithOldSize:(NSSize)oldBoundsSize { |
- for (NSView* subview in self.subviews) |
- [subview setFrame:self.bounds]; |
-} |
-@end |
- |
-// Helper Class (WebContentsPaintObserver) ------------------------------------- |
- |
-namespace overscroll_animator { |
-class WebContentsPaintObserver : public content::WebContentsObserver { |
- public: |
- WebContentsPaintObserver(content::WebContents* web_contents, |
- OverscrollAnimatorSliderView* slider_view) |
- : WebContentsObserver(web_contents), slider_view_(slider_view) {} |
- |
- void DidFirstVisuallyNonEmptyPaint() override { |
- [slider_view_ webContentsFinishedNonEmptyPaint]; |
- } |
- |
- private: |
- OverscrollAnimatorSliderView* slider_view_; // Weak reference. |
-}; |
-} // namespace overscroll_animator |
- |
-// OverscrollAnimatorSliderView Implementation --------------------------------- |
- |
-@implementation OverscrollAnimatorSliderView |
- |
-- (instancetype)initWithFrame:(NSRect)frame { |
- self = [super initWithFrame:frame]; |
- if (self) { |
- bottomView_.reset([[NSImageView alloc] initWithFrame:self.bounds]); |
- bottomView_.get().imageScaling = NSImageScaleNone; |
- bottomView_.get().autoresizingMask = |
- NSViewWidthSizable | NSViewHeightSizable; |
- bottomView_.get().imageAlignment = NSImageAlignTop; |
- [self addSubview:bottomView_]; |
- middleView_.reset([[ResizingView alloc] initWithFrame:self.bounds]); |
- middleView_.get().autoresizingMask = |
- NSViewWidthSizable | NSViewHeightSizable; |
- [self addSubview:middleView_]; |
- topView_.reset([[NSImageView alloc] initWithFrame:self.bounds]); |
- topView_.get().autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; |
- topView_.get().imageScaling = NSImageScaleNone; |
- topView_.get().imageAlignment = NSImageAlignTop; |
- [self addSubview:topView_]; |
- |
- [self reset]; |
- } |
- return self; |
-} |
- |
-- (void)webContentsFinishedNonEmptyPaint { |
- observer_.reset(); |
- [self reset]; |
-} |
- |
-- (void)reset { |
- DCHECK(!animating_); |
- inOverscroll_ = NO; |
- progress_ = kMinProgress; |
- |
- [CATransaction begin]; |
- [CATransaction setDisableActions:YES]; |
- bottomView_.get().hidden = YES; |
- middleView_.get().hidden = NO; |
- topView_.get().hidden = YES; |
- |
- [bottomView_ setFrameOrigin:NSMakePoint(0, 0)]; |
- [middleView_ setFrameOrigin:NSMakePoint(0, 0)]; |
- [topView_ setFrameOrigin:NSMakePoint(0, 0)]; |
- [CATransaction commit]; |
-} |
- |
-- (NSPoint)frameOriginWithProgress:(CGFloat)progress { |
- if (direction_ == content::OVERSCROLL_ANIMATOR_DIRECTION_BACKWARDS) |
- return NSMakePoint(progress / kMaxProgress * self.bounds.size.width, 0); |
- return NSMakePoint((1 - progress / kMaxProgress) * self.bounds.size.width, 0); |
-} |
- |
-- (NSView*)movingView { |
- if (direction_ == content::OVERSCROLL_ANIMATOR_DIRECTION_BACKWARDS) |
- return middleView_; |
- return topView_; |
-} |
- |
-- (CGFloat)animationDurationForProgress:(CGFloat)progress { |
- CGFloat progressPercentage = |
- fabs(progress_ - progress) / (kMaxProgress - kMinProgress); |
- return progressPercentage * kMaxAnimationDuration; |
-} |
- |
-- (void)scrollWheel:(NSEvent*)event { |
- NSView* latestRenderWidgetHostView = [[middleView_ subviews] lastObject]; |
- [latestRenderWidgetHostView scrollWheel:event]; |
-} |
- |
-// WebContentsOverscrollAnimator Implementation -------------------------------- |
- |
-- (BOOL)needsNavigationSnapshot { |
- return YES; |
-} |
- |
-- (void)beginOverscrollInDirection: |
- (content::OverscrollAnimatorDirection)direction |
- navigationSnapshot:(NSImage*)snapshot { |
- // TODO(erikchen): If snapshot is nil, need a placeholder. |
- if (animating_ || inOverscroll_) |
- return; |
- |
- inOverscroll_ = YES; |
- direction_ = direction; |
- if (direction_ == content::OVERSCROLL_ANIMATOR_DIRECTION_BACKWARDS) { |
- // The middleView_ will slide to the right, revealing bottomView_. |
- bottomView_.get().hidden = NO; |
- [bottomView_ setImage:snapshot]; |
- } else { |
- // The topView_ will slide in from the right, concealing middleView_. |
- topView_.get().hidden = NO; |
- [topView_ setFrameOrigin:NSMakePoint(self.bounds.size.width, 0)]; |
- [topView_ setImage:snapshot]; |
- } |
- |
- [self updateOverscrollProgress:kMinProgress]; |
-} |
- |
-- (void)addRenderWidgetHostNativeView:(NSView*)view { |
- [middleView_ addSubview:view]; |
-} |
- |
-- (void)updateOverscrollProgress:(CGFloat)progress { |
- if (animating_) |
- return; |
- DCHECK_LE(progress, kMaxProgress); |
- DCHECK_GE(progress, kMinProgress); |
- progress_ = progress; |
- [[self movingView] setFrameOrigin:[self frameOriginWithProgress:progress]]; |
-} |
- |
-- (void)completeOverscroll:(content::WebContentsImpl*)webContents { |
- if (animating_ || !inOverscroll_) |
- return; |
- |
- animating_ = YES; |
- |
- NSView* view = [self movingView]; |
- [NSAnimationContext beginGrouping]; |
- [NSAnimationContext currentContext].duration = |
- [self animationDurationForProgress:kMaxProgress]; |
- [[NSAnimationContext currentContext] setCompletionHandler:^{ |
- animating_ = NO; |
- |
- // Animation is complete. Now perform page load. |
- if (direction_ == content::OVERSCROLL_ANIMATOR_DIRECTION_BACKWARDS) |
- webContents->GetController().GoBack(); |
- else |
- webContents->GetController().GoForward(); |
- |
- // Reset the position of the middleView_, but wait for the page to paint |
- // before showing it. |
- middleView_.get().hidden = YES; |
- [middleView_ setFrameOrigin:NSMakePoint(0, 0)]; |
- observer_.reset( |
- new overscroll_animator::WebContentsPaintObserver(webContents, self)); |
- }]; |
- |
- // Animate the moving view to its final position. |
- [[view animator] setFrameOrigin:[self frameOriginWithProgress:kMaxProgress]]; |
- |
- [NSAnimationContext endGrouping]; |
-} |
- |
-- (void)cancelOverscroll { |
- if (animating_) |
- return; |
- |
- if (!inOverscroll_) { |
- [self reset]; |
- return; |
- } |
- |
- animating_ = YES; |
- |
- NSView* view = [self movingView]; |
- [NSAnimationContext beginGrouping]; |
- [NSAnimationContext currentContext].duration = |
- [self animationDurationForProgress:kMinProgress]; |
- [[NSAnimationContext currentContext] setCompletionHandler:^{ |
- // Animation is complete. Reset the state. |
- animating_ = NO; |
- [self reset]; |
- }]; |
- |
- // Animate the moving view to its initial position. |
- [[view animator] setFrameOrigin:[self frameOriginWithProgress:kMinProgress]]; |
- |
- [NSAnimationContext endGrouping]; |
-} |
- |
-@end |