Changeset 233883 in webkit


Ignore:
Timestamp:
Jul 16, 2018 9:44:23 PM (6 years ago)
Author:
Megan Gardner
Message:

Correctly adjust scroll offsets when a page is zoomed
https://bugs.webkit.org/show_bug.cgi?id=187673
<rdar://problem/41712829>

Reviewed by Wenson Hsieh.

Will add test later.

Make sure that distance is scaled by the pageScaleFactor, to
make sure that we scroll correctly when we are zoomed in.

  • page/ios/EventHandlerIOS.mm:

(WebCore::autoscrollAdjustmentFactorForScreenBoundaries):

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r233882 r233883  
     12018-07-16  Megan Gardner  <megan_gardner@apple.com>
     2
     3        Correctly adjust scroll offsets when a page is zoomed
     4        https://bugs.webkit.org/show_bug.cgi?id=187673
     5        <rdar://problem/41712829>
     6
     7        Reviewed by Wenson Hsieh.
     8
     9        Will add test later.
     10
     11        Make sure that distance is scaled by the pageScaleFactor, to
     12        make sure that we scroll correctly when we are zoomed in.
     13
     14        * page/ios/EventHandlerIOS.mm:
     15        (WebCore::autoscrollAdjustmentFactorForScreenBoundaries):
     16       
    1172018-07-16  Simon Fraser  <simon.fraser@apple.com>
    218
  • trunk/Source/WebCore/page/ios/EventHandlerIOS.mm

    r228549 r233883  
    579579}
    580580
    581 static IntSize autoscrollAdjustmentFactorForScreenBoundaries(const IntPoint& screenPoint, const FloatRect& screenRect)
     581static IntSize autoscrollAdjustmentFactorForScreenBoundaries(const IntPoint& contentPosition, const FloatRect& unobscuredContentRect, float zoomFactor)
    582582{
    583583    // If the window is at the edge of the screen, and the touch position is also at that edge of the screen,
     
    591591#define EDGE_DISTANCE_THRESHOLD 100
    592592
    593     float screenLeftEdge = screenRect.x();
    594     float insetScreenLeftEdge = screenLeftEdge + EDGE_DISTANCE_THRESHOLD;
    595     float screenRightEdge = screenRect.maxX();
    596     float insetScreenRightEdge = screenRightEdge - EDGE_DISTANCE_THRESHOLD;
    597     if (screenPoint.x() >= screenLeftEdge && screenPoint.x() < insetScreenLeftEdge) {
    598         float distanceFromEdge = screenPoint.x() - screenLeftEdge - EDGE_DISTANCE_THRESHOLD;
     593    CGSize edgeDistanceThreshold = CGSizeMake(EDGE_DISTANCE_THRESHOLD / zoomFactor, EDGE_DISTANCE_THRESHOLD / zoomFactor);
     594   
     595    float screenLeftEdge = unobscuredContentRect.x();
     596    float insetScreenLeftEdge = screenLeftEdge + edgeDistanceThreshold.width;
     597    float screenRightEdge = unobscuredContentRect.maxX();
     598    float insetScreenRightEdge = screenRightEdge - edgeDistanceThreshold.width;
     599    if (contentPosition.x() >= screenLeftEdge && contentPosition.x() < insetScreenLeftEdge) {
     600        float distanceFromEdge = contentPosition.x() - screenLeftEdge - edgeDistanceThreshold.width;
    599601        if (distanceFromEdge < 0)
    600             adjustmentFactor.setWidth(-EDGE_DISTANCE_THRESHOLD);
    601     } else if (screenPoint.x() >= insetScreenRightEdge && screenPoint.x() < screenRightEdge) {
    602         float distanceFromEdge = EDGE_DISTANCE_THRESHOLD - (screenRightEdge - screenPoint.x());
     602            adjustmentFactor.setWidth(-edgeDistanceThreshold.width);
     603    } else if (contentPosition.x() >= insetScreenRightEdge && contentPosition.x() < screenRightEdge) {
     604        float distanceFromEdge = edgeDistanceThreshold.width - (screenRightEdge - contentPosition.x());
    603605        if (distanceFromEdge > 0)
    604             adjustmentFactor.setWidth(EDGE_DISTANCE_THRESHOLD);
    605     }
    606    
    607     float screenTopEdge = screenRect.y();
    608     float insetScreenTopEdge = screenTopEdge + EDGE_DISTANCE_THRESHOLD;
    609     float screenBottomEdge = screenRect.maxY();
    610     float insetScreenBottomEdge = screenBottomEdge - EDGE_DISTANCE_THRESHOLD;
    611    
    612     if (screenPoint.y() >= screenTopEdge && screenPoint.y() < insetScreenTopEdge) {
    613         float distanceFromEdge = screenPoint.y() - screenTopEdge - EDGE_DISTANCE_THRESHOLD;
     606            adjustmentFactor.setWidth(edgeDistanceThreshold.width);
     607    }
     608   
     609    float screenTopEdge = unobscuredContentRect.y();
     610    float insetScreenTopEdge = screenTopEdge + edgeDistanceThreshold.height;
     611    float screenBottomEdge = unobscuredContentRect.maxY();
     612    float insetScreenBottomEdge = screenBottomEdge - edgeDistanceThreshold.height;
     613   
     614    if (contentPosition.y() >= screenTopEdge && contentPosition.y() < insetScreenTopEdge) {
     615        float distanceFromEdge = contentPosition.y() - screenTopEdge - edgeDistanceThreshold.height;
    614616        if (distanceFromEdge < 0)
    615             adjustmentFactor.setHeight(-EDGE_DISTANCE_THRESHOLD);
    616     } else if (screenPoint.y() >= insetScreenBottomEdge && screenPoint.y() < screenBottomEdge) {
    617         float distanceFromEdge = EDGE_DISTANCE_THRESHOLD - (screenBottomEdge - screenPoint.y());
     617            adjustmentFactor.setHeight(-edgeDistanceThreshold.height);
     618    } else if (contentPosition.y() >= insetScreenBottomEdge && contentPosition.y() < screenBottomEdge) {
     619        float distanceFromEdge = edgeDistanceThreshold.height - (screenBottomEdge - contentPosition.y());
    618620        if (distanceFromEdge > 0)
    619             adjustmentFactor.setHeight(EDGE_DISTANCE_THRESHOLD);
     621            adjustmentFactor.setHeight(edgeDistanceThreshold.height);
    620622    }
    621623   
     
    631633    // Manually need to convert viewToContents, as it will be skipped because delegatedScrolling is on iOS
    632634    IntPoint contentPosition = protectedFrame->view()->viewToContents(protectedFrame->view()->convertFromContainingWindow(m_targetAutoscrollPositionInWindow));
    633     IntSize adjustPosition = autoscrollAdjustmentFactorForScreenBoundaries(contentPosition, unobscuredContentRect);
     635    IntSize adjustPosition = autoscrollAdjustmentFactorForScreenBoundaries(contentPosition, unobscuredContentRect, protectedFrame->page()->pageScaleFactor());
    634636    return contentPosition + adjustPosition;
    635637}
Note: See TracChangeset for help on using the changeset viewer.