OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 958 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
969 if (m_gestureAnimation) { | 969 if (m_gestureAnimation) { |
970 m_gestureAnimation.clear(); | 970 m_gestureAnimation.clear(); |
971 m_flingSourceDevice = WebGestureDeviceUninitialized; | 971 m_flingSourceDevice = WebGestureDeviceUninitialized; |
972 if (m_layerTreeView) | 972 if (m_layerTreeView) |
973 m_layerTreeView->didStopFlinging(); | 973 m_layerTreeView->didStopFlinging(); |
974 return true; | 974 return true; |
975 } | 975 } |
976 return false; | 976 return false; |
977 } | 977 } |
978 | 978 |
979 bool WebViewImpl::startPageScaleAnimation(const IntPoint& targetPosition, bool u
seAnchor, float newScale, double durationInSeconds) | 979 void WebViewImpl::startPageScaleAnimation(const IntPoint& targetPosition, bool u
seAnchor, float newScale, double durationInSeconds) |
980 { | 980 { |
981 VisualViewport& visualViewport = page()->frameHost().visualViewport(); | 981 VisualViewport& visualViewport = page()->frameHost().visualViewport(); |
982 WebPoint clampedPoint = targetPosition; | 982 WebPoint clampedPoint = targetPosition; |
983 if (!useAnchor) { | 983 if (!useAnchor) { |
984 clampedPoint = visualViewport.clampDocumentOffsetAtScale(targetPosition,
newScale); | 984 clampedPoint = visualViewport.clampDocumentOffsetAtScale(targetPosition,
newScale); |
985 if (!durationInSeconds) { | 985 if (!durationInSeconds) { |
986 setPageScaleFactor(newScale); | 986 setPageScaleFactor(newScale); |
987 | 987 |
988 FrameView* view = mainFrameImpl()->frameView(); | 988 FrameView* view = mainFrameImpl()->frameView(); |
989 if (view && view->getScrollableArea()) | 989 if (view && view->getScrollableArea()) |
990 view->getScrollableArea()->setScrollPosition(DoublePoint(clamped
Point.x, clampedPoint.y), ProgrammaticScroll); | 990 view->getScrollableArea()->setScrollPosition(DoublePoint(clamped
Point.x, clampedPoint.y), ProgrammaticScroll); |
991 | |
992 return false; | |
993 } | 991 } |
994 } | 992 } |
995 if (useAnchor && newScale == pageScaleFactor()) | 993 if (useAnchor && newScale == pageScaleFactor()) |
996 return false; | 994 return; |
997 | 995 |
998 if (m_enableFakePageScaleAnimationForTesting) { | 996 if (m_enableFakePageScaleAnimationForTesting) { |
999 m_fakePageScaleAnimationTargetPosition = targetPosition; | 997 m_fakePageScaleAnimationTargetPosition = targetPosition; |
1000 m_fakePageScaleAnimationUseAnchor = useAnchor; | 998 m_fakePageScaleAnimationUseAnchor = useAnchor; |
1001 m_fakePageScaleAnimationPageScaleFactor = newScale; | 999 m_fakePageScaleAnimationPageScaleFactor = newScale; |
1002 } else { | 1000 } else if (m_layerTreeView) { |
1003 if (!m_layerTreeView) | |
1004 return false; | |
1005 m_layerTreeView->startPageScaleAnimation(targetPosition, useAnchor, newS
cale, durationInSeconds); | 1001 m_layerTreeView->startPageScaleAnimation(targetPosition, useAnchor, newS
cale, durationInSeconds); |
1006 } | 1002 } |
1007 return true; | |
1008 } | 1003 } |
1009 | 1004 |
1010 void WebViewImpl::enableFakePageScaleAnimationForTesting(bool enable) | 1005 void WebViewImpl::enableFakePageScaleAnimationForTesting(bool enable) |
1011 { | 1006 { |
1012 m_enableFakePageScaleAnimationForTesting = enable; | 1007 m_enableFakePageScaleAnimationForTesting = enable; |
1013 } | 1008 } |
1014 | 1009 |
1015 void WebViewImpl::setShowFPSCounter(bool show) | 1010 void WebViewImpl::setShowFPSCounter(bool show) |
1016 { | 1011 { |
1017 if (m_layerTreeView) { | 1012 if (m_layerTreeView) { |
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1442 | 1437 |
1443 computeScaleAndScrollForBlockRect(pointInRootFrame, blockBounds, touchPointP
adding, minimumPageScaleFactor() * doubleTapZoomAlreadyLegibleRatio, scale, scro
ll); | 1438 computeScaleAndScrollForBlockRect(pointInRootFrame, blockBounds, touchPointP
adding, minimumPageScaleFactor() * doubleTapZoomAlreadyLegibleRatio, scale, scro
ll); |
1444 | 1439 |
1445 bool stillAtPreviousDoubleTapScale = (pageScaleFactor() == m_doubleTapZoomPa
geScaleFactor | 1440 bool stillAtPreviousDoubleTapScale = (pageScaleFactor() == m_doubleTapZoomPa
geScaleFactor |
1446 && m_doubleTapZoomPageScaleFactor != minimumPageScaleFactor()) | 1441 && m_doubleTapZoomPageScaleFactor != minimumPageScaleFactor()) |
1447 || m_doubleTapZoomPending; | 1442 || m_doubleTapZoomPending; |
1448 | 1443 |
1449 bool scaleUnchanged = fabs(pageScaleFactor() - scale) < minScaleDifference; | 1444 bool scaleUnchanged = fabs(pageScaleFactor() - scale) < minScaleDifference; |
1450 bool shouldZoomOut = blockBounds.isEmpty() || scaleUnchanged || stillAtPrevi
ousDoubleTapScale; | 1445 bool shouldZoomOut = blockBounds.isEmpty() || scaleUnchanged || stillAtPrevi
ousDoubleTapScale; |
1451 | 1446 |
1452 bool isAnimating; | |
1453 | |
1454 if (shouldZoomOut) { | 1447 if (shouldZoomOut) { |
1455 scale = minimumPageScaleFactor(); | 1448 scale = minimumPageScaleFactor(); |
1456 IntPoint targetPosition = mainFrameImpl()->frameView()->rootFrameToConte
nts(pointInRootFrame); | 1449 IntPoint targetPosition = mainFrameImpl()->frameView()->rootFrameToConte
nts(pointInRootFrame); |
1457 isAnimating = startPageScaleAnimation(targetPosition, true, scale, doubl
eTapZoomAnimationDurationInSeconds); | 1450 startPageScaleAnimation(targetPosition, true, scale, doubleTapZoomAnimat
ionDurationInSeconds); |
1458 } else { | 1451 } else { |
1459 isAnimating = startPageScaleAnimation(scroll, false, scale, doubleTapZoo
mAnimationDurationInSeconds); | 1452 startPageScaleAnimation(scroll, false, scale, doubleTapZoomAnimationDura
tionInSeconds); |
1460 } | 1453 } |
1461 | 1454 |
1462 if (isAnimating) { | 1455 if (m_layerTreeView->hasPendingPageScaleAnimation()) { |
1463 m_doubleTapZoomPageScaleFactor = scale; | 1456 m_doubleTapZoomPageScaleFactor = scale; |
1464 m_doubleTapZoomPending = true; | 1457 m_doubleTapZoomPending = true; |
1465 } | 1458 } |
1466 } | 1459 } |
1467 | 1460 |
1468 void WebViewImpl::zoomToFindInPageRect(const WebRect& rectInRootFrame) | 1461 void WebViewImpl::zoomToFindInPageRect(const WebRect& rectInRootFrame) |
1469 { | 1462 { |
1470 if (!mainFrameImpl()) | 1463 if (!mainFrameImpl()) |
1471 return; | 1464 return; |
1472 | 1465 |
(...skipping 1458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2931 return; | 2924 return; |
2932 | 2925 |
2933 // If a text field has focus, we need to make sure the selection controller | 2926 // If a text field has focus, we need to make sure the selection controller |
2934 // knows to remove selection from it. Otherwise, the text field is still | 2927 // knows to remove selection from it. Otherwise, the text field is still |
2935 // processing keyboard events even though focus has been moved to the page a
nd | 2928 // processing keyboard events even though focus has been moved to the page a
nd |
2936 // keystrokes get eaten as a result. | 2929 // keystrokes get eaten as a result. |
2937 if (oldFocusedElement->isContentEditable() || oldFocusedElement->isTextFormC
ontrol()) | 2930 if (oldFocusedElement->isContentEditable() || oldFocusedElement->isTextFormC
ontrol()) |
2938 localFrame->selection().clear(); | 2931 localFrame->selection().clear(); |
2939 } | 2932 } |
2940 | 2933 |
2941 bool WebViewImpl::scrollFocusedNodeIntoRect(const WebRect& rectInViewport) | 2934 // TODO(dglazkov): Remove and replace with Node:hasEditableStyle. |
| 2935 // http://crbug.com/612560 |
| 2936 static bool isElementEditable(const Element* element) |
| 2937 { |
| 2938 if (element->isContentEditable()) |
| 2939 return true; |
| 2940 |
| 2941 if (element->isTextFormControl()) { |
| 2942 const HTMLTextFormControlElement* input = toHTMLTextFormControlElement(e
lement); |
| 2943 if (!input->isDisabledOrReadOnly()) |
| 2944 return true; |
| 2945 } |
| 2946 |
| 2947 return equalIgnoringCase(element->getAttribute(HTMLNames::roleAttr), "textbo
x"); |
| 2948 } |
| 2949 |
| 2950 bool WebViewImpl::scrollFocusedEditableElementIntoRect(const WebRect& rectInView
port) |
2942 { | 2951 { |
2943 LocalFrame* frame = page()->mainFrame() && page()->mainFrame()->isLocalFrame
() | 2952 LocalFrame* frame = page()->mainFrame() && page()->mainFrame()->isLocalFrame
() |
2944 ? page()->deprecatedLocalMainFrame() : nullptr; | 2953 ? page()->deprecatedLocalMainFrame() : nullptr; |
2945 Element* element = focusedElement(); | 2954 Element* element = focusedElement(); |
2946 if (!frame || !frame->view() || !element) | 2955 if (!frame || !frame->view() || !element) |
2947 return false; | 2956 return false; |
2948 | 2957 |
| 2958 if (!isElementEditable(element)) |
| 2959 return false; |
| 2960 |
2949 element->document().updateLayoutIgnorePendingStylesheets(); | 2961 element->document().updateLayoutIgnorePendingStylesheets(); |
2950 | 2962 |
2951 bool zoomInToLegibleScale = m_webSettings->autoZoomFocusedNodeToLegibleScale
() | 2963 bool zoomInToLegibleScale = m_webSettings->autoZoomFocusedNodeToLegibleScale
() |
2952 && !page()->frameHost().visualViewport().shouldDisableDesktopWorkarounds
(); | 2964 && !page()->frameHost().visualViewport().shouldDisableDesktopWorkarounds
(); |
2953 | 2965 |
2954 if (zoomInToLegibleScale) { | 2966 if (zoomInToLegibleScale) { |
2955 // When deciding whether to zoom in on a focused text box, we should dec
ide not to | 2967 // When deciding whether to zoom in on a focused text box, we should dec
ide not to |
2956 // zoom in if the user won't be able to zoom out. e.g if the textbox is
within a | 2968 // zoom in if the user won't be able to zoom out. e.g if the textbox is
within a |
2957 // touch-action: none container the user can't zoom back out. | 2969 // touch-action: none container the user can't zoom back out. |
2958 TouchAction action = TouchActionUtil::computeEffectiveTouchAction(*eleme
nt); | 2970 TouchAction action = TouchActionUtil::computeEffectiveTouchAction(*eleme
nt); |
2959 if (!(action & TouchActionPinchZoom)) | 2971 if (!(action & TouchActionPinchZoom)) |
2960 zoomInToLegibleScale = false; | 2972 zoomInToLegibleScale = false; |
2961 } | 2973 } |
2962 | 2974 |
2963 float scale; | 2975 float scale; |
2964 IntPoint scroll; | 2976 IntPoint scroll; |
2965 bool needAnimation; | 2977 bool needAnimation; |
2966 computeScaleAndScrollForFocusedNode(element, zoomInToLegibleScale, scale, sc
roll, needAnimation); | 2978 computeScaleAndScrollForFocusedNode(element, zoomInToLegibleScale, scale, sc
roll, needAnimation); |
2967 if (needAnimation) | 2979 if (needAnimation) |
2968 return startPageScaleAnimation(scroll, false, scale, scrollAndScaleAnima
tionDurationInSeconds); | 2980 startPageScaleAnimation(scroll, false, scale, scrollAndScaleAnimationDur
ationInSeconds); |
2969 | 2981 |
2970 return false; | 2982 return true; |
2971 } | 2983 } |
2972 | 2984 |
2973 void WebViewImpl::smoothScroll(int targetX, int targetY, long durationMs) | 2985 void WebViewImpl::smoothScroll(int targetX, int targetY, long durationMs) |
2974 { | 2986 { |
2975 IntPoint targetPosition(targetX, targetY); | 2987 IntPoint targetPosition(targetX, targetY); |
2976 startPageScaleAnimation(targetPosition, false, pageScaleFactor(), (double)du
rationMs / 1000); | 2988 startPageScaleAnimation(targetPosition, false, pageScaleFactor(), (double)du
rationMs / 1000); |
2977 } | 2989 } |
2978 | 2990 |
2979 void WebViewImpl::computeScaleAndScrollForFocusedNode(Node* focusedNode, bool zo
omInToLegibleScale, float& newScale, IntPoint& newScroll, bool& needAnimation) | 2991 void WebViewImpl::computeScaleAndScrollForFocusedNode(Node* focusedNode, bool zo
omInToLegibleScale, float& newScale, IntPoint& newScroll, bool& needAnimation) |
2980 { | 2992 { |
(...skipping 1541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4522 { | 4534 { |
4523 // TODO(oshima): Investigate if this should return the ScreenInfo's scale fa
ctor rather than | 4535 // TODO(oshima): Investigate if this should return the ScreenInfo's scale fa
ctor rather than |
4524 // page's scale factor, which can be 1 in use-zoom-for-dsf mode. | 4536 // page's scale factor, which can be 1 in use-zoom-for-dsf mode. |
4525 if (!page()) | 4537 if (!page()) |
4526 return 1; | 4538 return 1; |
4527 | 4539 |
4528 return page()->deviceScaleFactor(); | 4540 return page()->deviceScaleFactor(); |
4529 } | 4541 } |
4530 | 4542 |
4531 } // namespace blink | 4543 } // namespace blink |
OLD | NEW |