15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011, 2012 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 32f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/CSSValueKeywords.h" 3576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/HTMLNames.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/accessibility/AXObjectCache.h" 3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/clipboard/DataObject.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentMarkerController.h" 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Text.h" 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/Editor.h" 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h" 43e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu#include "core/editing/HTMLInterchange.h" 443c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "core/editing/InputMethodController.h" 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/TextIterator.h" 46e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu#include "core/editing/markup.h" 471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/KeyboardEvent.h" 481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/WheelEvent.h" 49f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "core/frame/EventHandlerRegistry.h" 50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/FrameHost.h" 5109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/FrameView.h" 52d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 53d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/PinchViewport.h" 5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/Settings.h" 5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/SmartClip.h" 5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h" 5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLMediaElement.h" 58a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/html/HTMLPlugInElement.h" 5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLTextAreaElement.h" 6019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "core/html/ime/InputMethodContext.h" 6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorController.h" 6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h" 6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h" 6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/UniqueIdentifier.h" 6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h" 6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/ContextMenuController.h" 6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/DragController.h" 6851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/page/DragData.h" 6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/DragSession.h" 7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h" 7153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FocusController.h" 7253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h" 7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/page/InjectedStyleSheets.h" 7453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h" 7553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PagePopupClient.h" 7653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PointerLockController.h" 77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/page/ScopedPageLoadDeferrer.h" 7853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/TouchDisambiguation.h" 79aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch#include "core/rendering/FastTextAutosizer.h" 8053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h" 8153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderWidget.h" 825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/rendering/TextAutosizer.h" 83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/RenderLayerCompositor.h" 8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "modules/device_orientation/DeviceOrientationInspectorAgent.h" 8507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "modules/encryptedmedia/MediaKeysController.h" 865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "modules/filesystem/InspectorFileSystemAgent.h" 8709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "modules/indexeddb/InspectorIndexedDBAgent.h" 88a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "modules/push_messaging/PushController.h" 8951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/ContextMenu.h" 9051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/ContextMenuItem.h" 91a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/Cursor.h" 9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/KeyboardCodes.h" 931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/NotImplemented.h" 94a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/OverscrollTheme.h" 951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformGestureEvent.h" 961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformKeyboardEvent.h" 971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformMouseEvent.h" 981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformWheelEvent.h" 9909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/PopupMenuClient.h" 10076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h" 1011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/TraceEvent.h" 10207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "platform/UserGestureIndicator.h" 103bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/exported/WebActiveGestureAnimation.h" 104a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/FontCache.h" 105f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/graphics/Color.h" 106a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/Image.h" 107a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/ImageBuffer.h" 108a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollbarTheme.h" 10951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SchemeRegistry.h" 1101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/Platform.h" 1111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebDragData.h" 1121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebFloatPoint.h" 1131e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebGestureCurve.h" 1141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebImage.h" 1151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebLayerTreeView.h" 1161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebVector.h" 117f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebAXObject.h" 118f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebActiveWheelFlingParameters.h" 119f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebAutofillClient.h" 120a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "public/web/WebFrameClient.h" 121f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebHitTestResult.h" 122f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebInputElement.h" 123f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebMediaPlayerAction.h" 124f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebNode.h" 125f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPlugin.h" 126f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPluginAction.h" 127f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebRange.h" 128f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebTextInputInfo.h" 129f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebViewClient.h" 130f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebWindowFeatures.h" 131f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/CompositionUnderlineVectorBuilder.h" 132f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ContextFeaturesClientImpl.h" 133f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/DatabaseClientImpl.h" 134f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/FullscreenController.h" 135f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/GraphicsLayerFactoryChromium.h" 136f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/LinkHighlight.h" 1375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "web/NavigatorContentUtilsClientImpl.h" 138f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/PopupContainer.h" 139f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/PrerendererClientImpl.h" 140f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/SpeechRecognitionClientProxy.h" 141f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/StorageQuotaClientImpl.h" 142f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ValidationMessageClientImpl.h" 143f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ViewportAnchor.h" 144f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebDevToolsAgentImpl.h" 145f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebDevToolsAgentPrivate.h" 146f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebInputEventConversion.h" 147f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebLocalFrameImpl.h" 148f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPagePopupImpl.h" 149f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPluginContainerImpl.h" 150f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPopupMenuImpl.h" 1515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "web/WebRemoteFrameImpl.h" 152f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebSettingsImpl.h" 153f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WorkerGlobalScopeProxyProviderImpl.h" 154f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/painting/ContinuousPainter.h" 1551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "wtf/CurrentTime.h" 1561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "wtf/RefPtr.h" 1571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "wtf/TemporaryChange.h" 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#if USE(DEFAULT_RENDER_THEME) 16053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderThemeChromiumDefault.h" 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Get rid of WTF's pow define so we can use std::pow. 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#undef pow 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <cmath> // for std::pow 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore; 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The following constants control parameters for automated scaling of webpages 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// (such as due to a double tap gesture or find in page etc.). These are 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// experimentally determined. 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const int touchPointPadding = 32; 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const int nonUserInitiatedPointPadding = 11; 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const float minScaleDifference = 0.01f; 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const float doubleTapZoomContentDefaultMargin = 5; 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const float doubleTapZoomContentMinimumMargin = 2; 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const double doubleTapZoomAnimationDurationInSeconds = 0.25; 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const float doubleTapZoomAlreadyLegibleRatio = 1.2f; 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 180f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)static const double multipleTargetsZoomAnimationDurationInSeconds = 0.25; 181f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)static const double findInPageAnimationDurationInSeconds = 0; 182f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 18353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// Constants for viewport anchoring on resize. 18453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static const float viewportAnchorXCoord = 0.5f; 18553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static const float viewportAnchorYCoord = 0; 18653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Constants for zooming in on a focused text field. 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const double scrollAndScaleAnimationDurationInSeconds = 0.2; 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const int minReadableCaretHeight = 18; 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const float minScaleChangeToTriggerZoom = 1.05f; 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const float leftBoxRatio = 0.3f; 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const int caretPadding = 10; 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink { 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Change the text zoom level by kTextSizeMultiplierRatio each time the user 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// zooms text in or out (ie., change by 20%). The min and max values limit 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// text zoom to half and 3x the original text size. These three values match 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// those in Apple's port in WebKit/WebKit/WebView/WebView.mm 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const double WebView::textSizeMultiplierRatio = 1.2; 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const double WebView::minTextSizeMultiplier = 0.5; 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const double WebView::maxTextSizeMultiplier = 3.0; 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Used to defer all page activity in cases where the embedder wishes to run 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// a nested event loop. Using a stack enables nesting of message loop invocations. 206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static Vector<ScopedPageLoadDeferrer*>& pageLoadDeferrerStack() 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 208d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) DEFINE_STATIC_LOCAL(Vector<ScopedPageLoadDeferrer*>, deferrerStack, ()); 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return deferrerStack; 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Ensure that the WebDragOperation enum values stay in sync with the original 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// DragOperation constants. 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define COMPILE_ASSERT_MATCHING_ENUM(coreName) \ 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) COMPILE_ASSERT(int(coreName) == int(Web##coreName), dummy##coreName) 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationNone); 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationCopy); 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationLink); 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationGeneric); 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationPrivate); 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationMove); 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationDelete); 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationEvery); 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool shouldUseExternalPopupMenus = false; 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static int webInputEventKeyStateToPlatformEventKeyState(int webInputEventKeyState) 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int platformEventKeyState = 0; 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webInputEventKeyState & WebInputEvent::ShiftKey) 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) platformEventKeyState = platformEventKeyState | WebCore::PlatformEvent::ShiftKey; 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webInputEventKeyState & WebInputEvent::ControlKey) 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) platformEventKeyState = platformEventKeyState | WebCore::PlatformEvent::CtrlKey; 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webInputEventKeyState & WebInputEvent::AltKey) 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) platformEventKeyState = platformEventKeyState | WebCore::PlatformEvent::AltKey; 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webInputEventKeyState & WebInputEvent::MetaKey) 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) platformEventKeyState = platformEventKeyState | WebCore::PlatformEvent::MetaKey; 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return platformEventKeyState; 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochnamespace { 24210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 24310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochclass UserGestureNotifier { 24410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochpublic: 24510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // If a UserGestureIndicator is created for a user gesture during the 24610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // lifetime of a UserGestureNotifier and *userGestureObserved is false, 24710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // the object will notify the client and set *userGestureObserved to true. 24810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch UserGestureNotifier(WebAutofillClient*, bool* userGestureObserved); 24910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ~UserGestureNotifier(); 25010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 25110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochprivate: 25210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WebAutofillClient* const m_client; 25310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch bool* const m_userGestureObserved; 25410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}; 25510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 25610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochUserGestureNotifier::UserGestureNotifier(WebAutofillClient* client, bool* userGestureObserved) 25710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch : m_client(client) 25810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch , m_userGestureObserved(userGestureObserved) 25910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 26010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ASSERT(m_userGestureObserved); 26110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (m_client) 26210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch UserGestureIndicator::clearProcessedUserGestureInPast(); 26310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 26410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 26510f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochUserGestureNotifier::~UserGestureNotifier() 26610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 26710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!*m_userGestureObserved && UserGestureIndicator::processedUserGestureInPast()) { 26810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch *m_userGestureObserved = true; 26910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (m_client) 27010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_client->firstUserGestureObserved(); 27110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 27210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 27310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 27410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} // namespace 27510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebView ---------------------------------------------------------------- 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebView* WebView::create(WebViewClient* client) 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Pass the WebViewImpl's self-reference to the caller. 2811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return WebViewImpl::create(client); 2821e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 2831e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 2841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)WebViewImpl* WebViewImpl::create(WebViewClient* client) 2851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 2861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // Pass the WebViewImpl's self-reference to the caller. 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptRef(new WebViewImpl(client)).leakRef(); 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebView::setUseExternalPopupMenus(bool useExternalPopupMenus) 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) shouldUseExternalPopupMenus = useExternalPopupMenus; 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebView::updateVisitedLinkState(unsigned long long linkHash) 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 29709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Page::visitedStateChanged(linkHash); 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebView::resetVisitedLinkState() 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 30209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Page::allVisitedStateChanged(); 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebView::willEnterModalLoop() 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 307d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) pageLoadDeferrerStack().append(new ScopedPageLoadDeferrer()); 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebView::didExitModalLoop() 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 312d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(pageLoadDeferrerStack().size()); 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 314d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) delete pageLoadDeferrerStack().last(); 315d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) pageLoadDeferrerStack().removeLast(); 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebViewImpl::setMainFrame(WebFrame* frame) 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (frame->isWebLocalFrame()) 3215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) toWebLocalFrameImpl(frame)->initializeAsMainFrame(page()); 3225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) else 3235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) toWebRemoteFrameImpl(frame)->initializeAsMainFrame(page()); 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setAutofillClient(WebAutofillClient* autofillClient) 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_autofillClient = autofillClient; 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setDevToolsAgentClient(WebDevToolsAgentClient* devToolsClient) 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (devToolsClient) 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_devToolsAgent = adoptPtr(new WebDevToolsAgentImpl(this, devToolsClient)); 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_devToolsAgent.clear(); 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setPrerendererClient(WebPrerendererClient* prerendererClient) 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 341d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(m_page); 342d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) providePrerendererClientTo(*m_page, new PrerendererClientImpl(prerendererClient)); 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setSpellCheckClient(WebSpellCheckClient* spellCheckClient) 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_spellCheckClient = spellCheckClient; 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebViewImpl::WebViewImpl(WebViewClient* client) 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_client(client) 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_autofillClient(0) 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_spellCheckClient(0) 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_chromeClientImpl(this) 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_contextMenuClientImpl(this) 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_dragClientImpl(this) 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_editorClientImpl(this) 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_inspectorClientImpl(this) 35953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_backForwardClientImpl(this) 36051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_spellCheckerClientImpl(this) 36109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_storageClientImpl(this) 3629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) , m_fixedLayoutSizeLock(false) 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_shouldAutoResize(false) 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_zoomLevel(0) 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_minimumZoomLevel(zoomFactorToZoomLevel(minTextSizeMultiplier)) 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_maximumZoomLevel(zoomFactorToZoomLevel(maxTextSizeMultiplier)) 367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_doubleTapZoomPageScaleFactor(0) 368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_doubleTapZoomPending(false) 369f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) , m_enableFakePageScaleAnimationForTesting(false) 370f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) , m_fakePageScaleAnimationPageScaleFactor(0) 371f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) , m_fakePageScaleAnimationUseAnchor(false) 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_contextMenuAllowed(false) 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_doingDragAndDrop(false) 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_ignoreInputEvents(false) 3751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) , m_compositorDeviceScaleFactorOverride(0) 3761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) , m_rootLayerScale(1) 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_suppressNextKeypressEvent(false) 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_imeAcceptEvents(true) 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_operationsAllowed(WebDragOperationNone) 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_dragOperation(WebDragOperationNone) 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_isTransparent(false) 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_tabsToLinks(false) 383926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_layerTreeView(0) 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_rootLayer(0) 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_rootGraphicsLayer(0) 386d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_rootTransformLayer(0) 387926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_graphicsLayerFactory(adoptPtr(new GraphicsLayerFactoryChromium(this))) 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_isAcceleratedCompositingActive(false) 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_layerTreeViewCommitsDeferred(false) 390f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu , m_matchesHeuristicsForGpuRasterization(false) 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_recreatingGraphicsContext(false) 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_flingModifier(0) 393926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_flingSourceDevice(false) 394f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) , m_fullscreenController(FullscreenController::create(this)) 395926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_showFPSCounter(false) 396926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_showPaintRects(false) 397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_showDebugBorders(false) 398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_continuousPaintingEnabled(false) 399591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch , m_showScrollBottleneckRects(false) 40002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch , m_baseBackgroundColor(Color::white) 40119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) , m_backgroundColorOverride(Color::transparent) 40251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_zoomFactorOverride(0) 40310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch , m_userGestureObserved(false) 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Page::PageClients pageClients; 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageClients.chromeClient = &m_chromeClientImpl; 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageClients.contextMenuClient = &m_contextMenuClientImpl; 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageClients.editorClient = &m_editorClientImpl; 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageClients.dragClient = &m_dragClientImpl; 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageClients.inspectorClient = &m_inspectorClientImpl; 41153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) pageClients.backForwardClient = &m_backForwardClientImpl; 41251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) pageClients.spellCheckerClient = &m_spellCheckerClientImpl; 41309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) pageClients.storageClient = &m_storageClientImpl; 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4156f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch m_page = adoptPtrWillBeNoop(new Page(pageClients)); 41607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch MediaKeysController::provideMediaKeysTo(*m_page, &m_mediaKeysClientImpl); 417a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch provideSpeechRecognitionTo(*m_page, SpeechRecognitionClientProxy::create(client ? client->speechRecognizer() : 0)); 418aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch provideNavigatorContentUtilsTo(*m_page, NavigatorContentUtilsClientImpl::create(this)); 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 420a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch provideContextFeaturesTo(*m_page, ContextFeaturesClientImpl::create()); 421d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) DeviceOrientationInspectorAgent::provideTo(*m_page); 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->inspectorController().registerModuleAgent(InspectorFileSystemAgent::create(m_page.get())); 424d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) provideDatabaseClientTo(*m_page, DatabaseClientImpl::create()); 42509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) InspectorIndexedDBAgent::provideTo(m_page.get()); 426d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) provideStorageQuotaClientTo(*m_page, StorageQuotaClientImpl::create()); 427a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch m_page->setValidationMessageClient(ValidationMessageClientImpl::create(*this)); 428d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) provideWorkerGlobalScopeProxyProviderTo(*m_page, WorkerGlobalScopeProxyProviderImpl::create()); 42983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 430d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_page->makeOrdinary(); 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (m_client) { 433a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch providePushControllerTo(*m_page, m_client->webPushClient()); 43493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) setDeviceScaleFactor(m_client->screenInfo().deviceScaleFactor); 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setVisibilityState(m_client->visibilityState(), true); 43693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_inspectorSettingsMap = adoptPtr(new SettingsMap); 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebViewImpl::~WebViewImpl() 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_page); 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 44610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl* WebViewImpl::mainFrameImpl() 4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return m_page && m_page->mainFrame() && m_page->mainFrame()->isLocalFrame() ? WebLocalFrameImpl::fromFrame(m_page->deprecatedLocalMainFrame()) : 0; 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::tabKeyCyclesThroughElements() const 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_page); 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_page->tabKeyCyclesThroughElements(); 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setTabKeyCyclesThroughElements(bool value) 4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_page) 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_page->setTabKeyCyclesThroughElements(value); 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 463d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::handleMouseLeave(LocalFrame& mainFrame, const WebMouseEvent& event) 464c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){ 465c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) m_client->setMouseOverURL(WebURL()); 466c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) PageWidgetEventHandler::handleMouseLeave(mainFrame, event); 467c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)} 468c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) 469d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::handleMouseDown(LocalFrame& mainFrame, const WebMouseEvent& event) 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If there is a popup open, close it as the user is clicking on the page (outside of the 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // popup). We also save it so we can prevent a click on an element from immediately 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // reopening the same popup. 47409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<PopupContainer> selectPopup; 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<WebPagePopupImpl> pagePopup; 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.button == WebMouseEvent::ButtonLeft) { 4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) selectPopup = m_selectPopup; 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pagePopup = m_pagePopup; 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hidePopups(); 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_selectPopup); 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_pagePopup); 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastMouseDownPoint = WebPoint(event.x, event.y); 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // Take capture on a mouse down on a plugin so we can send it mouse events. 4875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // If the hit node is a plugin but a scrollbar is over it don't start mouse 4885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // capture because it will interfere with the scrollbar receiving events. 4895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) IntPoint point(event.x, event.y); 4905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (event.button == WebMouseEvent::ButtonLeft && m_page->mainFrame()->isLocalFrame() && !m_page->deprecatedLocalMainFrame()->view()->scrollbarAtPoint(point)) { 4915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) point = m_page->deprecatedLocalMainFrame()->view()->windowToContents(point); 4925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) HitTestResult result(m_page->deprecatedLocalMainFrame()->eventHandler().hitTestResultAtPoint(point)); 4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* hitNode = result.innerNonSharedNode(); 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!result.scrollbar() && hitNode && hitNode->renderer() && hitNode->renderer()->isEmbeddedObject()) { 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_mouseCaptureNode = hitNode; 4977757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch TRACE_EVENT_ASYNC_BEGIN0("input", "capturing mouse", this); 49853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PageWidgetEventHandler::handleMouseDown(mainFrame, event); 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 50310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (event.button == WebMouseEvent::ButtonLeft && m_mouseCaptureNode) 50410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_mouseCaptureGestureToken = mainFrame.eventHandler().takeLastMouseDownGestureToken(); 50510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_selectPopup && m_selectPopup == selectPopup) { 5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // That click triggered a select popup which is the same as the one that 5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // was showing before the click. It means the user clicked the select 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // while the popup was showing, and as a result we first closed then 5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // immediately reopened the select popup. It needs to be closed. 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hideSelectPopup(); 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pagePopup && pagePopup && m_pagePopup->hasSamePopupClient(pagePopup.get())) { 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // That click triggered a page popup that is the same as the one we just closed. 5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It needs to be closed. 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) closePagePopup(m_pagePopup.get()); 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Dispatch the contextmenu event regardless of if the click was swallowed. 5218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN) 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // On Windows, we handle it on mouse up, not down. 5238abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#elif OS(MACOSX) 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.button == WebMouseEvent::ButtonRight 5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || (event.button == WebMouseEvent::ButtonLeft 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && event.modifiers & WebMouseEvent::ControlKey)) 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mouseContextMenu(event); 5288abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#else 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.button == WebMouseEvent::ButtonRight) 5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mouseContextMenu(event); 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::mouseContextMenu(const WebMouseEvent& event) 5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl() || !mainFrameImpl()->frameView()) 5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 539e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->contextMenuController().clearContextMenu(); 5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PlatformMouseEventBuilder pme(mainFrameImpl()->frameView(), event); 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Find the right target frame. See issue 1186900. 5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HitTestResult result = hitTestResultForWindowPos(pme.position()); 54507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Frame* targetFrame; 5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (result.innerNonSharedNode()) 5478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) targetFrame = result.innerNonSharedNode()->document().frame(); 5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 5493c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch targetFrame = m_page->focusController().focusedOrMainFrame(); 5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!targetFrame->isLocalFrame()) 55207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return; 55307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 55407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* targetLocalFrame = toLocalFrame(targetFrame); 55507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 5568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN) 55707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch targetLocalFrame->view()->setCursor(pointerCursor()); 5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_contextMenuAllowed = true; 56107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch targetLocalFrame->eventHandler().sendContextMenuEvent(pme); 5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_contextMenuAllowed = false; 5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Actually showing the context menu is handled by the ContextMenuClient 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // implementation... 5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 567d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::handleMouseUp(LocalFrame& mainFrame, const WebMouseEvent& event) 5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PageWidgetEventHandler::handleMouseUp(mainFrame, event); 5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN) 5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Dispatch the contextmenu event regardless of if the click was swallowed. 5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // On Mac/Linux, we handle it on mouse down, not up. 5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.button == WebMouseEvent::ButtonRight) 5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mouseContextMenu(event); 5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 579d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebViewImpl::handleMouseWheel(LocalFrame& mainFrame, const WebMouseWheelEvent& event) 580926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 581926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) hidePopups(); 582926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return PageWidgetEventHandler::handleMouseWheel(mainFrame, event); 583926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 584926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 58507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochbool WebViewImpl::scrollBy(const WebFloatSize& delta, const WebFloatSize& velocity) 5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 587f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (m_flingSourceDevice == WebGestureDeviceTouchpad) { 588926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebMouseWheelEvent syntheticWheel; 589926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const float tickDivisor = WebCore::WheelEvent::TickMultiplier; 5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 591926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.deltaX = delta.width; 592926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.deltaY = delta.height; 593926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.wheelTicksX = delta.width / tickDivisor; 594926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.wheelTicksY = delta.height / tickDivisor; 595926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.hasPreciseScrollingDeltas = true; 596926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.x = m_positionOnFlingStart.x; 597926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.y = m_positionOnFlingStart.y; 598926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.globalX = m_globalPositionOnFlingStart.x; 599926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.globalY = m_globalPositionOnFlingStart.y; 600926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.modifiers = m_flingModifier; 6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (m_page && m_page->mainFrame() && m_page->mainFrame()->isLocalFrame() && m_page->deprecatedLocalMainFrame()->view()) 6035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return handleMouseWheel(*m_page->deprecatedLocalMainFrame(), syntheticWheel); 604926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else { 605926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebGestureEvent syntheticGestureEvent; 606926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 607926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.type = WebInputEvent::GestureScrollUpdateWithoutPropagation; 608926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.data.scrollUpdate.deltaX = delta.width; 609926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.data.scrollUpdate.deltaY = delta.height; 610926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.x = m_positionOnFlingStart.x; 611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.y = m_positionOnFlingStart.y; 612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.globalX = m_globalPositionOnFlingStart.x; 613926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.globalY = m_globalPositionOnFlingStart.y; 614926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.modifiers = m_flingModifier; 615f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) syntheticGestureEvent.sourceDevice = WebGestureDeviceTouchscreen; 616926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 6175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (m_page && m_page->mainFrame() && m_page->mainFrame()->isLocalFrame() && m_page->deprecatedLocalMainFrame()->view()) 61807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return handleGestureEvent(syntheticGestureEvent); 619926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 62007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return false; 62107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 62207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::handleGestureEvent(const WebGestureEvent& event) 6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool eventSwallowed = false; 626926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool eventCancelled = false; // for disambiguation 627926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 62809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Special handling for slow-path fling gestures. 629f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) switch (event.type) { 630926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case WebInputEvent::GestureFlingStart: { 63109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (mainFrameImpl()->frame()->eventHandler().isScrollbarHandlingGestures()) 63209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) break; 633926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->cancelScheduledContentIntents(); 634926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_positionOnFlingStart = WebPoint(event.x / pageScaleFactor(), event.y / pageScaleFactor()); 635926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_globalPositionOnFlingStart = WebPoint(event.globalX, event.globalY); 636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_flingModifier = event.modifiers; 637926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_flingSourceDevice = event.sourceDevice; 6385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) OwnPtr<WebGestureCurve> flingCurve = adoptPtr(Platform::current()->createFlingAnimationCurve(event.sourceDevice, WebFloatPoint(event.data.flingStart.velocityX, event.data.flingStart.velocityY), WebSize())); 639f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ASSERT(flingCurve); 640926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_gestureAnimation = WebActiveGestureAnimation::createAtAnimationStart(flingCurve.release(), this); 641926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) scheduleAnimation(); 642926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) eventSwallowed = true; 643926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 644926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->didHandleGestureEvent(event, eventCancelled); 645926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return eventSwallowed; 646926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 647926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case WebInputEvent::GestureFlingCancel: 64851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (endActiveFlingAnimation()) 649926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) eventSwallowed = true; 650926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 651926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->didHandleGestureEvent(event, eventCancelled); 652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return eventSwallowed; 653926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) default: 654926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 655926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 656926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 657926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), event); 6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Handle link highlighting outside the main switch to avoid getting lost in the 6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // complicated set of cases handled below. 661f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) switch (event.type) { 6621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) case WebInputEvent::GestureShowPress: 6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Queue a highlight animation, then hand off to regular handler. 6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (settingsImpl()->gestureTapHighlightEnabled()) 6659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) enableTapHighlightAtPoint(platformEvent); 6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureTapCancel: 6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureTap: 6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureLongPress: 6709bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) for (size_t i = 0; i < m_linkHighlights.size(); ++i) 6719bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_linkHighlights[i]->startHighlightAnimationIfNeeded(); 6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 677f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) switch (event.type) { 6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureTap: { 6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->cancelScheduledContentIntents(); 680926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (detectContentOnTouch(platformEvent.position())) { 6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) eventSwallowed = true; 6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<PopupContainer> selectPopup; 6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) selectPopup = m_selectPopup; 6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hideSelectPopup(); 6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_selectPopup); 6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 690926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Don't trigger a disambiguation popup on sites designed for mobile devices. 691926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Instead, assume that the page has been designed with big enough buttons and links. 692926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (event.data.tap.width > 0 && !shouldDisableDesktopWorkarounds()) { 693926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // FIXME: didTapMultipleTargets should just take a rect instead of 694926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // an event. 695926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebGestureEvent scaledEvent = event; 696926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) scaledEvent.x = event.x / pageScaleFactor(); 697926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) scaledEvent.y = event.y / pageScaleFactor(); 698926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) scaledEvent.data.tap.width = event.data.tap.width / pageScaleFactor(); 699926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) scaledEvent.data.tap.height = event.data.tap.height / pageScaleFactor(); 700926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) IntRect boundingBox(scaledEvent.x - scaledEvent.data.tap.width / 2, scaledEvent.y - scaledEvent.data.tap.height / 2, scaledEvent.data.tap.width, scaledEvent.data.tap.height); 7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<IntRect> goodTargets; 702d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapVector<RawPtrWillBeMember<Node> > highlightNodes; 7039bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) findGoodTouchTargets(boundingBox, mainFrameImpl()->frame(), goodTargets, highlightNodes); 7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: replace touch adjustment code when numberOfGoodTargets == 1? 7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Single candidate case is currently handled by: https://bugs.webkit.org/show_bug.cgi?id=85101 706926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (goodTargets.size() >= 2 && m_client && m_client->didTapMultipleTargets(scaledEvent, goodTargets)) { 7079bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (settingsImpl()->gestureTapHighlightEnabled()) 7089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) enableTapHighlights(highlightNodes); 7099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) for (size_t i = 0; i < m_linkHighlights.size(); ++i) 7109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_linkHighlights[i]->startHighlightAnimationIfNeeded(); 7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) eventSwallowed = true; 712926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) eventCancelled = true; 7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 717f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureEvent(platformEvent); 7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_selectPopup && m_selectPopup == selectPopup) { 7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // That tap triggered a select popup which is the same as the one that 7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // was showing before the tap. It means the user tapped the select 7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // while the popup was showing, and as a result we first closed then 7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // immediately reopened the select popup. It needs to be closed. 7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hideSelectPopup(); 7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureTwoFingerTap: 7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureLongPress: 7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureLongTap: { 7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl() || !mainFrameImpl()->frameView()) 7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->cancelScheduledContentIntents(); 736e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->contextMenuController().clearContextMenu(); 7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_contextMenuAllowed = true; 738f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureEvent(platformEvent); 7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_contextMenuAllowed = false; 7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) case WebInputEvent::GestureShowPress: { 7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->cancelScheduledContentIntents(); 745f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureEvent(platformEvent); 7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureDoubleTap: 74993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (m_webSettings->doubleTapToZoomEnabled() && minimumPageScaleFactor() != maximumPageScaleFactor()) { 7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->cancelScheduledContentIntents(); 751f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) animateDoubleTapZoom(platformEvent.position()); 7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 753926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // GestureDoubleTap is currently only used by Android for zooming. For WebCore, 754926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // GestureTap with tap count = 2 is used instead. So we drop GestureDoubleTap here. 755926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) eventSwallowed = true; 756926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureScrollBegin: 7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GesturePinchBegin: 7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->cancelScheduledContentIntents(); 760f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case WebInputEvent::GestureTapDown: 7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureScrollEnd: 7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureScrollUpdate: 763926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case WebInputEvent::GestureScrollUpdateWithoutPropagation: 7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureTapCancel: 76553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) case WebInputEvent::GestureTapUnconfirmed: 7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GesturePinchEnd: 76709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case WebInputEvent::GesturePinchUpdate: 76809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case WebInputEvent::GestureFlingStart: { 769f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureEvent(platformEvent); 7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 775926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->didHandleGestureEvent(event, eventCancelled); 7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return eventSwallowed; 7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::transferActiveWheelFlingAnimation(const WebActiveWheelFlingParameters& parameters) 7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TRACE_EVENT0("webkit", "WebViewImpl::transferActiveWheelFlingAnimation"); 7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_gestureAnimation); 783926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_positionOnFlingStart = parameters.point; 784926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_globalPositionOnFlingStart = parameters.globalPoint; 7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_flingModifier = parameters.modifiers; 7865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) OwnPtr<WebGestureCurve> curve = adoptPtr(Platform::current()->createFlingAnimationCurve(parameters.sourceDevice, WebFloatPoint(parameters.delta), parameters.cumulativeScroll)); 787f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ASSERT(curve); 788926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_gestureAnimation = WebActiveGestureAnimation::createWithTimeOffset(curve.release(), this, parameters.startTime); 7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scheduleAnimation(); 7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 79251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool WebViewImpl::endActiveFlingAnimation() 79351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 79451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (m_gestureAnimation) { 79551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_gestureAnimation.clear(); 79651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (m_layerTreeView) 79751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_layerTreeView->didStopFlinging(); 79851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return true; 79951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 80051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return false; 80151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 80251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 803926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebViewImpl::startPageScaleAnimation(const IntPoint& targetPosition, bool useAnchor, float newScale, double durationInSeconds) 8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebPoint clampedPoint = targetPosition; 806926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!useAnchor) { 8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clampedPoint = clampOffsetAtScale(targetPosition, newScale); 808926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!durationInSeconds) { 809926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setPageScaleFactor(newScale, clampedPoint); 810926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 811926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 813926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (useAnchor && newScale == pageScaleFactor()) 814926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 815926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 816f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (m_enableFakePageScaleAnimationForTesting) { 817f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fakePageScaleAnimationTargetPosition = targetPosition; 818f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fakePageScaleAnimationUseAnchor = useAnchor; 819f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fakePageScaleAnimationPageScaleFactor = newScale; 820926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else { 821926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_layerTreeView) 822926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 823926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->startPageScaleAnimation(targetPosition, useAnchor, newScale, durationInSeconds); 824926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 825926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 826926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 828f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void WebViewImpl::enableFakePageScaleAnimationForTesting(bool enable) 829926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 830f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_enableFakePageScaleAnimationForTesting = enable; 8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 833926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::setShowFPSCounter(bool show) 834926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 835521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (m_layerTreeView) { 836926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) TRACE_EVENT0("webkit", "WebViewImpl::setShowFPSCounter"); 837926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->setShowFPSCounter(show); 838926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 839926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_showFPSCounter = show; 840926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 841926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 842926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::setShowPaintRects(bool show) 843926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 844521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (m_layerTreeView) { 845926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) TRACE_EVENT0("webkit", "WebViewImpl::setShowPaintRects"); 846926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->setShowPaintRects(show); 847926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 848926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_showPaintRects = show; 849926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 850926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 851926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::setShowDebugBorders(bool show) 852926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 853521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (m_layerTreeView) 854926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->setShowDebugBorders(show); 855926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_showDebugBorders = show; 856926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 857926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 858926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::setContinuousPaintingEnabled(bool enabled) 859926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 860521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (m_layerTreeView) { 861926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) TRACE_EVENT0("webkit", "WebViewImpl::setContinuousPaintingEnabled"); 862926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->setContinuousPaintingEnabled(enabled); 863926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 864926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_continuousPaintingEnabled = enabled; 865926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->scheduleAnimation(); 866926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 867926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 868591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid WebViewImpl::setShowScrollBottleneckRects(bool show) 869591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 870591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (m_layerTreeView) 871591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_layerTreeView->setShowScrollBottleneckRects(show); 872591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_showScrollBottleneckRects = show; 873591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 874591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 875d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::getSelectionRootBounds(WebRect& bounds) const 876d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 87707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch const Frame* frame = focusedWebCoreFrame(); 87807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!frame || !frame->isLocalFrame()) 879d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 880d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 88107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Element* root = toLocalFrame(frame)->selection().rootEditableElementOrDocumentElement(); 882d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!root) 883d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 884d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 885d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // If the selection is inside a form control, the root will be a <div> that 886d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // behaves as the editor but we want to return the actual element's bounds. 887d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // In practice, that means <textarea> and <input> controls that behave like 888d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // a text field. 889d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Element* shadowHost = root->shadowHost(); 890d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (shadowHost 891d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) && (isHTMLTextAreaElement(*shadowHost) 892d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) || (isHTMLInputElement(*shadowHost) 893d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) && toHTMLInputElement(*shadowHost).isText()))) 894d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) root = shadowHost; 895d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 8966f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch IntRect boundingBox = isHTMLHtmlElement(root) 8976f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch ? IntRect(IntPoint(0, 0), root->document().frame()->view()->contentsSize()) 8986f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch : root->pixelSnappedBoundingBox(); 8996f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 900d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) boundingBox = root->document().frame()->view()->contentsToWindow(boundingBox); 901d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) boundingBox.scale(pageScaleFactor()); 902d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bounds = boundingBox; 903d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 904d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 905d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void WebViewImpl::acceptLanguagesChanged() 906d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 907f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (!page()) 908f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return; 909f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 910f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) page()->acceptLanguagesChanged(); 911d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 912d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::handleKeyEvent(const WebKeyboardEvent& event) 9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT((event.type == WebInputEvent::RawKeyDown) 9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || (event.type == WebInputEvent::KeyDown) 9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || (event.type == WebInputEvent::KeyUp)); 9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Halt an in-progress fling on a key event. 92051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) endActiveFlingAnimation(); 9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Please refer to the comments explaining the m_suppressNextKeypressEvent 9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // member. 9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The m_suppressNextKeypressEvent is set if the KeyDown is handled by 9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Webkit. A keyDown event is typically associated with a keyPress(char) 9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // event and a keyUp event. We reset this flag here as this is a new keyDown 9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // event. 9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_suppressNextKeypressEvent = false; 9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If there is a select popup, it should be the one processing the event, 9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not the page. 9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_selectPopup) 9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_selectPopup->handleKeyEvent(PlatformKeyboardEventBuilder(event)); 9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pagePopup) { 9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pagePopup->handleKeyEvent(PlatformKeyboardEventBuilder(event)); 9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We need to ignore the next Char event after this otherwise pressing 9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // enter when selecting an item in the popup will go to the page. 9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (WebInputEvent::RawKeyDown == event.type) 9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_suppressNextKeypressEvent = true; 9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 943a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch RefPtr<Frame> focusedFrame = focusedWebCoreFrame(); 944a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (focusedFrame && focusedFrame->isRemoteFrameTemporary()) { 94510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(toLocalFrameTemporary(focusedFrame.get())); 946a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch webFrame->client()->forwardInputEvent(&event); 947a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return true; 948a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 949a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 950a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (!focusedFrame || !focusedFrame->isLocalFrame()) 9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 953a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch RefPtr<LocalFrame> frame = toLocalFrame(focusedFrame.get()); 954a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 95510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch PlatformKeyboardEventBuilder evt(event); 95610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 95710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (frame->eventHandler().keyEvent(evt)) { 95810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (WebInputEvent::RawKeyDown == event.type) { 95910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // Suppress the next keypress event unless the focused node is a plug-in node. 96010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // (Flash needs these keypress events to handle non-US keyboards.) 96110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch Element* element = focusedElement(); 96210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!element || !element->renderer() || !element->renderer()->isEmbeddedObject()) 96310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_suppressNextKeypressEvent = true; 96410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 96510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return true; 96610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 96710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 9688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if !OS(MACOSX) 9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebInputEvent::Type contextMenuTriggeringEventType = 9708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN) 9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInputEvent::KeyUp; 9728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#else 9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInputEvent::RawKeyDown; 9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isUnmodifiedMenuKey = !(event.modifiers & WebInputEvent::InputModifiers) && event.windowsKeyCode == VKEY_APPS; 9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isShiftF10 = event.modifiers == WebInputEvent::ShiftKey && event.windowsKeyCode == VKEY_F10; 9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if ((isUnmodifiedMenuKey || isShiftF10) && event.type == contextMenuTriggeringEventType) { 9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sendContextMenuEvent(event); 9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#endif // !OS(MACOSX) 9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return keyEventDefault(event); 9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::handleCharEvent(const WebKeyboardEvent& event) 9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(event.type == WebInputEvent::Char); 9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Please refer to the comments explaining the m_suppressNextKeypressEvent 9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // member. The m_suppressNextKeypressEvent is set if the KeyDown is 9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handled by Webkit. A keyDown event is typically associated with a 9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // keyPress(char) event and a keyUp event. We reset this flag here as it 9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // only applies to the current keyPress event. 9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool suppress = m_suppressNextKeypressEvent; 9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_suppressNextKeypressEvent = false; 9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If there is a select popup, it should be the one processing the event, 10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not the page. 10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_selectPopup) 10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_selectPopup->handleKeyEvent(PlatformKeyboardEventBuilder(event)); 10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pagePopup) 10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_pagePopup->handleKeyEvent(PlatformKeyboardEventBuilder(event)); 10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 100607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* frame = toLocalFrame(focusedWebCoreFrame()); 10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return suppress; 10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1010f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) EventHandler& handler = frame->eventHandler(); 10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PlatformKeyboardEventBuilder evt(event); 10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!evt.isCharacterKey()) 10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Accesskeys are triggered by char events and can't be suppressed. 1017f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (handler.handleAccessKey(evt)) 10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Safari 3.1 does not pass off windows system key messages (WM_SYSCHAR) to 10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the eventHandler::keyEvent. We mimic this behavior on all platforms since 10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for now we are converting other platform's key events to windows key 10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // events. 10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (evt.isSystemKey()) 10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1027f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (!suppress && !handler.keyEvent(evt)) 10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return keyEventDefault(event); 10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1033f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)WebRect WebViewImpl::computeBlockBounds(const WebRect& rect, bool ignoreClipping) 10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl()) 10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebRect(); 10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Use the rect-based hit test to find the node. 10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint point = mainFrameImpl()->frameView()->windowToContents(IntPoint(rect.x, rect.y)); 104019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent | (ignoreClipping ? HitTestRequest::IgnoreClipping : 0); 1041f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) HitTestResult result = mainFrameImpl()->frame()->eventHandler().hitTestResultAtPoint(point, hitType, IntSize(rect.width, rect.height)); 10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* node = result.innerNonSharedNode(); 10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node) 10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebRect(); 10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Find the block type node based on the hit node. 10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (node && (!node->renderer() || node->renderer()->isInline())) 10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node = node->parentNode(); 10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Return the bounding box in the window coordinate system. 10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node) { 10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect rect = node->Node::pixelSnappedBoundingBox(); 1054d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = node->document().frame(); 10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return frame->view()->contentsToWindow(rect); 10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebRect(); 10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebRect WebViewImpl::widenRectWithinPageBounds(const WebRect& source, int targetMargin, int minimumMargin) 10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebSize maxSize; 10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (mainFrame()) 10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) maxSize = mainFrame()->contentsSize(); 10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntSize scrollOffset; 10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (mainFrame()) 10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollOffset = mainFrame()->scrollOffset(); 10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int leftMargin = targetMargin; 10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int rightMargin = targetMargin; 10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const int absoluteSourceX = source.x + scrollOffset.width(); 10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (leftMargin > absoluteSourceX) { 10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leftMargin = absoluteSourceX; 10745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) rightMargin = std::max(leftMargin, minimumMargin); 10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const int maximumRightMargin = maxSize.width - (source.width + absoluteSourceX); 10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (rightMargin > maximumRightMargin) { 10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) rightMargin = maximumRightMargin; 10805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) leftMargin = std::min(leftMargin, std::max(rightMargin, minimumMargin)); 10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const int newWidth = source.width + leftMargin + rightMargin; 10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const int newX = source.x - leftMargin; 10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(newWidth >= 0); 10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(scrollOffset.width() + newX + newWidth <= maxSize.width); 10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebRect(newX, source.y, newWidth, source.height); 10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)float WebViewImpl::legibleScale() const 10938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){ 10948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // Pages should be as legible as on desktop when at dpi scale, so no 10958abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // need to zoom in further when automatically determining zoom level 10968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // (after double tap, find in page, etc), though the user should still 10978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // be allowed to manually pinch zoom in further if they desire. 10988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) float legibleScale = 1; 109951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (page()) 110051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) legibleScale *= page()->settings().accessibilityFontScaleFactor(); 11018abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return legibleScale; 11028abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)} 11038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 110406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)void WebViewImpl::computeScaleAndScrollForBlockRect(const WebPoint& hitPoint, const WebRect& blockRect, float padding, float defaultScaleWhenAlreadyLegible, float& scale, WebPoint& scroll) 11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scale = pageScaleFactor(); 11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scroll.x = scroll.y = 0; 1108f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1109f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) WebRect rect = blockRect; 11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!rect.isEmpty()) { 1112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) float defaultMargin = doubleTapZoomContentDefaultMargin; 1113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) float minimumMargin = doubleTapZoomContentMinimumMargin; 11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We want the margins to have the same physical size, which means we 11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // need to express them in post-scale size. To do that we'd need to know 11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the scale we're scaling to, but that depends on the margins. Instead 11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we express them as a fraction of the target rectangle: this will be 11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // correct if we end up fully zooming to it, and won't matter if we 11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // don't. 11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) rect = widenRectWithinPageBounds(rect, 11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<int>(defaultMargin * rect.width / m_size.width), 11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<int>(minimumMargin * rect.width / m_size.width)); 11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fit block to screen, respecting limits. 112453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) scale = static_cast<float>(m_size.width) / rect.width; 11255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) scale = std::min(scale, legibleScale()); 11268abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (pageScaleFactor() < defaultScaleWhenAlreadyLegible) 11275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) scale = std::max(scale, defaultScaleWhenAlreadyLegible); 11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scale = clampPageScaleFactorToLimits(scale); 11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1131f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // FIXME: If this is being called for auto zoom during find in page, 1132f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // then if the user manually zooms in it'd be nice to preserve the 1133f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // relative increase in zoom they caused (if they zoom out then it's ok 1134f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // to zoom them back in again). This isn't compatible with our current 1135f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // double-tap zoom strategy (fitting the containing block to the screen) 1136f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // though. 1137f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1138f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) float screenWidth = m_size.width / scale; 1139f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) float screenHeight = m_size.height / scale; 1140f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1141f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // Scroll to vertically align the block. 1142f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (rect.height < screenHeight) { 1143f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // Vertically center short blocks. 1144f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) rect.y -= 0.5 * (screenHeight - rect.height); 1145f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } else { 1146f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // Ensure position we're zooming to (+ padding) isn't off the bottom of 1147f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // the screen. 11485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) rect.y = std::max<float>(rect.y, hitPoint.y + padding - screenHeight); 1149f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } // Otherwise top align the block. 1150f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1151f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // Do the same thing for horizontal alignment. 1152f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (rect.width < screenWidth) 1153f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) rect.x -= 0.5 * (screenWidth - rect.width); 1154f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) else 11555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) rect.x = std::max<float>(rect.x, hitPoint.x + padding - screenWidth); 1156f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) scroll.x = rect.x; 1157f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) scroll.y = rect.y; 11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scale = clampPageScaleFactorToLimits(scale); 11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scroll = mainFrameImpl()->frameView()->windowToContents(scroll); 1161f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) scroll = clampOffsetAtScale(scroll, scale); 11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11646f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochstatic bool invokesHandCursor(Node* node, LocalFrame* frame) 11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node || !node->renderer()) 11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ECursor cursor = node->renderer()->style()->cursor(); 11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return cursor == CURSOR_POINTER 11716f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch || (cursor == CURSOR_AUTO && frame->eventHandler().useHandCursor(node, node->isLink())); 11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Node* WebViewImpl::bestTapNode(const PlatformGestureEvent& tapEvent) 11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page || !m_page->mainFrame() || !m_page->mainFrame()->isLocalFrame()) 11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* bestTouchNode = 0; 11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) IntPoint touchEventLocation(tapEvent.position()); 11825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->eventHandler().adjustGesturePosition(tapEvent, touchEventLocation); 1183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 11845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) IntPoint hitTestPoint = m_page->deprecatedLocalMainFrame()->view()->windowToContents(touchEventLocation); 11855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) HitTestResult result = m_page->deprecatedLocalMainFrame()->eventHandler().hitTestResultAtPoint(hitTestPoint, HitTestRequest::TouchEvent | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent); 1186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bestTouchNode = result.targetNode(); 1187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 11881e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // We might hit something like an image map that has no renderer on it 11891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // Walk up the tree until we have a node with an attached renderer 11901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) while (bestTouchNode && !bestTouchNode->renderer()) 1191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bestTouchNode = bestTouchNode->parentNode(); 1192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 11931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // Check if we're in the subtree of a node with a hand cursor 11941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // this is the heuristic we use to determine if we show a highlight on tap 11955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) while (bestTouchNode && !invokesHandCursor(bestTouchNode, m_page->deprecatedLocalMainFrame())) 11969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) bestTouchNode = bestTouchNode->parentNode(); 11971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 11981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (!bestTouchNode) 11991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return 0; 12001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 1201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // We should pick the largest enclosing node with hand cursor set. 12025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) while (bestTouchNode->parentNode() && invokesHandCursor(bestTouchNode->parentNode(), toLocalFrame(m_page->mainFrame()))) 12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bestTouchNode = bestTouchNode->parentNode(); 12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return bestTouchNode; 12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void WebViewImpl::enableTapHighlightAtPoint(const PlatformGestureEvent& tapEvent) 12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Node* touchNode = bestTapNode(tapEvent); 12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1212d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapVector<RawPtrWillBeMember<Node> > highlightNodes; 12139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) highlightNodes.append(touchNode); 12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) enableTapHighlights(highlightNodes); 12169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 12179bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1218d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void WebViewImpl::enableTapHighlights(WillBeHeapVector<RawPtrWillBeMember<Node> >& highlightNodes) 12199bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 1220d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (highlightNodes.isEmpty()) 1221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 1222d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 12239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // Always clear any existing highlight when this is invoked, even if we 12249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // don't get a new target to highlight. 12259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_linkHighlights.clear(); 12269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // LinkHighlight reads out layout and compositing state, so we need to make sure that's all up to date. 1228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) layout(); 1229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 12309bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) for (size_t i = 0; i < highlightNodes.size(); ++i) { 12319bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) Node* node = highlightNodes[i]; 12329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 123307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!node || !node->renderer()) 12349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) continue; 12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) Color highlightColor = node->renderer()->style()->tapHighlightColor(); 12379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // Safari documentation for -webkit-tap-highlight-color says if the specified color has 0 alpha, 12389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // then tap highlighting is disabled. 12399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // http://developer.apple.com/library/safari/#documentation/appleapplications/reference/safaricssref/articles/standardcssproperties.html 12409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (!highlightColor.alpha()) 12419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) continue; 12429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 12439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_linkHighlights.append(LinkHighlight::create(node, this)); 12449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1247f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void WebViewImpl::animateDoubleTapZoom(const IntPoint& point) 12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl()) 12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1252f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) WebRect rect(point.x(), point.y(), touchPointPadding, touchPointPadding); 1253f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) WebRect blockBounds = computeBlockBounds(rect, false); 1254f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float scale; 12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebPoint scroll; 1257f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 125806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) computeScaleAndScrollForBlockRect(point, blockBounds, touchPointPadding, minimumPageScaleFactor() * doubleTapZoomAlreadyLegibleRatio, scale, scroll); 12598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 12608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) bool stillAtPreviousDoubleTapScale = (pageScaleFactor() == m_doubleTapZoomPageScaleFactor 12618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) && m_doubleTapZoomPageScaleFactor != minimumPageScaleFactor()) 12628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) || m_doubleTapZoomPending; 12638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 12648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) bool scaleUnchanged = fabs(pageScaleFactor() - scale) < minScaleDifference; 12658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) bool shouldZoomOut = blockBounds.isEmpty() || scaleUnchanged || stillAtPreviousDoubleTapScale; 12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1267f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) bool isAnimating; 1268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 12698abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (shouldZoomOut) { 127000d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch scale = minimumPageScaleFactor(); 127100d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch isAnimating = startPageScaleAnimation(mainFrameImpl()->frameView()->windowToContents(point), true, scale, doubleTapZoomAnimationDurationInSeconds); 1272f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } else { 1273f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) isAnimating = startPageScaleAnimation(scroll, false, scale, doubleTapZoomAnimationDurationInSeconds); 1274f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } 1275f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1276f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (isAnimating) { 1277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_doubleTapZoomPageScaleFactor = scale; 1278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_doubleTapZoomPending = true; 1279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::zoomToFindInPageRect(const WebRect& rect) 12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1284f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (!mainFrameImpl()) 1285f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return; 1286f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1287f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) WebRect blockBounds = computeBlockBounds(rect, true); 1288f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1289f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (blockBounds.isEmpty()) { 1290f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // Keep current scale (no need to scroll as x,y will normally already 1291f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // be visible). FIXME: Revisit this if it isn't always true. 1292f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return; 1293f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } 1294f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1295f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) float scale; 1296f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) WebPoint scroll; 1297f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 129806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) computeScaleAndScrollForBlockRect(WebPoint(rect.x, rect.y), blockBounds, nonUserInitiatedPointPadding, minimumPageScaleFactor(), scale, scroll); 1299f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1300f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) startPageScaleAnimation(scroll, false, scale, findInPageAnimationDurationInSeconds); 1301f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)} 1302f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1303f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)bool WebViewImpl::zoomToMultipleTargetsRect(const WebRect& rect) 1304f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){ 1305f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (!mainFrameImpl()) 1306f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return false; 1307f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1308f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) float scale; 1309f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) WebPoint scroll; 1310f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 131106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) computeScaleAndScrollForBlockRect(WebPoint(rect.x, rect.y), rect, nonUserInitiatedPointPadding, minimumPageScaleFactor(), scale, scroll); 1312f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1313f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (scale <= pageScaleFactor()) 1314f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return false; 1315f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1316f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) startPageScaleAnimation(scroll, false, scale, multipleTargetsZoomAnimationDurationInSeconds); 1317f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return true; 13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::hasTouchEventHandlers(bool hasTouchHandlers) 13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_client) 13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->hasTouchEventHandlers(hasTouchHandlers); 13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebViewImpl::hasTouchEventHandlersAt(const WebPoint& point) 1327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 1328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // FIXME: Implement this. Note that the point must be divided by pageScaleFactor. 1329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 1330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 1331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 13328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if !OS(MACOSX) 13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Mac has no way to open a context menu based on a keyboard event. 13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::sendContextMenuEvent(const WebKeyboardEvent& event) 13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The contextMenuController() holds onto the last context menu that was 13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // popped up on the page until a new one is created. We need to clear 13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this menu before propagating the event through the DOM so that we can 13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // detect if we create a new menu for this event, since we won't create 13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a new menu if the DOM swallows the event and the defaultEventHandler does 13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not run. 1342e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) page()->contextMenuController().clearContextMenu(); 13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_contextMenuAllowed = true; 134507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Frame* focusedFrame = page()->focusController().focusedOrMainFrame(); 134607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!focusedFrame->isLocalFrame()) 134707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return false; 134807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool handled = toLocalFrame(focusedFrame)->eventHandler().sendContextMenuEventForKey(); 13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_contextMenuAllowed = false; 13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return handled; 13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::keyEventDefault(const WebKeyboardEvent& event) 13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 135607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* frame = toLocalFrame(focusedWebCoreFrame()); 13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (event.type) { 13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::Char: 13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.windowsKeyCode == VKEY_SPACE) { 13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int keyCode = ((event.modifiers & WebInputEvent::ShiftKey) ? VKEY_PRIOR : VKEY_NEXT); 13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return scrollViewWithKeyboard(keyCode, event.modifiers); 13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::RawKeyDown: 13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.modifiers == WebInputEvent::ControlKey) { 13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (event.windowsKeyCode) { 13708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if !OS(MACOSX) 13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case 'A': 13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) focusedFrame()->executeCommand(WebString::fromUTF8("SelectAll")); 13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_INSERT: 13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case 'C': 13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) focusedFrame()->executeCommand(WebString::fromUTF8("Copy")); 13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Match FF behavior in the sense that Ctrl+home/end are the only Ctrl 13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // key combinations which affect scrolling. Safari is buggy in the 13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // sense that it scrolls the page for all Ctrl+scrolling key 13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // combinations. For e.g. Ctrl+pgup/pgdn/up/down, etc. 13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_HOME: 13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_END: 13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!event.isSystemKey && !(event.modifiers & WebInputEvent::ShiftKey)) 13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return scrollViewWithKeyboard(event.windowsKeyCode, event.modifiers); 13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::scrollViewWithKeyboard(int keyCode, int modifiers) 14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ScrollDirection scrollDirection; 14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ScrollGranularity scrollGranularity; 14038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX) 14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Control-Up/Down should be PageUp/Down on Mac. 14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (modifiers & WebMouseEvent::ControlKey) { 14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (keyCode == VKEY_UP) 14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) keyCode = VKEY_PRIOR; 14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (keyCode == VKEY_DOWN) 14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) keyCode = VKEY_NEXT; 14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mapKeyCodeForScroll(keyCode, &scrollDirection, &scrollGranularity)) 14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 141409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return bubblingScroll(scrollDirection, scrollGranularity); 14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::mapKeyCodeForScroll(int keyCode, 14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebCore::ScrollDirection* scrollDirection, 14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebCore::ScrollGranularity* scrollGranularity) 14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (keyCode) { 14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_LEFT: 14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollLeft; 14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByLine; 14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_RIGHT: 14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollRight; 14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByLine; 14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_UP: 14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollUp; 14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByLine; 14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_DOWN: 14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollDown; 14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByLine; 14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_HOME: 14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollUp; 14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByDocument; 14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_END: 14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollDown; 14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByDocument; 14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_PRIOR: // page up 14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollUp; 14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByPage; 14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_NEXT: // page down 14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollDown; 14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByPage; 14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::hideSelectPopup() 14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_selectPopup) 14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_selectPopup->hidePopup(); 14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 146709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool WebViewImpl::bubblingScroll(ScrollDirection scrollDirection, ScrollGranularity scrollGranularity) 14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 146907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* frame = toLocalFrame(focusedWebCoreFrame()); 14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 147309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return frame->eventHandler().bubblingScroll(scrollDirection, scrollGranularity); 14745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 147609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void WebViewImpl::popupOpened(PopupContainer* popupContainer) 14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 147809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(!m_selectPopup); 147909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_selectPopup = popupContainer; 1480d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(mainFrameImpl()->frame()->document()); 1481d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Document& document = *mainFrameImpl()->frame()->document(); 1482f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) page()->frameHost().eventHandlerRegistry().didAddEventHandler(document, EventHandlerRegistry::WheelEvent); 14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 148509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void WebViewImpl::popupClosed(PopupContainer* popupContainer) 14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 148709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(m_selectPopup); 1488d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_selectPopup = nullptr; 1489d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(mainFrameImpl()->frame()->document()); 1490d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Document& document = *mainFrameImpl()->frame()->document(); 1491f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // Remove the handler we added in |popupOpened| conditionally, because the 1492f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // Document may have already removed it, for instance, due to a navigation. 1493f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) EventHandlerRegistry* registry = &document.frameHost()->eventHandlerRegistry(); 1494f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (registry->eventHandlerTargets(EventHandlerRegistry::WheelEvent)->contains(&document)) 1495f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) registry->didRemoveEventHandler(document, EventHandlerRegistry::WheelEvent); 14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PagePopup* WebViewImpl::openPagePopup(PagePopupClient* client, const IntRect& originBoundsInRootView) 14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(client); 15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (hasOpenedPopup()) 15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hidePopups(); 15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_pagePopup); 15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebWidget* popupWidget = m_client->createPopupMenu(WebPopupTypePage); 15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(popupWidget); 15071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_pagePopup = toWebPagePopupImpl(popupWidget); 1508926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_pagePopup->initialize(this, client, originBoundsInRootView)) { 15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pagePopup->closePopup(); 1510d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_pagePopup = nullptr; 15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_pagePopup.get(); 15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::closePagePopup(PagePopup* popup) 15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(popup); 15181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) WebPagePopupImpl* popupImpl = toWebPagePopupImpl(popup); 15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_pagePopup.get() == popupImpl); 15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pagePopup.get() != popupImpl) 15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pagePopup->closePopup(); 1523d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_pagePopup = nullptr; 15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 152607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochFrame* WebViewImpl::focusedWebCoreFrame() const 15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15283c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch return m_page ? m_page->focusController().focusedOrMainFrame() : 0; 15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebViewImpl* WebViewImpl::fromPage(Page* page) 15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page) 15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1535e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return static_cast<WebViewImpl*>(page->chrome().client().webView()); 15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebWidget ------------------------------------------------------------------ 15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::close() 15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_page) { 15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Initiate shutdown for the entire frameset. This will cause a lot of 15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // notifications to be sent. 15456f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch m_page->willBeDestroyed(); 15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_page.clear(); 15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Should happen after m_page.clear(). 15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_devToolsAgent) 15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_devToolsAgent.clear(); 15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Reset the delegate to prevent notifications being sent as we're being 15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // deleted. 15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client = 0; 15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) deref(); // Balances ref() acquired in WebView::create 15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::willStartLiveResize() 15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (mainFrameImpl() && mainFrameImpl()->frameView()) 15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mainFrameImpl()->frameView()->willStartLiveResize(); 15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1565d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = mainFrameImpl()->frame(); 156610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WebPluginContainerImpl* pluginContainer = WebLocalFrameImpl::pluginContainerFromFrame(frame); 15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pluginContainer) 15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pluginContainer->willStartLiveResize(); 15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1571926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebSize WebViewImpl::size() 1572926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 1573926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_size; 1574926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 1575926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 157610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::resizePinchViewport(const WebSize& newSize) 157710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 157810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!pinchVirtualViewportEnabled()) 157910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return; 158010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 158110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch page()->frameHost().pinchViewport().setSize(newSize); 158210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 158310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::resize(const WebSize& newSize) 15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_shouldAutoResize || m_size == newSize) 15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FrameView* view = mainFrameImpl()->frameView(); 15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!view) 15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebSize oldSize = m_size; 15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float oldPageScaleFactor = pageScaleFactor(); 159553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) int oldContentsWidth = contentsSize().width(); 15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_size = newSize; 15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 159951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) bool shouldAnchorAndRescaleViewport = settings()->mainFrameResizesAreOrientationChanges() 1600f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) && oldSize.width && oldContentsWidth && newSize.width != oldSize.width && !m_fullscreenController->isFullscreen(); 160151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 1602f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ViewportAnchor viewportAnchor(&mainFrameImpl()->frame()->eventHandler()); 160353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (shouldAnchorAndRescaleViewport) { 160453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) viewportAnchor.setAnchor(view->visibleContentRect(), 160553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) FloatSize(viewportAnchorXCoord, viewportAnchorYCoord)); 160653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 160753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1608aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch { 1609aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch // Avoids unnecessary invalidations while various bits of state in FastTextAutosizer are updated. 1610aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch FastTextAutosizer::DeferUpdatePageInfo deferUpdatePageInfo(page()); 1611aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 1612323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_pageScaleConstraintsSet.didChangeViewSize(m_size); 1613323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1614aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch updatePageDefinedViewportConstraints(mainFrameImpl()->frame()->document()->viewportDescription()); 1615aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch updateMainFrameLayoutSize(); 16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1617323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // If the virtual viewport pinch mode is enabled, the main frame will be resized 1618323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // after layout so it can be sized to the contentsSize. 1619323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (!pinchVirtualViewportEnabled() && mainFrameImpl()->frameView()) 1620323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) mainFrameImpl()->frameView()->resize(m_size); 1621323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1622323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (pinchVirtualViewportEnabled()) 1623323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) page()->frameHost().pinchViewport().setSize(m_size); 16245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 16255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // When device emulation is enabled, device size values may change - they are 16265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // usually set equal to the view size. These values are not considered viewport-dependent 16275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // (see MediaQueryExp::isViewportDependent), since they are only viewport-dependent in emulation mode, 16285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // and thus will not be invalidated in |FrameView::performPreLayoutTasks|. 16295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // Therefore we should force explicit media queries invalidation here. 16305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (page()->inspectorController().deviceEmulationEnabled()) { 16315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (Document* document = mainFrameImpl()->frame()->document()) 16325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) document->mediaQueryAffectingValueChanged(); 16335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (settings()->viewportEnabled() && !m_fixedLayoutSizeLock) { 1637926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Relayout immediately to recalculate the minimum scale limit. 1638926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (view->needsLayout()) 1639926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) view->layout(); 1640926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 164153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (shouldAnchorAndRescaleViewport) { 164253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) float viewportWidthRatio = static_cast<float>(newSize.width) / oldSize.width; 164353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) float contentsWidthRatio = static_cast<float>(contentsSize().width()) / oldContentsWidth; 164453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) float scaleMultiplier = viewportWidthRatio / contentsWidthRatio; 164553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 164653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) IntSize viewportSize = view->visibleContentRect().size(); 164753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (scaleMultiplier != 1) { 164853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) float newPageScaleFactor = oldPageScaleFactor * scaleMultiplier; 164953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) viewportSize.scale(pageScaleFactor() / newPageScaleFactor); 165053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) IntPoint scrollOffsetAtNewScale = viewportAnchor.computeOrigin(viewportSize); 165153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) setPageScaleFactor(newPageScaleFactor, scrollOffsetAtNewScale); 165253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } else { 165353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) IntPoint scrollOffsetAtNewScale = clampOffsetAtScale(viewportAnchor.computeOrigin(viewportSize), pageScaleFactor()); 165453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) updateMainFrameScrollPosition(scrollOffsetAtNewScale, false); 165553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sendResizeEventAndRepaint(); 16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::willEndLiveResize() 16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (mainFrameImpl() && mainFrameImpl()->frameView()) 16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mainFrameImpl()->frameView()->willEndLiveResize(); 16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1667d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = mainFrameImpl()->frame(); 166810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WebPluginContainerImpl* pluginContainer = WebLocalFrameImpl::pluginContainerFromFrame(frame); 16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pluginContainer) 16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pluginContainer->willEndLiveResize(); 16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::willEnterFullScreen() 16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1675f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fullscreenController->willEnterFullScreen(); 16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::didEnterFullScreen() 16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1680f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fullscreenController->didEnterFullScreen(); 16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::willExitFullScreen() 16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1685f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fullscreenController->willExitFullScreen(); 16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::didExitFullScreen() 16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1690f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fullscreenController->didExitFullScreen(); 16915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1693926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::animate(double monotonicFrameBeginTime) 16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1695926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) TRACE_EVENT0("webkit", "WebViewImpl::animate"); 16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1697926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!monotonicFrameBeginTime) 1698926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) monotonicFrameBeginTime = monotonicallyIncreasingTime(); 16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create synthetic wheel events as necessary for fling. 17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_gestureAnimation) { 17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_gestureAnimation->animate(monotonicFrameBeginTime)) 17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scheduleAnimation(); 1704926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else { 170551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) endActiveFlingAnimation(); 1706926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 170753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) PlatformGestureEvent endScrollEvent(PlatformEvent::GestureScrollEnd, 17081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_positionOnFlingStart, m_globalPositionOnFlingStart, 17091e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) IntSize(), 0, false, false, false, false, 17101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 0, 0, 0, 0); 171153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1712f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) mainFrameImpl()->frame()->eventHandler().handleGestureScrollEnd(endScrollEvent); 1713926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PageWidgetDelegate::animate(m_page.get(), monotonicFrameBeginTime); 1720926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1721926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_continuousPaintingEnabled) { 1722926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ContinuousPainter::setNeedsDisplayRecursive(m_rootGraphicsLayer, m_pageOverlays.get()); 1723926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->scheduleAnimation(); 1724926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::layout() 17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TRACE_EVENT0("webkit", "WebViewImpl::layout"); 17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PageWidgetDelegate::layout(m_page.get()); 173119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) updateLayerTreeBackgroundColor(); 17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) for (size_t i = 0; i < m_linkHighlights.size(); ++i) 17349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_linkHighlights[i]->updateGeometry(); 17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1737d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void WebViewImpl::paint(WebCanvas* canvas, const WebRect& rect) 17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1739d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // This should only be used when compositing is not being used for this 1740d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // WebView, and it is painting into the recording of its parent. 1741d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT(!isAcceleratedCompositingActive()); 17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1743d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) double paintStart = currentTime(); 1744d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) PageWidgetDelegate::paint(m_page.get(), pageOverlays(), canvas, rect, isTransparent() ? PageWidgetDelegate::Translucent : PageWidgetDelegate::Opaque); 1745d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) double paintEnd = currentTime(); 1746d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) double pixelsPerSec = (rect.width * rect.height) / (paintEnd - paintStart); 1747d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) blink::Platform::current()->histogramCustomCounts("Renderer4.SoftwarePaintDurationMS", (paintEnd - paintStart) * 1000, 0, 120, 30); 1748d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) blink::Platform::current()->histogramCustomCounts("Renderer4.SoftwarePaintMegapixPerSecond", pixelsPerSec / 1000000, 10, 210, 30); 17495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1751323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if OS(ANDROID) 1752323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void WebViewImpl::paintCompositedDeprecated(WebCanvas* canvas, const WebRect& rect) 1753f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{ 1754323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // Note: This method exists on OS(ANDROID) and will hopefully be 1755323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // removed once the link disambiguation feature renders using 1756323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // the compositor. 1757323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ASSERT(isAcceleratedCompositingActive()); 1758323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 17595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FrameView* view = page()->deprecatedLocalMainFrame()->view(); 1760323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) PaintBehavior oldPaintBehavior = view->paintBehavior(); 1761323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) view->setPaintBehavior(oldPaintBehavior | PaintBehaviorFlattenCompositingLayers); 1762323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1763323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) PageWidgetDelegate::paint(m_page.get(), pageOverlays(), canvas, rect, isTransparent() ? PageWidgetDelegate::Translucent : PageWidgetDelegate::Opaque); 1764323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1765323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) view->setPaintBehavior(oldPaintBehavior); 1766323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 1767323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif 1768323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1769323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void WebViewImpl::compositeAndReadbackAsync(WebCompositeAndReadbackAsyncCallback* callback) 1770323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 1771323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ASSERT(isAcceleratedCompositingActive()); 1772f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu m_layerTreeView->compositeAndReadbackAsync(callback); 1773f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu} 1774f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::isTrackingRepaints() const 17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page()) 17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 17795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!page()->mainFrame()->isLocalFrame()) 17805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return false; 17815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FrameView* view = page()->deprecatedLocalMainFrame()->view(); 1782f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return view->isTrackingPaintInvalidations(); 17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::themeChanged() 17865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page()) 17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 17895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!page()->mainFrame()->isLocalFrame()) 17905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 17915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FrameView* view = page()->deprecatedLocalMainFrame()->view(); 17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebRect damagedRect(0, 0, m_size.width, m_size.height); 17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) view->invalidateRect(damagedRect); 17955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::enterFullScreenForElement(WebCore::Element* element) 17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1799f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fullscreenController->enterFullScreenForElement(element); 18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::exitFullScreenForElement(WebCore::Element* element) 18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1804f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fullscreenController->exitFullScreenForElement(element); 18055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::hasHorizontalScrollbar() 18085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 18095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return mainFrameImpl()->frameView()->horizontalScrollbar(); 18105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::hasVerticalScrollbar() 18135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 18145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return mainFrameImpl()->frameView()->verticalScrollbar(); 18155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const WebInputEvent* WebViewImpl::m_currentInputEvent = 0; 18185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1819f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// FIXME: autogenerate this kind of code, and use it throughout Blink rather than 1820f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// the one-offs for subsets of these values. 1821f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)static const AtomicString* inputTypeToName(WebInputEvent::Type type) 1822f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){ 1823f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) switch (type) { 1824f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::MouseDown: 1825f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::mousedown; 1826f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::MouseUp: 1827f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::mouseup; 1828f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::MouseMove: 1829f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::mousemove; 1830f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::MouseEnter: 1831f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::mouseenter; 1832f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::MouseLeave: 1833f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::mouseleave; 1834f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::ContextMenu: 1835f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::contextmenu; 1836f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::MouseWheel: 1837f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::mousewheel; 1838f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::KeyDown: 1839f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::keydown; 1840f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::KeyUp: 1841f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::keyup; 1842f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::GestureScrollBegin: 1843f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::gesturescrollstart; 1844f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::GestureScrollEnd: 1845f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::gesturescrollend; 1846f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::GestureScrollUpdate: 1847f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::gesturescrollupdate; 1848f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::TouchStart: 1849f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::touchstart; 1850f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::TouchMove: 1851f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::touchmove; 1852f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::TouchEnd: 1853f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::touchend; 1854f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::TouchCancel: 1855f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return &EventTypeNames::touchcancel; 1856f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) default: 1857f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return 0; 1858f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 1859f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)} 1860f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 18615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::handleInputEvent(const WebInputEvent& inputEvent) 18625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 186310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch UserGestureNotifier notifier(m_autofillClient, &m_userGestureObserved); 1864d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // On the first input event since page load, |notifier| instructs the 1865d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // autofill client to unblock values of password input fields of any forms 1866d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // on the page. There is a single input event, GestureTap, which can both 1867d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // be the first event after page load, and cause a form submission. In that 1868d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // case, the form submission happens before the autofill client is told 1869d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // to unblock the password values, and so the password values are not 1870d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // submitted. To avoid that, GestureTap is handled explicitly: 1871d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (inputEvent.type == WebInputEvent::GestureTap && m_autofillClient) { 1872d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_userGestureObserved = true; 1873d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_autofillClient->firstUserGestureObserved(); 1874d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 187510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 1876f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) const AtomicString* inputEventName = inputTypeToName(inputEvent.type); 18775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) TRACE_EVENT1("input", "WebViewImpl::handleInputEvent", "type", inputEventName ? inputEventName->ascii() : "unknown"); 18785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we've started a drag and drop operation, ignore input events until 18795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we're done. 18805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_doingDragAndDrop) 18815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 18825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 188353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_devToolsAgent && m_devToolsAgent->handleInputEvent(m_page.get(), inputEvent)) 188453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return true; 188553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 18865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Report the event to be NOT processed by WebKit, so that the browser can handle it appropriately. 18875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_ignoreInputEvents) 18885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 18895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TemporaryChange<const WebInputEvent*> currentEventChange(m_currentInputEvent, &inputEvent); 18915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isPointerLocked() && WebInputEvent::isMouseEventType(inputEvent.type)) { 18935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pointerLockMouseEvent(inputEvent); 18945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 18955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 18965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_mouseCaptureNode && WebInputEvent::isMouseEventType(inputEvent.type)) { 18987757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch TRACE_EVENT1("input", "captured mouse event", "type", inputEvent.type); 18995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Save m_mouseCaptureNode since mouseCaptureLost() will clear it. 1900d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<Node> node = m_mouseCaptureNode; 19015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Not all platforms call mouseCaptureLost() directly. 19035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (inputEvent.type == WebInputEvent::MouseUp) 19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mouseCaptureLost(); 19055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 190610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch OwnPtr<UserGestureIndicator> gestureIndicator; 190710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 19085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AtomicString eventType; 19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (inputEvent.type) { 19105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseMove: 19111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mousemove; 19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 19135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseLeave: 19141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mouseout; 19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 19165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseDown: 19171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mousedown; 191810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessingNewUserGesture)); 191910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_mouseCaptureGestureToken = gestureIndicator->currentToken(); 19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseUp: 19221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mouseup; 192310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch gestureIndicator = adoptPtr(new UserGestureIndicator(m_mouseCaptureGestureToken.release())); 19245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 19275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node->dispatchMouseEvent( 19305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PlatformMouseEventBuilder(mainFrameImpl()->frameView(), *static_cast<const WebMouseEvent*>(&inputEvent)), 19315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) eventType, static_cast<const WebMouseEvent*>(&inputEvent)->clickCount); 19325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 19335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1935926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return PageWidgetDelegate::handleInputEvent(m_page.get(), *this, inputEvent); 19365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 19375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 193853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void WebViewImpl::setCursorVisibilityState(bool isVisible) 193953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 194053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_page) 194153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_page->setIsCursorVisible(isVisible); 194253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 194353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 19445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::mouseCaptureLost() 19455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 19467757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch TRACE_EVENT_ASYNC_END0("input", "capturing mouse", this); 1947d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_mouseCaptureNode = nullptr; 19485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 19495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setFocus(bool enable) 19515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 19523c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch m_page->focusController().setFocused(enable); 19535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (enable) { 19543c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch m_page->focusController().setActive(true); 195507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch RefPtr<Frame> focusedFrame = m_page->focusController().focusedFrame(); 195607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (focusedFrame && focusedFrame->isLocalFrame()) { 195707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* localFrame = toLocalFrame(focusedFrame.get()); 195807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Element* element = localFrame->document()->focusedElement(); 195907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (element && localFrame->selection().selection().isNone()) { 19605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the selection was cleared while the WebView was not 19615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // focused, then the focus element shows with a focus ring but 19625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // no caret and does respond to keyboard inputs. 19630019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (element->isTextFormControl()) { 19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) element->updateFocusAppearance(true); 19650019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } else if (element->isContentEditable()) { 19665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // updateFocusAppearance() selects all the text of 19675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // contentseditable DIVs. So we set the selection explicitly 19685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // instead. Note that this has the side effect of moving the 19695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // caret back to the beginning of the text. 19700019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch Position position(element, 0, Position::PositionIsOffsetInAnchor); 197107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch localFrame->selection().setSelection(VisibleSelection(position, SEL_DEFAULT_AFFINITY)); 19725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 19755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_imeAcceptEvents = true; 19765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 19775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hidePopups(); 19785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Clear focus on the currently focused frame if any. 19805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 19815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 19825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) LocalFrame* frame = m_page->mainFrame() && m_page->mainFrame()->isLocalFrame() 19845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ? m_page->deprecatedLocalMainFrame() : 0; 19855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 19865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 19875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 198807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch RefPtr<Frame> focusedFrame = m_page->focusController().focusedFrame(); 198907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (focusedFrame && focusedFrame->isLocalFrame()) { 19905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Finish an ongoing composition to delete the composition node. 199107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (toLocalFrame(focusedFrame.get())->inputMethodController().hasComposition()) { 1992926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_autofillClient) 1993926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_autofillClient->setIgnoreTextChanges(true); 1994926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 199507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch toLocalFrame(focusedFrame.get())->inputMethodController().confirmComposition(); 1996926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1997926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_autofillClient) 1998926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_autofillClient->setIgnoreTextChanges(false); 1999926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 20005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_imeAcceptEvents = false; 20015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 20045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::setComposition( 20065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebString& text, 20075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebVector<WebCompositionUnderline>& underlines, 20085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int selectionStart, 20095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int selectionEnd) 20105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 201107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); 20125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!focused || !m_imeAcceptEvents) 20135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 20145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2015a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (WebPlugin* plugin = focusedPluginIfInputMethodSupported(focused)) 2016a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return plugin->setComposition(text, underlines, selectionStart, selectionEnd); 2017a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 20185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The input focus has been moved to another WebWidget object. 20195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We should use this |editor| object only to complete the ongoing 20205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // composition. 20213c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch InputMethodController& inputMethodController = focused->inputMethodController(); 2022c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) if (!focused->editor().canEdit() && !inputMethodController.hasComposition()) 20235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 20245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We should verify the parent node of this IME composition node are 20265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // editable because JavaScript may delete a parent node of the composition 20275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node. In this case, WebKit crashes while deleting texts from the parent 20285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node, which doesn't exist any longer. 2029a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch RefPtrWillBeRawPtr<Range> range = inputMethodController.compositionRange(); 20305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (range) { 20315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* node = range->startContainer(); 20325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node || !node->isContentEditable()) 20335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 20345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we're not going to fire a keypress event, then the keydown event was 20375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // canceled. In that case, cancel any existing composition. 20385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (text.isEmpty() || m_suppressNextKeypressEvent) { 20395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A browser process sent an IPC message which does not contain a valid 20405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // string, which means an ongoing composition has been canceled. 20415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the ongoing composition has been canceled, replace the ongoing 20425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // composition string with an empty string and complete it. 20435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String emptyString; 20445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<CompositionUnderline> emptyUnderlines; 20453c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch inputMethodController.setComposition(emptyString, emptyUnderlines, 0, 0); 20465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return text.isEmpty(); 20475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When the range of composition underlines overlap with the range between 20505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // selectionStart and selectionEnd, WebKit somehow won't paint the selection 20515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // at all (see InlineTextBox::paint() function in InlineTextBox.cpp). 20525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // But the selection range actually takes effect. 20533c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch inputMethodController.setComposition(String(text), 20545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CompositionUnderlineVectorBuilder(underlines), 20555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) selectionStart, selectionEnd); 20565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20573c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch return inputMethodController.hasComposition(); 20585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 20595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::confirmComposition() 20615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2062591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return confirmComposition(DoNotKeepSelection); 2063591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 2064591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 2065591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool WebViewImpl::confirmComposition(ConfirmCompositionBehavior selectionBehavior) 2066591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 2067591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return confirmComposition(WebString(), selectionBehavior); 20685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 20695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::confirmComposition(const WebString& text) 20715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2072591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return confirmComposition(text, DoNotKeepSelection); 2073591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 2074591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 2075591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool WebViewImpl::confirmComposition(const WebString& text, ConfirmCompositionBehavior selectionBehavior) 2076591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 207707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); 20785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!focused || !m_imeAcceptEvents) 20795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2080a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 2081a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (WebPlugin* plugin = focusedPluginIfInputMethodSupported(focused)) 2082a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return plugin->confirmComposition(text, selectionBehavior); 2083a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 2084bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return focused->inputMethodController().confirmCompositionOrInsertText(text, selectionBehavior == KeepSelection ? InputMethodController::KeepSelection : InputMethodController::DoNotKeepSelection); 20855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 20865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::compositionRange(size_t* location, size_t* length) 20885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 208907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); 20908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (!focused || !m_imeAcceptEvents) 20915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 20925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2093a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch RefPtrWillBeRawPtr<Range> range = focused->inputMethodController().compositionRange(); 20945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!range) 20955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 20965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2097f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) Element* editable = focused->selection().rootEditableElementOrDocumentElement(); 2098f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(editable); 2099f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) PlainTextRange plainTextRange(PlainTextRange::create(*editable, *range.get())); 2100f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (plainTextRange.isNull()) 2101f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return false; 2102f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) *location = plainTextRange.start(); 2103f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) *length = plainTextRange.length(); 2104f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return true; 21055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 21065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebTextInputInfo WebViewImpl::textInputInfo() 21085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 21095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebTextInputInfo info; 21105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 211107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); 21125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!focused) 21135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return info; 21145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) FrameSelection& selection = focused->selection(); 21168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Node* node = selection.selection().rootEditableElement(); 21175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node) 21185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return info; 21195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2120e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch info.inputMode = inputModeOfFocusedElement(); 2121e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 21225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) info.type = textInputType(); 21235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (info.type == WebTextInputTypeNone) 21245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return info; 21255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2126c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) if (!focused->editor().canEdit()) 2127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return info; 2128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 212981c961c4effb2aa7c24b0514b1ff0af1fae479f2Bo Liu // Emits an object replacement character for each replaced element so that 213081c961c4effb2aa7c24b0514b1ff0af1fae479f2Bo Liu // it is exposed to IME and thus could be deleted by IME on android. 213181c961c4effb2aa7c24b0514b1ff0af1fae479f2Bo Liu info.value = plainText(rangeOfContents(node).get(), TextIteratorEmitsObjectReplacementCharacter); 21325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (info.value.isEmpty()) 21345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return info; 21355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2136a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (RefPtrWillBeRawPtr<Range> range = selection.selection().firstRange()) { 2137f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) PlainTextRange plainTextRange(PlainTextRange::create(*node, *range.get())); 2138f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (plainTextRange.isNotNull()) { 2139f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) info.selectionStart = plainTextRange.start(); 2140f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) info.selectionEnd = plainTextRange.end(); 2141f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) } 21425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2143f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 2144a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (RefPtrWillBeRawPtr<Range> range = focused->inputMethodController().compositionRange()) { 2145f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) PlainTextRange plainTextRange(PlainTextRange::create(*node, *range.get())); 2146f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (plainTextRange.isNotNull()) { 2147f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) info.compositionStart = plainTextRange.start(); 2148f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) info.compositionEnd = plainTextRange.end(); 2149f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) } 21505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return info; 21535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 21545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebTextInputType WebViewImpl::textInputType() 21565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 21570019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch Element* element = focusedElement(); 21580019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!element) 21595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeNone; 21605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2161d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (isHTMLInputElement(*element)) { 2162d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) HTMLInputElement& input = toHTMLInputElement(*element); 21635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2164d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isDisabledOrReadOnly()) 21655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeNone; 21665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isPasswordField()) 21685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypePassword; 2169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isSearchField()) 21705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeSearch; 2171d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isEmailField()) 21725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeEmail; 2173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isNumberField()) 21745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeNumber; 2175d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isTelephoneField()) 21765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeTelephone; 2177d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isURLField()) 21785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeURL; 2179d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isDateField()) 21805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeDate; 2181d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isDateTimeLocalField()) 21825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeDateTimeLocal; 2183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isMonthField()) 21845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeMonth; 2185d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isTimeField()) 21865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeTime; 2187d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isWeekField()) 21885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeWeek; 2189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isTextField()) 21905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeText; 21915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeNone; 21935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2195d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (isHTMLTextAreaElement(*element)) { 2196d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (toHTMLTextAreaElement(*element).isDisabledOrReadOnly()) 21975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeNone; 21985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeTextArea; 21995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 22020019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (element->isHTMLElement()) { 22030019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (toHTMLElement(element)->isDateTimeFieldElement()) 2204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return WebTextInputTypeDateTimeField; 2205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 2206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif 2207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 22080019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (element->shouldUseInputMethod()) 22095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeContentEditable; 22105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeNone; 22125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2214e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochWebString WebViewImpl::inputModeOfFocusedElement() 2215e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 2216e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (!RuntimeEnabledFeatures::inputModeAttributeEnabled()) 2217e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return WebString(); 2218e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 22190019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch Element* element = focusedElement(); 22200019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!element) 2221e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return WebString(); 2222e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 2223d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (isHTMLInputElement(*element)) { 2224d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const HTMLInputElement& input = toHTMLInputElement(*element); 2225d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.supportsInputModeAttribute()) 2226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return input.fastGetAttribute(HTMLNames::inputmodeAttr).lower(); 2227e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return WebString(); 2228e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 2229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (isHTMLTextAreaElement(*element)) { 2230d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const HTMLTextAreaElement& textarea = toHTMLTextAreaElement(*element); 2231d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return textarea.fastGetAttribute(HTMLNames::inputmodeAttr).lower(); 2232e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 2233e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 2234e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return WebString(); 2235e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch} 2236e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 22375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::selectionBounds(WebRect& anchor, WebRect& focus) const 22385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 223907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch const LocalFrame* frame = toLocalFrame(focusedWebCoreFrame()); 22405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 22415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 22428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) FrameSelection& selection = frame->selection(); 22435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22448abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (selection.isCaret()) { 22458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) anchor = focus = selection.absoluteCaretBounds(); 22468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) } else { 2247a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch RefPtrWillBeRawPtr<Range> selectedRange = selection.toNormalizedRange(); 2248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!selectedRange) 2249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 22505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2251a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch RefPtrWillBeRawPtr<Range> range(Range::create(selectedRange->startContainer()->document(), 2252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->startContainer(), 2253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->startOffset(), 2254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->startContainer(), 2255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->startOffset())); 2256c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) anchor = frame->editor().firstRectForRange(range.get()); 2257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range = Range::create(selectedRange->endContainer()->document(), 2259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->endContainer(), 2260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->endOffset(), 2261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->endContainer(), 2262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->endOffset()); 2263c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) focus = frame->editor().firstRectForRange(range.get()); 2264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 22655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) IntRect scaledAnchor(frame->view()->contentsToWindow(anchor)); 2267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) IntRect scaledFocus(frame->view()->contentsToWindow(focus)); 2268323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 2269323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (pinchVirtualViewportEnabled()) { 2270d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // FIXME(http://crbug.com/371902) - We shouldn't have to do this 2271d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // manually, the contentsToWindow methods above should be fixed to do 2272d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // this. 2273323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) IntPoint pinchViewportOffset = 2274323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) roundedIntPoint(page()->frameHost().pinchViewport().visibleRect().location()); 2275323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) scaledAnchor.moveBy(-pinchViewportOffset); 2276323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) scaledFocus.moveBy(-pinchViewportOffset); 2277323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 2278323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 227953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) scaledAnchor.scale(pageScaleFactor()); 228053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) scaledFocus.scale(pageScaleFactor()); 2281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) anchor = scaledAnchor; 2282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) focus = scaledFocus; 22835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22848abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (!selection.selection().isBaseFirst()) 22855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) std::swap(anchor, focus); 22865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 22875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 228919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)InputMethodContext* WebViewImpl::inputMethodContext() 229019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){ 229119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (!m_imeAcceptEvents) 229219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) return 0; 229319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 229407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* focusedFrame = toLocalFrame(focusedWebCoreFrame()); 229519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (!focusedFrame) 229619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) return 0; 229719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 229819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) Element* target = focusedFrame->document()->focusedElement(); 229919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (target && target->hasInputMethodContext()) 2300d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return &target->inputMethodContext(); 230119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 230219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) return 0; 230319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 230419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 2305d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebPlugin* WebViewImpl::focusedPluginIfInputMethodSupported(LocalFrame* frame) 2306a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){ 230710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WebPluginContainerImpl* container = WebLocalFrameImpl::pluginContainerFromNode(frame, WebNode(focusedElement())); 2308a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (container && container->supportsInputMethod()) 2309a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return container->plugin(); 2310a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return 0; 2311a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)} 2312a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 231319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void WebViewImpl::didShowCandidateWindow() 231419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){ 231519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (InputMethodContext* context = inputMethodContext()) 231619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) context->dispatchCandidateWindowShowEvent(); 231719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 231819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 231919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void WebViewImpl::didUpdateCandidateWindow() 232019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){ 232119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (InputMethodContext* context = inputMethodContext()) 232219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) context->dispatchCandidateWindowUpdateEvent(); 232319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 232419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 232519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void WebViewImpl::didHideCandidateWindow() 232619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){ 232719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (InputMethodContext* context = inputMethodContext()) 232819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) context->dispatchCandidateWindowHideEvent(); 232919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 233019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 23315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::selectionTextDirection(WebTextDirection& start, WebTextDirection& end) const 23325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 233307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch const LocalFrame* frame = toLocalFrame(focusedWebCoreFrame()); 23345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 23355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 23368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) FrameSelection& selection = frame->selection(); 23378abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (!selection.toNormalizedRange()) 23385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 23398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) start = selection.start().primaryDirection() == RTL ? WebTextDirectionRightToLeft : WebTextDirectionLeftToRight; 23408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) end = selection.end().primaryDirection() == RTL ? WebTextDirectionRightToLeft : WebTextDirectionLeftToRight; 23415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 23425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebViewImpl::isSelectionAnchorFirst() const 2345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 234607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (const LocalFrame* frame = toLocalFrame(focusedWebCoreFrame())) 23478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return frame->selection().selection().isBaseFirst(); 23488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return false; 2349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2351e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)WebVector<WebCompositionUnderline> WebViewImpl::compositionUnderlines() const 2352e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 235307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch const LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); 2354e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (!focused) 2355e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return WebVector<WebCompositionUnderline>(); 2356e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) const Vector<CompositionUnderline>& underlines = focused->inputMethodController().customCompositionUnderlines(); 2357e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) WebVector<WebCompositionUnderline> results(underlines.size()); 2358e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) for (size_t index = 0; index < underlines.size(); ++index) { 2359e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) CompositionUnderline underline = underlines[index]; 23605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) results[index] = WebCompositionUnderline(underline.startOffset, underline.endOffset, static_cast<WebColor>(underline.color.rgb()), underline.thick, static_cast<WebColor>(underline.backgroundColor.rgb())); 2361e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 2362e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return results; 2363e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 2364e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 23655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebColor WebViewImpl::backgroundColor() const 23665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 23675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (isTransparent()) 23685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return Color::transparent; 23695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 237002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return m_baseBackgroundColor; 2371f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (!m_page->mainFrame()) 2372f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return m_baseBackgroundColor; 23735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->mainFrame()->isLocalFrame()) 23745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return m_baseBackgroundColor; 23755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FrameView* view = m_page->deprecatedLocalMainFrame()->view(); 237609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return view->documentBackgroundColor().rgb(); 23775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::caretOrSelectionRange(size_t* location, size_t* length) 23805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 238107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch const LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); 23825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!focused) 23835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 23845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2385f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) PlainTextRange selectionOffsets = focused->inputMethodController().getSelectionOffsets(); 2386bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (selectionOffsets.isNull()) 23875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 23885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2389bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *location = selectionOffsets.start(); 2390bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *length = selectionOffsets.length(); 2391bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return true; 23925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setTextDirection(WebTextDirection direction) 23955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 23965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The Editor::setBaseWritingDirection() function checks if we can change 23975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the text direction of the selected node and updates its DOM "dir" 23985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // attribute and its CSS "direction" property. 23995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // So, we just call the function as Safari does. 240007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch const LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); 24015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!focused) 24025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 24035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2404c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) Editor& editor = focused->editor(); 2405c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) if (!editor.canEdit()) 24065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 24075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (direction) { 24095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebTextDirectionDefault: 2410c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) editor.setBaseWritingDirection(NaturalWritingDirection); 24115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 24125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebTextDirectionLeftToRight: 2414c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) editor.setBaseWritingDirection(LeftToRightWritingDirection); 24155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 24165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebTextDirectionRightToLeft: 2418c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) editor.setBaseWritingDirection(RightToLeftWritingDirection); 24195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 24205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 24225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) notImplemented(); 24235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 24245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 24255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::isAcceleratedCompositingActive() const 24285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_isAcceleratedCompositingActive; 24305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::willCloseLayerTreeView() 2433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 2434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setIsAcceleratedCompositingActive(false); 2435926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView = 0; 2436926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2437926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 24385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::didAcquirePointerLock() 24395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (page()) 2441e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) page()->pointerLockController().didAcquirePointerLock(); 24425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::didNotAcquirePointerLock() 24455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (page()) 2447e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) page()->pointerLockController().didNotAcquirePointerLock(); 24485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::didLosePointerLock() 24515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (page()) 2453e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) page()->pointerLockController().didLosePointerLock(); 24545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::didChangeWindowResizerRect() 24575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (mainFrameImpl()->frameView()) 24595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mainFrameImpl()->frameView()->windowResizerRectChanged(); 24605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebView -------------------------------------------------------------------- 24635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebSettingsImpl* WebViewImpl::settingsImpl() 24655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_webSettings) 246709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_webSettings = adoptPtr(new WebSettingsImpl(&m_page->settings(), &m_page->inspectorController())); 24685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_webSettings); 24695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_webSettings.get(); 24705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebSettings* WebViewImpl::settings() 24735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return settingsImpl(); 24755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebViewImpl::pageEncoding() const 24785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 24805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebString(); 24815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->mainFrame()->isLocalFrame()) 24835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return WebString(); 24845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 24855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Is this check needed? 24865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->deprecatedLocalMainFrame()->document()->loader()) 24875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebString(); 24885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return m_page->deprecatedLocalMainFrame()->document()->encodingName(); 24905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setPageEncoding(const WebString& encodingName) 24935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 24955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 24965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->mainFrame()->isLocalFrame()) 24985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 24995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 25005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Only change override encoding, don't change default encoding. 25015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note that the new encoding must be 0 if it isn't supposed to be set. 250209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) AtomicString newEncodingName; 25035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!encodingName.isEmpty()) 25045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) newEncodingName = encodingName; 25055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->loader().reload(NormalReload, KURL(), newEncodingName); 25065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebFrame* WebViewImpl::mainFrame() 25095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 251076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) return WebFrame::fromFrame(m_page ? m_page->mainFrame() : 0); 25115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebFrame* WebViewImpl::findFrameByName( 25145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebString& name, WebFrame* relativeToFrame) 25155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 25165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // FIXME: Either this should only deal with WebLocalFrames or it should move to WebFrame. 25175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!relativeToFrame) 25185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) relativeToFrame = mainFrame(); 25195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Frame* frame = toWebLocalFrameImpl(relativeToFrame)->frame(); 2520f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) frame = frame->tree().find(name); 25215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!frame || !frame->isLocalFrame()) 25225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return 0; 25235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return WebLocalFrameImpl::fromFrame(toLocalFrame(frame)); 25245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebFrame* WebViewImpl::focusedFrame() 25275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 252810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return WebLocalFrameImpl::fromFrame(toLocalFrame(focusedWebCoreFrame())); 25295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setFocusedFrame(WebFrame* frame) 25325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 25335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) { 25345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Clears the focused frame if any. 253507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Frame* focusedFrame = focusedWebCoreFrame(); 253607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (focusedFrame && focusedFrame->isLocalFrame()) 253707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch toLocalFrame(focusedFrame)->selection().setFocused(false); 25385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 25395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 254010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch LocalFrame* webcoreFrame = toWebLocalFrameImpl(frame)->frame(); 25413c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch webcoreFrame->page()->focusController().setFocusedFrame(webcoreFrame); 25425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setInitialFocus(bool reverse) 25455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 25465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 25475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 254807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Frame* frame = page()->focusController().focusedOrMainFrame(); 254907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (frame->isLocalFrame()) { 255007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (Document* document = toLocalFrame(frame)->document()) 255107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch document->setFocusedElement(nullptr); 255207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 255309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) page()->focusController().setInitialFocus(reverse ? FocusTypeBackward : FocusTypeForward); 25545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2556d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::clearFocusedElement() 25575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 255807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch RefPtr<Frame> frame = focusedWebCoreFrame(); 255907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!frame || !frame->isLocalFrame()) 25605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 25615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 256207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* localFrame = toLocalFrame(frame.get()); 256307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 2564d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<Document> document = localFrame->document(); 25655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!document) 25665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 25675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2568d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<Element> oldFocusedElement = document->focusedElement(); 25695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Clear the focused node. 2571d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) document->setFocusedElement(nullptr); 25725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25730019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!oldFocusedElement) 25745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 25755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If a text field has focus, we need to make sure the selection controller 25775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // knows to remove selection from it. Otherwise, the text field is still 25785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // processing keyboard events even though focus has been moved to the page and 25795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // keystrokes get eaten as a result. 25800019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (oldFocusedElement->isContentEditable() || oldFocusedElement->isTextFormControl()) 258107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch localFrame->selection().clear(); 25825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::scrollFocusedNodeIntoRect(const WebRect& rect) 25855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 25865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) LocalFrame* frame = page()->mainFrame() && page()->mainFrame()->isLocalFrame() 25875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ? page()->deprecatedLocalMainFrame() : 0; 25880019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch Element* element = focusedElement(); 25890019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!frame || !frame->view() || !element) 25905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 25915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_webSettings->autoZoomFocusedNodeToLegibleScale()) { 25930019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch frame->view()->scrollElementToRect(element, IntRect(rect.x, rect.y, rect.width, rect.height)); 25945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 25955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 25965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2597926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) float scale; 2598926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) IntPoint scroll; 2599926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool needAnimation; 26000019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch computeScaleAndScrollForFocusedNode(element, scale, scroll, needAnimation); 2601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (needAnimation) 2602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) startPageScaleAnimation(scroll, false, scale, scrollAndScaleAnimationDurationInSeconds); 2603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2604926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2605926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::computeScaleAndScrollForFocusedNode(Node* focusedNode, float& newScale, IntPoint& newScroll, bool& needAnimation) 2606926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 26078abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) focusedNode->document().updateLayoutIgnorePendingStylesheets(); 26085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 'caret' is rect encompassing the blinking cursor. 26108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) IntRect textboxRect = focusedNode->document().view()->contentsToWindow(pixelSnappedIntRect(focusedNode->Node::boundingBox())); 2611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebRect caret, unusedEnd; 2612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectionBounds(caret, unusedEnd); 261353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) IntRect unscaledCaret = caret; 261453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) unscaledCaret.scale(1 / pageScaleFactor()); 261553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) caret = unscaledCaret; 26165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Pick a scale which is reasonably readable. This is the scale at which 26185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the caret height will become minReadableCaretHeight (adjusted for dpi 26195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and font scale factor). 262051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) newScale = clampPageScaleFactorToLimits(legibleScale() * minReadableCaretHeight / caret.height); 26215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const float deltaScale = newScale / pageScaleFactor(); 26225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Convert the rects to absolute space in the new scale. 26245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect textboxRectInDocumentCoordinates = textboxRect; 26255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) textboxRectInDocumentCoordinates.move(mainFrame()->scrollOffset()); 26265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect caretInDocumentCoordinates = caret; 26275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) caretInDocumentCoordinates.move(mainFrame()->scrollOffset()); 26285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 262953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) int viewWidth = m_size.width / newScale; 263053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) int viewHeight = m_size.height / newScale; 2631926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2632926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (textboxRectInDocumentCoordinates.width() <= viewWidth) { 26335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Field is narrower than screen. Try to leave padding on left so field's 26345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // label is visible, but it's more important to ensure entire field is 26355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // onscreen. 2636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) int idealLeftPadding = viewWidth * leftBoxRatio; 2637926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) int maxLeftPaddingKeepingBoxOnscreen = viewWidth - textboxRectInDocumentCoordinates.width(); 26385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) newScroll.setX(textboxRectInDocumentCoordinates.x() - std::min<int>(idealLeftPadding, maxLeftPaddingKeepingBoxOnscreen)); 26395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 26405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Field is wider than screen. Try to left-align field, unless caret would 26415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be offscreen, in which case right-align the caret. 26425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) newScroll.setX(std::max<int>(textboxRectInDocumentCoordinates.x(), caretInDocumentCoordinates.x() + caretInDocumentCoordinates.width() + caretPadding - viewWidth)); 26435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2644926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (textboxRectInDocumentCoordinates.height() <= viewHeight) { 26455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Field is shorter than screen. Vertically center it. 2646926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) newScroll.setY(textboxRectInDocumentCoordinates.y() - (viewHeight - textboxRectInDocumentCoordinates.height()) / 2); 26475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 26485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Field is taller than screen. Try to top align field, unless caret would 26495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be offscreen, in which case bottom-align the caret. 26505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) newScroll.setY(std::max<int>(textboxRectInDocumentCoordinates.y(), caretInDocumentCoordinates.y() + caretInDocumentCoordinates.height() + caretPadding - viewHeight)); 26515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2653926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) needAnimation = false; 26545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we are at less than the target zoom level, zoom in. 26555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (deltaScale > minScaleChangeToTriggerZoom) 26565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) needAnimation = true; 26575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the caret is offscreen, then animate. 2658926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) IntRect sizeRect(0, 0, viewWidth, viewHeight); 26595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!sizeRect.contains(caret)) 26605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) needAnimation = true; 26615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the box is partially offscreen and it's possible to bring it fully 26625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // onscreen, then animate. 26635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (sizeRect.contains(textboxRectInDocumentCoordinates.width(), textboxRectInDocumentCoordinates.height()) && !sizeRect.contains(textboxRect)) 26645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) needAnimation = true; 26655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::advanceFocus(bool reverse) 26685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 266909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) page()->focusController().advanceFocus(reverse ? FocusTypeBackward : FocusTypeForward); 26705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double WebViewImpl::zoomLevel() 26735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_zoomLevel; 26755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)double WebViewImpl::setZoomLevel(double zoomLevel) 26785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (zoomLevel < m_minimumZoomLevel) 26805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_zoomLevel = m_minimumZoomLevel; 26815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (zoomLevel > m_maximumZoomLevel) 26825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_zoomLevel = m_maximumZoomLevel; 26835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 26845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_zoomLevel = zoomLevel; 26855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2686d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = mainFrameImpl()->frame(); 268710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WebPluginContainerImpl* pluginContainer = WebLocalFrameImpl::pluginContainerFromFrame(frame); 26885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pluginContainer) 26898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) pluginContainer->plugin()->setZoomLevel(m_zoomLevel, false); 26905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else { 269151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) float zoomFactor = m_zoomFactorOverride ? m_zoomFactorOverride : static_cast<float>(zoomLevelToZoomFactor(m_zoomLevel)); 26928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) frame->setPageZoomFactor(zoomFactor); 26935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 26955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_zoomLevel; 26965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::zoomLimitsChanged(double minimumZoomLevel, 26995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double maximumZoomLevel) 27005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_minimumZoomLevel = minimumZoomLevel; 27025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_maximumZoomLevel = maximumZoomLevel; 27035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->zoomLimitsChanged(m_minimumZoomLevel, m_maximumZoomLevel); 27045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)float WebViewImpl::textZoomFactor() 27078abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){ 27088abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return mainFrameImpl()->frame()->textZoomFactor(); 27098abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)} 27108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 27118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)float WebViewImpl::setTextZoomFactor(float textZoomFactor) 27128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){ 2713d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = mainFrameImpl()->frame(); 271410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (WebLocalFrameImpl::pluginContainerFromFrame(frame)) 27158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return 1; 27168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 27178abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) frame->setTextZoomFactor(textZoomFactor); 27188abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 27198abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return textZoomFactor; 27208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)} 27218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 27225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::fullFramePluginZoomLevelChanged(double zoomLevel) 27235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (zoomLevel == m_zoomLevel) 27255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 27265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_zoomLevel = std::max(std::min(zoomLevel, m_maximumZoomLevel), m_minimumZoomLevel); 27285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->zoomLevelChanged(); 27295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double WebView::zoomLevelToZoomFactor(double zoomLevel) 27325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return pow(textSizeMultiplierRatio, zoomLevel); 27345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double WebView::zoomFactorToZoomLevel(double factor) 27375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Since factor = 1.2^level, level = log(factor) / log(1.2) 27395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return log(factor) / log(textSizeMultiplierRatio); 27405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float WebViewImpl::pageScaleFactor() const 27435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page()) 27455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 1; 27465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 274710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!pinchVirtualViewportEnabled()) 274810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return page()->pageScaleFactor(); 274910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 275010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return page()->frameHost().pinchViewport().scale(); 27515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)float WebViewImpl::clampPageScaleFactorToLimits(float scaleFactor) const 27545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 275593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_pageScaleConstraintsSet.finalConstraints().clampToConstraints(scaleFactor); 27565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)IntPoint WebViewImpl::clampOffsetAtScale(const IntPoint& offset, float scale) 27595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 276093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) FrameView* view = mainFrameImpl()->frameView(); 276193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (!view) 276293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return offset; 276393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 2764d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return view->clampOffsetAtScale(offset, scale); 27655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 276710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebViewImpl::pinchVirtualViewportEnabled() const 27685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 276910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ASSERT(page()); 277010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return page()->settings().pinchVirtualViewportEnabled(); 277110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 277210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 277310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::setPinchViewportOffset(const WebFloatPoint& offset) 277410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 277510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ASSERT(page()); 277610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 277710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!pinchVirtualViewportEnabled()) 27785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 27795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 278010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch page()->frameHost().pinchViewport().setLocation(offset); 278110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 278210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 278310f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebFloatPoint WebViewImpl::pinchViewportOffset() const 278410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 278510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ASSERT(page()); 278610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 278710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!pinchVirtualViewportEnabled()) 278810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return WebFloatPoint(); 278910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 279010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return page()->frameHost().pinchViewport().visibleRect().location(); 279110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 279210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 279310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::setPageScaleFactor(float scaleFactor) 279410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 279510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ASSERT(page()); 279610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 27975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scaleFactor = clampPageScaleFactorToLimits(scaleFactor); 279810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (scaleFactor == pageScaleFactor()) 279910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return; 2800926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 280110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // TODO(bokan): Old-style pinch path. Remove when we're migrated to 280210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // virtual viewport pinch. 280310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!pinchVirtualViewportEnabled()) { 280410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch IntPoint scrollOffset(mainFrame()->scrollOffset().width, mainFrame()->scrollOffset().height); 280510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch setPageScaleFactor(scaleFactor, scrollOffset); 280610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return; 280710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 280810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 280910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch page()->frameHost().pinchViewport().setScale(scaleFactor); 281010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch deviceOrPageScaleFactorChanged(); 281110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 281210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 281310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::setMainFrameScrollOffset(const WebPoint& origin) 281410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 281510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch updateMainFrameScrollPosition(origin, false); 281693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 2817926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 281810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::setPageScaleFactor(float scaleFactor, const WebPoint& origin) 281993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 282010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!page()) 282193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return; 28225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 282310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch IntPoint newScrollOffset = origin; 282410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch scaleFactor = clampPageScaleFactorToLimits(scaleFactor); 282510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch newScrollOffset = clampOffsetAtScale(newScrollOffset, scaleFactor); 282610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 282710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (pinchVirtualViewportEnabled()) 282810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch setPageScaleFactor(scaleFactor); 282910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // Note, we don't set the offset in the new path. This method is going 283010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // away for the new pinch model so that's ok. 283110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch else 283210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch page()->setPageScaleFactor(scaleFactor, newScrollOffset); 28335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 28345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 283510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 28365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float WebViewImpl::deviceScaleFactor() const 28375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 28385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page()) 28395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 1; 28405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return page()->deviceScaleFactor(); 28425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 28435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setDeviceScaleFactor(float scaleFactor) 28455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 28465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page()) 28475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 28485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) page()->setDeviceScaleFactor(scaleFactor); 28505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_layerTreeView) 28521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) updateLayerTreeDeviceScaleFactor(); 28535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 28545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::enableAutoResizeMode(const WebSize& minSize, const WebSize& maxSize) 28565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 28575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_shouldAutoResize = true; 28585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_minAutoSize = minSize; 28595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_maxAutoSize = maxSize; 28605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) configureAutoResizeMode(); 28615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 28625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::disableAutoResizeMode() 28645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 28655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_shouldAutoResize = false; 28665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) configureAutoResizeMode(); 28675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 28685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 286993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void WebViewImpl::setUserAgentPageScaleConstraints(PageScaleConstraints newConstraints) 28705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 287193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (newConstraints == m_pageScaleConstraintsSet.userAgentConstraints()) 2872926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 2873926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 287493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.setUserAgentConstraints(newConstraints); 2875926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 287693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (!mainFrameImpl() || !mainFrameImpl()->frameView()) 287793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return; 287893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 287993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) mainFrameImpl()->frameView()->setNeedsLayout(); 28805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 28815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 288293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void WebViewImpl::setInitialPageScaleOverride(float initialPageScaleFactorOverride) 28835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 288493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) PageScaleConstraints constraints = m_pageScaleConstraintsSet.userAgentConstraints(); 288593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.initialScale = initialPageScaleFactorOverride; 28865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 288793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (constraints == m_pageScaleConstraintsSet.userAgentConstraints()) 28885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 28895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 289093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.setNeedsReset(true); 289193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) setUserAgentPageScaleConstraints(constraints); 28925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 28935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 289493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void WebViewImpl::setPageScaleFactorLimits(float minPageScale, float maxPageScale) 28955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 289693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) PageScaleConstraints constraints = m_pageScaleConstraintsSet.userAgentConstraints(); 289793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.minimumScale = minPageScale; 289893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.maximumScale = maxPageScale; 289993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) setUserAgentPageScaleConstraints(constraints); 2900926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2901926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 290293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void WebViewImpl::setIgnoreViewportTagScaleLimits(bool ignore) 290393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 290493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) PageScaleConstraints constraints = m_pageScaleConstraintsSet.userAgentConstraints(); 290593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (ignore) { 290693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.minimumScale = m_pageScaleConstraintsSet.defaultConstraints().minimumScale; 290793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.maximumScale = m_pageScaleConstraintsSet.defaultConstraints().maximumScale; 290893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } else { 290993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.minimumScale = -1; 291093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.maximumScale = -1; 291193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 291293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) setUserAgentPageScaleConstraints(constraints); 291393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 291493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 291593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void WebViewImpl::refreshPageScaleFactorAfterLayout() 2916926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 29175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!mainFrame() || !page() || !page()->mainFrame() || !page()->mainFrame()->isLocalFrame() || !page()->deprecatedLocalMainFrame()->view()) 2918926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 29195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FrameView* view = page()->deprecatedLocalMainFrame()->view(); 2920926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2921bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) updatePageDefinedViewportConstraints(mainFrameImpl()->frame()->document()->viewportDescription()); 292293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.computeFinalConstraints(); 2923926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2924d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (settings()->shrinksViewportContentToFit() && !m_fixedLayoutSizeLock) { 292593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) int verticalScrollbarWidth = 0; 2926926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (view->verticalScrollbar() && !view->verticalScrollbar()->isOverlayScrollbar()) 292793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) verticalScrollbarWidth = view->verticalScrollbar()->width(); 2928323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_pageScaleConstraintsSet.adjustFinalConstraintsToContentsSize(contentsSize(), verticalScrollbarWidth); 29295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 293093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 2931323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (pinchVirtualViewportEnabled()) 2932323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) mainFrameImpl()->frameView()->resize(m_pageScaleConstraintsSet.mainFrameSize(contentsSize())); 2933323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 2934926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) float newPageScaleFactor = pageScaleFactor(); 293593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (m_pageScaleConstraintsSet.needsReset() && m_pageScaleConstraintsSet.finalConstraints().initialScale != -1) { 293693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) newPageScaleFactor = m_pageScaleConstraintsSet.finalConstraints().initialScale; 293793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.setNeedsReset(false); 2938926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 293910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch setPageScaleFactor(newPageScaleFactor); 294093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 294193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) updateLayerTreeViewport(); 294293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 294393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // Relayout immediately to avoid violating the rule that needsLayout() 294493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // isn't set at the end of a layout. 294593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (view->needsLayout()) 294693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) view->layout(); 294793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 294893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 2949bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void WebViewImpl::updatePageDefinedViewportConstraints(const ViewportDescription& description) 295093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 29515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!settings()->viewportEnabled() || !page() || (!m_size.width && !m_size.height) || !page()->mainFrame()->isLocalFrame()) 295293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return; 295393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 29545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Document* document = page()->deprecatedLocalMainFrame()->document(); 2955aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 29565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (settingsImpl()->useExpandedHeuristicsForGpuRasterization()) { 29575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_matchesHeuristicsForGpuRasterization = description.maxWidth == Length(DeviceWidth) 29585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) && description.minZoom == 1.0 29595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) && description.minZoomIsExplicit; 29605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } else { 29615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_matchesHeuristicsForGpuRasterization = description.maxWidth == Length(DeviceWidth) 29625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) && description.minZoom == 1.0 29635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) && description.minZoomIsExplicit 29645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) && description.zoom == 1.0 29655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) && description.zoomIsExplicit 29665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) && description.userZoom 29675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) && description.userZoomIsExplicit; 29685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 2969f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu if (m_layerTreeView) 2970f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu m_layerTreeView->heuristicsForGpuRasterizationUpdated(m_matchesHeuristicsForGpuRasterization); 2971f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 2972aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch Length defaultMinWidth = document->viewportDefaultMinWidth(); 2973aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (defaultMinWidth.isAuto()) 2974aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch defaultMinWidth = Length(ExtendToZoom); 2975aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 29761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ViewportDescription adjustedDescription = description; 29771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (settingsImpl()->viewportMetaLayoutSizeQuirk() && adjustedDescription.type == ViewportDescription::ViewportMeta) { 297851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) const int legacyWidthSnappingMagicNumber = 320; 297951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (adjustedDescription.maxWidth.isFixed() && adjustedDescription.maxWidth.value() <= legacyWidthSnappingMagicNumber) 298009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) adjustedDescription.maxWidth = Length(DeviceWidth); 2981d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (adjustedDescription.maxHeight.isFixed() && adjustedDescription.maxHeight.value() <= m_size.height) 298209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) adjustedDescription.maxHeight = Length(DeviceHeight); 29831e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) adjustedDescription.minWidth = adjustedDescription.maxWidth; 29841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) adjustedDescription.minHeight = adjustedDescription.maxHeight; 29858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) } 2986aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 298751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) float oldInitialScale = m_pageScaleConstraintsSet.pageDefinedConstraints().initialScale; 2988323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_pageScaleConstraintsSet.updatePageDefinedConstraints(adjustedDescription, defaultMinWidth); 298951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 299051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (settingsImpl()->clobberUserAgentInitialScaleQuirk() 299151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) && m_pageScaleConstraintsSet.userAgentConstraints().initialScale != -1 299251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) && m_pageScaleConstraintsSet.userAgentConstraints().initialScale * deviceScaleFactor() <= 1) { 299309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (description.maxWidth == Length(DeviceWidth) 2994aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch || (description.maxWidth.type() == Auto && m_pageScaleConstraintsSet.pageDefinedConstraints().initialScale == 1.0f)) 299551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) setInitialPageScaleOverride(-1); 299651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 2997aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 2998323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_pageScaleConstraintsSet.adjustForAndroidWebViewQuirks(adjustedDescription, defaultMinWidth.intValue(), deviceScaleFactor(), settingsImpl()->supportDeprecatedTargetDensityDPI(), page()->settings().wideViewportQuirkEnabled(), page()->settings().useWideViewport(), page()->settings().loadWithOverviewMode(), settingsImpl()->viewportMetaNonUserScalableQuirk()); 299951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) float newInitialScale = m_pageScaleConstraintsSet.pageDefinedConstraints().initialScale; 300051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (oldInitialScale != newInitialScale && newInitialScale != -1) { 300151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_pageScaleConstraintsSet.setNeedsReset(true); 300251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (mainFrameImpl() && mainFrameImpl()->frameView()) 300351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) mainFrameImpl()->frameView()->setNeedsLayout(); 300451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 300593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 3006bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) updateMainFrameLayoutSize(); 3007aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 30085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (LocalFrame* frame = page()->deprecatedLocalMainFrame()) { 3009aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (FastTextAutosizer* textAutosizer = frame->document()->fastTextAutosizer()) 3010aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch textAutosizer->updatePageInfoInAllFrames(); 3011aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch } 3012bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 3013bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 3014bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void WebViewImpl::updateMainFrameLayoutSize() 3015bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 3016323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (m_fixedLayoutSizeLock || m_shouldAutoResize || !mainFrameImpl()) 3017bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return; 3018bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 301909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<FrameView> view = mainFrameImpl()->frameView(); 3020bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (!view) 3021bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return; 3022bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 3023bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) WebSize layoutSize = m_size; 3024bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 3025bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (settings()->viewportEnabled()) { 3026bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) layoutSize = flooredIntSize(m_pageScaleConstraintsSet.pageDefinedConstraints().layoutSize); 30275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 302809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool textAutosizingEnabled = page()->settings().textAutosizingEnabled(); 302909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (textAutosizingEnabled && layoutSize.width != view->layoutSize().width()) { 30305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (TextAutosizer* textAutosizer = page()->deprecatedLocalMainFrame()->document()->textAutosizer()) 3031a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) textAutosizer->recalculateMultipliers(); 3032a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 3033bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } 30345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3035e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu if (page()->settings().forceZeroLayoutHeight()) 3036e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu layoutSize.height = 0; 3037e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu 3038bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) view->setLayoutSize(layoutSize); 303993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 304093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 304193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)IntSize WebViewImpl::contentsSize() const 304293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 30435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!page()->mainFrame()->isLocalFrame()) 30445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return IntSize(); 30455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) RenderView* root = page()->deprecatedLocalMainFrame()->contentRenderer(); 304693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (!root) 304793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return IntSize(); 304893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return root->documentRect().size(); 30495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 30505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)WebSize WebViewImpl::contentsPreferredMinimumSize() 30525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 30535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Document* document = m_page->mainFrame()->isLocalFrame() ? m_page->deprecatedLocalMainFrame()->document() : 0; 30545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!document || !document->renderView() || !document->documentElement()) 30555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return WebSize(); 30565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 30575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) layout(); 3058521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) FontCachePurgePreventer fontCachePurgePreventer; // Required by minPreferredLogicalWidth(). 30595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) IntSize preferredMinimumSize(document->renderView()->minPreferredLogicalWidth(), document->documentElement()->scrollHeight()); 30605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) preferredMinimumSize.scale(zoomLevelToZoomFactor(zoomLevel())); 30615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return preferredMinimumSize; 30625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 30635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 30645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float WebViewImpl::minimumPageScaleFactor() const 30655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 306693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_pageScaleConstraintsSet.finalConstraints().minimumScale; 30675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 30685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float WebViewImpl::maximumPageScaleFactor() const 30705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 307193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_pageScaleConstraintsSet.finalConstraints().maximumScale; 30725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 30735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::resetScrollAndScaleState() 30755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3076d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // TODO: This is done by the pinchViewport().reset() call below and can be removed when 3077d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // the new pinch path is the only one. 3078d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) setPageScaleFactor(1); 3079d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) updateMainFrameScrollPosition(IntPoint(), true); 3080d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) page()->frameHost().pinchViewport().reset(); 3081926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 30825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!page()->mainFrame()->isLocalFrame()) 30835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 30845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 3085926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Clear out the values for the current history item. This will prevent the history item from clobbering the 3086926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // value determined during page scale initialization, which may be less than 1. 30875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) page()->deprecatedLocalMainFrame()->loader().clearScrollPositionAndViewState(); 308893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.setNeedsReset(true); 30895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Clobber saved scales and scroll offsets. 30915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (FrameView* view = page()->deprecatedLocalMainFrame()->document()->view()) 30925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) view->cacheCurrentScrollPosition(); 30935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 30945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setFixedLayoutSize(const WebSize& layoutSize) 30965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 30975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!page() || !page()->mainFrame()->isLocalFrame()) 30985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 30995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) LocalFrame* frame = page()->deprecatedLocalMainFrame(); 31019bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (!frame) 31025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 31035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 310409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<FrameView> view = frame->view(); 31059bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (!view) 31069bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return; 31079bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 31089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_fixedLayoutSizeLock = layoutSize.width || layoutSize.height; 31099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 31109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (m_fixedLayoutSizeLock) 3111bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) view->setLayoutSize(layoutSize); 31129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) else 3113bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) updateMainFrameLayoutSize(); 31145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 31155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::performMediaPlayerAction(const WebMediaPlayerAction& action, 31175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& location) 31185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 31195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HitTestResult result = hitTestResultForWindowPos(location); 3120d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<Node> node = result.innerNonSharedNode(); 3121d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!isHTMLVideoElement(*node) && !isHTMLAudioElement(*node)) 31225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 31235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3124d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<HTMLMediaElement> mediaElement = static_pointer_cast<HTMLMediaElement>(node); 31255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (action.type) { 31265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebMediaPlayerAction::Play: 31275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (action.enable) 31285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mediaElement->play(); 31295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 31305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mediaElement->pause(); 31315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 31325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebMediaPlayerAction::Mute: 31335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mediaElement->setMuted(action.enable); 31345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 31355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebMediaPlayerAction::Loop: 31365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mediaElement->setLoop(action.enable); 31375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 31385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebMediaPlayerAction::Controls: 31395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mediaElement->setControls(action.enable); 31405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 31415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 31425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 31435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 31445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 31455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::performPluginAction(const WebPluginAction& action, 31475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& location) 31485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 31495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HitTestResult result = hitTestResultForWindowPos(location); 3150d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<Node> node = result.innerNonSharedNode(); 3151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!isHTMLObjectElement(*node) && !isHTMLEmbedElement(*node)) 31525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 31535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* object = node->renderer(); 31555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (object && object->isWidget()) { 31565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Widget* widget = toRenderWidget(object)->widget(); 31575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (widget && widget->isPluginContainer()) { 315809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) WebPluginContainerImpl* plugin = toWebPluginContainerImpl(widget); 31595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (action.type) { 31605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebPluginAction::Rotate90Clockwise: 31615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) plugin->plugin()->rotateView(WebPlugin::RotationType90Clockwise); 31625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 31635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebPluginAction::Rotate90Counterclockwise: 31645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) plugin->plugin()->rotateView(WebPlugin::RotationType90Counterclockwise); 31655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 31665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 31675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 31685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 31695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 31705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 31715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 31725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebHitTestResult WebViewImpl::hitTestResultAt(const WebPoint& point) 31745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3175591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch IntPoint scaledPoint = point; 3176591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch scaledPoint.scale(1 / pageScaleFactor(), 1 / pageScaleFactor()); 3177591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return hitTestResultForWindowPos(scaledPoint); 31785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 31795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::copyImageAt(const WebPoint& point) 31815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 31825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 31835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 31845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HitTestResult result = hitTestResultForWindowPos(point); 31865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 318737fa872c637fc1cb688924f3a9f8071921d93f63Bo Liu if (result.absoluteImageURLIncludingCanvasDataURL().isEmpty()) { 31885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // There isn't actually an image at these coordinates. Might be because 31895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the window scrolled while the context menu was open or because the page 31905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // changed itself between when we thought there was an image here and when 31915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we actually tried to retreive the image. 31925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 31935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: implement a cache of the most recent HitTestResult to avoid having 31945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to do two hit tests. 31955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 31965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 31975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->editor().copyImage(result); 31995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 32005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3201323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void WebViewImpl::saveImageAt(const WebPoint& point) 3202323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 3203323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (!m_page) 3204323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return; 3205323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 320637fa872c637fc1cb688924f3a9f8071921d93f63Bo Liu KURL url = hitTestResultForWindowPos(point).absoluteImageURLIncludingCanvasDataURL(); 3207323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 3208323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (url.isEmpty()) 3209323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return; 3210323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 3211323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ResourceRequest request(url); 32125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->loader().client()->loadURLExternally( 3213323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) request, NavigationPolicyDownloadTo, WebString()); 3214323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 3215323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 32165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::dragSourceEndedAt( 32175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& clientPoint, 32185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& screenPoint, 32195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebDragOperation operation) 32205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 32215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PlatformMouseEvent pme(clientPoint, 32225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) screenPoint, 32235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LeftButton, PlatformEvent::MouseMoved, 0, false, false, false, 32245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) false, 0); 32255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->eventHandler().dragSourceEndedAt(pme, 32265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<DragOperation>(operation)); 32275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 32285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::dragSourceSystemDragEnded() 32305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 32315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It's possible for us to get this callback while not doing a drag if 32325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it's from a previous page that got unloaded. 32335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_doingDragAndDrop) { 323400d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch m_page->dragController().dragEnded(); 32355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_doingDragAndDrop = false; 32365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 32375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 32385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebDragOperation WebViewImpl::dragTargetDragEnter( 32405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebDragData& webDragData, 32415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& clientPoint, 32425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& screenPoint, 32435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebDragOperationsMask operationsAllowed, 32445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int keyModifiers) 32455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 32465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_currentDragData); 32475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3248d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_currentDragData = webDragData.getValue(); 32495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_operationsAllowed = operationsAllowed; 32505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragEnter, keyModifiers); 32525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 32535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebDragOperation WebViewImpl::dragTargetDragOver( 32555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& clientPoint, 32565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& screenPoint, 32575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebDragOperationsMask operationsAllowed, 32585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int keyModifiers) 32595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 32605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_operationsAllowed = operationsAllowed; 32615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragOver, keyModifiers); 32635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 32645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::dragTargetDragLeave() 32665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 32675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_currentDragData); 32685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DragData dragData( 32705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_currentDragData.get(), 32715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint(), 32725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint(), 32735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<DragOperation>(m_operationsAllowed)); 32745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 327500d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch m_page->dragController().dragExited(&dragData); 32765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: why is the drag scroll timer not stopped here? 32785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dragOperation = WebDragOperationNone; 3280d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_currentDragData = nullptr; 32815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 32825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::dragTargetDrop(const WebPoint& clientPoint, 32845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& screenPoint, 32855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int keyModifiers) 32865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 32875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_currentDragData); 32885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 328910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch UserGestureNotifier notifier(m_autofillClient, &m_userGestureObserved); 329010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 32915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If this webview transitions from the "drop accepting" state to the "not 32925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // accepting" state, then our IPC message reply indicating that may be in- 32935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // flight, or else delayed by javascript processing in this webview. If a 32945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // drop happens before our IPC reply has reached the browser process, then 32955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the browser forwards the drop to this webview. So only allow a drop to 32965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // proceed if our webview m_dragOperation state is not DragOperationNone. 32975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_dragOperation == WebDragOperationNone) { // IPC RACE CONDITION: do not allow this drop. 32995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dragTargetDragLeave(); 33005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 33015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 33025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_currentDragData->setModifierKeyState(webInputEventKeyStateToPlatformEventKeyState(keyModifiers)); 33045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DragData dragData( 33055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_currentDragData.get(), 33065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clientPoint, 33075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) screenPoint, 33085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<DragOperation>(m_operationsAllowed)); 33095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 331007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch UserGestureIndicator gesture(DefinitelyProcessingNewUserGesture); 331100d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch m_page->dragController().performDrag(&dragData); 33125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dragOperation = WebDragOperationNone; 3314d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_currentDragData = nullptr; 33155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 33165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 331753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void WebViewImpl::spellingMarkers(WebVector<uint32_t>* markers) 331853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 331953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<uint32_t> result; 33205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree().traverseNext()) { 33215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!frame->isLocalFrame()) 33225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) continue; 33235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) const WillBeHeapVector<DocumentMarker*>& documentMarkers = toLocalFrame(frame)->document()->markers().markers(); 332453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t i = 0; i < documentMarkers.size(); ++i) 332553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) result.append(documentMarkers[i]->hash()); 332653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 332753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) markers->assign(result); 332853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 332953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 33305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebDragOperation WebViewImpl::dragTargetDragEnterOrOver(const WebPoint& clientPoint, const WebPoint& screenPoint, DragAction dragAction, int keyModifiers) 33315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 33325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_currentDragData); 33335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_currentDragData->setModifierKeyState(webInputEventKeyStateToPlatformEventKeyState(keyModifiers)); 33355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DragData dragData( 33365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_currentDragData.get(), 33375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clientPoint, 33385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) screenPoint, 33395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<DragOperation>(m_operationsAllowed)); 33405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DragSession dragSession; 33425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (dragAction == DragEnter) 334300d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch dragSession = m_page->dragController().dragEntered(&dragData); 33445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 334500d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch dragSession = m_page->dragController().dragUpdated(&dragData); 33465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DragOperation dropEffect = dragSession.operation; 33485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Mask the drop effect operation against the drag source's allowed operations. 33505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!(dropEffect & dragData.draggingSourceOperationMask())) 33515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dropEffect = DragOperationNone; 33525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dragOperation = static_cast<WebDragOperation>(dropEffect); 33545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_dragOperation; 33565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 33575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::sendResizeEventAndRepaint() 33595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 336002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // FIXME: This is wrong. The FrameView is responsible sending a resizeEvent 336102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // as part of layout. Layout is also responsible for sending invalidations 336202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // to the embedder. This method and all callers may be wrong. -- eseidel. 33635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (mainFrameImpl()->frameView()) { 33645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Enqueues the resize event. 336551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) mainFrameImpl()->frame()->document()->enqueueResizeEvent(); 33665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 33675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_client) { 33695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isAcceleratedCompositingActive()) { 33705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateLayerTreeViewport(); 33715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 33725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebRect damagedRect(0, 0, m_size.width, m_size.height); 33735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->didInvalidateRect(damagedRect); 33745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 33755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 33765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pageOverlays) 33775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays->update(); 33785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 33795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::configureAutoResizeMode() 33815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 33825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl() || !mainFrameImpl()->frame() || !mainFrameImpl()->frame()->view()) 33835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 33845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mainFrameImpl()->frame()->view()->enableAutoSizeMode(m_shouldAutoResize, m_minAutoSize, m_maxAutoSize); 33865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 33875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned long WebViewImpl::createUniqueIdentifierForRequest() 33895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 339053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return createUniqueIdentifier(); 33915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 33925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::inspectElementAt(const WebPoint& point) 33945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 33955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 33965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 33975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3398e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (point.x == -1 || point.y == -1) { 3399e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->inspectorController().inspect(0); 3400e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } else { 3401d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move | HitTestRequest::ReadOnly | HitTestRequest::AllowChildFrameContent; 34025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) HitTestRequest request(hitType); 34035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3404f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) WebMouseEvent dummyEvent; 3405f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) dummyEvent.type = WebInputEvent::MouseDown; 3406f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) dummyEvent.x = point.x; 3407f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) dummyEvent.y = point.y; 34085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) IntPoint transformedPoint = PlatformMouseEventBuilder(m_page->deprecatedLocalMainFrame()->view(), dummyEvent).position(); 34095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) HitTestResult result(m_page->deprecatedLocalMainFrame()->view()->windowToContents(transformedPoint)); 34105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->contentRenderer()->hitTest(request, result); 3411521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) Node* node = result.innerNode(); 34125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!node && m_page->deprecatedLocalMainFrame()->document()) 34135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) node = m_page->deprecatedLocalMainFrame()->document()->documentElement(); 3414e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->inspectorController().inspect(node); 34155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 34165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 34175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebViewImpl::inspectorSettings() const 34195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_inspectorSettings; 34215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 34225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setInspectorSettings(const WebString& settings) 34245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_inspectorSettings = settings; 34265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 34275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::inspectorSetting(const WebString& key, WebString* value) const 34295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_inspectorSettingsMap->contains(key)) 34315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 34325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *value = m_inspectorSettingsMap->get(key); 34335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 34345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 34355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setInspectorSetting(const WebString& key, 34375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebString& value) 34385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_inspectorSettingsMap->set(key, value); 34405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) client()->didUpdateInspectorSetting(key, value); 34415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 34425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebViewImpl::setCompositorDeviceScaleFactorOverride(float deviceScaleFactor) 34441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 3445a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (m_compositorDeviceScaleFactorOverride == deviceScaleFactor) 3446a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return; 34471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_compositorDeviceScaleFactorOverride = deviceScaleFactor; 34481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (page() && m_layerTreeView) 34491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) updateLayerTreeDeviceScaleFactor(); 34501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 34511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 345251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void WebViewImpl::setRootLayerTransform(const WebSize& rootLayerOffset, float rootLayerScale) 34531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 3454a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (m_rootLayerScale == rootLayerScale && m_rootLayerOffset == rootLayerOffset) 3455a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return; 34561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_rootLayerScale = rootLayerScale; 345751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_rootLayerOffset = rootLayerOffset; 345851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (mainFrameImpl()) 345951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) mainFrameImpl()->setInputEventsTransformForEmulation(m_rootLayerOffset, m_rootLayerScale); 34601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) updateRootLayerTransform(); 34611e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 34621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 34635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebDevToolsAgent* WebViewImpl::devToolsAgent() 34645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_devToolsAgent.get(); 34665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 34675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)WebAXObject WebViewImpl::accessibilityObject() 34695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl()) 34718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return WebAXObject(); 34725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Document* document = mainFrameImpl()->frame()->document(); 34748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return WebAXObject( 3475d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) document->axObjectCache()->getOrCreate(document->renderView())); 34765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 34775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::performCustomContextMenuAction(unsigned action) 34795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 34815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3482e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) ContextMenu* menu = m_page->contextMenuController().contextMenu(); 34835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!menu) 34845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 348553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) const ContextMenuItem* item = menu->itemWithAction(static_cast<ContextMenuAction>(ContextMenuItemBaseCustomTag + action)); 34865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (item) 3487e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->contextMenuController().contextMenuItemSelected(item); 3488e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->contextMenuController().clearContextMenu(); 34895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 34905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::showContextMenu() 3492926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 3493926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!page()) 3494926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 3495926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3496e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) page()->contextMenuController().clearContextMenu(); 3497926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_contextMenuAllowed = true; 349807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (LocalFrame* focusedFrame = toLocalFrame(page()->focusController().focusedOrMainFrame())) 3499f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) focusedFrame->eventHandler().sendContextMenuEventForKey(); 3500926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_contextMenuAllowed = false; 3501926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 3502926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3503e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu// FIXME: This should be removed when the chromium side patch lands 3504e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu// http://codereview.chromium.org/260623004 350509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebString WebViewImpl::getSmartClipData(WebRect rect) 350609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 3507e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu return WebString(); 3508e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu} 3509e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu 3510e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liuvoid WebViewImpl::getSmartClipData(WebRect rect, WebString& clipText, WebRect& clipRect) 3511e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu{ 351207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* frame = toLocalFrame(focusedWebCoreFrame()); 351309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!frame) 3514e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu return; 3515e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu SmartClipData clipData = WebCore::SmartClip(frame).dataForRect(rect); 3516e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu clipText = clipData.clipData(); 3517e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu clipRect = clipData.rect(); 3518e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu} 3519e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu 3520e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liuvoid WebViewImpl::extractSmartClipData(WebRect rect, WebString& clipText, WebString& clipHtml, WebRect& clipRect) 3521e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu{ 3522e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu LocalFrame* localFrame = toLocalFrame(focusedWebCoreFrame()); 3523e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu if (!localFrame) 3524e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu return; 3525e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu SmartClipData clipData = WebCore::SmartClip(localFrame).dataForRect(rect); 3526e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu clipText = clipData.clipData(); 3527e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu clipRect = clipData.rect(); 3528e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu 3529e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu WebLocalFrameImpl* frame = mainFrameImpl(); 3530e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu if (!frame) 3531e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu return; 3532e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu WebPoint startPoint(rect.x, rect.y); 3533e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu WebPoint endPoint(rect.x + rect.width, rect.y + rect.height); 3534e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu VisiblePosition startVisiblePosition = frame->visiblePositionForWindowPoint(startPoint); 3535e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu VisiblePosition endVisiblePosition = frame->visiblePositionForWindowPoint(endPoint); 3536e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu 3537e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu Position startPosition = startVisiblePosition.deepEquivalent(); 3538e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu Position endPosition = endVisiblePosition.deepEquivalent(); 3539e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu 3540c6f91470756c6f8015daf0996ad5302a02ef9fe3Torne (Richard Coles) // document() will return null if -webkit-user-select is set to none. 3541c6f91470756c6f8015daf0996ad5302a02ef9fe3Torne (Richard Coles) if (!startPosition.document() || !endPosition.document()) 3542c6f91470756c6f8015daf0996ad5302a02ef9fe3Torne (Richard Coles) return; 3543c6f91470756c6f8015daf0996ad5302a02ef9fe3Torne (Richard Coles) 3544c6f91470756c6f8015daf0996ad5302a02ef9fe3Torne (Richard Coles) RefPtrWillBeRawPtr<Range> range = Range::create(*startPosition.document(), startPosition, endPosition); 3545e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu if (!range) 3546e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu return; 3547e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu 3548e65d17ab81f0664fe04da3576f47a70ee6e2d8f0Bo Liu clipHtml = createMarkup(range.get(), 0, AnnotateForInterchange, false, ResolveNonLocalURLs); 354909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 355009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 355109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void WebViewImpl::hidePopups() 355209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 355309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) hideSelectPopup(); 355409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_pagePopup) 355509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) closePagePopup(m_pagePopup.get()); 355609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 35575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setIsTransparent(bool isTransparent) 35595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 35605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Set any existing frames to be transparent. 35615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Frame* frame = m_page->mainFrame(); 35625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (frame) { 35635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (frame->isLocalFrame()) 35645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) toLocalFrame(frame)->view()->setTransparent(isTransparent); 3565f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) frame = frame->tree().traverseNext(); 35665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 35675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Future frames check this to know whether to be transparent. 35695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_isTransparent = isTransparent; 35705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 35715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::isTransparent() const 35735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 35745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_isTransparent; 35755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 35765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 357702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochvoid WebViewImpl::setBaseBackgroundColor(WebColor color) 357802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 3579d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) layout(); 3580d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 358102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch if (m_baseBackgroundColor == color) 358202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return; 358302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 358402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_baseBackgroundColor = color; 358502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 35865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (m_page->mainFrame() && m_page->mainFrame()->isLocalFrame()) 35875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->view()->setBaseBackgroundColor(color); 358802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 358919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) updateLayerTreeBackgroundColor(); 359002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch} 359102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 35925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setIsActive(bool active) 35935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 35943c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch if (page()) 35953c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch page()->focusController().setActive(active); 35965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 35975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::isActive() const 35995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 36003c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch return page() ? page()->focusController().isActive() : false; 36015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setDomainRelaxationForbidden(bool forbidden, const WebString& scheme) 36045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 36055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SchemeRegistry::setDomainRelaxationForbiddenForURLScheme(forbidden, String(scheme)); 36065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 360802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochvoid WebViewImpl::setWindowFeatures(const WebWindowFeatures& features) 360902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 361002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_page->chrome().setWindowFeatures(features); 361102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch} 361202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3613a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid WebViewImpl::setOpenedByDOM() 3614a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{ 3615a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch m_page->setOpenedByDOM(); 3616a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 3617a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 36185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setSelectionColors(unsigned activeBackgroundColor, 36195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned activeForegroundColor, 36205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned inactiveBackgroundColor, 36215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned inactiveForegroundColor) { 36221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#if USE(DEFAULT_RENDER_THEME) 3623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RenderThemeChromiumDefault::setSelectionColors(activeBackgroundColor, activeForegroundColor, inactiveBackgroundColor, inactiveForegroundColor); 3624c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) RenderTheme::theme().platformColorsDidChange(); 36255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 36265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebView::injectStyleSheet(const WebString& sourceCode, const WebVector<WebString>& patternsIn, WebView::StyleInjectionTarget injectIn) 36295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 36305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<String> patterns; 36315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < patternsIn.size(); ++i) 36325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) patterns.append(patternsIn[i]); 36335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 363409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) InjectedStyleSheets::instance().add(sourceCode, patterns, static_cast<WebCore::StyleInjectionTarget>(injectIn)); 36355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebView::removeInjectedStyleSheets() 36385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 363909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) InjectedStyleSheets::instance().removeAll(); 36405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3642bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void WebViewImpl::didCommitLoad(bool isNewNavigation, bool isNavigationWithinPage) 36435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3644bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (isNewNavigation && !isNavigationWithinPage) 364593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.setNeedsReset(true); 36465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make sure link highlight from previous page is cleared. 36489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_linkHighlights.clear(); 364951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) endActiveFlingAnimation(); 365010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_userGestureObserved = false; 36515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 365310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::willInsertBody(WebLocalFrameImpl* webframe) 36545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3655d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (webframe != mainFrameImpl()) 36565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 36575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->mainFrame()->isLocalFrame()) 36595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 36605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 3661a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // If we get to the <body> tag and we have no pending stylesheet and import load, we 3662d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // can be fairly confident we'll have something sensible to paint soon and 3663d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // can turn off deferred commits. 36645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (m_page->deprecatedLocalMainFrame()->document()->isRenderingReady()) 3665d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) resumeTreeViewCommits(); 3666d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 3667d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 3668d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::resumeTreeViewCommits() 3669d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 36705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (m_layerTreeViewCommitsDeferred) { 36715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (m_layerTreeView) 36725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) m_layerTreeView->setDeferCommits(false); 36735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) m_layerTreeViewCommitsDeferred = false; 36745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 3675d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 3676d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 367710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::layoutUpdated(WebLocalFrameImpl* webframe) 3678d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 3679d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!m_client || webframe != mainFrameImpl()) 3680d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 3681d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 3682d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // If we finished a layout while in deferred commit mode, 3683d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // that means it's time to start producing frames again so un-defer. 3684d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) resumeTreeViewCommits(); 36855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 36865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_shouldAutoResize && mainFrameImpl()->frame() && mainFrameImpl()->frame()->view()) { 36875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebSize frameSize = mainFrameImpl()->frame()->view()->frameRect().size(); 36885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (frameSize != m_size) { 36895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_size = frameSize; 3690323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 3691323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) page()->frameHost().pinchViewport().setSize(m_size); 3692323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_pageScaleConstraintsSet.didChangeViewSize(m_size); 3693323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 36945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->didAutoResize(m_size); 36955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sendResizeEventAndRepaint(); 36965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 36975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 36985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 369993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (m_pageScaleConstraintsSet.constraintsDirty()) 370093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) refreshPageScaleFactorAfterLayout(); 37015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3702926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->didUpdateLayout(); 3703926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 37045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3705926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::didChangeContentsSize() 3706926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 370793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.didChangeContentsSize(contentsSize(), pageScaleFactor()); 37085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 37095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 371053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void WebViewImpl::deviceOrPageScaleFactorChanged() 371153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 371293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.setNeedsReset(false); 371353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) updateLayerTreeViewport(); 371453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 371553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 37165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::useExternalPopupMenus() 37175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 37185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return shouldUseExternalPopupMenus; 37195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 37205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3721d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::startDragging(LocalFrame* frame, 37225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebDragData& dragData, 37235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebDragOperationsMask mask, 37245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebImage& dragImage, 37255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& dragImageOffset) 37265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 37275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_client) 37285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 37295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_doingDragAndDrop); 37305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_doingDragAndDrop = true; 373110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_client->startDragging(WebLocalFrameImpl::fromFrame(frame), dragData, mask, dragImage, dragImageOffset); 37325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 37335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setIgnoreInputEvents(bool newValue) 37355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 37365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_ignoreInputEvents != newValue); 37375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_ignoreInputEvents = newValue; 37385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 37395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 374019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void WebViewImpl::setBackgroundColorOverride(WebColor color) 374119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){ 374219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) m_backgroundColorOverride = color; 374319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) updateLayerTreeBackgroundColor(); 374419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 374519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 374651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void WebViewImpl::setZoomFactorOverride(float zoomFactor) 374751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 374851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_zoomFactorOverride = zoomFactor; 374951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) setZoomLevel(zoomLevel()); 375051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 375151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 37525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::addPageOverlay(WebPageOverlay* overlay, int zOrder) 37535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 37545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_pageOverlays) 37555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays = PageOverlayList::create(this); 37565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays->add(overlay, zOrder); 37585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 37595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::removePageOverlay(WebPageOverlay* overlay) 37615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 37625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pageOverlays && m_pageOverlays->remove(overlay) && m_pageOverlays->empty()) 37635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays = nullptr; 37645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 37655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setOverlayLayer(WebCore::GraphicsLayer* layer) 37675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3768d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!m_rootGraphicsLayer) 3769d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 3770d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 37715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->mainFrame()->isLocalFrame()) 37725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 37735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 3774f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (pinchVirtualViewportEnabled()) { 37755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->view()->renderView()->compositor()->setOverlayLayer(layer); 3776f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return; 3777f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 3778f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 3779f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // FIXME(bokan): This path goes away after virtual viewport pinch is enabled everywhere. 3780d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!m_rootTransformLayer) 37815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_rootTransformLayer = m_page->deprecatedLocalMainFrame()->view()->renderView()->compositor()->ensureRootTransformLayer(); 3782d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 3783d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_rootTransformLayer) { 3784d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (layer->parent() != m_rootTransformLayer) 3785d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootTransformLayer->addChild(layer); 37865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 37875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 37885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 378909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)Element* WebViewImpl::focusedElement() const 37905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 379107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Frame* frame = m_page->focusController().focusedFrame(); 379207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!frame || !frame->isLocalFrame()) 37935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 37945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 379507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Document* document = toLocalFrame(frame)->document(); 37965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!document) 37975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 37985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37997757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return document->focusedElement(); 38005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HitTestResult WebViewImpl::hitTestResultForWindowPos(const IntPoint& pos) 38035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 38045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->mainFrame()->isLocalFrame()) 38055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return HitTestResult(); 38065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) IntPoint docPoint(m_page->deprecatedLocalMainFrame()->view()->windowToContents(pos)); 38075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return m_page->deprecatedLocalMainFrame()->eventHandler().hitTestResultAtPoint(docPoint, HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent); 38085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setTabsToLinks(bool enable) 38115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 38125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_tabsToLinks = enable; 38135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::tabsToLinks() const 38165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 38175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_tabsToLinks; 38185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::suppressInvalidations(bool enable) 38215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3822926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_client) 3823926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->suppressCompositorScheduling(enable); 38245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setRootGraphicsLayer(GraphicsLayer* layer) 38275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3828926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) suppressInvalidations(true); 38295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 383010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (pinchVirtualViewportEnabled()) { 3831d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PinchViewport& pinchViewport = page()->frameHost().pinchViewport(); 3832d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) pinchViewport.attachToLayerTree(layer, graphicsLayerFactory()); 3833591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (layer) { 3834d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootGraphicsLayer = pinchViewport.rootGraphicsLayer(); 3835d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootLayer = pinchViewport.rootGraphicsLayer()->platformLayer(); 3836f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_rootTransformLayer = pinchViewport.rootGraphicsLayer(); 3837591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } else { 3838591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_rootGraphicsLayer = 0; 3839591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_rootLayer = 0; 3840d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootTransformLayer = 0; 3841591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 3842591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } else { 3843591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_rootGraphicsLayer = layer; 3844591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_rootLayer = layer ? layer->platformLayer() : 0; 3845d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootTransformLayer = 0; 3846591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 38475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setIsAcceleratedCompositingActive(layer); 38495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) updateRootLayerTransform(); 38511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 38525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_layerTreeView) { 38539bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (m_rootLayer) { 38545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layerTreeView->setRootLayer(*m_rootLayer); 38559bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // We register viewport layers here since there may not be a layer 38569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // tree view prior to this point. 385710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (pinchVirtualViewportEnabled()) { 385807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch page()->frameHost().pinchViewport().registerLayersWithTreeView(m_layerTreeView); 38599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } else { 38609bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) GraphicsLayer* rootScrollLayer = compositor()->scrollLayer(); 38619bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) ASSERT(rootScrollLayer); 38629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) WebLayer* pageScaleLayer = rootScrollLayer->parent() ? rootScrollLayer->parent()->platformLayer() : 0; 38639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_layerTreeView->registerViewportLayers(pageScaleLayer, rootScrollLayer->platformLayer(), 0); 38649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 38659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } else { 38665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layerTreeView->clearRootLayer(); 386710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (pinchVirtualViewportEnabled()) 386807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch page()->frameHost().pinchViewport().clearLayersForTreeView(m_layerTreeView); 38699bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) else 38709bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_layerTreeView->clearViewportLayers(); 38719bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 38725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 38735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3874926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) suppressInvalidations(false); 38755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::scheduleCompositingLayerSync() 38785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 387951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_layerTreeView->setNeedsAnimate(); 38805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3882d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::scrollRootLayer() 38835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 38845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateLayerTreeViewport(); 38855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::invalidateRect(const IntRect& rect) 38885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 38895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_isAcceleratedCompositingActive) { 38905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_layerTreeView); 38915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateLayerTreeViewport(); 38925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else if (m_client) 38935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->didInvalidateRect(rect); 38945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3896926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebCore::GraphicsLayerFactory* WebViewImpl::graphicsLayerFactory() const 3897926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 3898926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_graphicsLayerFactory.get(); 3899926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 3900926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3901591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochWebCore::RenderLayerCompositor* WebViewImpl::compositor() const 3902591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 3903591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!page() 3904591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch || !page()->mainFrame() 39055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) || !page()->mainFrame()->isLocalFrame() 39065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) || !page()->deprecatedLocalMainFrame()->document() 39075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) || !page()->deprecatedLocalMainFrame()->document()->renderView()) 3908591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return 0; 39095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return page()->deprecatedLocalMainFrame()->document()->renderView()->compositor(); 3910591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 3911591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 3912926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::registerForAnimations(WebLayer* layer) 3913926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 3914926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_layerTreeView) 3915926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->registerForAnimations(layer); 3916926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 3917926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 39185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebCore::GraphicsLayer* WebViewImpl::rootGraphicsLayer() 39195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 39205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_rootGraphicsLayer; 39215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 39225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::scheduleAnimation() 39245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 392551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (isAcceleratedCompositingActive()) { 3926fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch ASSERT(m_layerTreeView); 3927fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch m_layerTreeView->setNeedsAnimate(); 3928fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch return; 3929fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch } 3930fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch if (m_client) 3931fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch m_client->scheduleAnimation(); 39325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 39335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setIsAcceleratedCompositingActive(bool active) 39355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 393651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) blink::Platform::current()->histogramEnumeration("GPU.setIsAcceleratedCompositingActive", active * 2 + m_isAcceleratedCompositingActive, 4); 39375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_isAcceleratedCompositingActive == active) 39395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 39405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3941d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!m_client) 3942d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return; 3943d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 39445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!active) { 39455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_isAcceleratedCompositingActive = false; 39465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_layerTreeViewCommitsDeferred 394751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) && blink::Platform::current()->isThreadedCompositingEnabled()) { 39485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_layerTreeView); 39495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In threaded compositing mode, force compositing mode is always on so setIsAcceleratedCompositingActive(false) 39505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // means that we're transitioning to a new page. Suppress commits until WebKit generates invalidations so 39515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we don't attempt to paint too early in the next page load. 39525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layerTreeView->setDeferCommits(true); 39535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layerTreeViewCommitsDeferred = true; 39545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 39555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else if (m_layerTreeView) { 39565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_isAcceleratedCompositingActive = true; 39575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateLayerTreeViewport(); 39587757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (m_pageOverlays) 39597757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch m_pageOverlays->update(); 39605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 39615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TRACE_EVENT0("webkit", "WebViewImpl::setIsAcceleratedCompositingActive(true)"); 39625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3963926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->initializeLayerTreeView(); 3964926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView = m_client->layerTreeView(); 39655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_layerTreeView) { 3966926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->setRootLayer(*m_rootLayer); 39675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool visible = page()->visibilityState() == PageVisibilityStateVisible; 39695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layerTreeView->setVisible(visible); 39701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) updateLayerTreeDeviceScaleFactor(); 397193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_layerTreeView->setPageScaleFactorAndLimits(pageScaleFactor(), minimumPageScaleFactor(), maximumPageScaleFactor()); 397219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) updateLayerTreeBackgroundColor(); 39735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layerTreeView->setHasTransparentBackground(isTransparent()); 3974f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#if USE(RUBBER_BANDING) 3975f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) RefPtr<Image> overhangImage = OverscrollTheme::theme()->getOverhangImage(); 397610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (overhangImage && overhangImage->nativeImageForCurrentFrame()) 3977f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_layerTreeView->setOverhangBitmap(overhangImage->nativeImageForCurrentFrame()->bitmap()); 3978f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#endif 39795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateLayerTreeViewport(); 39805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_isAcceleratedCompositingActive = true; 39815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pageOverlays) 39825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays->update(); 3983926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->setShowFPSCounter(m_showFPSCounter); 3984926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->setShowPaintRects(m_showPaintRects); 3985926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->setShowDebugBorders(m_showDebugBorders); 3986926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->setContinuousPaintingEnabled(m_continuousPaintingEnabled); 3987591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_layerTreeView->setShowScrollBottleneckRects(m_showScrollBottleneckRects); 3988f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu m_layerTreeView->heuristicsForGpuRasterizationUpdated(m_matchesHeuristicsForGpuRasterization); 39895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 399010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // FIXME: It appears that only unittests, <webview> and android webview 399110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // printing can hit this code. We should make them not hit this code and 3992f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // then delete this else clause and allowsBrokenNullLayerTreeView. 399310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // crbug.com/322276 and crbug.com/364716. 3994f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ASSERT(m_client->allowsBrokenNullLayerTreeView()); 39955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_isAcceleratedCompositingActive = false; 3996f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu m_page->settings().setAcceleratedCompositingEnabled(false); 3997f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu m_page->updateAcceleratedCompositingSettings(); 39985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 39995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (page() && page()->mainFrame()->isLocalFrame()) 40015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) page()->deprecatedLocalMainFrame()->view()->setClipsRepaints(!m_isAcceleratedCompositingActive); 40025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 40035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4004926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::updateMainFrameScrollPosition(const IntPoint& scrollPosition, bool programmaticScroll) 4005926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 40065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!page()->mainFrame()->isLocalFrame()) 40075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 40085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 40095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FrameView* frameView = page()->deprecatedLocalMainFrame()->view(); 4010926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!frameView) 4011926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 4012926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4013926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (frameView->scrollPosition() == scrollPosition) 4014926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 4015926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4016926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool oldProgrammaticScroll = frameView->inProgrammaticScroll(); 4017926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) frameView->setInProgrammaticScroll(programmaticScroll); 4018926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) frameView->notifyScrollPositionChanged(scrollPosition); 4019926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) frameView->setInProgrammaticScroll(oldProgrammaticScroll); 4020926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 4021926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 40225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::applyScrollAndScale(const WebSize& scrollDelta, float pageScaleDelta) 40235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 40245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl() || !mainFrameImpl()->frameView()) 40255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 40265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 402710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (pinchVirtualViewportEnabled()) { 402810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (pageScaleDelta != 1) { 402910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // When the virtual viewport is enabled, offsets are already set for us. 403010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch setPageScaleFactor(pageScaleFactor() * pageScaleDelta); 403110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_doubleTapZoomPending = false; 403210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 403310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 403407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return; 403507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 403607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 403707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch // TODO(bokan): Old pinch path only - virtual viewport pinch scrolls are automatically updated via GraphicsLayer::DidScroll. 403807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch // this should be removed once old pinch is removed. 40395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pageScaleDelta == 1) { 40405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TRACE_EVENT_INSTANT2("webkit", "WebViewImpl::applyScrollAndScale::scrollBy", "x", scrollDelta.width, "y", scrollDelta.height); 4041926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebSize webScrollOffset = mainFrame()->scrollOffset(); 4042926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) IntPoint scrollOffset(webScrollOffset.width + scrollDelta.width, webScrollOffset.height + scrollDelta.height); 4043926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) updateMainFrameScrollPosition(scrollOffset, false); 40445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 40455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The page scale changed, so apply a scale and scroll in a single 40465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // operation. 40475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebSize scrollOffset = mainFrame()->scrollOffset(); 40485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollOffset.width += scrollDelta.width; 40495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollOffset.height += scrollDelta.height; 40505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebPoint scrollPoint(scrollOffset.width, scrollOffset.height); 40525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setPageScaleFactor(pageScaleFactor() * pageScaleDelta, scrollPoint); 4053926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_doubleTapZoomPending = false; 40545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 40565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::updateLayerTreeViewport() 40585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 40595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!page() || !m_layerTreeView) 40605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 40615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 406293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_layerTreeView->setPageScaleFactorAndLimits(pageScaleFactor(), minimumPageScaleFactor(), maximumPageScaleFactor()); 40635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 40645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 406519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void WebViewImpl::updateLayerTreeBackgroundColor() 406619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){ 406719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (!m_layerTreeView) 406819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) return; 406919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 407009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_layerTreeView->setBackgroundColor(alphaChannel(m_backgroundColorOverride) ? m_backgroundColorOverride : backgroundColor()); 407119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 407219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 40731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebViewImpl::updateLayerTreeDeviceScaleFactor() 40741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 40751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ASSERT(page()); 40761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ASSERT(m_layerTreeView); 40771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 40781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) float deviceScaleFactor = m_compositorDeviceScaleFactorOverride ? m_compositorDeviceScaleFactorOverride : page()->deviceScaleFactor(); 40791e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_layerTreeView->setDeviceScaleFactor(deviceScaleFactor); 40801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 40811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 40821e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebViewImpl::updateRootLayerTransform() 40831e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 4084d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // If we don't have a root graphics layer, we won't bother trying to find 4085d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // or update the transform layer. 4086d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!m_rootGraphicsLayer) 4087d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 4088d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 4089f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // FIXME(bokan): m_rootTransformLayer is always set here in pinch virtual viewport. This can go away once 4090f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // that's default everywhere. 40915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_rootTransformLayer && m_page->mainFrame()->isLocalFrame()) 40925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_rootTransformLayer = m_page->deprecatedLocalMainFrame()->view()->renderView()->compositor()->ensureRootTransformLayer(); 4093d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 4094d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_rootTransformLayer) { 40951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) WebCore::TransformationMatrix transform; 409651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) transform.translate(m_rootLayerOffset.width, m_rootLayerOffset.height); 40971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) transform = transform.scale(m_rootLayerScale); 4098d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootTransformLayer->setTransform(transform); 40991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } 41001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 41011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 41025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::detectContentOnTouch(const WebPoint& position) 41035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 41045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HitTestResult touchHit = hitTestResultForWindowPos(position); 41055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (touchHit.isContentEditable()) 41075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 41085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* node = touchHit.innerNode(); 41105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node || !node->isTextNode()) 41115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 41125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Ignore when tapping on links or nodes listening to click events, unless the click event is on the 41145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // body element, in which case it's unlikely that the original node itself was intended to be clickable. 4115d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) for (; node && !isHTMLBodyElement(*node); node = node->parentNode()) { 41165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node->isLink() || node->willRespondToTouchEvents() || node->willRespondToMouseClickEvents()) 41175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 41185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 41195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebContentDetectionResult content = m_client->detectContentAround(touchHit); 41215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!content.isValid()) 41225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 41235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->scheduleContentIntent(content.intent()); 41255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 41265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 41275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setVisibilityState(WebPageVisibilityState visibilityState, 41295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isInitialState) { 41305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page()) 41315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 41325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 413351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ASSERT(visibilityState == WebPageVisibilityStateVisible || visibilityState == WebPageVisibilityStateHidden || visibilityState == WebPageVisibilityStatePrerender); 41345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_page->setVisibilityState(static_cast<PageVisibilityState>(static_cast<int>(visibilityState)), isInitialState); 41355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_layerTreeView) { 41375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool visible = visibilityState == WebPageVisibilityStateVisible; 41385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layerTreeView->setVisible(visible); 41395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 41405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 41415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::requestPointerLock() 41435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 41445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client && m_client->requestPointerLock(); 41455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 41465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::requestPointerUnlock() 41485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 41495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_client) 41505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->requestPointerUnlock(); 41515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 41525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::isPointerLocked() 41545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 41555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client && m_client->isPointerLocked(); 41565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 41575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::pointerLockMouseEvent(const WebInputEvent& event) 41595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 41605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AtomicString eventType; 41615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (event.type) { 41625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseDown: 41631e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mousedown; 41645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 41655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseUp: 41661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mouseup; 41675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 41685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseMove: 41691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mousemove; 41705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 41715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 41725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 41735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 41745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebMouseEvent& mouseEvent = static_cast<const WebMouseEvent&>(event); 41765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (page()) 4178e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) page()->pointerLockController().dispatchLockedMouseEvent( 41795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PlatformMouseEventBuilder(mainFrameImpl()->frameView(), mouseEvent), 41805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) eventType); 41815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 41825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebViewImpl::shouldDisableDesktopWorkarounds() 4184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 4185bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (!settings()->viewportEnabled()) 41868abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return false; 41878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 41888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // A document is considered adapted to small screen UAs if one of these holds: 41898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // 1. The author specified viewport has a constrained width that is equal to 41908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // the initial viewport width. 41918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // 2. The author has disabled viewport zoom. 41928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 41938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) const PageScaleConstraints& constraints = m_pageScaleConstraintsSet.pageDefinedConstraints(); 41948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 4195bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (!mainFrameImpl() || !mainFrameImpl()->frameView()) 4196bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return false; 4197bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 4198bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return mainFrameImpl()->frameView()->layoutSize().width() == m_size.width 41998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) || (constraints.minimumScale == constraints.maximumScale && constraints.minimumScale != -1); 4200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 4201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 420251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink 4203