summaryrefslogtreecommitdiffstats
path: root/ios
diff options
context:
space:
mode:
authorjustincohen <justincohen@chromium.org>2015-05-19 07:09:58 -0700
committerCommit bot <commit-bot@chromium.org>2015-05-19 14:10:02 +0000
commit87c443e596cac6351b5b24cca5a8c84ce85a935f (patch)
tree0b153a4276e8505bd3e45a60b72b0d8be3378ecd /ios
parentd2fb08c90b06687650c2ef4dda31bedeacef35a1 (diff)
downloadchromium_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.mm29
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();