Index: ios/chrome/browser/find_in_page/find_in_page_controller.mm |
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 0d1621e15ae12f2e5c816d8048dc24394cdec2ad..bc8a5c9621d860da554a4fa220a5c393e81339b5 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(); |