diff options
author | justincohen <justincohen@chromium.org> | 2015-05-19 07:09:58 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-05-19 14:10:02 +0000 |
commit | 87c443e596cac6351b5b24cca5a8c84ce85a935f (patch) | |
tree | 0b153a4276e8505bd3e45a60b72b0d8be3378ecd /ios | |
parent | d2fb08c90b06687650c2ef4dda31bedeacef35a1 (diff) | |
download | chromium_src-87c443e596cac6351b5b24cca5a8c84ce85a935f.zip chromium_src-87c443e596cac6351b5b24cca5a8c84ce85a935f.tar.gz chromium_src-87c443e596cac6351b5b24cca5a8c84ce85a935f.tar.bz2 |
[Find in Page] Prevent scrolling past the page edge.
Sometimes the find in page js returns a text position that is too far down.
Correct all |points| sent to -setContentOffset for overscroll.
BUG=472091
Review URL: https://codereview.chromium.org/1071723002
Cr-Commit-Position: refs/heads/master@{#330518}
Diffstat (limited to 'ios')
-rw-r--r-- | ios/chrome/browser/find_in_page/find_in_page_controller.mm | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/ios/chrome/browser/find_in_page/find_in_page_controller.mm b/ios/chrome/browser/find_in_page/find_in_page_controller.mm index 0d1621e..bc8a5c9 100644 --- a/ios/chrome/browser/find_in_page/find_in_page_controller.mm +++ b/ios/chrome/browser/find_in_page/find_in_page_controller.mm @@ -5,6 +5,7 @@ #import "ios/chrome/browser/find_in_page/find_in_page_controller.h" #import <UIKit/UIKit.h> +#import <cmath> #include "base/ios/ios_util.h" #include "base/logging.h" @@ -58,6 +59,9 @@ const NSTimeInterval kRecurringPumpDelay = .01; - (void)processPumpResult:(BOOL)finished scrollPoint:(CGPoint)scrollPoint completionHandler:(ProceduralBlock)completionHandler; +// Prevent scrolling past the end of the page. +- (CGPoint)limitOverscroll:(CRWWebViewScrollViewProxy*)scrollViewProxy + atPoint:(CGPoint)point; // Returns the associated web state. May be null. - (web::WebState*)webState; @end @@ -133,11 +137,24 @@ const NSTimeInterval kRecurringPumpDelay = .01; return [_webViewProxy scrollViewProxy]; } +- (CGPoint)limitOverscroll:(CRWWebViewScrollViewProxy*)scrollViewProxy + atPoint:(CGPoint)point { + CGFloat contentHeight = scrollViewProxy.contentSize.height; + CGFloat frameHeight = scrollViewProxy.frame.size.height; + CGFloat maxScroll = std::max<CGFloat>(0, contentHeight - frameHeight); + if (point.y > maxScroll) { + point.y = maxScroll; + } + return point; +} + - (void)processPumpResult:(BOOL)finished scrollPoint:(CGPoint)scrollPoint completionHandler:(ProceduralBlock)completionHandler { if (finished) { [_delegate willAdjustScrollPosition]; + scrollPoint = [self limitOverscroll:[_webViewProxy scrollViewProxy] + atPoint:scrollPoint]; [[_webViewProxy scrollViewProxy] setContentOffset:scrollPoint animated:YES]; if (completionHandler) completionHandler(); @@ -199,6 +216,8 @@ const NSTimeInterval kRecurringPumpDelay = .01; base::scoped_nsobject<FindInPageController> strongSelf([weakSelf retain]); if (finished) { [[strongSelf delegate] willAdjustScrollPosition]; + point = [strongSelf limitOverscroll:[strongSelf webViewScrollView] + atPoint:point]; [[strongSelf webViewScrollView] setContentOffset:point animated:YES]; } completionHandler(finished); @@ -212,12 +231,8 @@ const NSTimeInterval kRecurringPumpDelay = .01; [_findInPageJsManager nextMatchWithCompletionHandler:^(CGPoint point) { base::scoped_nsobject<FindInPageController> strongSelf([weakSelf retain]); [[strongSelf delegate] willAdjustScrollPosition]; - CGFloat contentHeight = [strongSelf webViewScrollView].contentSize.height; - CGFloat frameHeight = [strongSelf webViewScrollView].frame.size.height; - CGFloat maxScroll = fmax(0, contentHeight - frameHeight); - if (point.y > maxScroll) { - point.y = maxScroll; - } + point = [strongSelf limitOverscroll:[strongSelf webViewScrollView] + atPoint:point]; [[strongSelf webViewScrollView] setContentOffset:point animated:YES]; if (completionHandler) completionHandler(); @@ -232,6 +247,8 @@ const NSTimeInterval kRecurringPumpDelay = .01; [_findInPageJsManager previousMatchWithCompletionHandler:^(CGPoint point) { base::scoped_nsobject<FindInPageController> strongSelf([weakSelf retain]); [[strongSelf delegate] willAdjustScrollPosition]; + point = [strongSelf limitOverscroll:[strongSelf webViewScrollView] + atPoint:point]; [[strongSelf webViewScrollView] setContentOffset:point animated:YES]; if (completionHandler) completionHandler(); |