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" 367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/InputTypeNames.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/accessibility/AXObjectCache.h" 3809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/clipboard/DataObject.h" 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentMarkerController.h" 41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/dom/NodeRenderingTraversal.h" 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Text.h" 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/Editor.h" 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h" 45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/editing/HTMLInterchange.h" 463c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "core/editing/InputMethodController.h" 4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/TextIterator.h" 48197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/editing/markup.h" 491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/KeyboardEvent.h" 501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/WheelEvent.h" 51f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "core/frame/EventHandlerRegistry.h" 52d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/FrameHost.h" 5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/FrameView.h" 54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/PinchViewport.h" 56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/frame/RemoteFrame.h" 5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/Settings.h" 5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/SmartClip.h" 5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h" 6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLMediaElement.h" 61a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/html/HTMLPlugInElement.h" 6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLTextAreaElement.h" 6319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "core/html/ime/InputMethodContext.h" 6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorController.h" 6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h" 6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h" 6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/UniqueIdentifier.h" 6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h" 6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/ContextMenuController.h" 70197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/page/ContextMenuProvider.h" 7153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/DragController.h" 7251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/page/DragData.h" 7353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/DragSession.h" 7453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h" 7553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FocusController.h" 7653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h" 7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/page/InjectedStyleSheets.h" 7853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h" 7953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PagePopupClient.h" 8053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PointerLockController.h" 81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/page/ScopedPageLoadDeferrer.h" 8253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/TouchDisambiguation.h" 8353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h" 8453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderWidget.h" 855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/rendering/TextAutosizer.h" 86d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/RenderLayerCompositor.h" 879e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "modules/credentialmanager/CredentialManagerClient.h" 8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "modules/device_orientation/DeviceOrientationInspectorAgent.h" 8907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "modules/encryptedmedia/MediaKeysController.h" 905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "modules/filesystem/InspectorFileSystemAgent.h" 9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "modules/indexeddb/InspectorIndexedDBAgent.h" 92a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "modules/push_messaging/PushController.h" 9351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/ContextMenu.h" 9451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/ContextMenuItem.h" 95a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/Cursor.h" 9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/KeyboardCodes.h" 977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/Logging.h" 981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/NotImplemented.h" 99a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/OverscrollTheme.h" 1001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformGestureEvent.h" 1011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformKeyboardEvent.h" 1021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformMouseEvent.h" 1031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformWheelEvent.h" 10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/PopupMenuClient.h" 10576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h" 1061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/TraceEvent.h" 10707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "platform/UserGestureIndicator.h" 108bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/exported/WebActiveGestureAnimation.h" 109a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/FontCache.h" 110f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/graphics/Color.h" 1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/graphics/FirstPaintInvalidationTracking.h" 112a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/Image.h" 113a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/ImageBuffer.h" 1147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/scheduler/Scheduler.h" 115a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollbarTheme.h" 11651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SchemeRegistry.h" 1171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/Platform.h" 1187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "public/platform/WebCompositeAndReadbackAsyncCallback.h" 1191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebDragData.h" 1201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebFloatPoint.h" 1211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebGestureCurve.h" 1221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebImage.h" 1231e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebLayerTreeView.h" 124197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "public/platform/WebURLRequest.h" 1251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebVector.h" 126f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebAXObject.h" 127f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebActiveWheelFlingParameters.h" 128f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebAutofillClient.h" 129c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "public/web/WebBeginFrameArgs.h" 130a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "public/web/WebFrameClient.h" 131f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebHitTestResult.h" 132f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebInputElement.h" 133f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebMediaPlayerAction.h" 134f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebNode.h" 135f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPlugin.h" 136f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPluginAction.h" 137f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebRange.h" 138f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebTextInputInfo.h" 139f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebViewClient.h" 140f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebWindowFeatures.h" 141f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/CompositionUnderlineVectorBuilder.h" 142f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ContextFeaturesClientImpl.h" 143f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/DatabaseClientImpl.h" 144f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/FullscreenController.h" 145f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/GraphicsLayerFactoryChromium.h" 146f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/LinkHighlight.h" 1475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "web/NavigatorContentUtilsClientImpl.h" 148f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/PopupContainer.h" 149f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/PrerendererClientImpl.h" 150f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/SpeechRecognitionClientProxy.h" 151f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/StorageQuotaClientImpl.h" 152f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ValidationMessageClientImpl.h" 153f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ViewportAnchor.h" 154f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebDevToolsAgentImpl.h" 155f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebDevToolsAgentPrivate.h" 156f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebInputEventConversion.h" 157f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebLocalFrameImpl.h" 158f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPagePopupImpl.h" 159f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPluginContainerImpl.h" 160f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPopupMenuImpl.h" 1615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "web/WebRemoteFrameImpl.h" 162f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebSettingsImpl.h" 163f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WorkerGlobalScopeProxyProviderImpl.h" 164f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/painting/ContinuousPainter.h" 1651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "wtf/CurrentTime.h" 1661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "wtf/RefPtr.h" 1671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "wtf/TemporaryChange.h" 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#if USE(DEFAULT_RENDER_THEME) 17053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderThemeChromiumDefault.h" 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Get rid of WTF's pow define so we can use std::pow. 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#undef pow 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <cmath> // for std::pow 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The following constants control parameters for automated scaling of webpages 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// (such as due to a double tap gesture or find in page etc.). These are 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// experimentally determined. 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const int touchPointPadding = 32; 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const int nonUserInitiatedPointPadding = 11; 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const float minScaleDifference = 0.01f; 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const float doubleTapZoomContentDefaultMargin = 5; 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const float doubleTapZoomContentMinimumMargin = 2; 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const double doubleTapZoomAnimationDurationInSeconds = 0.25; 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const float doubleTapZoomAlreadyLegibleRatio = 1.2f; 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 188f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)static const double multipleTargetsZoomAnimationDurationInSeconds = 0.25; 189f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)static const double findInPageAnimationDurationInSeconds = 0; 190f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 19153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// Constants for viewport anchoring on resize. 19253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static const float viewportAnchorXCoord = 0.5f; 19353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static const float viewportAnchorYCoord = 0; 19453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Constants for zooming in on a focused text field. 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const double scrollAndScaleAnimationDurationInSeconds = 0.2; 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const int minReadableCaretHeight = 18; 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const float minScaleChangeToTriggerZoom = 1.05f; 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const float leftBoxRatio = 0.3f; 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const int caretPadding = 10; 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink { 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Change the text zoom level by kTextSizeMultiplierRatio each time the user 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// zooms text in or out (ie., change by 20%). The min and max values limit 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// text zoom to half and 3x the original text size. These three values match 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// those in Apple's port in WebKit/WebKit/WebView/WebView.mm 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const double WebView::textSizeMultiplierRatio = 1.2; 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const double WebView::minTextSizeMultiplier = 0.5; 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const double WebView::maxTextSizeMultiplier = 3.0; 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Used to defer all page activity in cases where the embedder wishes to run 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// a nested event loop. Using a stack enables nesting of message loop invocations. 2147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistatic WillBeHeapVector<RawPtrWillBeMember<ScopedPageLoadDeferrer> >& pageLoadDeferrerStack() 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DEFINE_STATIC_LOCAL(OwnPtrWillBePersistent<WillBeHeapVector<RawPtrWillBeMember<ScopedPageLoadDeferrer> > >, deferrerStack, (adoptPtrWillBeNoop(new WillBeHeapVector<RawPtrWillBeMember<ScopedPageLoadDeferrer> > ()))); 2177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return *deferrerStack; 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Ensure that the WebDragOperation enum values stay in sync with the original 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// DragOperation constants. 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define COMPILE_ASSERT_MATCHING_ENUM(coreName) \ 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) COMPILE_ASSERT(int(coreName) == int(Web##coreName), dummy##coreName) 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationNone); 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationCopy); 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationLink); 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationGeneric); 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationPrivate); 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationMove); 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationDelete); 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(DragOperationEvery); 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool shouldUseExternalPopupMenus = false; 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static int webInputEventKeyStateToPlatformEventKeyState(int webInputEventKeyState) 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int platformEventKeyState = 0; 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webInputEventKeyState & WebInputEvent::ShiftKey) 239e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) platformEventKeyState = platformEventKeyState | PlatformEvent::ShiftKey; 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webInputEventKeyState & WebInputEvent::ControlKey) 241e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) platformEventKeyState = platformEventKeyState | PlatformEvent::CtrlKey; 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webInputEventKeyState & WebInputEvent::AltKey) 243e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) platformEventKeyState = platformEventKeyState | PlatformEvent::AltKey; 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (webInputEventKeyState & WebInputEvent::MetaKey) 245e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) platformEventKeyState = platformEventKeyState | PlatformEvent::MetaKey; 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return platformEventKeyState; 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochnamespace { 25010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 25110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochclass UserGestureNotifier { 25210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochpublic: 253c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // If a UserGestureIndicator is created for a user gesture since the last 254c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // page load and *userGestureObserved is false, the UserGestureNotifier 255c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // will notify the client and set *userGestureObserved to true. 25610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch UserGestureNotifier(WebAutofillClient*, bool* userGestureObserved); 25710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ~UserGestureNotifier(); 25810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 25910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochprivate: 26010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WebAutofillClient* const m_client; 26110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch bool* const m_userGestureObserved; 26210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}; 26310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 26410f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochUserGestureNotifier::UserGestureNotifier(WebAutofillClient* client, bool* userGestureObserved) 26510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch : m_client(client) 26610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch , m_userGestureObserved(userGestureObserved) 26710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 26810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ASSERT(m_userGestureObserved); 26910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 27010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 27110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochUserGestureNotifier::~UserGestureNotifier() 27210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 273c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (!*m_userGestureObserved && UserGestureIndicator::processedUserGestureSinceLoad()) { 27410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch *m_userGestureObserved = true; 27510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (m_client) 27610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_client->firstUserGestureObserved(); 27710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 27810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 27910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 28010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} // namespace 28110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebView ---------------------------------------------------------------- 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebView* WebView::create(WebViewClient* client) 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Pass the WebViewImpl's self-reference to the caller. 2871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return WebViewImpl::create(client); 2881e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 2891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 2901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)WebViewImpl* WebViewImpl::create(WebViewClient* client) 2911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 2921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // Pass the WebViewImpl's self-reference to the caller. 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptRef(new WebViewImpl(client)).leakRef(); 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebView::setUseExternalPopupMenus(bool useExternalPopupMenus) 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) shouldUseExternalPopupMenus = useExternalPopupMenus; 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebView::updateVisitedLinkState(unsigned long long linkHash) 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 30309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Page::visitedStateChanged(linkHash); 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebView::resetVisitedLinkState() 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 30809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Page::allVisitedStateChanged(); 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebView::willEnterModalLoop() 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) pageLoadDeferrerStack().append(new ScopedPageLoadDeferrer()); 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebView::didExitModalLoop() 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 318d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(pageLoadDeferrerStack().size()); 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ScopedPageLoadDeferrer* deferrer = pageLoadDeferrerStack().last(); 3217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#if ENABLE(OILPAN) 3227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci deferrer->dispose(); 3237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#else 3247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci delete deferrer; 3257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif 326d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) pageLoadDeferrerStack().removeLast(); 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebViewImpl::setMainFrame(WebFrame* frame) 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (frame->isWebLocalFrame()) 332e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) toWebLocalFrameImpl(frame)->initializeCoreFrame(&page()->frameHost(), 0, nullAtom, nullAtom); 3335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) else 334e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) toWebRemoteFrameImpl(frame)->initializeCoreFrame(&page()->frameHost(), 0, nullAtom); 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setAutofillClient(WebAutofillClient* autofillClient) 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_autofillClient = autofillClient; 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3429e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void WebViewImpl::setCredentialManagerClient(WebCredentialManagerClient* webCredentialManagerClient) 3439e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){ 3449e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) ASSERT(m_page); 3459e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) provideCredentialManagerClientTo(*m_page, new CredentialManagerClient(webCredentialManagerClient)); 3469e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)} 3479e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setDevToolsAgentClient(WebDevToolsAgentClient* devToolsClient) 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (devToolsClient) 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_devToolsAgent = adoptPtr(new WebDevToolsAgentImpl(this, devToolsClient)); 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_devToolsAgent.clear(); 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setPrerendererClient(WebPrerendererClient* prerendererClient) 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 358d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(m_page); 359d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) providePrerendererClientTo(*m_page, new PrerendererClientImpl(prerendererClient)); 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setSpellCheckClient(WebSpellCheckClient* spellCheckClient) 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_spellCheckClient = spellCheckClient; 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebViewImpl::WebViewImpl(WebViewClient* client) 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_client(client) 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_autofillClient(0) 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_spellCheckClient(0) 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_chromeClientImpl(this) 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_contextMenuClientImpl(this) 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_dragClientImpl(this) 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_editorClientImpl(this) 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_inspectorClientImpl(this) 37653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_backForwardClientImpl(this) 37751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_spellCheckerClientImpl(this) 37809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_storageClientImpl(this) 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_shouldAutoResize(false) 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_zoomLevel(0) 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_minimumZoomLevel(zoomFactorToZoomLevel(minTextSizeMultiplier)) 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_maximumZoomLevel(zoomFactorToZoomLevel(maxTextSizeMultiplier)) 383926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_doubleTapZoomPageScaleFactor(0) 384926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_doubleTapZoomPending(false) 385f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) , m_enableFakePageScaleAnimationForTesting(false) 386f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) , m_fakePageScaleAnimationPageScaleFactor(0) 387f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) , m_fakePageScaleAnimationUseAnchor(false) 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_contextMenuAllowed(false) 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_doingDragAndDrop(false) 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_ignoreInputEvents(false) 3911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) , m_compositorDeviceScaleFactorOverride(0) 3921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) , m_rootLayerScale(1) 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_suppressNextKeypressEvent(false) 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_imeAcceptEvents(true) 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_operationsAllowed(WebDragOperationNone) 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_dragOperation(WebDragOperationNone) 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_isTransparent(false) 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_tabsToLinks(false) 399926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_layerTreeView(0) 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_rootLayer(0) 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_rootGraphicsLayer(0) 402d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_rootTransformLayer(0) 403926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_graphicsLayerFactory(adoptPtr(new GraphicsLayerFactoryChromium(this))) 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_isAcceleratedCompositingActive(false) 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_layerTreeViewCommitsDeferred(false) 406197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_layerTreeViewClosed(false) 407f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu , m_matchesHeuristicsForGpuRasterization(false) 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_recreatingGraphicsContext(false) 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_flingModifier(0) 410926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_flingSourceDevice(false) 411f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) , m_fullscreenController(FullscreenController::create(this)) 412926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_showFPSCounter(false) 413926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_showPaintRects(false) 414926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_showDebugBorders(false) 415926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_continuousPaintingEnabled(false) 416591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch , m_showScrollBottleneckRects(false) 41702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch , m_baseBackgroundColor(Color::white) 41819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) , m_backgroundColorOverride(Color::transparent) 41951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_zoomFactorOverride(0) 42010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch , m_userGestureObserved(false) 4217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_topControlsContentOffset(0) 4227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_topControlsLayoutHeight(0) 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Page::PageClients pageClients; 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageClients.chromeClient = &m_chromeClientImpl; 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageClients.contextMenuClient = &m_contextMenuClientImpl; 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageClients.editorClient = &m_editorClientImpl; 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageClients.dragClient = &m_dragClientImpl; 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pageClients.inspectorClient = &m_inspectorClientImpl; 43053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) pageClients.backForwardClient = &m_backForwardClientImpl; 43151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) pageClients.spellCheckerClient = &m_spellCheckerClientImpl; 43209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) pageClients.storageClient = &m_storageClientImpl; 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4346f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch m_page = adoptPtrWillBeNoop(new Page(pageClients)); 43507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch MediaKeysController::provideMediaKeysTo(*m_page, &m_mediaKeysClientImpl); 436a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch provideSpeechRecognitionTo(*m_page, SpeechRecognitionClientProxy::create(client ? client->speechRecognizer() : 0)); 437aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch provideNavigatorContentUtilsTo(*m_page, NavigatorContentUtilsClientImpl::create(this)); 4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 439a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch provideContextFeaturesTo(*m_page, ContextFeaturesClientImpl::create()); 440d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) DeviceOrientationInspectorAgent::provideTo(*m_page); 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->inspectorController().registerModuleAgent(InspectorFileSystemAgent::create(m_page.get())); 443d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) provideDatabaseClientTo(*m_page, DatabaseClientImpl::create()); 44409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) InspectorIndexedDBAgent::provideTo(m_page.get()); 445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) provideStorageQuotaClientTo(*m_page, StorageQuotaClientImpl::create()); 446a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch m_page->setValidationMessageClient(ValidationMessageClientImpl::create(*this)); 447d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) provideWorkerGlobalScopeProxyProviderTo(*m_page, WorkerGlobalScopeProxyProviderImpl::create()); 44883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 449d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_page->makeOrdinary(); 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (m_client) { 452a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch providePushControllerTo(*m_page, m_client->webPushClient()); 45393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) setDeviceScaleFactor(m_client->screenInfo().deviceScaleFactor); 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setVisibilityState(m_client->visibilityState(), true); 45593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 457c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) initializeLayerTreeView(); 4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebViewImpl::~WebViewImpl() 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_page); 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46510f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl* WebViewImpl::mainFrameImpl() 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return m_page && m_page->mainFrame() && m_page->mainFrame()->isLocalFrame() ? WebLocalFrameImpl::fromFrame(m_page->deprecatedLocalMainFrame()) : 0; 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::tabKeyCyclesThroughElements() const 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_page); 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_page->tabKeyCyclesThroughElements(); 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setTabKeyCyclesThroughElements(bool value) 4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_page) 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_page->setTabKeyCyclesThroughElements(value); 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 482d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::handleMouseLeave(LocalFrame& mainFrame, const WebMouseEvent& event) 483c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){ 484c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) m_client->setMouseOverURL(WebURL()); 485c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) PageWidgetEventHandler::handleMouseLeave(mainFrame, event); 486c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)} 487c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) 488d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::handleMouseDown(LocalFrame& mainFrame, const WebMouseEvent& event) 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If there is a popup open, close it as the user is clicking on the page (outside of the 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // popup). We also save it so we can prevent a click on an element from immediately 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // reopening the same popup. 49309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<PopupContainer> selectPopup; 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<WebPagePopupImpl> pagePopup; 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.button == WebMouseEvent::ButtonLeft) { 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) selectPopup = m_selectPopup; 4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pagePopup = m_pagePopup; 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hidePopups(); 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_selectPopup); 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_pagePopup); 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastMouseDownPoint = WebPoint(event.x, event.y); 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // Take capture on a mouse down on a plugin so we can send it mouse events. 5065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // If the hit node is a plugin but a scrollbar is over it don't start mouse 5075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // capture because it will interfere with the scrollbar receiving events. 5085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) IntPoint point(event.x, event.y); 5097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (event.button == WebMouseEvent::ButtonLeft && m_page->mainFrame()->isLocalFrame()) { 5105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) point = m_page->deprecatedLocalMainFrame()->view()->windowToContents(point); 5115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) HitTestResult result(m_page->deprecatedLocalMainFrame()->eventHandler().hitTestResultAtPoint(point)); 5127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci result.setToShadowHostIfInUserAgentShadowRoot(); 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* hitNode = result.innerNonSharedNode(); 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!result.scrollbar() && hitNode && hitNode->renderer() && hitNode->renderer()->isEmbeddedObject()) { 5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_mouseCaptureNode = hitNode; 5177757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch TRACE_EVENT_ASYNC_BEGIN0("input", "capturing mouse", this); 51853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PageWidgetEventHandler::handleMouseDown(mainFrame, event); 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (event.button == WebMouseEvent::ButtonLeft && m_mouseCaptureNode) 52410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_mouseCaptureGestureToken = mainFrame.eventHandler().takeLastMouseDownGestureToken(); 52510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_selectPopup && m_selectPopup == selectPopup) { 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // That click triggered a select popup which is the same as the one that 5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // was showing before the click. It means the user clicked the select 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // while the popup was showing, and as a result we first closed then 5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // immediately reopened the select popup. It needs to be closed. 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hideSelectPopup(); 5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pagePopup && pagePopup && m_pagePopup->hasSamePopupClient(pagePopup.get())) { 5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // That click triggered a page popup that is the same as the one we just closed. 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It needs to be closed. 5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) closePagePopup(m_pagePopup.get()); 5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Dispatch the contextmenu event regardless of if the click was swallowed. 5418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN) 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // On Windows, we handle it on mouse up, not down. 5438abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#elif OS(MACOSX) 5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.button == WebMouseEvent::ButtonRight 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || (event.button == WebMouseEvent::ButtonLeft 5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && event.modifiers & WebMouseEvent::ControlKey)) 5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mouseContextMenu(event); 5488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#else 5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.button == WebMouseEvent::ButtonRight) 5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mouseContextMenu(event); 5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::mouseContextMenu(const WebMouseEvent& event) 5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl() || !mainFrameImpl()->frameView()) 5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 559e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->contextMenuController().clearContextMenu(); 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PlatformMouseEventBuilder pme(mainFrameImpl()->frameView(), event); 5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Find the right target frame. See issue 1186900. 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HitTestResult result = hitTestResultForWindowPos(pme.position()); 56507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Frame* targetFrame; 5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (result.innerNonSharedNode()) 5678abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) targetFrame = result.innerNonSharedNode()->document().frame(); 5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 5693c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch targetFrame = m_page->focusController().focusedOrMainFrame(); 5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!targetFrame->isLocalFrame()) 57207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return; 57307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 57407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* targetLocalFrame = toLocalFrame(targetFrame); 57507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 5768abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN) 57707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch targetLocalFrame->view()->setCursor(pointerCursor()); 5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_contextMenuAllowed = true; 58107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch targetLocalFrame->eventHandler().sendContextMenuEvent(pme); 5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_contextMenuAllowed = false; 5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Actually showing the context menu is handled by the ContextMenuClient 5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // implementation... 5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 587d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::handleMouseUp(LocalFrame& mainFrame, const WebMouseEvent& event) 5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PageWidgetEventHandler::handleMouseUp(mainFrame, event); 5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN) 5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Dispatch the contextmenu event regardless of if the click was swallowed. 5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // On Mac/Linux, we handle it on mouse down, not up. 5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.button == WebMouseEvent::ButtonRight) 5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mouseContextMenu(event); 5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 599d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool WebViewImpl::handleMouseWheel(LocalFrame& mainFrame, const WebMouseWheelEvent& event) 600926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) hidePopups(); 602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return PageWidgetEventHandler::handleMouseWheel(mainFrame, event); 603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 604926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 60507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochbool WebViewImpl::scrollBy(const WebFloatSize& delta, const WebFloatSize& velocity) 6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 607f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (m_flingSourceDevice == WebGestureDeviceTouchpad) { 608926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebMouseWheelEvent syntheticWheel; 609e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) const float tickDivisor = WheelEvent::TickMultiplier; 6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.deltaX = delta.width; 612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.deltaY = delta.height; 613926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.wheelTicksX = delta.width / tickDivisor; 614926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.wheelTicksY = delta.height / tickDivisor; 615926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.hasPreciseScrollingDeltas = true; 616926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.x = m_positionOnFlingStart.x; 617926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.y = m_positionOnFlingStart.y; 618926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.globalX = m_globalPositionOnFlingStart.x; 619926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.globalY = m_globalPositionOnFlingStart.y; 620926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticWheel.modifiers = m_flingModifier; 6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (m_page && m_page->mainFrame() && m_page->mainFrame()->isLocalFrame() && m_page->deprecatedLocalMainFrame()->view()) 6235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return handleMouseWheel(*m_page->deprecatedLocalMainFrame(), syntheticWheel); 624926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else { 625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebGestureEvent syntheticGestureEvent; 626926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 627926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.type = WebInputEvent::GestureScrollUpdateWithoutPropagation; 628926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.data.scrollUpdate.deltaX = delta.width; 629926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.data.scrollUpdate.deltaY = delta.height; 630926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.x = m_positionOnFlingStart.x; 631926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.y = m_positionOnFlingStart.y; 632926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.globalX = m_globalPositionOnFlingStart.x; 633926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.globalY = m_globalPositionOnFlingStart.y; 634926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) syntheticGestureEvent.modifiers = m_flingModifier; 635f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) syntheticGestureEvent.sourceDevice = WebGestureDeviceTouchscreen; 636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 6375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (m_page && m_page->mainFrame() && m_page->mainFrame()->isLocalFrame() && m_page->deprecatedLocalMainFrame()->view()) 63807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return handleGestureEvent(syntheticGestureEvent); 639926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 64007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return false; 64107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 64207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::handleGestureEvent(const WebGestureEvent& event) 6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool eventSwallowed = false; 646926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool eventCancelled = false; // for disambiguation 647926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 64809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Special handling for slow-path fling gestures. 649f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) switch (event.type) { 650926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case WebInputEvent::GestureFlingStart: { 65109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (mainFrameImpl()->frame()->eventHandler().isScrollbarHandlingGestures()) 65209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) break; 653926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->cancelScheduledContentIntents(); 654926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_positionOnFlingStart = WebPoint(event.x / pageScaleFactor(), event.y / pageScaleFactor()); 655926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_globalPositionOnFlingStart = WebPoint(event.globalX, event.globalY); 656926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_flingModifier = event.modifiers; 657926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_flingSourceDevice = event.sourceDevice; 6585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) OwnPtr<WebGestureCurve> flingCurve = adoptPtr(Platform::current()->createFlingAnimationCurve(event.sourceDevice, WebFloatPoint(event.data.flingStart.velocityX, event.data.flingStart.velocityY), WebSize())); 659f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ASSERT(flingCurve); 660926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_gestureAnimation = WebActiveGestureAnimation::createAtAnimationStart(flingCurve.release(), this); 661926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) scheduleAnimation(); 662926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) eventSwallowed = true; 663926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 664926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->didHandleGestureEvent(event, eventCancelled); 665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return eventSwallowed; 666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 667926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case WebInputEvent::GestureFlingCancel: 66851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (endActiveFlingAnimation()) 669926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) eventSwallowed = true; 670926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->didHandleGestureEvent(event, eventCancelled); 672926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return eventSwallowed; 673926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) default: 674926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 675926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 676926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 677926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), event); 6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Special handling for double tap and scroll events as we don't want to 6807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // hit test for them. 6817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci switch (event.type) { 6827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case WebInputEvent::GestureDoubleTap: 6837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_webSettings->doubleTapToZoomEnabled() && minimumPageScaleFactor() != maximumPageScaleFactor()) { 6847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_client->cancelScheduledContentIntents(); 6857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci animateDoubleTapZoom(platformEvent.position()); 6867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 6877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // GestureDoubleTap is currently only used by Android for zooming. For WebCore, 6887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // GestureTap with tap count = 2 is used instead. So we drop GestureDoubleTap here. 6897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci eventSwallowed = true; 6907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_client->didHandleGestureEvent(event, eventCancelled); 6917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return eventSwallowed; 6927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case WebInputEvent::GestureScrollBegin: 6937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case WebInputEvent::GesturePinchBegin: 6947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_client->cancelScheduledContentIntents(); 6957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case WebInputEvent::GestureScrollEnd: 6967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case WebInputEvent::GestureScrollUpdate: 6977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case WebInputEvent::GestureScrollUpdateWithoutPropagation: 6987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case WebInputEvent::GesturePinchEnd: 6997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case WebInputEvent::GesturePinchUpdate: 7007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case WebInputEvent::GestureFlingStart: 7017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Scrolling-related gesture events invoke EventHandler recursively for each frame down 7027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // the chain, doing a single-frame hit-test per frame. This matches handleWheelEvent. 7037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Perhaps we could simplify things by rewriting scroll handling to work inner frame 7047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // out, and then unify with other gesture events. 7057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureScrollEvent(platformEvent); 7067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_client->didHandleGestureEvent(event, eventCancelled); 7077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return eventSwallowed; 7087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci default: 7097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 7107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 7117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 7127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Hit test across all frames and do touch adjustment as necessary for the event type. 7137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci GestureEventWithHitTestResults targetedEvent = 7147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_page->deprecatedLocalMainFrame()->eventHandler().targetGestureEvent(platformEvent); 715197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Handle link highlighting outside the main switch to avoid getting lost in the 7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // complicated set of cases handled below. 718f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) switch (event.type) { 7191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) case WebInputEvent::GestureShowPress: 7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Queue a highlight animation, then hand off to regular handler. 7217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci enableTapHighlightAtPoint(targetedEvent); 7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureTapCancel: 7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureTap: 7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureLongPress: 7269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) for (size_t i = 0; i < m_linkHighlights.size(); ++i) 7279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_linkHighlights[i]->startHighlightAnimationIfNeeded(); 7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 733f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) switch (event.type) { 7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureTap: { 7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->cancelScheduledContentIntents(); 7367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: Use targeted event here and save another hit test. 7377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: Content intent should be generated using same node that was highlighted. crbug.com/416746 738926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (detectContentOnTouch(platformEvent.position())) { 7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) eventSwallowed = true; 7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 74309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<PopupContainer> selectPopup; 7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) selectPopup = m_selectPopup; 7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hideSelectPopup(); 7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_selectPopup); 7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 748926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Don't trigger a disambiguation popup on sites designed for mobile devices. 749926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Instead, assume that the page has been designed with big enough buttons and links. 7507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Don't trigger a disambiguation popup when screencasting, since it's implemented outside of 7517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // compositor pipeline and is not being screencasted itself. This leads to bad user experience. 7527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (event.data.tap.width > 0 && !shouldDisableDesktopWorkarounds() && !page()->inspectorController().screencastEnabled()) { 753926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebGestureEvent scaledEvent = event; 754926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) scaledEvent.x = event.x / pageScaleFactor(); 755926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) scaledEvent.y = event.y / pageScaleFactor(); 756926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) scaledEvent.data.tap.width = event.data.tap.width / pageScaleFactor(); 757926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) scaledEvent.data.tap.height = event.data.tap.height / pageScaleFactor(); 7587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci IntRect boundingBox( 7597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci scaledEvent.x - scaledEvent.data.tap.width / 2, 7607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci scaledEvent.y - scaledEvent.data.tap.height / 2, 7617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci scaledEvent.data.tap.width, 7627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci scaledEvent.data.tap.height); 7637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 7647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci WebSize pinchViewportOffset = pinchVirtualViewportEnabled() ? 7657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci flooredIntSize(page()->frameHost().pinchViewport().location()) : IntSize(); 7667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 7677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Keep bounding box relative to the main frame. 7687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci boundingBox.move(pinchViewportOffset); 7697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<IntRect> goodTargets; 771d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapVector<RawPtrWillBeMember<Node> > highlightNodes; 7729bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) findGoodTouchTargets(boundingBox, mainFrameImpl()->frame(), goodTargets, highlightNodes); 7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: replace touch adjustment code when numberOfGoodTargets == 1? 7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Single candidate case is currently handled by: https://bugs.webkit.org/show_bug.cgi?id=85101 7757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (goodTargets.size() >= 2 && m_client 7767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci && m_client->didTapMultipleTargets(pinchViewportOffset, boundingBox, goodTargets)) { 7777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 778197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch enableTapHighlights(highlightNodes); 7799bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) for (size_t i = 0; i < m_linkHighlights.size(); ++i) 7809bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_linkHighlights[i]->startHighlightAnimationIfNeeded(); 7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) eventSwallowed = true; 782926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) eventCancelled = true; 7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureEvent(targetedEvent); 7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_selectPopup && m_selectPopup == selectPopup) { 7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // That tap triggered a select popup which is the same as the one that 7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // was showing before the tap. It means the user tapped the select 7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // while the popup was showing, and as a result we first closed then 7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // immediately reopened the select popup. It needs to be closed. 7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hideSelectPopup(); 7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureTwoFingerTap: 8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureLongPress: 8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureLongTap: { 8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl() || !mainFrameImpl()->frameView()) 8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->cancelScheduledContentIntents(); 806e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->contextMenuController().clearContextMenu(); 8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_contextMenuAllowed = true; 8087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureEvent(targetedEvent); 8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_contextMenuAllowed = false; 8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case WebInputEvent::GestureShowPress: 8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->cancelScheduledContentIntents(); 815f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case WebInputEvent::GestureTapDown: 8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::GestureTapCancel: 8177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case WebInputEvent::GestureTapUnconfirmed: { 8187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureEvent(targetedEvent); 8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 824926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->didHandleGestureEvent(event, eventCancelled); 8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return eventSwallowed; 8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::transferActiveWheelFlingAnimation(const WebActiveWheelFlingParameters& parameters) 8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 830197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch TRACE_EVENT0("blink", "WebViewImpl::transferActiveWheelFlingAnimation"); 8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_gestureAnimation); 832926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_positionOnFlingStart = parameters.point; 833926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_globalPositionOnFlingStart = parameters.globalPoint; 8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_flingModifier = parameters.modifiers; 8355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) OwnPtr<WebGestureCurve> curve = adoptPtr(Platform::current()->createFlingAnimationCurve(parameters.sourceDevice, WebFloatPoint(parameters.delta), parameters.cumulativeScroll)); 836f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ASSERT(curve); 837926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_gestureAnimation = WebActiveGestureAnimation::createWithTimeOffset(curve.release(), this, parameters.startTime); 8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scheduleAnimation(); 8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 84151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool WebViewImpl::endActiveFlingAnimation() 84251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 84351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (m_gestureAnimation) { 84451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_gestureAnimation.clear(); 84551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (m_layerTreeView) 84651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_layerTreeView->didStopFlinging(); 84751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return true; 84851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 84951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return false; 85051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 85151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 852926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebViewImpl::startPageScaleAnimation(const IntPoint& targetPosition, bool useAnchor, float newScale, double durationInSeconds) 8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebPoint clampedPoint = targetPosition; 855926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!useAnchor) { 8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clampedPoint = clampOffsetAtScale(targetPosition, newScale); 857926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!durationInSeconds) { 858926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setPageScaleFactor(newScale, clampedPoint); 859926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 860926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 862926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (useAnchor && newScale == pageScaleFactor()) 863926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 864926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 865f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (m_enableFakePageScaleAnimationForTesting) { 866f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fakePageScaleAnimationTargetPosition = targetPosition; 867f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fakePageScaleAnimationUseAnchor = useAnchor; 868f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fakePageScaleAnimationPageScaleFactor = newScale; 869926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else { 870926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_layerTreeView) 871926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 872926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->startPageScaleAnimation(targetPosition, useAnchor, newScale, durationInSeconds); 873926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 874926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 875926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 877f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void WebViewImpl::enableFakePageScaleAnimationForTesting(bool enable) 878926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 879f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_enableFakePageScaleAnimationForTesting = enable; 8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 882926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::setShowFPSCounter(bool show) 883926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 884521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (m_layerTreeView) { 885197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch TRACE_EVENT0("blink", "WebViewImpl::setShowFPSCounter"); 886926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->setShowFPSCounter(show); 887926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 888926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_showFPSCounter = show; 889926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 890926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 891926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::setShowPaintRects(bool show) 892926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 893521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (m_layerTreeView) { 894197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch TRACE_EVENT0("blink", "WebViewImpl::setShowPaintRects"); 895926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->setShowPaintRects(show); 896926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 897926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_showPaintRects = show; 8987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setFirstPaintInvalidationTrackingEnabledForShowPaintRects(show); 899926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 900926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 901926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::setShowDebugBorders(bool show) 902926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 903521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (m_layerTreeView) 904926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->setShowDebugBorders(show); 905926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_showDebugBorders = show; 906926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 907926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 908926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::setContinuousPaintingEnabled(bool enabled) 909926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 910521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (m_layerTreeView) { 911197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch TRACE_EVENT0("blink", "WebViewImpl::setContinuousPaintingEnabled"); 912926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->setContinuousPaintingEnabled(enabled); 913926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 914926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_continuousPaintingEnabled = enabled; 9157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_client) 9167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_client->scheduleAnimation(); 917926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 918926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 919591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid WebViewImpl::setShowScrollBottleneckRects(bool show) 920591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 921591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (m_layerTreeView) 922591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_layerTreeView->setShowScrollBottleneckRects(show); 923591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_showScrollBottleneckRects = show; 924591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 925591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 926d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::getSelectionRootBounds(WebRect& bounds) const 927d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 928e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) const Frame* frame = focusedCoreFrame(); 92907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!frame || !frame->isLocalFrame()) 930d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 931d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 93207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Element* root = toLocalFrame(frame)->selection().rootEditableElementOrDocumentElement(); 933d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!root) 934d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 935d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 936d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // If the selection is inside a form control, the root will be a <div> that 937d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // behaves as the editor but we want to return the actual element's bounds. 938d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // In practice, that means <textarea> and <input> controls that behave like 939d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // a text field. 940d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Element* shadowHost = root->shadowHost(); 941d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (shadowHost 942d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) && (isHTMLTextAreaElement(*shadowHost) 9437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci || (isHTMLInputElement(*shadowHost) && toHTMLInputElement(*shadowHost).isTextField()))) 944d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) root = shadowHost; 945d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 9466f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch IntRect boundingBox = isHTMLHtmlElement(root) 9476f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch ? IntRect(IntPoint(0, 0), root->document().frame()->view()->contentsSize()) 9486f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch : root->pixelSnappedBoundingBox(); 9496f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 950d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) boundingBox = root->document().frame()->view()->contentsToWindow(boundingBox); 951d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) boundingBox.scale(pageScaleFactor()); 952d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bounds = boundingBox; 953d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 954d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 955d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void WebViewImpl::acceptLanguagesChanged() 956d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 957f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (!page()) 958f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return; 959f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 960f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) page()->acceptLanguagesChanged(); 961d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 962d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::handleKeyEvent(const WebKeyboardEvent& event) 9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT((event.type == WebInputEvent::RawKeyDown) 9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || (event.type == WebInputEvent::KeyDown) 9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) || (event.type == WebInputEvent::KeyUp)); 9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Halt an in-progress fling on a key event. 97051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) endActiveFlingAnimation(); 9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Please refer to the comments explaining the m_suppressNextKeypressEvent 9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // member. 9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The m_suppressNextKeypressEvent is set if the KeyDown is handled by 9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Webkit. A keyDown event is typically associated with a keyPress(char) 9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // event and a keyUp event. We reset this flag here as this is a new keyDown 9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // event. 9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_suppressNextKeypressEvent = false; 9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If there is a select popup, it should be the one processing the event, 9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not the page. 9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_selectPopup) 9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_selectPopup->handleKeyEvent(PlatformKeyboardEventBuilder(event)); 9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pagePopup) { 9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pagePopup->handleKeyEvent(PlatformKeyboardEventBuilder(event)); 9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We need to ignore the next Char event after this otherwise pressing 9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // enter when selecting an item in the popup will go to the page. 9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (WebInputEvent::RawKeyDown == event.type) 9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_suppressNextKeypressEvent = true; 9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<Frame> focusedFrame = focusedCoreFrame(); 994a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (focusedFrame && focusedFrame->isRemoteFrameTemporary()) { 99510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(toLocalFrameTemporary(focusedFrame.get())); 996a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch webFrame->client()->forwardInputEvent(&event); 997a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return true; 998a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 999a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 1000a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (!focusedFrame || !focusedFrame->isLocalFrame()) 10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LocalFrame* frame = toLocalFrame(focusedFrame.get()); 1004a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 100510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch PlatformKeyboardEventBuilder evt(event); 100610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 100710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (frame->eventHandler().keyEvent(evt)) { 100810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (WebInputEvent::RawKeyDown == event.type) { 100910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // Suppress the next keypress event unless the focused node is a plug-in node. 101010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // (Flash needs these keypress events to handle non-US keyboards.) 101110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch Element* element = focusedElement(); 101210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!element || !element->renderer() || !element->renderer()->isEmbeddedObject()) 101310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_suppressNextKeypressEvent = true; 101410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 101510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return true; 101610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 101710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 10188abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if !OS(MACOSX) 10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebInputEvent::Type contextMenuTriggeringEventType = 10208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN) 10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInputEvent::KeyUp; 10228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#else 10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInputEvent::RawKeyDown; 10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isUnmodifiedMenuKey = !(event.modifiers & WebInputEvent::InputModifiers) && event.windowsKeyCode == VKEY_APPS; 10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isShiftF10 = event.modifiers == WebInputEvent::ShiftKey && event.windowsKeyCode == VKEY_F10; 10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if ((isUnmodifiedMenuKey || isShiftF10) && event.type == contextMenuTriggeringEventType) { 10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sendContextMenuEvent(event); 10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#endif // !OS(MACOSX) 10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return keyEventDefault(event); 10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::handleCharEvent(const WebKeyboardEvent& event) 10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(event.type == WebInputEvent::Char); 10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Please refer to the comments explaining the m_suppressNextKeypressEvent 10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // member. The m_suppressNextKeypressEvent is set if the KeyDown is 10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // handled by Webkit. A keyDown event is typically associated with a 10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // keyPress(char) event and a keyUp event. We reset this flag here as it 10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // only applies to the current keyPress event. 10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool suppress = m_suppressNextKeypressEvent; 10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_suppressNextKeypressEvent = false; 10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If there is a select popup, it should be the one processing the event, 10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not the page. 10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_selectPopup) 10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_selectPopup->handleKeyEvent(PlatformKeyboardEventBuilder(event)); 10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pagePopup) 10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_pagePopup->handleKeyEvent(PlatformKeyboardEventBuilder(event)); 10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1056e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) LocalFrame* frame = toLocalFrame(focusedCoreFrame()); 10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return suppress; 10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1060f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) EventHandler& handler = frame->eventHandler(); 10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PlatformKeyboardEventBuilder evt(event); 10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!evt.isCharacterKey()) 10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Accesskeys are triggered by char events and can't be suppressed. 1067f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (handler.handleAccessKey(evt)) 10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Safari 3.1 does not pass off windows system key messages (WM_SYSCHAR) to 10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the eventHandler::keyEvent. We mimic this behavior on all platforms since 10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for now we are converting other platform's key events to windows key 10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // events. 10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (evt.isSystemKey()) 10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1077f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (!suppress && !handler.keyEvent(evt)) 10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return keyEventDefault(event); 10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1083f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)WebRect WebViewImpl::computeBlockBounds(const WebRect& rect, bool ignoreClipping) 10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl()) 10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebRect(); 10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Use the rect-based hit test to find the node. 10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint point = mainFrameImpl()->frameView()->windowToContents(IntPoint(rect.x, rect.y)); 1090197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | HitTestRequest::Active | (ignoreClipping ? HitTestRequest::IgnoreClipping : 0); 1091f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) HitTestResult result = mainFrameImpl()->frame()->eventHandler().hitTestResultAtPoint(point, hitType, IntSize(rect.width, rect.height)); 10927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci result.setToShadowHostIfInUserAgentShadowRoot(); 10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* node = result.innerNonSharedNode(); 10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node) 10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebRect(); 10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Find the block type node based on the hit node. 10997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: This wants to walk composed tree with NodeRenderingTraversal::parent(). 11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (node && (!node->renderer() || node->renderer()->isInline())) 11019e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) node = NodeRenderingTraversal::parent(node); 11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Return the bounding box in the window coordinate system. 11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node) { 11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect rect = node->Node::pixelSnappedBoundingBox(); 1106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = node->document().frame(); 11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return frame->view()->contentsToWindow(rect); 11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebRect(); 11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebRect WebViewImpl::widenRectWithinPageBounds(const WebRect& source, int targetMargin, int minimumMargin) 11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebSize maxSize; 11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (mainFrame()) 11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) maxSize = mainFrame()->contentsSize(); 11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntSize scrollOffset; 11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (mainFrame()) 11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollOffset = mainFrame()->scrollOffset(); 11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int leftMargin = targetMargin; 11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int rightMargin = targetMargin; 11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const int absoluteSourceX = source.x + scrollOffset.width(); 11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (leftMargin > absoluteSourceX) { 11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leftMargin = absoluteSourceX; 11265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) rightMargin = std::max(leftMargin, minimumMargin); 11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const int maximumRightMargin = maxSize.width - (source.width + absoluteSourceX); 11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (rightMargin > maximumRightMargin) { 11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) rightMargin = maximumRightMargin; 11325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) leftMargin = std::min(leftMargin, std::max(rightMargin, minimumMargin)); 11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const int newWidth = source.width + leftMargin + rightMargin; 11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const int newX = source.x - leftMargin; 11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(newWidth >= 0); 11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(scrollOffset.width() + newX + newWidth <= maxSize.width); 11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebRect(newX, source.y, newWidth, source.height); 11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11448abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)float WebViewImpl::legibleScale() const 11458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){ 11468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // Pages should be as legible as on desktop when at dpi scale, so no 11478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // need to zoom in further when automatically determining zoom level 11488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // (after double tap, find in page, etc), though the user should still 11498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // be allowed to manually pinch zoom in further if they desire. 11508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) float legibleScale = 1; 115151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (page()) 115251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) legibleScale *= page()->settings().accessibilityFontScaleFactor(); 11538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return legibleScale; 11548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)} 11558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 115606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)void WebViewImpl::computeScaleAndScrollForBlockRect(const WebPoint& hitPoint, const WebRect& blockRect, float padding, float defaultScaleWhenAlreadyLegible, float& scale, WebPoint& scroll) 11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scale = pageScaleFactor(); 11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scroll.x = scroll.y = 0; 1160f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1161f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) WebRect rect = blockRect; 11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!rect.isEmpty()) { 1164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) float defaultMargin = doubleTapZoomContentDefaultMargin; 1165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) float minimumMargin = doubleTapZoomContentMinimumMargin; 11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We want the margins to have the same physical size, which means we 11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // need to express them in post-scale size. To do that we'd need to know 11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the scale we're scaling to, but that depends on the margins. Instead 11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we express them as a fraction of the target rectangle: this will be 11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // correct if we end up fully zooming to it, and won't matter if we 11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // don't. 11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) rect = widenRectWithinPageBounds(rect, 11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<int>(defaultMargin * rect.width / m_size.width), 11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<int>(minimumMargin * rect.width / m_size.width)); 11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fit block to screen, respecting limits. 117653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) scale = static_cast<float>(m_size.width) / rect.width; 11775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) scale = std::min(scale, legibleScale()); 11788abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (pageScaleFactor() < defaultScaleWhenAlreadyLegible) 11795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) scale = std::max(scale, defaultScaleWhenAlreadyLegible); 11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scale = clampPageScaleFactorToLimits(scale); 11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1183f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // FIXME: If this is being called for auto zoom during find in page, 1184f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // then if the user manually zooms in it'd be nice to preserve the 1185f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // relative increase in zoom they caused (if they zoom out then it's ok 1186f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // to zoom them back in again). This isn't compatible with our current 1187f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // double-tap zoom strategy (fitting the containing block to the screen) 1188f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // though. 1189f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1190f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) float screenWidth = m_size.width / scale; 1191f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) float screenHeight = m_size.height / scale; 1192f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1193f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // Scroll to vertically align the block. 1194f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (rect.height < screenHeight) { 1195f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // Vertically center short blocks. 1196f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) rect.y -= 0.5 * (screenHeight - rect.height); 1197f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } else { 1198f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // Ensure position we're zooming to (+ padding) isn't off the bottom of 1199f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // the screen. 12005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) rect.y = std::max<float>(rect.y, hitPoint.y + padding - screenHeight); 1201f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } // Otherwise top align the block. 1202f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1203f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // Do the same thing for horizontal alignment. 1204f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (rect.width < screenWidth) 1205f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) rect.x -= 0.5 * (screenWidth - rect.width); 1206f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) else 12075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) rect.x = std::max<float>(rect.x, hitPoint.x + padding - screenWidth); 1208f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) scroll.x = rect.x; 1209f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) scroll.y = rect.y; 12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scale = clampPageScaleFactorToLimits(scale); 12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scroll = mainFrameImpl()->frameView()->windowToContents(scroll); 1213f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) scroll = clampOffsetAtScale(scroll, scale); 12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1216e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)static Node* findCursorDefiningAncestor(Node* node, LocalFrame* frame) 1217e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){ 1218e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // Go up the tree to find the node that defines a mouse cursor style 1219e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) while (node) { 1220e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (node->renderer()) { 1221e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) ECursor cursor = node->renderer()->style()->cursor(); 1222e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (cursor != CURSOR_AUTO || frame->eventHandler().useHandCursor(node, node->isLink())) 1223e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) break; 1224e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 12259e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) node = NodeRenderingTraversal::parent(node); 1226e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 1227e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 1228e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return node; 1229e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)} 1230e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 1231e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)static bool showsHandCursor(Node* node, LocalFrame* frame) 12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node || !node->renderer()) 12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ECursor cursor = node->renderer()->style()->cursor(); 12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return cursor == CURSOR_POINTER 12386f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch || (cursor == CURSOR_AUTO && frame->eventHandler().useHandCursor(node, node->isLink())); 12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciNode* WebViewImpl::bestTapNode(const GestureEventWithHitTestResults& targetedTapEvent) 12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1243197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch TRACE_EVENT0("input", "WebViewImpl::bestTapNode"); 1244197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1245197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!m_page || !m_page->mainFrame()) 12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Node* bestTouchNode = targetedTapEvent.hitTestResult().innerNode(); 1249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 12501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // We might hit something like an image map that has no renderer on it 12511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // Walk up the tree until we have a node with an attached renderer 12527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: This wants to walk composed tree with NodeRenderingTraversal::parent(). 12531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) while (bestTouchNode && !bestTouchNode->renderer()) 12549e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) bestTouchNode = NodeRenderingTraversal::parent(bestTouchNode); 1255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1256e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) Node* cursorDefiningAncestor = 1257e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) findCursorDefiningAncestor(bestTouchNode, m_page->deprecatedLocalMainFrame()); 1258e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // We show a highlight on tap only when the current node shows a hand cursor 1259e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (!cursorDefiningAncestor || !showsHandCursor(cursorDefiningAncestor, m_page->deprecatedLocalMainFrame())) { 12601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return 0; 1261e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 12621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 1263e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // We should pick the largest enclosing node with hand cursor set. We do this by first jumping 1264e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // up to cursorDefiningAncestor (which is already known to have hand cursor set). Then we locate 1265e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // the next cursor-defining ancestor up in the the tree and repeat the jumps as long as the node 1266e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // has hand cursor set. 1267e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) do { 1268e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) bestTouchNode = cursorDefiningAncestor; 12699e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) cursorDefiningAncestor = findCursorDefiningAncestor(NodeRenderingTraversal::parent(bestTouchNode), 12709e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) m_page->deprecatedLocalMainFrame()); 1271e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } while (cursorDefiningAncestor && showsHandCursor(cursorDefiningAncestor, m_page->deprecatedLocalMainFrame())); 12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return bestTouchNode; 12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebViewImpl::enableTapHighlightAtPoint(const GestureEventWithHitTestResults& targetedTapEvent) 12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Node* touchNode = bestTapNode(targetedTapEvent); 12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1280d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapVector<RawPtrWillBeMember<Node> > highlightNodes; 12819bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) highlightNodes.append(touchNode); 12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12839bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) enableTapHighlights(highlightNodes); 12849bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 12859bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1286d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void WebViewImpl::enableTapHighlights(WillBeHeapVector<RawPtrWillBeMember<Node> >& highlightNodes) 12879bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 1288d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (highlightNodes.isEmpty()) 1289d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 1290d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 12919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // Always clear any existing highlight when this is invoked, even if we 12929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // don't get a new target to highlight. 12939bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_linkHighlights.clear(); 12949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1295d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // LinkHighlight reads out layout and compositing state, so we need to make sure that's all up to date. 1296d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) layout(); 1297d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 12989bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) for (size_t i = 0; i < highlightNodes.size(); ++i) { 12999bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) Node* node = highlightNodes[i]; 13009bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 130107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!node || !node->renderer()) 13029bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) continue; 13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13049bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) Color highlightColor = node->renderer()->style()->tapHighlightColor(); 13059bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // Safari documentation for -webkit-tap-highlight-color says if the specified color has 0 alpha, 13069bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // then tap highlighting is disabled. 13079bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // http://developer.apple.com/library/safari/#documentation/appleapplications/reference/safaricssref/articles/standardcssproperties.html 13089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (!highlightColor.alpha()) 13099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) continue; 13109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 13119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_linkHighlights.append(LinkHighlight::create(node, this)); 13129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void WebViewImpl::animateDoubleTapZoom(const IntPoint& point) 13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl()) 13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1320f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) WebRect rect(point.x(), point.y(), touchPointPadding, touchPointPadding); 1321f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) WebRect blockBounds = computeBlockBounds(rect, false); 1322f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float scale; 13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebPoint scroll; 1325f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 132606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) computeScaleAndScrollForBlockRect(point, blockBounds, touchPointPadding, minimumPageScaleFactor() * doubleTapZoomAlreadyLegibleRatio, scale, scroll); 13278abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 13288abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) bool stillAtPreviousDoubleTapScale = (pageScaleFactor() == m_doubleTapZoomPageScaleFactor 13298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) && m_doubleTapZoomPageScaleFactor != minimumPageScaleFactor()) 13308abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) || m_doubleTapZoomPending; 13318abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 13328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) bool scaleUnchanged = fabs(pageScaleFactor() - scale) < minScaleDifference; 13338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) bool shouldZoomOut = blockBounds.isEmpty() || scaleUnchanged || stillAtPreviousDoubleTapScale; 13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1335f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) bool isAnimating; 1336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 13378abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (shouldZoomOut) { 133800d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch scale = minimumPageScaleFactor(); 133900d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch isAnimating = startPageScaleAnimation(mainFrameImpl()->frameView()->windowToContents(point), true, scale, doubleTapZoomAnimationDurationInSeconds); 1340f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } else { 1341f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) isAnimating = startPageScaleAnimation(scroll, false, scale, doubleTapZoomAnimationDurationInSeconds); 1342f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } 1343f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1344f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (isAnimating) { 1345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_doubleTapZoomPageScaleFactor = scale; 1346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_doubleTapZoomPending = true; 1347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::zoomToFindInPageRect(const WebRect& rect) 13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1352f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (!mainFrameImpl()) 1353f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return; 1354f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1355f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) WebRect blockBounds = computeBlockBounds(rect, true); 1356f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1357f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (blockBounds.isEmpty()) { 1358f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // Keep current scale (no need to scroll as x,y will normally already 1359f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // be visible). FIXME: Revisit this if it isn't always true. 1360f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return; 1361f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } 1362f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1363f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) float scale; 1364f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) WebPoint scroll; 1365f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 136606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) computeScaleAndScrollForBlockRect(WebPoint(rect.x, rect.y), blockBounds, nonUserInitiatedPointPadding, minimumPageScaleFactor(), scale, scroll); 1367f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1368f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) startPageScaleAnimation(scroll, false, scale, findInPageAnimationDurationInSeconds); 1369f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)} 1370f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1371f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)bool WebViewImpl::zoomToMultipleTargetsRect(const WebRect& rect) 1372f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){ 1373f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (!mainFrameImpl()) 1374f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return false; 1375f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1376f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) float scale; 1377f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) WebPoint scroll; 1378f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 137906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) computeScaleAndScrollForBlockRect(WebPoint(rect.x, rect.y), rect, nonUserInitiatedPointPadding, minimumPageScaleFactor(), scale, scroll); 1380f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1381f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (scale <= pageScaleFactor()) 1382f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return false; 1383f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 1384f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) startPageScaleAnimation(scroll, false, scale, multipleTargetsZoomAnimationDurationInSeconds); 1385f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return true; 13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::hasTouchEventHandlers(bool hasTouchHandlers) 13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_client) 13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->hasTouchEventHandlers(hasTouchHandlers); 13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1394926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebViewImpl::hasTouchEventHandlersAt(const WebPoint& point) 1395926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 1396926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // FIXME: Implement this. Note that the point must be divided by pageScaleFactor. 1397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 1398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 1399926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 14008abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if !OS(MACOSX) 14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Mac has no way to open a context menu based on a keyboard event. 14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::sendContextMenuEvent(const WebKeyboardEvent& event) 14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The contextMenuController() holds onto the last context menu that was 14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // popped up on the page until a new one is created. We need to clear 14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this menu before propagating the event through the DOM so that we can 14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // detect if we create a new menu for this event, since we won't create 14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a new menu if the DOM swallows the event and the defaultEventHandler does 14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // not run. 1410e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) page()->contextMenuController().clearContextMenu(); 14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_contextMenuAllowed = true; 141307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Frame* focusedFrame = page()->focusController().focusedOrMainFrame(); 141407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!focusedFrame->isLocalFrame()) 141507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return false; 141607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool handled = toLocalFrame(focusedFrame)->eventHandler().sendContextMenuEventForKey(); 14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_contextMenuAllowed = false; 14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return handled; 14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1422197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid WebViewImpl::showContextMenuAtPoint(float x, float y, PassRefPtr<ContextMenuProvider> menuProvider) 1423197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 1424197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!page()->mainFrame()->isLocalFrame()) 1425197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return; 1426197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_contextMenuAllowed = true; 1427197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch page()->contextMenuController().clearContextMenu(); 1428197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch page()->contextMenuController().showContextMenuAtPoint(page()->deprecatedLocalMainFrame(), x, y, menuProvider); 1429197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_contextMenuAllowed = false; 1430197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 1431197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::keyEventDefault(const WebKeyboardEvent& event) 14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1434e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) LocalFrame* frame = toLocalFrame(focusedCoreFrame()); 14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (event.type) { 14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::Char: 14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.windowsKeyCode == VKEY_SPACE) { 14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int keyCode = ((event.modifiers & WebInputEvent::ShiftKey) ? VKEY_PRIOR : VKEY_NEXT); 14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return scrollViewWithKeyboard(keyCode, event.modifiers); 14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::RawKeyDown: 14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.modifiers == WebInputEvent::ControlKey) { 14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (event.windowsKeyCode) { 14488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if !OS(MACOSX) 14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case 'A': 14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) focusedFrame()->executeCommand(WebString::fromUTF8("SelectAll")); 14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_INSERT: 14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case 'C': 14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) focusedFrame()->executeCommand(WebString::fromUTF8("Copy")); 14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Match FF behavior in the sense that Ctrl+home/end are the only Ctrl 14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // key combinations which affect scrolling. Safari is buggy in the 14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // sense that it scrolls the page for all Ctrl+scrolling key 14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // combinations. For e.g. Ctrl+pgup/pgdn/up/down, etc. 14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_HOME: 14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_END: 14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!event.isSystemKey && !(event.modifiers & WebInputEvent::ShiftKey)) 14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return scrollViewWithKeyboard(event.windowsKeyCode, event.modifiers); 14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::scrollViewWithKeyboard(int keyCode, int modifiers) 14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ScrollDirection scrollDirection; 14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ScrollGranularity scrollGranularity; 14818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX) 14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Control-Up/Down should be PageUp/Down on Mac. 14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (modifiers & WebMouseEvent::ControlKey) { 14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (keyCode == VKEY_UP) 14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) keyCode = VKEY_PRIOR; 14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (keyCode == VKEY_DOWN) 14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) keyCode = VKEY_NEXT; 14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mapKeyCodeForScroll(keyCode, &scrollDirection, &scrollGranularity)) 14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1492197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1493e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (LocalFrame* frame = toLocalFrame(focusedCoreFrame())) 1494e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return frame->eventHandler().bubblingScroll(scrollDirection, scrollGranularity); 1495e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return false; 14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1498e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool WebViewImpl::mapKeyCodeForScroll( 1499e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) int keyCode, 1500e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) ScrollDirection* scrollDirection, 1501e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) ScrollGranularity* scrollGranularity) 15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (keyCode) { 15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_LEFT: 15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollLeft; 15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByLine; 15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_RIGHT: 15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollRight; 15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByLine; 15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_UP: 15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollUp; 15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByLine; 15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_DOWN: 15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollDown; 15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByLine; 15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_HOME: 15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollUp; 15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByDocument; 15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_END: 15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollDown; 15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByDocument; 15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_PRIOR: // page up 15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollUp; 15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByPage; 15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VKEY_NEXT: // page down 15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollDirection = ScrollDown; 15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *scrollGranularity = ScrollByPage; 15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::hideSelectPopup() 15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_selectPopup) 15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_selectPopup->hidePopup(); 15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 154909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void WebViewImpl::popupOpened(PopupContainer* popupContainer) 15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 155109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(!m_selectPopup); 155209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_selectPopup = popupContainer; 1553d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(mainFrameImpl()->frame()->document()); 1554d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Document& document = *mainFrameImpl()->frame()->document(); 1555f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) page()->frameHost().eventHandlerRegistry().didAddEventHandler(document, EventHandlerRegistry::WheelEvent); 15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 155809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void WebViewImpl::popupClosed(PopupContainer* popupContainer) 15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 156009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(m_selectPopup); 1561d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_selectPopup = nullptr; 1562d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(mainFrameImpl()->frame()->document()); 1563d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Document& document = *mainFrameImpl()->frame()->document(); 1564f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // Remove the handler we added in |popupOpened| conditionally, because the 1565f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // Document may have already removed it, for instance, due to a navigation. 1566f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) EventHandlerRegistry* registry = &document.frameHost()->eventHandlerRegistry(); 1567f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (registry->eventHandlerTargets(EventHandlerRegistry::WheelEvent)->contains(&document)) 1568f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) registry->didRemoveEventHandler(document, EventHandlerRegistry::WheelEvent); 15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PagePopup* WebViewImpl::openPagePopup(PagePopupClient* client, const IntRect& originBoundsInRootView) 15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(client); 15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (hasOpenedPopup()) 15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hidePopups(); 15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_pagePopup); 15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebWidget* popupWidget = m_client->createPopupMenu(WebPopupTypePage); 15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(popupWidget); 15801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_pagePopup = toWebPagePopupImpl(popupWidget); 1581926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_pagePopup->initialize(this, client, originBoundsInRootView)) { 15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pagePopup->closePopup(); 1583d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_pagePopup = nullptr; 15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_pagePopup.get(); 15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::closePagePopup(PagePopup* popup) 15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(popup); 15911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) WebPagePopupImpl* popupImpl = toWebPagePopupImpl(popup); 15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_pagePopup.get() == popupImpl); 15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pagePopup.get() != popupImpl) 15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pagePopup->closePopup(); 1596d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_pagePopup = nullptr; 15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1599e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)Frame* WebViewImpl::focusedCoreFrame() const 16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16013c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch return m_page ? m_page->focusController().focusedOrMainFrame() : 0; 16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebViewImpl* WebViewImpl::fromPage(Page* page) 16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page) 16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1608e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return static_cast<WebViewImpl*>(page->chrome().client().webView()); 16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebWidget ------------------------------------------------------------------ 16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::close() 16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_page) { 16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Initiate shutdown for the entire frameset. This will cause a lot of 16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // notifications to be sent. 16186f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch m_page->willBeDestroyed(); 16195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_page.clear(); 16205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Should happen after m_page.clear(). 16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_devToolsAgent) 16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_devToolsAgent.clear(); 16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Reset the delegate to prevent notifications being sent as we're being 16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // deleted. 16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client = 0; 16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) deref(); // Balances ref() acquired in WebView::create 16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::willStartLiveResize() 16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (mainFrameImpl() && mainFrameImpl()->frameView()) 16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mainFrameImpl()->frameView()->willStartLiveResize(); 16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1638d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = mainFrameImpl()->frame(); 163910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WebPluginContainerImpl* pluginContainer = WebLocalFrameImpl::pluginContainerFromFrame(frame); 16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pluginContainer) 16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pluginContainer->willStartLiveResize(); 16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1644926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebSize WebViewImpl::size() 1645926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 1646926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_size; 1647926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 1648926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 164910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::resizePinchViewport(const WebSize& newSize) 165010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 165110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!pinchVirtualViewportEnabled()) 165210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return; 165310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 165410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch page()->frameHost().pinchViewport().setSize(newSize); 165510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 165610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 1657197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebLocalFrameImpl* WebViewImpl::localFrameRootTemporary() const 1658197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 1659197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // FIXME: This is a temporary method that finds the first localFrame in a traversal. 1660197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // This is equivalent to mainFrame() if the mainFrame is in-process. We need to create 1661197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // separate WebWidgets to be created by RenderWidgets, which are associated with *all* 1662197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // local frame roots, not just the first one in the tree. Until then, this limits us 1663197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // to having only one functioning connected LocalFrame subtree per process. 1664e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) for (Frame* frame = page()->mainFrame(); frame; frame = frame->tree().traverseNext()) { 1665197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (frame->isLocalRoot()) 1666197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return WebLocalFrameImpl::fromFrame(toLocalFrame(frame)); 1667197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 1668197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return 0; 1669197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 1670197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1671197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid WebViewImpl::performResize() 1672197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 1673197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_pageScaleConstraintsSet.didChangeViewSize(m_size); 1674197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1675197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch updatePageDefinedViewportConstraints(localFrameRootTemporary()->frame()->document()->viewportDescription()); 1676197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch updateMainFrameLayoutSize(); 1677197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1678197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // If the virtual viewport pinch mode is enabled, the main frame will be resized 1679197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // after layout so it can be sized to the contentsSize. 1680197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!pinchVirtualViewportEnabled() && localFrameRootTemporary()->frameView()) 1681197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch localFrameRootTemporary()->frameView()->resize(m_size); 1682197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1683197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (pinchVirtualViewportEnabled()) 1684197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch page()->frameHost().pinchViewport().setSize(m_size); 1685197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1686197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // When device emulation is enabled, device size values may change - they are 1687197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // usually set equal to the view size. These values are not considered viewport-dependent 1688197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // (see MediaQueryExp::isViewportDependent), since they are only viewport-dependent in emulation mode, 1689197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // and thus will not be invalidated in |FrameView::performPreLayoutTasks|. 1690197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Therefore we should force explicit media queries invalidation here. 1691197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (page()->inspectorController().deviceEmulationEnabled()) { 1692197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (Document* document = localFrameRootTemporary()->frame()->document()) 1693197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch document->mediaQueryAffectingValueChanged(); 1694197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 1695197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 1696197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 16977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebViewImpl::setTopControlsContentOffset(float offset) 16987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 16997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_topControlsContentOffset = offset; 17007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_layerTreeView->setTopControlsContentOffset(offset); 17017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci didUpdateTopControls(); 17027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 17037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 17047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebViewImpl::setTopControlsLayoutHeight(float height) 17057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 17067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_topControlsLayoutHeight = height; 17077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci didUpdateTopControls(); 17087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 17097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 17107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebViewImpl::didUpdateTopControls() 17117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 17127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FrameView* view = localFrameRootTemporary()->frameView(); 17137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!view) 17147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 17157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 17167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // The viewport bounds were adjusted on the compositor by this much due to top controls. Tell 17177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // the FrameView about it so it can make correct scroll offset clamping decisions during compositor 17187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // commits. 17197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME(bokan) Reenable once Chromium side lands. 17207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // float topControlsViewportAdjustment = m_topControlsContentOffset - m_topControlsLayoutHeight; 17217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // view->setTopControlsViewportAdjustment(topControlsViewportAdjustment); 17227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 17237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::resize(const WebSize& newSize) 17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_shouldAutoResize || m_size == newSize) 17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1729197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch FrameView* view = localFrameRootTemporary()->frameView(); 17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!view) 17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1733c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) bool shouldAnchorAndRescaleViewport = settings()->mainFrameResizesAreOrientationChanges() 1734c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) && m_size.width && contentsSize().width() && newSize.width != m_size.width && !m_fullscreenController->isFullscreen(); 17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float oldPageScaleFactor = pageScaleFactor(); 1736c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) float oldMinimumPageScaleFactor = minimumPageScaleFactor(); 17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_size = newSize; 17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1740197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ViewportAnchor viewportAnchor(&localFrameRootTemporary()->frame()->eventHandler()); 174153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (shouldAnchorAndRescaleViewport) { 17427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci viewportAnchor.setAnchor( 17437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci view->visibleContentRect(), 17447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci visibleRectInDocument(), 17457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FloatSize(viewportAnchorXCoord, viewportAnchorYCoord)); 174653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 174753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1748c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // FIXME: TextAutosizer does not yet support out-of-process frames. 1749197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (mainFrameImpl() && mainFrameImpl()->frame()->isLocalFrame()) 1750aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch { 1751c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // Avoids unnecessary invalidations while various bits of state in TextAutosizer are updated. 1752c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) TextAutosizer::DeferUpdatePageInfo deferUpdatePageInfo(page()); 1753197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch performResize(); 1754197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } else { 1755197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch performResize(); 17565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (settings()->viewportEnabled()) { 1759926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Relayout immediately to recalculate the minimum scale limit. 1760926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (view->needsLayout()) 1761926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) view->layout(); 1762926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 176353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (shouldAnchorAndRescaleViewport) { 1764c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) float newPageScaleFactor = oldPageScaleFactor / oldMinimumPageScaleFactor * minimumPageScaleFactor(); 17657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci newPageScaleFactor = clampPageScaleFactorToLimits(newPageScaleFactor); 17667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 17677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FloatSize pinchViewportSize = FloatSize(newSize); 17687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci pinchViewportSize.scale(1 / newPageScaleFactor); 17697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 17707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci IntPoint mainFrameOrigin; 17717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FloatPoint pinchViewportOrigin; 17727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci viewportAnchor.computeOrigins(*view, pinchViewportSize, 17737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci mainFrameOrigin, pinchViewportOrigin); 17747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci scrollAndRescaleViewports(newPageScaleFactor, mainFrameOrigin, pinchViewportOrigin); 17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sendResizeEventAndRepaint(); 17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciIntRect WebViewImpl::visibleRectInDocument() const 17827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 17837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (pinchVirtualViewportEnabled()) { 17847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Inner viewport in the document coordinates 17857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return enclosedIntRect(page()->frameHost().pinchViewport().visibleRectInDocument()); 17867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 17877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 17887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Outer viewport in the document coordinates 17897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return localFrameRootTemporary()->frameView()->visibleContentRect(); 17907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 17917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::willEndLiveResize() 17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (mainFrameImpl() && mainFrameImpl()->frameView()) 17955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mainFrameImpl()->frameView()->willEndLiveResize(); 17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1797d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = mainFrameImpl()->frame(); 179810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WebPluginContainerImpl* pluginContainer = WebLocalFrameImpl::pluginContainerFromFrame(frame); 17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pluginContainer) 18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pluginContainer->willEndLiveResize(); 18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::didEnterFullScreen() 18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1805f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fullscreenController->didEnterFullScreen(); 18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::didExitFullScreen() 18095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1810f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fullscreenController->didExitFullScreen(); 18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1813c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void WebViewImpl::beginFrame(const WebBeginFrameArgs& frameTime) 18145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1815c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) TRACE_EVENT0("blink", "WebViewImpl::beginFrame"); 18165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci WebBeginFrameArgs validFrameTime(frameTime); 18187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!validFrameTime.lastFrameTimeMonotonic) 18197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci validFrameTime.lastFrameTimeMonotonic = monotonicallyIncreasingTime(); 18207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 18217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Scheduler::shared()->willBeginFrame(validFrameTime); 18225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create synthetic wheel events as necessary for fling. 18245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_gestureAnimation) { 18257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_gestureAnimation->animate(validFrameTime.lastFrameTimeMonotonic)) 18265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scheduleAnimation(); 1827926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else { 182851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) endActiveFlingAnimation(); 1829926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 183053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) PlatformGestureEvent endScrollEvent(PlatformEvent::GestureScrollEnd, 18311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_positionOnFlingStart, m_globalPositionOnFlingStart, 18321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) IntSize(), 0, false, false, false, false, 18331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 0, 0, 0, 0); 183453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1835f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) mainFrameImpl()->frame()->eventHandler().handleGestureScrollEnd(endScrollEvent); 1836926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 18375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 18385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 18405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 18415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18422fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) PageWidgetDelegate::animate(m_page.get(), validFrameTime.lastFrameTimeMonotonic); 1843926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1844926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_continuousPaintingEnabled) { 1845926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ContinuousPainter::setNeedsDisplayRecursive(m_rootGraphicsLayer, m_pageOverlays.get()); 1846926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->scheduleAnimation(); 1847926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 18485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebViewImpl::didCommitFrameToCompositor() 18517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 18527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Scheduler::shared()->didCommitFrameToCompositor(); 18537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 18547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::layout() 18565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1857197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch TRACE_EVENT0("blink", "WebViewImpl::layout"); 1858197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!localFrameRootTemporary()) 1859197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return; 1860197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1861197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch PageWidgetDelegate::layout(m_page.get(), localFrameRootTemporary()->frame()); 186219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) updateLayerTreeBackgroundColor(); 18635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) for (size_t i = 0; i < m_linkHighlights.size(); ++i) 18659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_linkHighlights[i]->updateGeometry(); 1866197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1867197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (m_devToolsAgent) 1868197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_devToolsAgent->didLayout(); 18695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1871d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void WebViewImpl::paint(WebCanvas* canvas, const WebRect& rect) 18725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1873d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // This should only be used when compositing is not being used for this 1874d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // WebView, and it is painting into the recording of its parent. 1875d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT(!isAcceleratedCompositingActive()); 18765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1877d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) double paintStart = currentTime(); 18782fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) PageWidgetDelegate::paint(m_page.get(), pageOverlays(), canvas, rect, isTransparent() ? PageWidgetDelegate::Translucent : PageWidgetDelegate::Opaque); 1879d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) double paintEnd = currentTime(); 1880d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) double pixelsPerSec = (rect.width * rect.height) / (paintEnd - paintStart); 1881e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) Platform::current()->histogramCustomCounts("Renderer4.SoftwarePaintDurationMS", (paintEnd - paintStart) * 1000, 0, 120, 30); 1882e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) Platform::current()->histogramCustomCounts("Renderer4.SoftwarePaintMegapixPerSecond", pixelsPerSec / 1000000, 10, 210, 30); 18835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 18845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1885323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if OS(ANDROID) 1886323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void WebViewImpl::paintCompositedDeprecated(WebCanvas* canvas, const WebRect& rect) 1887f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{ 1888323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // Note: This method exists on OS(ANDROID) and will hopefully be 1889323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // removed once the link disambiguation feature renders using 1890323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // the compositor. 1891323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ASSERT(isAcceleratedCompositingActive()); 1892323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 18935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FrameView* view = page()->deprecatedLocalMainFrame()->view(); 1894323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) PaintBehavior oldPaintBehavior = view->paintBehavior(); 1895323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) view->setPaintBehavior(oldPaintBehavior | PaintBehaviorFlattenCompositingLayers); 1896323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 18972fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) PageWidgetDelegate::paint(m_page.get(), pageOverlays(), canvas, rect, isTransparent() ? PageWidgetDelegate::Translucent : PageWidgetDelegate::Opaque); 1898323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1899323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) view->setPaintBehavior(oldPaintBehavior); 1900323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 1901323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif 1902323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1903323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void WebViewImpl::compositeAndReadbackAsync(WebCompositeAndReadbackAsyncCallback* callback) 1904323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 1905323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ASSERT(isAcceleratedCompositingActive()); 1906f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu m_layerTreeView->compositeAndReadbackAsync(callback); 1907f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu} 1908f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::isTrackingRepaints() const 19105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 19115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page()) 19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 19135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!page()->mainFrame()->isLocalFrame()) 19145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return false; 19155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FrameView* view = page()->deprecatedLocalMainFrame()->view(); 1916f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return view->isTrackingPaintInvalidations(); 19175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 19185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::themeChanged() 19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page()) 19225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 19235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!page()->mainFrame()->isLocalFrame()) 19245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 19255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FrameView* view = page()->deprecatedLocalMainFrame()->view(); 19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebRect damagedRect(0, 0, m_size.width, m_size.height); 19285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) view->invalidateRect(damagedRect); 19295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 19305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1931e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void WebViewImpl::enterFullScreenForElement(Element* element) 19325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1933f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fullscreenController->enterFullScreenForElement(element); 19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 19355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1936e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void WebViewImpl::exitFullScreenForElement(Element* element) 19375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1938f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) m_fullscreenController->exitFullScreenForElement(element); 19395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 19405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1941197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid WebViewImpl::clearCompositedSelectionBounds() 1942197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 1943197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (m_layerTreeView) 1944197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_layerTreeView->clearSelection(); 1945197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 1946197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 19477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebViewImpl::updateCompositedSelectionBounds(const WebSelectionBound& anchor, const WebSelectionBound& focus) 19487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 19497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_layerTreeView) 19507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_layerTreeView->registerSelection(anchor, focus); 19517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 19527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 19535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::hasHorizontalScrollbar() 19545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 19555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return mainFrameImpl()->frameView()->horizontalScrollbar(); 19565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 19575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::hasVerticalScrollbar() 19595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 19605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return mainFrameImpl()->frameView()->verticalScrollbar(); 19615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 19625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const WebInputEvent* WebViewImpl::m_currentInputEvent = 0; 19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1965f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// FIXME: autogenerate this kind of code, and use it throughout Blink rather than 1966f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// the one-offs for subsets of these values. 1967197021e6b966cfb06891637935ef33fff06433d1Ben Murdochstatic String inputTypeToName(WebInputEvent::Type type) 1968f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){ 1969f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) switch (type) { 1970f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::MouseDown: 1971197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::mousedown; 1972f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::MouseUp: 1973197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::mouseup; 1974f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::MouseMove: 1975197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::mousemove; 1976f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::MouseEnter: 1977197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::mouseenter; 1978f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::MouseLeave: 1979197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::mouseleave; 1980f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::ContextMenu: 1981197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::contextmenu; 1982f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::MouseWheel: 1983197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::mousewheel; 1984f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::KeyDown: 1985197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::keydown; 1986f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::KeyUp: 1987197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::keyup; 1988f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::GestureScrollBegin: 1989197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::gesturescrollstart; 1990f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::GestureScrollEnd: 1991197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::gesturescrollend; 1992f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::GestureScrollUpdate: 1993197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::gesturescrollupdate; 1994197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case WebInputEvent::GestureTapDown: 1995197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::gesturetapdown; 1996197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case WebInputEvent::GestureShowPress: 1997197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::gestureshowpress; 1998197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case WebInputEvent::GestureTap: 1999197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::gesturetap; 2000197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case WebInputEvent::GestureTapUnconfirmed: 2001197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::gesturetapunconfirmed; 2002f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::TouchStart: 2003197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::touchstart; 2004f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::TouchMove: 2005197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::touchmove; 2006f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::TouchEnd: 2007197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::touchend; 2008f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case WebInputEvent::TouchCancel: 2009197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTypeNames::touchcancel; 2010f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) default: 2011197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return String("unknown"); 2012f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 2013f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)} 2014f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 20155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::handleInputEvent(const WebInputEvent& inputEvent) 20165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 201710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch UserGestureNotifier notifier(m_autofillClient, &m_userGestureObserved); 2018d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // On the first input event since page load, |notifier| instructs the 2019d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // autofill client to unblock values of password input fields of any forms 2020d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // on the page. There is a single input event, GestureTap, which can both 2021d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // be the first event after page load, and cause a form submission. In that 2022d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // case, the form submission happens before the autofill client is told 2023d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // to unblock the password values, and so the password values are not 2024d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // submitted. To avoid that, GestureTap is handled explicitly: 2025d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (inputEvent.type == WebInputEvent::GestureTap && m_autofillClient) { 2026d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_userGestureObserved = true; 2027d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_autofillClient->firstUserGestureObserved(); 2028d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 202910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 2030197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch TRACE_EVENT1("input", "WebViewImpl::handleInputEvent", "type", inputTypeToName(inputEvent.type).ascii()); 20315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we've started a drag and drop operation, ignore input events until 20325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we're done. 20335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_doingDragAndDrop) 20345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 20355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 203653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_devToolsAgent && m_devToolsAgent->handleInputEvent(m_page.get(), inputEvent)) 203753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return true; 203853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 20395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Report the event to be NOT processed by WebKit, so that the browser can handle it appropriately. 20405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_ignoreInputEvents) 20415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 20425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TemporaryChange<const WebInputEvent*> currentEventChange(m_currentInputEvent, &inputEvent); 20445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isPointerLocked() && WebInputEvent::isMouseEventType(inputEvent.type)) { 20465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pointerLockMouseEvent(inputEvent); 20475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 20485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_mouseCaptureNode && WebInputEvent::isMouseEventType(inputEvent.type)) { 20517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch TRACE_EVENT1("input", "captured mouse event", "type", inputEvent.type); 20525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Save m_mouseCaptureNode since mouseCaptureLost() will clear it. 2053d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<Node> node = m_mouseCaptureNode; 20545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Not all platforms call mouseCaptureLost() directly. 20565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (inputEvent.type == WebInputEvent::MouseUp) 20575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mouseCaptureLost(); 20585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 205910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch OwnPtr<UserGestureIndicator> gestureIndicator; 206010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 20615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AtomicString eventType; 20625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (inputEvent.type) { 20635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseMove: 20641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mousemove; 20655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 20665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseLeave: 20671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mouseout; 20685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 20695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseDown: 20701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mousedown; 207110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessingNewUserGesture)); 207210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_mouseCaptureGestureToken = gestureIndicator->currentToken(); 20735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 20745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseUp: 20751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mouseup; 207610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch gestureIndicator = adoptPtr(new UserGestureIndicator(m_mouseCaptureGestureToken.release())); 20775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 20785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 20795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 20805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node->dispatchMouseEvent( 2083197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch PlatformMouseEventBuilder(mainFrameImpl()->frameView(), static_cast<const WebMouseEvent&>(inputEvent)), 2084197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch eventType, static_cast<const WebMouseEvent&>(inputEvent).clickCount); 20855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 20865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20882fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) return PageWidgetDelegate::handleInputEvent(m_page.get(), *this, inputEvent); 20895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 20905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 209153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void WebViewImpl::setCursorVisibilityState(bool isVisible) 209253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 209353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_page) 209453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_page->setIsCursorVisible(isVisible); 209553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 209653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 20975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::mouseCaptureLost() 20985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 20997757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch TRACE_EVENT_ASYNC_END0("input", "capturing mouse", this); 2100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_mouseCaptureNode = nullptr; 21015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 21025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setFocus(bool enable) 21045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 21053c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch m_page->focusController().setFocused(enable); 21065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (enable) { 21073c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch m_page->focusController().setActive(true); 21087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<Frame> focusedFrame = m_page->focusController().focusedFrame(); 210907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (focusedFrame && focusedFrame->isLocalFrame()) { 211007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* localFrame = toLocalFrame(focusedFrame.get()); 211107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Element* element = localFrame->document()->focusedElement(); 211207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (element && localFrame->selection().selection().isNone()) { 21135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the selection was cleared while the WebView was not 21145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // focused, then the focus element shows with a focus ring but 21155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // no caret and does respond to keyboard inputs. 21160019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (element->isTextFormControl()) { 21175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) element->updateFocusAppearance(true); 21180019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } else if (element->isContentEditable()) { 21195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // updateFocusAppearance() selects all the text of 21205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // contentseditable DIVs. So we set the selection explicitly 21215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // instead. Note that this has the side effect of moving the 21225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // caret back to the beginning of the text. 21230019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch Position position(element, 0, Position::PositionIsOffsetInAnchor); 212407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch localFrame->selection().setSelection(VisibleSelection(position, SEL_DEFAULT_AFFINITY)); 21255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_imeAcceptEvents = true; 21295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 21305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hidePopups(); 21315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Clear focus on the currently focused frame if any. 21335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 21345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 21355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) LocalFrame* frame = m_page->mainFrame() && m_page->mainFrame()->isLocalFrame() 21375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ? m_page->deprecatedLocalMainFrame() : 0; 21385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 21395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 21405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<Frame> focusedFrame = m_page->focusController().focusedFrame(); 214207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (focusedFrame && focusedFrame->isLocalFrame()) { 21435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Finish an ongoing composition to delete the composition node. 214407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (toLocalFrame(focusedFrame.get())->inputMethodController().hasComposition()) { 2145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_autofillClient) 2146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_autofillClient->setIgnoreTextChanges(true); 2147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 214807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch toLocalFrame(focusedFrame.get())->inputMethodController().confirmComposition(); 2149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_autofillClient) 2151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_autofillClient->setIgnoreTextChanges(false); 2152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 21535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_imeAcceptEvents = false; 21545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 21575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::setComposition( 21595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebString& text, 21605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebVector<WebCompositionUnderline>& underlines, 21615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int selectionStart, 21625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int selectionEnd) 21635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2164e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) LocalFrame* focused = toLocalFrame(focusedCoreFrame()); 21655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!focused || !m_imeAcceptEvents) 21665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 21675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2168a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (WebPlugin* plugin = focusedPluginIfInputMethodSupported(focused)) 2169a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return plugin->setComposition(text, underlines, selectionStart, selectionEnd); 2170a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 21715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The input focus has been moved to another WebWidget object. 21725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We should use this |editor| object only to complete the ongoing 21735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // composition. 21743c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch InputMethodController& inputMethodController = focused->inputMethodController(); 2175c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) if (!focused->editor().canEdit() && !inputMethodController.hasComposition()) 21765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 21775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We should verify the parent node of this IME composition node are 21795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // editable because JavaScript may delete a parent node of the composition 21805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node. In this case, WebKit crashes while deleting texts from the parent 21815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // node, which doesn't exist any longer. 2182a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch RefPtrWillBeRawPtr<Range> range = inputMethodController.compositionRange(); 21835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (range) { 21845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* node = range->startContainer(); 21855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node || !node->isContentEditable()) 21865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 21875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 21885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 21895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we're not going to fire a keypress event, then the keydown event was 21905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // canceled. In that case, cancel any existing composition. 21915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (text.isEmpty() || m_suppressNextKeypressEvent) { 21925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A browser process sent an IPC message which does not contain a valid 21935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // string, which means an ongoing composition has been canceled. 21945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the ongoing composition has been canceled, replace the ongoing 21955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // composition string with an empty string and complete it. 21965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String emptyString; 21975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<CompositionUnderline> emptyUnderlines; 21983c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch inputMethodController.setComposition(emptyString, emptyUnderlines, 0, 0); 21995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return text.isEmpty(); 22005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 22015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When the range of composition underlines overlap with the range between 22035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // selectionStart and selectionEnd, WebKit somehow won't paint the selection 22045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // at all (see InlineTextBox::paint() function in InlineTextBox.cpp). 22055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // But the selection range actually takes effect. 22063c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch inputMethodController.setComposition(String(text), 22075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CompositionUnderlineVectorBuilder(underlines), 22085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) selectionStart, selectionEnd); 22095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22103c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch return inputMethodController.hasComposition(); 22115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::confirmComposition() 22145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2215591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return confirmComposition(DoNotKeepSelection); 2216591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 2217591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 2218591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool WebViewImpl::confirmComposition(ConfirmCompositionBehavior selectionBehavior) 2219591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 2220591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return confirmComposition(WebString(), selectionBehavior); 22215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::confirmComposition(const WebString& text) 22245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2225591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return confirmComposition(text, DoNotKeepSelection); 2226591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 2227591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 2228591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool WebViewImpl::confirmComposition(const WebString& text, ConfirmCompositionBehavior selectionBehavior) 2229591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 2230e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) LocalFrame* focused = toLocalFrame(focusedCoreFrame()); 22315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!focused || !m_imeAcceptEvents) 22325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2233a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 2234a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (WebPlugin* plugin = focusedPluginIfInputMethodSupported(focused)) 2235a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return plugin->confirmComposition(text, selectionBehavior); 2236a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 2237bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return focused->inputMethodController().confirmCompositionOrInsertText(text, selectionBehavior == KeepSelection ? InputMethodController::KeepSelection : InputMethodController::DoNotKeepSelection); 22385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::compositionRange(size_t* location, size_t* length) 22415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2242e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) LocalFrame* focused = toLocalFrame(focusedCoreFrame()); 22438abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (!focused || !m_imeAcceptEvents) 22445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 22455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2246a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch RefPtrWillBeRawPtr<Range> range = focused->inputMethodController().compositionRange(); 22475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!range) 22485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 22495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2250f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) Element* editable = focused->selection().rootEditableElementOrDocumentElement(); 2251f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(editable); 2252f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) PlainTextRange plainTextRange(PlainTextRange::create(*editable, *range.get())); 2253f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (plainTextRange.isNull()) 2254f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return false; 2255f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) *location = plainTextRange.start(); 2256f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) *length = plainTextRange.length(); 2257f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return true; 22585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 22595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebTextInputInfo WebViewImpl::textInputInfo() 22615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 22625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebTextInputInfo info; 22635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2264e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) Frame* focusedFrame = focusedCoreFrame(); 2265197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!focusedFrame->isLocalFrame()) 2266197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return info; 2267197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 2268197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch LocalFrame* focused = toLocalFrame(focusedFrame); 22695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!focused) 22705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return info; 22715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) FrameSelection& selection = focused->selection(); 2273c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Element* element = selection.selection().rootEditableElement(); 2274c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (!element) 22755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return info; 22765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2277e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch info.inputMode = inputModeOfFocusedElement(); 2278e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 22795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) info.type = textInputType(); 2280c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) info.flags = textInputFlags(); 22815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (info.type == WebTextInputTypeNone) 22825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return info; 22835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2284c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) if (!focused->editor().canEdit()) 2285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return info; 2286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2287197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Emits an object replacement character for each replaced element so that 2288197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // it is exposed to IME and thus could be deleted by IME on android. 2289c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) info.value = plainText(rangeOfContents(element).get(), TextIteratorEmitsObjectReplacementCharacter); 22905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (info.value.isEmpty()) 22925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return info; 22935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2294a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (RefPtrWillBeRawPtr<Range> range = selection.selection().firstRange()) { 2295c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) PlainTextRange plainTextRange(PlainTextRange::create(*element, *range.get())); 2296f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (plainTextRange.isNotNull()) { 2297f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) info.selectionStart = plainTextRange.start(); 2298f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) info.selectionEnd = plainTextRange.end(); 2299f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) } 23005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2301f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 2302a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (RefPtrWillBeRawPtr<Range> range = focused->inputMethodController().compositionRange()) { 2303c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) PlainTextRange plainTextRange(PlainTextRange::create(*element, *range.get())); 2304f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (plainTextRange.isNotNull()) { 2305f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) info.compositionStart = plainTextRange.start(); 2306f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) info.compositionEnd = plainTextRange.end(); 2307f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) } 23085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 23095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return info; 23115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebTextInputType WebViewImpl::textInputType() 23145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 23150019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch Element* element = focusedElement(); 23160019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!element) 23175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeNone; 23185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (isHTMLInputElement(*element)) { 2320d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) HTMLInputElement& input = toHTMLInputElement(*element); 23217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const AtomicString& type = input.type(); 23225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.isDisabledOrReadOnly()) 23245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeNone; 23255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (type == InputTypeNames::password) 23275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypePassword; 23287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (type == InputTypeNames::search) 23295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeSearch; 23307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (type == InputTypeNames::email) 23315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeEmail; 23327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (type == InputTypeNames::number) 23335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeNumber; 23347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (type == InputTypeNames::tel) 23355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeTelephone; 23367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (type == InputTypeNames::url) 23375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeURL; 23387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (type == InputTypeNames::date) 23395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeDate; 23407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (type == InputTypeNames::datetime_local) 23415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeDateTimeLocal; 23427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (type == InputTypeNames::month) 23435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeMonth; 23447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (type == InputTypeNames::time) 23455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeTime; 23467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (type == InputTypeNames::week) 23475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeWeek; 23487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (type == InputTypeNames::text) 23495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeText; 23505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeNone; 23525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 23535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2354d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (isHTMLTextAreaElement(*element)) { 2355d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (toHTMLTextAreaElement(*element).isDisabledOrReadOnly()) 23565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeNone; 23575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeTextArea; 23585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 23595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2360926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 23610019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (element->isHTMLElement()) { 23620019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (toHTMLElement(element)->isDateTimeFieldElement()) 2363926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return WebTextInputTypeDateTimeField; 2364926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 2365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif 2366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2367c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (element->isContentEditable(Node::UserSelectAllIsAlwaysNonEditable)) 23685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeContentEditable; 23695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebTextInputTypeNone; 23715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 23725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2373c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)int WebViewImpl::textInputFlags() 2374c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 2375c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Element* element = focusedElement(); 2376c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (!element) 2377c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return WebTextInputFlagNone; 2378c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 23797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DEFINE_STATIC_LOCAL(AtomicString, autocompleteString, ("autocomplete", AtomicString::ConstructFromLiteral)); 23807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DEFINE_STATIC_LOCAL(AtomicString, autocorrectString, ("autocorrect", AtomicString::ConstructFromLiteral)); 23817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DEFINE_STATIC_LOCAL(AtomicString, spellcheckString, ("spellcheck", AtomicString::ConstructFromLiteral)); 2382c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) int flags = 0; 2383c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 23847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const AtomicString& autocomplete = element->getAttribute(autocompleteString); 2385c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (autocomplete == "on") 2386c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) flags |= WebTextInputFlagAutocompleteOn; 2387c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) else if (autocomplete == "off") 2388c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) flags |= WebTextInputFlagAutocompleteOff; 2389c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 23907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const AtomicString& autocorrect = element->getAttribute(autocorrectString); 2391c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (autocorrect == "on") 2392c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) flags |= WebTextInputFlagAutocorrectOn; 2393c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) else if (autocorrect == "off") 2394c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) flags |= WebTextInputFlagAutocorrectOff; 2395c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 23967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const AtomicString& spellcheck = element->getAttribute(spellcheckString); 2397c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (spellcheck == "on") 2398c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) flags |= WebTextInputFlagSpellcheckOn; 2399c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) else if (spellcheck == "off") 2400c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) flags |= WebTextInputFlagSpellcheckOff; 2401c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 2402c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return flags; 2403c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 2404c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 2405e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochWebString WebViewImpl::inputModeOfFocusedElement() 2406e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 2407e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (!RuntimeEnabledFeatures::inputModeAttributeEnabled()) 2408e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return WebString(); 2409e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 24100019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch Element* element = focusedElement(); 24110019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!element) 2412e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return WebString(); 2413e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 2414d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (isHTMLInputElement(*element)) { 2415d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const HTMLInputElement& input = toHTMLInputElement(*element); 2416d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (input.supportsInputModeAttribute()) 2417d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return input.fastGetAttribute(HTMLNames::inputmodeAttr).lower(); 2418e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return WebString(); 2419e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 2420d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (isHTMLTextAreaElement(*element)) { 2421d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const HTMLTextAreaElement& textarea = toHTMLTextAreaElement(*element); 2422d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return textarea.fastGetAttribute(HTMLNames::inputmodeAttr).lower(); 2423e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 2424e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 2425e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return WebString(); 2426e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch} 2427e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 24285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::selectionBounds(WebRect& anchor, WebRect& focus) const 24295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2430e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) const Frame* frame = focusedCoreFrame(); 2431197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!frame || !frame->isLocalFrame()) 24325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2433197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 2434197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const LocalFrame* localFrame = toLocalFrame(frame); 2435197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!localFrame) 2436197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return false; 2437197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch FrameSelection& selection = localFrame->selection(); 24385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (selection.isCaret()) { 24408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) anchor = focus = selection.absoluteCaretBounds(); 24418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) } else { 2442a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch RefPtrWillBeRawPtr<Range> selectedRange = selection.toNormalizedRange(); 2443926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!selectedRange) 2444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 24455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2446a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch RefPtrWillBeRawPtr<Range> range(Range::create(selectedRange->startContainer()->document(), 2447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->startContainer(), 2448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->startOffset(), 2449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->startContainer(), 2450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->startOffset())); 2451197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch anchor = localFrame->editor().firstRectForRange(range.get()); 2452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) range = Range::create(selectedRange->endContainer()->document(), 2454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->endContainer(), 2455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->endOffset(), 2456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->endContainer(), 2457926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectedRange->endOffset()); 2458197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch focus = localFrame->editor().firstRectForRange(range.get()); 2459926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 24605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2461197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch IntRect scaledAnchor(localFrame->view()->contentsToWindow(anchor)); 2462197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch IntRect scaledFocus(localFrame->view()->contentsToWindow(focus)); 2463323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 2464323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (pinchVirtualViewportEnabled()) { 2465d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // FIXME(http://crbug.com/371902) - We shouldn't have to do this 2466d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // manually, the contentsToWindow methods above should be fixed to do 2467d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // this. 2468323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) IntPoint pinchViewportOffset = 2469323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) roundedIntPoint(page()->frameHost().pinchViewport().visibleRect().location()); 2470323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) scaledAnchor.moveBy(-pinchViewportOffset); 2471323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) scaledFocus.moveBy(-pinchViewportOffset); 2472323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 2473323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 247453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) scaledAnchor.scale(pageScaleFactor()); 247553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) scaledFocus.scale(pageScaleFactor()); 2476926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) anchor = scaledAnchor; 2477926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) focus = scaledFocus; 24785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (!selection.selection().isBaseFirst()) 24805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) std::swap(anchor, focus); 24815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 24825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 24835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 248419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)InputMethodContext* WebViewImpl::inputMethodContext() 248519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){ 248619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (!m_imeAcceptEvents) 248719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) return 0; 248819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 2489e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) LocalFrame* focusedFrame = toLocalFrame(focusedCoreFrame()); 249019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (!focusedFrame) 249119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) return 0; 249219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 249319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) Element* target = focusedFrame->document()->focusedElement(); 249419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (target && target->hasInputMethodContext()) 2495d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return &target->inputMethodContext(); 249619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 249719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) return 0; 249819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 249919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 2500d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebPlugin* WebViewImpl::focusedPluginIfInputMethodSupported(LocalFrame* frame) 2501a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){ 250210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WebPluginContainerImpl* container = WebLocalFrameImpl::pluginContainerFromNode(frame, WebNode(focusedElement())); 2503a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (container && container->supportsInputMethod()) 2504a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return container->plugin(); 2505a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return 0; 2506a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)} 2507a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 250819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void WebViewImpl::didShowCandidateWindow() 250919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){ 251019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (InputMethodContext* context = inputMethodContext()) 251119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) context->dispatchCandidateWindowShowEvent(); 251219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 251319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 251419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void WebViewImpl::didUpdateCandidateWindow() 251519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){ 251619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (InputMethodContext* context = inputMethodContext()) 251719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) context->dispatchCandidateWindowUpdateEvent(); 251819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 251919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 252019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void WebViewImpl::didHideCandidateWindow() 252119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){ 252219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (InputMethodContext* context = inputMethodContext()) 252319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) context->dispatchCandidateWindowHideEvent(); 252419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 252519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 25265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::selectionTextDirection(WebTextDirection& start, WebTextDirection& end) const 25275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2528e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) const LocalFrame* frame = toLocalFrame(focusedCoreFrame()); 25295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 25305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 25318abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) FrameSelection& selection = frame->selection(); 25328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (!selection.toNormalizedRange()) 25335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2534e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) start = toWebTextDirection(selection.start().primaryDirection()); 2535e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) end = toWebTextDirection(selection.end().primaryDirection()); 25365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 25375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2539926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebViewImpl::isSelectionAnchorFirst() const 2540926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 2541e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (const LocalFrame* frame = toLocalFrame(focusedCoreFrame())) 25428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return frame->selection().selection().isBaseFirst(); 25438abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return false; 2544926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2545926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2546e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)WebVector<WebCompositionUnderline> WebViewImpl::compositionUnderlines() const 2547e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 2548e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) const LocalFrame* focused = toLocalFrame(focusedCoreFrame()); 2549e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (!focused) 2550e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return WebVector<WebCompositionUnderline>(); 2551e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) const Vector<CompositionUnderline>& underlines = focused->inputMethodController().customCompositionUnderlines(); 2552e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) WebVector<WebCompositionUnderline> results(underlines.size()); 2553e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) for (size_t index = 0; index < underlines.size(); ++index) { 2554e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) CompositionUnderline underline = underlines[index]; 25555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) results[index] = WebCompositionUnderline(underline.startOffset, underline.endOffset, static_cast<WebColor>(underline.color.rgb()), underline.thick, static_cast<WebColor>(underline.backgroundColor.rgb())); 2556e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 2557e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return results; 2558e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 2559e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 25605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebColor WebViewImpl::backgroundColor() const 25615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 25625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (isTransparent()) 25635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return Color::transparent; 25645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 256502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return m_baseBackgroundColor; 2566f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (!m_page->mainFrame()) 2567f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return m_baseBackgroundColor; 25685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->mainFrame()->isLocalFrame()) 25695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return m_baseBackgroundColor; 25705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FrameView* view = m_page->deprecatedLocalMainFrame()->view(); 257109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return view->documentBackgroundColor().rgb(); 25725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebPagePopup* WebViewImpl::pagePopup() const 25757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 25767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return m_pagePopup.get(); 25777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 25787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 25795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::caretOrSelectionRange(size_t* location, size_t* length) 25805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2581e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) const LocalFrame* focused = toLocalFrame(focusedCoreFrame()); 25825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!focused) 25835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 25845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2585f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) PlainTextRange selectionOffsets = focused->inputMethodController().getSelectionOffsets(); 2586bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (selectionOffsets.isNull()) 25875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 25885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2589bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *location = selectionOffsets.start(); 2590bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *length = selectionOffsets.length(); 2591bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return true; 25925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setTextDirection(WebTextDirection direction) 25955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 25965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The Editor::setBaseWritingDirection() function checks if we can change 25975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the text direction of the selected node and updates its DOM "dir" 25985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // attribute and its CSS "direction" property. 25995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // So, we just call the function as Safari does. 2600e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) const LocalFrame* focused = toLocalFrame(focusedCoreFrame()); 26015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!focused) 26025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 26035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2604c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) Editor& editor = focused->editor(); 2605c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) if (!editor.canEdit()) 26065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 26075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (direction) { 26095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebTextDirectionDefault: 2610c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) editor.setBaseWritingDirection(NaturalWritingDirection); 26115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 26125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebTextDirectionLeftToRight: 2614c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) editor.setBaseWritingDirection(LeftToRightWritingDirection); 26155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 26165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebTextDirectionRightToLeft: 2618c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) editor.setBaseWritingDirection(RightToLeftWritingDirection); 26195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 26205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 26225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) notImplemented(); 26235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 26245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::isAcceleratedCompositingActive() const 26285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_isAcceleratedCompositingActive; 26305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2632926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::willCloseLayerTreeView() 2633926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 2634926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setIsAcceleratedCompositingActive(false); 2635926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView = 0; 2636197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_layerTreeViewClosed = true; 2637926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2638926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 26395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::didAcquirePointerLock() 26405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (page()) 2642e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) page()->pointerLockController().didAcquirePointerLock(); 26435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::didNotAcquirePointerLock() 26465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (page()) 2648e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) page()->pointerLockController().didNotAcquirePointerLock(); 26495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::didLosePointerLock() 26525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_pointerLockGestureToken.clear(); 26545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (page()) 2655e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) page()->pointerLockController().didLosePointerLock(); 26565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::didChangeWindowResizerRect() 26595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (mainFrameImpl()->frameView()) 26615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mainFrameImpl()->frameView()->windowResizerRectChanged(); 26625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebView -------------------------------------------------------------------- 26655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebSettingsImpl* WebViewImpl::settingsImpl() 26675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_webSettings) 266909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_webSettings = adoptPtr(new WebSettingsImpl(&m_page->settings(), &m_page->inspectorController())); 26705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_webSettings); 26715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_webSettings.get(); 26725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebSettings* WebViewImpl::settings() 26755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return settingsImpl(); 26775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebViewImpl::pageEncoding() const 26805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 26825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebString(); 26835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->mainFrame()->isLocalFrame()) 26855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return WebString(); 26865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 26875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Is this check needed? 26885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->deprecatedLocalMainFrame()->document()->loader()) 26895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WebString(); 26905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return m_page->deprecatedLocalMainFrame()->document()->encodingName(); 26925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 26935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setPageEncoding(const WebString& encodingName) 26955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 26975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 26985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->mainFrame()->isLocalFrame()) 27005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 27015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 27025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Only change override encoding, don't change default encoding. 27035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note that the new encoding must be 0 if it isn't supposed to be set. 270409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) AtomicString newEncodingName; 27055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!encodingName.isEmpty()) 27065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) newEncodingName = encodingName; 27075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->loader().reload(NormalReload, KURL(), newEncodingName); 27085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebFrame* WebViewImpl::mainFrame() 27115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 271276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) return WebFrame::fromFrame(m_page ? m_page->mainFrame() : 0); 27135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebFrame* WebViewImpl::findFrameByName( 27165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebString& name, WebFrame* relativeToFrame) 27175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // FIXME: Either this should only deal with WebLocalFrames or it should move to WebFrame. 27195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!relativeToFrame) 27205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) relativeToFrame = mainFrame(); 27215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Frame* frame = toWebLocalFrameImpl(relativeToFrame)->frame(); 2722f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) frame = frame->tree().find(name); 27235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!frame || !frame->isLocalFrame()) 27245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return 0; 27255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return WebLocalFrameImpl::fromFrame(toLocalFrame(frame)); 27265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebFrame* WebViewImpl::focusedFrame() 27295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2730e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return WebFrame::fromFrame(focusedCoreFrame()); 27315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setFocusedFrame(WebFrame* frame) 27345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) { 27365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Clears the focused frame if any. 2737e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) Frame* focusedFrame = focusedCoreFrame(); 273807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (focusedFrame && focusedFrame->isLocalFrame()) 273907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch toLocalFrame(focusedFrame)->selection().setFocused(false); 27405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 27415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2742e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) LocalFrame* coreFrame = toWebLocalFrameImpl(frame)->frame(); 2743e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) coreFrame->page()->focusController().setFocusedFrame(coreFrame); 27445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setInitialFocus(bool reverse) 27475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 27495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 275007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Frame* frame = page()->focusController().focusedOrMainFrame(); 275107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (frame->isLocalFrame()) { 275207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (Document* document = toLocalFrame(frame)->document()) 275307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch document->setFocusedElement(nullptr); 275407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 275509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) page()->focusController().setInitialFocus(reverse ? FocusTypeBackward : FocusTypeForward); 27565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2758d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::clearFocusedElement() 27595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<Frame> frame = focusedCoreFrame(); 276107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!frame || !frame->isLocalFrame()) 27625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 27635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 276407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch LocalFrame* localFrame = toLocalFrame(frame.get()); 276507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 2766d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<Document> document = localFrame->document(); 27675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!document) 27685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 27695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2770d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<Element> oldFocusedElement = document->focusedElement(); 27715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Clear the focused node. 2773d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) document->setFocusedElement(nullptr); 27745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27750019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!oldFocusedElement) 27765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 27775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If a text field has focus, we need to make sure the selection controller 27795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // knows to remove selection from it. Otherwise, the text field is still 27805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // processing keyboard events even though focus has been moved to the page and 27815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // keystrokes get eaten as a result. 27820019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (oldFocusedElement->isContentEditable() || oldFocusedElement->isTextFormControl()) 278307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch localFrame->selection().clear(); 27845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 27855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::scrollFocusedNodeIntoRect(const WebRect& rect) 27875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) LocalFrame* frame = page()->mainFrame() && page()->mainFrame()->isLocalFrame() 27895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ? page()->deprecatedLocalMainFrame() : 0; 27900019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch Element* element = focusedElement(); 27910019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!frame || !frame->view() || !element) 27925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 27935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_webSettings->autoZoomFocusedNodeToLegibleScale()) { 27950019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch frame->view()->scrollElementToRect(element, IntRect(rect.x, rect.y, rect.width, rect.height)); 27965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 27975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 27985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2799926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) float scale; 2800926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) IntPoint scroll; 2801926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool needAnimation; 28020019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch computeScaleAndScrollForFocusedNode(element, scale, scroll, needAnimation); 2803926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (needAnimation) 2804926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) startPageScaleAnimation(scroll, false, scale, scrollAndScaleAnimationDurationInSeconds); 2805926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 2806926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2807926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::computeScaleAndScrollForFocusedNode(Node* focusedNode, float& newScale, IntPoint& newScroll, bool& needAnimation) 2808926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 28098abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) focusedNode->document().updateLayoutIgnorePendingStylesheets(); 28105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 'caret' is rect encompassing the blinking cursor. 28128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) IntRect textboxRect = focusedNode->document().view()->contentsToWindow(pixelSnappedIntRect(focusedNode->Node::boundingBox())); 2813926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebRect caret, unusedEnd; 2814926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) selectionBounds(caret, unusedEnd); 281553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) IntRect unscaledCaret = caret; 281653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) unscaledCaret.scale(1 / pageScaleFactor()); 281753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) caret = unscaledCaret; 28185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Pick a scale which is reasonably readable. This is the scale at which 28205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the caret height will become minReadableCaretHeight (adjusted for dpi 28215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and font scale factor). 282251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) newScale = clampPageScaleFactorToLimits(legibleScale() * minReadableCaretHeight / caret.height); 28237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci newScale = std::max(newScale, pageScaleFactor()); 28245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const float deltaScale = newScale / pageScaleFactor(); 28255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Convert the rects to absolute space in the new scale. 28275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect textboxRectInDocumentCoordinates = textboxRect; 28285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) textboxRectInDocumentCoordinates.move(mainFrame()->scrollOffset()); 28295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect caretInDocumentCoordinates = caret; 28305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) caretInDocumentCoordinates.move(mainFrame()->scrollOffset()); 28315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 283253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) int viewWidth = m_size.width / newScale; 283353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) int viewHeight = m_size.height / newScale; 2834926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2835926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (textboxRectInDocumentCoordinates.width() <= viewWidth) { 28365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Field is narrower than screen. Try to leave padding on left so field's 28375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // label is visible, but it's more important to ensure entire field is 28385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // onscreen. 2839926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) int idealLeftPadding = viewWidth * leftBoxRatio; 2840926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) int maxLeftPaddingKeepingBoxOnscreen = viewWidth - textboxRectInDocumentCoordinates.width(); 28415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) newScroll.setX(textboxRectInDocumentCoordinates.x() - std::min<int>(idealLeftPadding, maxLeftPaddingKeepingBoxOnscreen)); 28425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 28435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Field is wider than screen. Try to left-align field, unless caret would 28445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be offscreen, in which case right-align the caret. 28455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) newScroll.setX(std::max<int>(textboxRectInDocumentCoordinates.x(), caretInDocumentCoordinates.x() + caretInDocumentCoordinates.width() + caretPadding - viewWidth)); 28465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2847926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (textboxRectInDocumentCoordinates.height() <= viewHeight) { 28485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Field is shorter than screen. Vertically center it. 2849926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) newScroll.setY(textboxRectInDocumentCoordinates.y() - (viewHeight - textboxRectInDocumentCoordinates.height()) / 2); 28505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 28515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Field is taller than screen. Try to top align field, unless caret would 28525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be offscreen, in which case bottom-align the caret. 28535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) newScroll.setY(std::max<int>(textboxRectInDocumentCoordinates.y(), caretInDocumentCoordinates.y() + caretInDocumentCoordinates.height() + caretPadding - viewHeight)); 28545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2856926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) needAnimation = false; 28575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we are at less than the target zoom level, zoom in. 28585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (deltaScale > minScaleChangeToTriggerZoom) 28595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) needAnimation = true; 28605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the caret is offscreen, then animate. 2861926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) IntRect sizeRect(0, 0, viewWidth, viewHeight); 28627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci sizeRect.scale(newScale / pageScaleFactor()); 28635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!sizeRect.contains(caret)) 28645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) needAnimation = true; 28655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the box is partially offscreen and it's possible to bring it fully 28665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // onscreen, then animate. 28675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (sizeRect.contains(textboxRectInDocumentCoordinates.width(), textboxRectInDocumentCoordinates.height()) && !sizeRect.contains(textboxRect)) 28685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) needAnimation = true; 28695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 28705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::advanceFocus(bool reverse) 28725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 287309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) page()->focusController().advanceFocus(reverse ? FocusTypeBackward : FocusTypeForward); 28745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 28755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double WebViewImpl::zoomLevel() 28775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 28785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_zoomLevel; 28795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 28805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)double WebViewImpl::setZoomLevel(double zoomLevel) 28825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 28835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (zoomLevel < m_minimumZoomLevel) 28845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_zoomLevel = m_minimumZoomLevel; 28855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (zoomLevel > m_maximumZoomLevel) 28865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_zoomLevel = m_maximumZoomLevel; 28875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 28885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_zoomLevel = zoomLevel; 28895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2890d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = mainFrameImpl()->frame(); 289110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch WebPluginContainerImpl* pluginContainer = WebLocalFrameImpl::pluginContainerFromFrame(frame); 28925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pluginContainer) 28938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) pluginContainer->plugin()->setZoomLevel(m_zoomLevel, false); 28945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else { 289551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) float zoomFactor = m_zoomFactorOverride ? m_zoomFactorOverride : static_cast<float>(zoomLevelToZoomFactor(m_zoomLevel)); 28968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) frame->setPageZoomFactor(zoomFactor); 28975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 28988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 28995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_zoomLevel; 29005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 29015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::zoomLimitsChanged(double minimumZoomLevel, 29035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double maximumZoomLevel) 29045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 29055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_minimumZoomLevel = minimumZoomLevel; 29065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_maximumZoomLevel = maximumZoomLevel; 29075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->zoomLimitsChanged(m_minimumZoomLevel, m_maximumZoomLevel); 29085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 29095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)float WebViewImpl::textZoomFactor() 29118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){ 29128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return mainFrameImpl()->frame()->textZoomFactor(); 29138abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)} 29148abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 29158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)float WebViewImpl::setTextZoomFactor(float textZoomFactor) 29168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){ 2917d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = mainFrameImpl()->frame(); 291810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (WebLocalFrameImpl::pluginContainerFromFrame(frame)) 29198abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return 1; 29208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 29218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) frame->setTextZoomFactor(textZoomFactor); 29228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 29238abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return textZoomFactor; 29248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)} 29258abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 29265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::fullFramePluginZoomLevelChanged(double zoomLevel) 29275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 29285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (zoomLevel == m_zoomLevel) 29295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 29305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_zoomLevel = std::max(std::min(zoomLevel, m_maximumZoomLevel), m_minimumZoomLevel); 29325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->zoomLevelChanged(); 29335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 29345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double WebView::zoomLevelToZoomFactor(double zoomLevel) 29365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 29375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return pow(textSizeMultiplierRatio, zoomLevel); 29385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 29395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double WebView::zoomFactorToZoomLevel(double factor) 29415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 29425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Since factor = 1.2^level, level = log(factor) / log(1.2) 29435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return log(factor) / log(textSizeMultiplierRatio); 29445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 29455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float WebViewImpl::pageScaleFactor() const 29475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 29485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page()) 29495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 1; 29505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!pinchVirtualViewportEnabled()) 295210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return page()->pageScaleFactor(); 295310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 295410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return page()->frameHost().pinchViewport().scale(); 29555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 29565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)float WebViewImpl::clampPageScaleFactorToLimits(float scaleFactor) const 29585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 295993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_pageScaleConstraintsSet.finalConstraints().clampToConstraints(scaleFactor); 29605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 29615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 296293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)IntPoint WebViewImpl::clampOffsetAtScale(const IntPoint& offset, float scale) 29635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 296493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) FrameView* view = mainFrameImpl()->frameView(); 296593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (!view) 296693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return offset; 296793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 2968d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return view->clampOffsetAtScale(offset, scale); 29695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 29705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 297110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebViewImpl::pinchVirtualViewportEnabled() const 29725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 297310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ASSERT(page()); 297410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return page()->settings().pinchVirtualViewportEnabled(); 297510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 297610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 297710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::setPinchViewportOffset(const WebFloatPoint& offset) 297810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 297910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ASSERT(page()); 298010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 298110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!pinchVirtualViewportEnabled()) 29825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 29835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 298410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch page()->frameHost().pinchViewport().setLocation(offset); 298510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 298610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 298710f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebFloatPoint WebViewImpl::pinchViewportOffset() const 298810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 298910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ASSERT(page()); 299010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 299110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!pinchVirtualViewportEnabled()) 299210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return WebFloatPoint(); 299310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 299410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return page()->frameHost().pinchViewport().visibleRect().location(); 299510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 299610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 29977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebViewImpl::scrollAndRescaleViewports(float scaleFactor, 29987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const IntPoint& mainFrameOrigin, 29997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const FloatPoint& pinchViewportOrigin) 30007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 30017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Old way 30027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!pinchVirtualViewportEnabled()) { 30037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setPageScaleFactor(scaleFactor, mainFrameOrigin); 30047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 30057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 30067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 30077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!page()) 30087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 30097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 30107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!mainFrameImpl()) 30117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 30127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 30137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FrameView * view = mainFrameImpl()->frameView(); 30147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!view) 30157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 30167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 30177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Order is important: pinch viewport location is clamped based on 30187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // main frame scroll position and pinch viewport scale. 30197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 30207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci view->setScrollOffset(mainFrameOrigin); 30217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 30227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setPageScaleFactor(scaleFactor); 30237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 30247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci page()->frameHost().pinchViewport().setLocation(pinchViewportOrigin); 30257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 30267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 302710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::setPageScaleFactor(float scaleFactor) 302810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 302910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ASSERT(page()); 303010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 30315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scaleFactor = clampPageScaleFactorToLimits(scaleFactor); 303210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (scaleFactor == pageScaleFactor()) 303310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return; 3034926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 303510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // TODO(bokan): Old-style pinch path. Remove when we're migrated to 303610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // virtual viewport pinch. 303710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!pinchVirtualViewportEnabled()) { 303810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch IntPoint scrollOffset(mainFrame()->scrollOffset().width, mainFrame()->scrollOffset().height); 303910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch setPageScaleFactor(scaleFactor, scrollOffset); 304010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return; 304110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 304210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 304310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch page()->frameHost().pinchViewport().setScale(scaleFactor); 304410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch deviceOrPageScaleFactorChanged(); 304510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 304610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 304710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::setMainFrameScrollOffset(const WebPoint& origin) 304810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 304910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch updateMainFrameScrollPosition(origin, false); 305093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 3051926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 305210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::setPageScaleFactor(float scaleFactor, const WebPoint& origin) 305393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 305410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!page()) 305593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return; 30565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 305710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch IntPoint newScrollOffset = origin; 305810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch scaleFactor = clampPageScaleFactorToLimits(scaleFactor); 305910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch newScrollOffset = clampOffsetAtScale(newScrollOffset, scaleFactor); 306010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 306110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (pinchVirtualViewportEnabled()) 306210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch setPageScaleFactor(scaleFactor); 306310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // Note, we don't set the offset in the new path. This method is going 306410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // away for the new pinch model so that's ok. 306510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch else 306610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch page()->setPageScaleFactor(scaleFactor, newScrollOffset); 30675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 30685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float WebViewImpl::deviceScaleFactor() const 30705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 30715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page()) 30725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 1; 30735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return page()->deviceScaleFactor(); 30755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 30765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setDeviceScaleFactor(float scaleFactor) 30785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 30795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page()) 30805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 30815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) page()->setDeviceScaleFactor(scaleFactor); 30835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 308453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_layerTreeView) 30851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) updateLayerTreeDeviceScaleFactor(); 30865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 30875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebViewImpl::setDeviceColorProfile(const WebVector<char>& colorProfile) 30897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 30907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!page()) 30917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 30927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 30937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Vector<char> deviceProfile; 30947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci deviceProfile.append(colorProfile.data(), colorProfile.size()); 30957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 30967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci page()->setDeviceColorProfile(deviceProfile); 30977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 30987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 30997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebViewImpl::resetDeviceColorProfile() 31007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 31017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!page()) 31027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 31037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 31047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci page()->resetDeviceColorProfile(); 31057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 31067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 31075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::enableAutoResizeMode(const WebSize& minSize, const WebSize& maxSize) 31085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 31095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_shouldAutoResize = true; 31105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_minAutoSize = minSize; 31115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_maxAutoSize = maxSize; 31125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) configureAutoResizeMode(); 31135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 31145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::disableAutoResizeMode() 31165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 31175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_shouldAutoResize = false; 31185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) configureAutoResizeMode(); 31195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 31205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 312193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void WebViewImpl::setUserAgentPageScaleConstraints(PageScaleConstraints newConstraints) 31225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 312393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (newConstraints == m_pageScaleConstraintsSet.userAgentConstraints()) 3124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 3125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 312693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.setUserAgentConstraints(newConstraints); 3127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 312893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (!mainFrameImpl() || !mainFrameImpl()->frameView()) 312993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return; 313093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 313193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) mainFrameImpl()->frameView()->setNeedsLayout(); 31325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 31335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 313493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void WebViewImpl::setInitialPageScaleOverride(float initialPageScaleFactorOverride) 31355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 313693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) PageScaleConstraints constraints = m_pageScaleConstraintsSet.userAgentConstraints(); 313793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.initialScale = initialPageScaleFactorOverride; 31385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 313993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (constraints == m_pageScaleConstraintsSet.userAgentConstraints()) 31405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 31415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 314293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.setNeedsReset(true); 314393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) setUserAgentPageScaleConstraints(constraints); 31445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 31455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 314693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void WebViewImpl::setPageScaleFactorLimits(float minPageScale, float maxPageScale) 31475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 314893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) PageScaleConstraints constraints = m_pageScaleConstraintsSet.userAgentConstraints(); 314993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.minimumScale = minPageScale; 315093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.maximumScale = maxPageScale; 315193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) setUserAgentPageScaleConstraints(constraints); 3152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 3153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 315493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void WebViewImpl::setIgnoreViewportTagScaleLimits(bool ignore) 315593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 315693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) PageScaleConstraints constraints = m_pageScaleConstraintsSet.userAgentConstraints(); 315793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (ignore) { 315893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.minimumScale = m_pageScaleConstraintsSet.defaultConstraints().minimumScale; 315993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.maximumScale = m_pageScaleConstraintsSet.defaultConstraints().maximumScale; 316093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } else { 316193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.minimumScale = -1; 316293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) constraints.maximumScale = -1; 316393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 316493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) setUserAgentPageScaleConstraints(constraints); 316593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 316693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 316793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void WebViewImpl::refreshPageScaleFactorAfterLayout() 3168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 31695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!mainFrame() || !page() || !page()->mainFrame() || !page()->mainFrame()->isLocalFrame() || !page()->deprecatedLocalMainFrame()->view()) 3170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 31715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FrameView* view = page()->deprecatedLocalMainFrame()->view(); 3172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3173bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) updatePageDefinedViewportConstraints(mainFrameImpl()->frame()->document()->viewportDescription()); 317493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.computeFinalConstraints(); 3175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 31767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (settings()->shrinksViewportContentToFit()) { 317793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) int verticalScrollbarWidth = 0; 3178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (view->verticalScrollbar() && !view->verticalScrollbar()->isOverlayScrollbar()) 317993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) verticalScrollbarWidth = view->verticalScrollbar()->width(); 3180323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_pageScaleConstraintsSet.adjustFinalConstraintsToContentsSize(contentsSize(), verticalScrollbarWidth); 31815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 318293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 3183323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (pinchVirtualViewportEnabled()) 3184323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) mainFrameImpl()->frameView()->resize(m_pageScaleConstraintsSet.mainFrameSize(contentsSize())); 3185323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 3186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) float newPageScaleFactor = pageScaleFactor(); 318793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (m_pageScaleConstraintsSet.needsReset() && m_pageScaleConstraintsSet.finalConstraints().initialScale != -1) { 318893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) newPageScaleFactor = m_pageScaleConstraintsSet.finalConstraints().initialScale; 318993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.setNeedsReset(false); 3190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 319110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch setPageScaleFactor(newPageScaleFactor); 319293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 319393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) updateLayerTreeViewport(); 319493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 319593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // Relayout immediately to avoid violating the rule that needsLayout() 319693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // isn't set at the end of a layout. 319793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (view->needsLayout()) 319893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) view->layout(); 319993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 320093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 3201bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void WebViewImpl::updatePageDefinedViewportConstraints(const ViewportDescription& description) 320293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 32035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!settings()->viewportEnabled() || !page() || (!m_size.width && !m_size.height) || !page()->mainFrame()->isLocalFrame()) 320493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return; 320593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 32065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Document* document = page()->deprecatedLocalMainFrame()->document(); 3207aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 32089e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) m_matchesHeuristicsForGpuRasterization = description.maxWidth == Length(DeviceWidth) 32099e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) && description.minZoom == 1.0 32109e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) && description.minZoomIsExplicit; 3211f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu if (m_layerTreeView) 3212f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu m_layerTreeView->heuristicsForGpuRasterizationUpdated(m_matchesHeuristicsForGpuRasterization); 3213f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 3214aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch Length defaultMinWidth = document->viewportDefaultMinWidth(); 3215aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (defaultMinWidth.isAuto()) 3216aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch defaultMinWidth = Length(ExtendToZoom); 3217aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 32181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ViewportDescription adjustedDescription = description; 32191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (settingsImpl()->viewportMetaLayoutSizeQuirk() && adjustedDescription.type == ViewportDescription::ViewportMeta) { 322051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) const int legacyWidthSnappingMagicNumber = 320; 322151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (adjustedDescription.maxWidth.isFixed() && adjustedDescription.maxWidth.value() <= legacyWidthSnappingMagicNumber) 322209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) adjustedDescription.maxWidth = Length(DeviceWidth); 3223d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (adjustedDescription.maxHeight.isFixed() && adjustedDescription.maxHeight.value() <= m_size.height) 322409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) adjustedDescription.maxHeight = Length(DeviceHeight); 32251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) adjustedDescription.minWidth = adjustedDescription.maxWidth; 32261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) adjustedDescription.minHeight = adjustedDescription.maxHeight; 32278abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) } 3228aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 322951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) float oldInitialScale = m_pageScaleConstraintsSet.pageDefinedConstraints().initialScale; 3230323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_pageScaleConstraintsSet.updatePageDefinedConstraints(adjustedDescription, defaultMinWidth); 323151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 323251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (settingsImpl()->clobberUserAgentInitialScaleQuirk() 323351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) && m_pageScaleConstraintsSet.userAgentConstraints().initialScale != -1 323451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) && m_pageScaleConstraintsSet.userAgentConstraints().initialScale * deviceScaleFactor() <= 1) { 323509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (description.maxWidth == Length(DeviceWidth) 3236aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch || (description.maxWidth.type() == Auto && m_pageScaleConstraintsSet.pageDefinedConstraints().initialScale == 1.0f)) 323751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) setInitialPageScaleOverride(-1); 323851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 3239aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 3240323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_pageScaleConstraintsSet.adjustForAndroidWebViewQuirks(adjustedDescription, defaultMinWidth.intValue(), deviceScaleFactor(), settingsImpl()->supportDeprecatedTargetDensityDPI(), page()->settings().wideViewportQuirkEnabled(), page()->settings().useWideViewport(), page()->settings().loadWithOverviewMode(), settingsImpl()->viewportMetaNonUserScalableQuirk()); 324151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) float newInitialScale = m_pageScaleConstraintsSet.pageDefinedConstraints().initialScale; 324251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (oldInitialScale != newInitialScale && newInitialScale != -1) { 324351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_pageScaleConstraintsSet.setNeedsReset(true); 324451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (mainFrameImpl() && mainFrameImpl()->frameView()) 324551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) mainFrameImpl()->frameView()->setNeedsLayout(); 324651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 324793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 3248bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) updateMainFrameLayoutSize(); 3249aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 32505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (LocalFrame* frame = page()->deprecatedLocalMainFrame()) { 3251c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (TextAutosizer* textAutosizer = frame->document()->textAutosizer()) 3252aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch textAutosizer->updatePageInfoInAllFrames(); 3253aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch } 3254bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 3255bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 3256bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void WebViewImpl::updateMainFrameLayoutSize() 3257bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 32587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_shouldAutoResize || !mainFrameImpl()) 3259bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return; 3260bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 326109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<FrameView> view = mainFrameImpl()->frameView(); 3262bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (!view) 3263bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return; 3264bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 3265bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) WebSize layoutSize = m_size; 3266bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 3267c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (settings()->viewportEnabled()) 3268bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) layoutSize = flooredIntSize(m_pageScaleConstraintsSet.pageDefinedConstraints().layoutSize); 32695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3270e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (page()->settings().forceZeroLayoutHeight()) 3271e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) layoutSize.height = 0; 3272e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 3273bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) view->setLayoutSize(layoutSize); 327493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 327593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 327693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)IntSize WebViewImpl::contentsSize() const 327793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 32785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!page()->mainFrame()->isLocalFrame()) 32795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return IntSize(); 32805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) RenderView* root = page()->deprecatedLocalMainFrame()->contentRenderer(); 328193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (!root) 328293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return IntSize(); 328393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return root->documentRect().size(); 32845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 32855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)WebSize WebViewImpl::contentsPreferredMinimumSize() 32875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 32885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Document* document = m_page->mainFrame()->isLocalFrame() ? m_page->deprecatedLocalMainFrame()->document() : 0; 32895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!document || !document->renderView() || !document->documentElement()) 32905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return WebSize(); 32915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 32925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) layout(); 3293521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) FontCachePurgePreventer fontCachePurgePreventer; // Required by minPreferredLogicalWidth(). 32945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) IntSize preferredMinimumSize(document->renderView()->minPreferredLogicalWidth(), document->documentElement()->scrollHeight()); 32955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) preferredMinimumSize.scale(zoomLevelToZoomFactor(zoomLevel())); 32965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return preferredMinimumSize; 32975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 32985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 32995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float WebViewImpl::minimumPageScaleFactor() const 33005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 330193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_pageScaleConstraintsSet.finalConstraints().minimumScale; 33025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 33035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float WebViewImpl::maximumPageScaleFactor() const 33055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 330693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_pageScaleConstraintsSet.finalConstraints().maximumScale; 33075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 33085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::resetScrollAndScaleState() 33105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3311d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // TODO: This is done by the pinchViewport().reset() call below and can be removed when 3312d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // the new pinch path is the only one. 3313d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) setPageScaleFactor(1); 3314d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) updateMainFrameScrollPosition(IntPoint(), true); 3315d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) page()->frameHost().pinchViewport().reset(); 3316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 33175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!page()->mainFrame()->isLocalFrame()) 33185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 33195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 3320926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Clear out the values for the current history item. This will prevent the history item from clobbering the 3321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // value determined during page scale initialization, which may be less than 1. 33225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) page()->deprecatedLocalMainFrame()->loader().clearScrollPositionAndViewState(); 332393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.setNeedsReset(true); 33245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Clobber saved scales and scroll offsets. 33265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (FrameView* view = page()->deprecatedLocalMainFrame()->document()->view()) 33275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) view->cacheCurrentScrollPosition(); 33285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 33295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::performMediaPlayerAction(const WebMediaPlayerAction& action, 33315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& location) 33325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 33335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HitTestResult result = hitTestResultForWindowPos(location); 3334d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<Node> node = result.innerNonSharedNode(); 3335d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!isHTMLVideoElement(*node) && !isHTMLAudioElement(*node)) 33365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 33375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3338d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<HTMLMediaElement> mediaElement = static_pointer_cast<HTMLMediaElement>(node); 33395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (action.type) { 33405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebMediaPlayerAction::Play: 33415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (action.enable) 33425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mediaElement->play(); 33435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 33445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mediaElement->pause(); 33455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 33465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebMediaPlayerAction::Mute: 33475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mediaElement->setMuted(action.enable); 33485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 33495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebMediaPlayerAction::Loop: 33505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mediaElement->setLoop(action.enable); 33515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 33525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebMediaPlayerAction::Controls: 3353197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch mediaElement->setBooleanAttribute(HTMLNames::controlsAttr, action.enable); 33545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 33555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 33565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 33575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 33585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 33595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::performPluginAction(const WebPluginAction& action, 33615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& location) 33625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 33635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HitTestResult result = hitTestResultForWindowPos(location); 3364d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<Node> node = result.innerNonSharedNode(); 3365d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!isHTMLObjectElement(*node) && !isHTMLEmbedElement(*node)) 33665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 33675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* object = node->renderer(); 33695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (object && object->isWidget()) { 33705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Widget* widget = toRenderWidget(object)->widget(); 33715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (widget && widget->isPluginContainer()) { 337209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) WebPluginContainerImpl* plugin = toWebPluginContainerImpl(widget); 33735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (action.type) { 33745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebPluginAction::Rotate90Clockwise: 33755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) plugin->plugin()->rotateView(WebPlugin::RotationType90Clockwise); 33765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 33775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebPluginAction::Rotate90Counterclockwise: 33785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) plugin->plugin()->rotateView(WebPlugin::RotationType90Counterclockwise); 33795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 33805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 33815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 33825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 33835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 33845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 33855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 33865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebHitTestResult WebViewImpl::hitTestResultAt(const WebPoint& point) 33885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 33895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return coreHitTestResultAt(point); 33905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 33915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 33925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)HitTestResult WebViewImpl::coreHitTestResultAt(const WebPoint& point) 33935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){ 3394591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch IntPoint scaledPoint = point; 3395591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch scaledPoint.scale(1 / pageScaleFactor(), 1 / pageScaleFactor()); 3396591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return hitTestResultForWindowPos(scaledPoint); 33975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 33985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::copyImageAt(const WebPoint& point) 34005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 34025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 34035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HitTestResult result = hitTestResultForWindowPos(point); 34057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Node* node = result.innerNonSharedNode(); 34067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(node); 34075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!isHTMLCanvasElement(*node) && result.absoluteImageURL().isEmpty()) { 34095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // There isn't actually an image at these coordinates. Might be because 34105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the window scrolled while the context menu was open or because the page 34115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // changed itself between when we thought there was an image here and when 34125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we actually tried to retreive the image. 34135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 34145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: implement a cache of the most recent HitTestResult to avoid having 34155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to do two hit tests. 34165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 34175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 34185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->editor().copyImage(result); 34205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 34215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3422323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void WebViewImpl::saveImageAt(const WebPoint& point) 3423323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 34247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!m_client) 3425323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return; 3426323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 34277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Node* node = hitTestResultForWindowPos(point).innerNonSharedNode(); 34287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!node || !(isHTMLCanvasElement(*node) || isHTMLImageElement(*node))) 34297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 3430323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 34317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci String url = toElement(*node).imageSourceURL(); 34327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!KURL(KURL(), url).protocolIsData()) 3433323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return; 3434323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 34357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_client->saveImageFromDataURL(url); 3436323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 3437323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 34385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::dragSourceEndedAt( 34395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& clientPoint, 34405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& screenPoint, 34415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebDragOperation operation) 34425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci PlatformMouseEvent pme(clientPoint, screenPoint, LeftButton, PlatformEvent::MouseMoved, 34447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 0, false, false, false, false, PlatformMouseEvent::RealOrIndistinguishable, 0); 34455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->eventHandler().dragSourceEndedAt(pme, 34465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<DragOperation>(operation)); 34475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 34485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::dragSourceSystemDragEnded() 34505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It's possible for us to get this callback while not doing a drag if 34525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it's from a previous page that got unloaded. 34535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_doingDragAndDrop) { 345400d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch m_page->dragController().dragEnded(); 34555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_doingDragAndDrop = false; 34565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 34575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 34585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebDragOperation WebViewImpl::dragTargetDragEnter( 34605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebDragData& webDragData, 34615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& clientPoint, 34625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& screenPoint, 34635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebDragOperationsMask operationsAllowed, 34645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int keyModifiers) 34655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_currentDragData); 34675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3468d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_currentDragData = webDragData.getValue(); 34695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_operationsAllowed = operationsAllowed; 34705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragEnter, keyModifiers); 34725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 34735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebDragOperation WebViewImpl::dragTargetDragOver( 34755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& clientPoint, 34765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& screenPoint, 34775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebDragOperationsMask operationsAllowed, 34785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int keyModifiers) 34795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_operationsAllowed = operationsAllowed; 34815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dragTargetDragEnterOrOver(clientPoint, screenPoint, DragOver, keyModifiers); 34835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 34845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::dragTargetDragLeave() 34865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_currentDragData); 34885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DragData dragData( 34905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_currentDragData.get(), 34915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint(), 34925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint(), 34935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<DragOperation>(m_operationsAllowed)); 34945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 349500d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch m_page->dragController().dragExited(&dragData); 34965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: why is the drag scroll timer not stopped here? 34985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dragOperation = WebDragOperationNone; 3500d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_currentDragData = nullptr; 35015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 35025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::dragTargetDrop(const WebPoint& clientPoint, 35045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& screenPoint, 35055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int keyModifiers) 35065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 35075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_currentDragData); 35085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 350910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch UserGestureNotifier notifier(m_autofillClient, &m_userGestureObserved); 351010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 35115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If this webview transitions from the "drop accepting" state to the "not 35125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // accepting" state, then our IPC message reply indicating that may be in- 35135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // flight, or else delayed by javascript processing in this webview. If a 35145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // drop happens before our IPC reply has reached the browser process, then 35155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the browser forwards the drop to this webview. So only allow a drop to 35165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // proceed if our webview m_dragOperation state is not DragOperationNone. 35175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_dragOperation == WebDragOperationNone) { // IPC RACE CONDITION: do not allow this drop. 35195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dragTargetDragLeave(); 35205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 35215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 35225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_currentDragData->setModifierKeyState(webInputEventKeyStateToPlatformEventKeyState(keyModifiers)); 35245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DragData dragData( 35255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_currentDragData.get(), 35265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clientPoint, 35275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) screenPoint, 35285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<DragOperation>(m_operationsAllowed)); 35295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 353007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch UserGestureIndicator gesture(DefinitelyProcessingNewUserGesture); 353100d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch m_page->dragController().performDrag(&dragData); 35325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dragOperation = WebDragOperationNone; 3534d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_currentDragData = nullptr; 35355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 35365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 353753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void WebViewImpl::spellingMarkers(WebVector<uint32_t>* markers) 353853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 353953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<uint32_t> result; 35405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree().traverseNext()) { 35415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!frame->isLocalFrame()) 35425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) continue; 3543197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const DocumentMarkerVector& documentMarkers = toLocalFrame(frame)->document()->markers().markers(); 354453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t i = 0; i < documentMarkers.size(); ++i) 354553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) result.append(documentMarkers[i]->hash()); 354653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 354753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) markers->assign(result); 354853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 354953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 35509e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void WebViewImpl::removeSpellingMarkersUnderWords(const WebVector<WebString>& words) 35519e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){ 35529e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) Vector<String> convertedWords; 35539e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) convertedWords.append(words.data(), words.size()); 35549e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 35559e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree().traverseNext()) { 35569e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) if (frame->isLocalFrame()) 35579e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) toLocalFrame(frame)->removeSpellingMarkersUnderWords(convertedWords); 35589e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) } 35599e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)} 35609e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 35615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebDragOperation WebViewImpl::dragTargetDragEnterOrOver(const WebPoint& clientPoint, const WebPoint& screenPoint, DragAction dragAction, int keyModifiers) 35625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 35635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_currentDragData); 35645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_currentDragData->setModifierKeyState(webInputEventKeyStateToPlatformEventKeyState(keyModifiers)); 35665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DragData dragData( 35675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_currentDragData.get(), 35685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clientPoint, 35695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) screenPoint, 35705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_cast<DragOperation>(m_operationsAllowed)); 35715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DragSession dragSession; 35735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (dragAction == DragEnter) 357400d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch dragSession = m_page->dragController().dragEntered(&dragData); 35755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 357600d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch dragSession = m_page->dragController().dragUpdated(&dragData); 35775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DragOperation dropEffect = dragSession.operation; 35795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Mask the drop effect operation against the drag source's allowed operations. 35815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!(dropEffect & dragData.draggingSourceOperationMask())) 35825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dropEffect = DragOperationNone; 35835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dragOperation = static_cast<WebDragOperation>(dropEffect); 35855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_dragOperation; 35875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 35885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::sendResizeEventAndRepaint() 35905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 359102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // FIXME: This is wrong. The FrameView is responsible sending a resizeEvent 359202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // as part of layout. Layout is also responsible for sending invalidations 359302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // to the embedder. This method and all callers may be wrong. -- eseidel. 3594197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (localFrameRootTemporary()->frameView()) { 35955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Enqueues the resize event. 3596197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch localFrameRootTemporary()->frame()->document()->enqueueResizeEvent(); 35975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 35985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_client) { 36005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isAcceleratedCompositingActive()) { 36015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateLayerTreeViewport(); 36025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 36035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebRect damagedRect(0, 0, m_size.width, m_size.height); 36045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->didInvalidateRect(damagedRect); 36055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 36065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 36075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pageOverlays) 36085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays->update(); 36095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::configureAutoResizeMode() 36125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 36135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl() || !mainFrameImpl()->frame() || !mainFrameImpl()->frame()->view()) 36145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 36155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36169e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) if (m_shouldAutoResize) 36179e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) mainFrameImpl()->frame()->view()->enableAutoSizeMode(m_minAutoSize, m_maxAutoSize); 36189e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) else 36199e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) mainFrameImpl()->frame()->view()->disableAutoSizeMode(); 36205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned long WebViewImpl::createUniqueIdentifierForRequest() 36235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 362453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return createUniqueIdentifier(); 36255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::inspectElementAt(const WebPoint& point) 36285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 36295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 36305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 36315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3632e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (point.x == -1 || point.y == -1) { 3633e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->inspectorController().inspect(0); 3634e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } else { 3635d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move | HitTestRequest::ReadOnly | HitTestRequest::AllowChildFrameContent; 36365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) HitTestRequest request(hitType); 36375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3638f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) WebMouseEvent dummyEvent; 3639f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) dummyEvent.type = WebInputEvent::MouseDown; 3640f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) dummyEvent.x = point.x; 3641f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) dummyEvent.y = point.y; 36425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) IntPoint transformedPoint = PlatformMouseEventBuilder(m_page->deprecatedLocalMainFrame()->view(), dummyEvent).position(); 36435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) HitTestResult result(m_page->deprecatedLocalMainFrame()->view()->windowToContents(transformedPoint)); 36445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->contentRenderer()->hitTest(request, result); 3645521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) Node* node = result.innerNode(); 36465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!node && m_page->deprecatedLocalMainFrame()->document()) 36475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) node = m_page->deprecatedLocalMainFrame()->document()->documentElement(); 3648e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->inspectorController().inspect(node); 36495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 36505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebViewImpl::setCompositorDeviceScaleFactorOverride(float deviceScaleFactor) 36531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 3654a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (m_compositorDeviceScaleFactorOverride == deviceScaleFactor) 3655a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return; 36561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_compositorDeviceScaleFactorOverride = deviceScaleFactor; 36571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (page() && m_layerTreeView) 36581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) updateLayerTreeDeviceScaleFactor(); 36591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 36601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 366151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void WebViewImpl::setRootLayerTransform(const WebSize& rootLayerOffset, float rootLayerScale) 36621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 3663a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (m_rootLayerScale == rootLayerScale && m_rootLayerOffset == rootLayerOffset) 3664a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return; 36651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_rootLayerScale = rootLayerScale; 366651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_rootLayerOffset = rootLayerOffset; 366751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (mainFrameImpl()) 366851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) mainFrameImpl()->setInputEventsTransformForEmulation(m_rootLayerOffset, m_rootLayerScale); 36691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) updateRootLayerTransform(); 36701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 36711e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 36725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebDevToolsAgent* WebViewImpl::devToolsAgent() 36735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 36745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_devToolsAgent.get(); 36755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)WebAXObject WebViewImpl::accessibilityObject() 36785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 36795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl()) 36808abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return WebAXObject(); 36815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Document* document = mainFrameImpl()->frame()->document(); 36838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return WebAXObject( 3684d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) document->axObjectCache()->getOrCreate(document->renderView())); 36855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::performCustomContextMenuAction(unsigned action) 36885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 36895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_page) 36905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3691e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) ContextMenu* menu = m_page->contextMenuController().contextMenu(); 36925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!menu) 36935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 369453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) const ContextMenuItem* item = menu->itemWithAction(static_cast<ContextMenuAction>(ContextMenuItemBaseCustomTag + action)); 36955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (item) 3696e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->contextMenuController().contextMenuItemSelected(item); 3697e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_page->contextMenuController().clearContextMenu(); 36985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3700926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::showContextMenu() 3701926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 3702926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!page()) 3703926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 3704926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3705e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) page()->contextMenuController().clearContextMenu(); 3706926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_contextMenuAllowed = true; 370707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (LocalFrame* focusedFrame = toLocalFrame(page()->focusController().focusedOrMainFrame())) 3708f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) focusedFrame->eventHandler().sendContextMenuEventForKey(); 3709926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_contextMenuAllowed = false; 3710926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 3711926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3712197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid WebViewImpl::extractSmartClipData(WebRect rect, WebString& clipText, WebString& clipHtml, WebRect& clipRect) 3713197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 3714e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) LocalFrame* localFrame = toLocalFrame(focusedCoreFrame()); 3715197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!localFrame) 3716197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return; 3717e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) SmartClipData clipData = SmartClip(localFrame).dataForRect(rect); 3718197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch clipText = clipData.clipData(); 3719197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch clipRect = clipData.rect(); 3720197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 3721197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WebLocalFrameImpl* frame = mainFrameImpl(); 3722197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!frame) 3723197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return; 3724197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WebPoint startPoint(rect.x, rect.y); 3725197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WebPoint endPoint(rect.x + rect.width, rect.y + rect.height); 3726197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch VisiblePosition startVisiblePosition = frame->visiblePositionForWindowPoint(startPoint); 3727197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch VisiblePosition endVisiblePosition = frame->visiblePositionForWindowPoint(endPoint); 3728197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 3729197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Position startPosition = startVisiblePosition.deepEquivalent(); 3730197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Position endPosition = endVisiblePosition.deepEquivalent(); 3731197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 37329e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) // document() will return null if -webkit-user-select is set to none. 37339e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) if (!startPosition.document() || !endPosition.document()) 37349e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) return; 37359e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 3736197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RefPtrWillBeRawPtr<Range> range = Range::create(*startPosition.document(), startPosition, endPosition); 3737197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!range) 3738197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return; 3739197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 3740197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch clipHtml = createMarkup(range.get(), 0, AnnotateForInterchange, false, ResolveNonLocalURLs); 374109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 374209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 374309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void WebViewImpl::hidePopups() 374409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 374509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) hideSelectPopup(); 374609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_pagePopup) 374709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) closePagePopup(m_pagePopup.get()); 374809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 37495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setIsTransparent(bool isTransparent) 37515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 37525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Set any existing frames to be transparent. 37535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Frame* frame = m_page->mainFrame(); 37545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (frame) { 37555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (frame->isLocalFrame()) 37565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) toLocalFrame(frame)->view()->setTransparent(isTransparent); 3757f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) frame = frame->tree().traverseNext(); 37585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 37595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Future frames check this to know whether to be transparent. 37615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_isTransparent = isTransparent; 37625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 37635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::isTransparent() const 37655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 37665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_isTransparent; 37675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 37685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 376902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochvoid WebViewImpl::setBaseBackgroundColor(WebColor color) 377002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 3771d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) layout(); 3772d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 377302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch if (m_baseBackgroundColor == color) 377402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return; 377502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 377602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_baseBackgroundColor = color; 377702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 37785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (m_page->mainFrame() && m_page->mainFrame()->isLocalFrame()) 37795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->view()->setBaseBackgroundColor(color); 378002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 378119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) updateLayerTreeBackgroundColor(); 378202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch} 378302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 37845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setIsActive(bool active) 37855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 37863c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch if (page()) 37873c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch page()->focusController().setActive(active); 37885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 37895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::isActive() const 37915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 37923c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch return page() ? page()->focusController().isActive() : false; 37935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 37945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setDomainRelaxationForbidden(bool forbidden, const WebString& scheme) 37965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 37975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SchemeRegistry::setDomainRelaxationForbiddenForURLScheme(forbidden, String(scheme)); 37985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 37995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 380002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochvoid WebViewImpl::setWindowFeatures(const WebWindowFeatures& features) 380102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 380202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_page->chrome().setWindowFeatures(features); 380302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch} 380402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3805a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid WebViewImpl::setOpenedByDOM() 3806a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{ 3807a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch m_page->setOpenedByDOM(); 3808a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 3809a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 38105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setSelectionColors(unsigned activeBackgroundColor, 38115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned activeForegroundColor, 38125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned inactiveBackgroundColor, 38135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned inactiveForegroundColor) { 38141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#if USE(DEFAULT_RENDER_THEME) 3815926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RenderThemeChromiumDefault::setSelectionColors(activeBackgroundColor, activeForegroundColor, inactiveBackgroundColor, inactiveForegroundColor); 3816c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) RenderTheme::theme().platformColorsDidChange(); 38175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 38185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebView::injectStyleSheet(const WebString& sourceCode, const WebVector<WebString>& patternsIn, WebView::StyleInjectionTarget injectIn) 38215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 38225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<String> patterns; 38235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < patternsIn.size(); ++i) 38245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) patterns.append(patternsIn[i]); 38255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3826c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InjectedStyleSheets::instance().add(sourceCode, patterns, static_cast<blink::StyleInjectionTarget>(injectIn)); 38275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebView::removeInjectedStyleSheets() 38305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 383109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) InjectedStyleSheets::instance().removeAll(); 38325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3834bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void WebViewImpl::didCommitLoad(bool isNewNavigation, bool isNavigationWithinPage) 38355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3836bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (isNewNavigation && !isNavigationWithinPage) 383793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.setNeedsReset(true); 38385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make sure link highlight from previous page is cleared. 38409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_linkHighlights.clear(); 384151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) endActiveFlingAnimation(); 384210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_userGestureObserved = false; 38435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 38445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 384510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::willInsertBody(WebLocalFrameImpl* webframe) 38465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3847d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (webframe != mainFrameImpl()) 38485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 38495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->mainFrame()->isLocalFrame()) 38515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 38525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 3853a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // If we get to the <body> tag and we have no pending stylesheet and import load, we 3854d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // can be fairly confident we'll have something sensible to paint soon and 3855d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // can turn off deferred commits. 38565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (m_page->deprecatedLocalMainFrame()->document()->isRenderingReady()) 3857d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) resumeTreeViewCommits(); 3858d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 3859d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 3860e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void WebViewImpl::didRemoveAllPendingStylesheet(WebLocalFrameImpl* webframe) 3861e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){ 3862e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (webframe != mainFrameImpl()) 3863e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return; 3864e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 3865e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // If we have no more stylesheets to load and we're past the body tag, 3866e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // we should have something to paint and should start as soon as possible. 3867e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (m_page->deprecatedLocalMainFrame()->document()->body()) 3868e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) resumeTreeViewCommits(); 3869e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)} 3870e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 3871d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::resumeTreeViewCommits() 3872d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 38735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (m_layerTreeViewCommitsDeferred) { 38745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (m_layerTreeView) 38755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) m_layerTreeView->setDeferCommits(false); 38765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) m_layerTreeViewCommitsDeferred = false; 38775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 3878d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 3879d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 388010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebViewImpl::layoutUpdated(WebLocalFrameImpl* webframe) 3881d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 3882197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!m_client || !webframe->frame()->isLocalRoot()) 3883d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 3884d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 3885d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // If we finished a layout while in deferred commit mode, 3886d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // that means it's time to start producing frames again so un-defer. 3887d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) resumeTreeViewCommits(); 38885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3889197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (m_shouldAutoResize && webframe->frame() && webframe->frame()->view()) { 3890197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch WebSize frameSize = webframe->frame()->view()->frameRect().size(); 38915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (frameSize != m_size) { 38925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_size = frameSize; 3893323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 3894323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) page()->frameHost().pinchViewport().setSize(m_size); 3895323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_pageScaleConstraintsSet.didChangeViewSize(m_size); 3896323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 38975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->didAutoResize(m_size); 38985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sendResizeEventAndRepaint(); 38995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 39005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 39015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 390293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (m_pageScaleConstraintsSet.constraintsDirty()) 390393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) refreshPageScaleFactorAfterLayout(); 39045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3905926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->didUpdateLayout(); 3906926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 39075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3908926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::didChangeContentsSize() 3909926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 391093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.didChangeContentsSize(contentsSize(), pageScaleFactor()); 39115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 39125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 391353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void WebViewImpl::deviceOrPageScaleFactorChanged() 391453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 391593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_pageScaleConstraintsSet.setNeedsReset(false); 391653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) updateLayerTreeViewport(); 3917197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_page->inspectorController().deviceOrPageScaleFactorChanged(); 391853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 391953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 39205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::useExternalPopupMenus() 39215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 39225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return shouldUseExternalPopupMenus; 39235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 39245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3925d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void WebViewImpl::startDragging(LocalFrame* frame, 39265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebDragData& dragData, 39275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebDragOperationsMask mask, 39285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebImage& dragImage, 39295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebPoint& dragImageOffset) 39305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 39315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_client) 39325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 39335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_doingDragAndDrop); 39345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_doingDragAndDrop = true; 393510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_client->startDragging(WebLocalFrameImpl::fromFrame(frame), dragData, mask, dragImage, dragImageOffset); 39365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 39375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setIgnoreInputEvents(bool newValue) 39395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 39405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_ignoreInputEvents != newValue); 39415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_ignoreInputEvents = newValue; 39425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 39435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 394419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void WebViewImpl::setBackgroundColorOverride(WebColor color) 394519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){ 394619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) m_backgroundColorOverride = color; 394719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) updateLayerTreeBackgroundColor(); 394819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 394919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 395051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void WebViewImpl::setZoomFactorOverride(float zoomFactor) 395151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 395251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_zoomFactorOverride = zoomFactor; 395351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) setZoomLevel(zoomLevel()); 395451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 395551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 39565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::addPageOverlay(WebPageOverlay* overlay, int zOrder) 39575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 39585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_pageOverlays) 39595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays = PageOverlayList::create(this); 39605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays->add(overlay, zOrder); 39625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 39635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::removePageOverlay(WebPageOverlay* overlay) 39655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 39665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_pageOverlays && m_pageOverlays->remove(overlay) && m_pageOverlays->empty()) 39675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_pageOverlays = nullptr; 39685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 39695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3970e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void WebViewImpl::setOverlayLayer(GraphicsLayer* layer) 39715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3972d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!m_rootGraphicsLayer) 3973d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 3974d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 39755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->mainFrame()->isLocalFrame()) 39765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 39775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 3978f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (pinchVirtualViewportEnabled()) { 39795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_page->deprecatedLocalMainFrame()->view()->renderView()->compositor()->setOverlayLayer(layer); 3980f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return; 3981f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 3982f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 3983f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // FIXME(bokan): This path goes away after virtual viewport pinch is enabled everywhere. 3984d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!m_rootTransformLayer) 39855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_rootTransformLayer = m_page->deprecatedLocalMainFrame()->view()->renderView()->compositor()->ensureRootTransformLayer(); 3986d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 3987d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_rootTransformLayer) { 3988d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (layer->parent() != m_rootTransformLayer) 3989d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootTransformLayer->addChild(layer); 39905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 39915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 39925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 399309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)Element* WebViewImpl::focusedElement() const 39945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 399507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Frame* frame = m_page->focusController().focusedFrame(); 399607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!frame || !frame->isLocalFrame()) 39975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 39985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 399907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Document* document = toLocalFrame(frame)->document(); 40005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!document) 40015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 40025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40037757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return document->focusedElement(); 40045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 40055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HitTestResult WebViewImpl::hitTestResultForWindowPos(const IntPoint& pos) 40075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 40085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_page->mainFrame()->isLocalFrame()) 40095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return HitTestResult(); 40105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) IntPoint docPoint(m_page->deprecatedLocalMainFrame()->view()->windowToContents(pos)); 40117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci HitTestResult result = m_page->deprecatedLocalMainFrame()->eventHandler().hitTestResultAtPoint(docPoint, HitTestRequest::ReadOnly | HitTestRequest::Active); 40127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci result.setToShadowHostIfInUserAgentShadowRoot(); 40137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return result; 40145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 40155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setTabsToLinks(bool enable) 40175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 40185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_tabsToLinks = enable; 40195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 40205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::tabsToLinks() const 40225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 40235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_tabsToLinks; 40245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 40255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::suppressInvalidations(bool enable) 40275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4028926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_client) 4029926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_client->suppressCompositorScheduling(enable); 40305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 40315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setRootGraphicsLayer(GraphicsLayer* layer) 40335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4034926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) suppressInvalidations(true); 40355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 403610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (pinchVirtualViewportEnabled()) { 4037d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PinchViewport& pinchViewport = page()->frameHost().pinchViewport(); 4038d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) pinchViewport.attachToLayerTree(layer, graphicsLayerFactory()); 4039591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (layer) { 4040d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootGraphicsLayer = pinchViewport.rootGraphicsLayer(); 4041d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootLayer = pinchViewport.rootGraphicsLayer()->platformLayer(); 4042f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_rootTransformLayer = pinchViewport.rootGraphicsLayer(); 4043591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } else { 4044591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_rootGraphicsLayer = 0; 4045591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_rootLayer = 0; 4046d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootTransformLayer = 0; 4047591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 4048591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } else { 4049591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_rootGraphicsLayer = layer; 4050591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_rootLayer = layer ? layer->platformLayer() : 0; 4051d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootTransformLayer = 0; 4052591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 40535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4054c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) setIsAcceleratedCompositingActive(layer != 0); 40555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) updateRootLayerTransform(); 40571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 40585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_layerTreeView) { 40599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (m_rootLayer) { 40605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layerTreeView->setRootLayer(*m_rootLayer); 40619bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // We register viewport layers here since there may not be a layer 40629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // tree view prior to this point. 406310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (pinchVirtualViewportEnabled()) { 406407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch page()->frameHost().pinchViewport().registerLayersWithTreeView(m_layerTreeView); 40659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } else { 40669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) GraphicsLayer* rootScrollLayer = compositor()->scrollLayer(); 40679bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) ASSERT(rootScrollLayer); 40689bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) WebLayer* pageScaleLayer = rootScrollLayer->parent() ? rootScrollLayer->parent()->platformLayer() : 0; 40699bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_layerTreeView->registerViewportLayers(pageScaleLayer, rootScrollLayer->platformLayer(), 0); 40709bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 40719bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } else { 40725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layerTreeView->clearRootLayer(); 407310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (pinchVirtualViewportEnabled()) 407407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch page()->frameHost().pinchViewport().clearLayersForTreeView(m_layerTreeView); 40759bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) else 40769bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_layerTreeView->clearViewportLayers(); 40779bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 40785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 40795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4080926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) suppressInvalidations(false); 40815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 40825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::scheduleCompositingLayerSync() 40845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 408551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_layerTreeView->setNeedsAnimate(); 40865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 40875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::invalidateRect(const IntRect& rect) 40895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 40905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_isAcceleratedCompositingActive) { 40915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_layerTreeView); 40925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateLayerTreeViewport(); 40935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else if (m_client) 40945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->didInvalidateRect(rect); 40955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 40965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4097e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)GraphicsLayerFactory* WebViewImpl::graphicsLayerFactory() const 4098926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 4099926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_graphicsLayerFactory.get(); 4100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 4101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4102e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)RenderLayerCompositor* WebViewImpl::compositor() const 4103591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 4104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!page() || !page()->mainFrame()) 4105591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return 0; 4106197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 4107197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!page()->mainFrame()->isLocalFrame()) 4108197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return localFrameRootTemporary()->frame()->document()->renderView()->compositor(); 4109197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 4110197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!page()->deprecatedLocalMainFrame()->document() || !page()->deprecatedLocalMainFrame()->document()->renderView()) 4111197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return 0; 4112197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 41135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return page()->deprecatedLocalMainFrame()->document()->renderView()->compositor(); 4114591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 4115591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 4116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::registerForAnimations(WebLayer* layer) 4117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 4118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_layerTreeView) 4119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_layerTreeView->registerForAnimations(layer); 4120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 4121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4122e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)GraphicsLayer* WebViewImpl::rootGraphicsLayer() 41235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 41245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_rootGraphicsLayer; 41255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 41265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::scheduleAnimation() 41285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 41297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_layerTreeView) { 4130fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch m_layerTreeView->setNeedsAnimate(); 4131fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch return; 4132fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch } 4133fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch if (m_client) 4134fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch m_client->scheduleAnimation(); 41355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 41365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4137c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void WebViewImpl::initializeLayerTreeView() 4138c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 4139c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (m_client) { 4140c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_client->initializeLayerTreeView(); 4141c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_layerTreeView = m_client->layerTreeView(); 4142c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 4143c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 4144c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_page->settings().setAcceleratedCompositingEnabled(m_layerTreeView != 0); 4145c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 4146c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // FIXME: only unittests, click to play, Android priting, and printing (for headers and footers) 4147c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // make this assert necessary. We should make them not hit this code and then delete allowsBrokenNullLayerTreeView. 4148c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(m_layerTreeView || !m_client || m_client->allowsBrokenNullLayerTreeView()); 4149c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 4150c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 41515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setIsAcceleratedCompositingActive(bool active) 41525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4153e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // In the middle of shutting down; don't try to spin back up a compositor. 4154e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // FIXME: compositing startup/shutdown should be refactored so that it 4155e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // turns on explicitly rather than lazily, which causes this awkwardness. 4156e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (m_layerTreeViewClosed) 4157e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return; 4158e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 4159c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(!active || m_layerTreeView); 4160e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) Platform::current()->histogramEnumeration("GPU.setIsAcceleratedCompositingActive", active * 2 + m_isAcceleratedCompositingActive, 4); 41615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_isAcceleratedCompositingActive == active) 41635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 41645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4165d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!m_client) 4166d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return; 4167d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 41685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!active) { 41695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_isAcceleratedCompositingActive = false; 4170197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!m_layerTreeViewCommitsDeferred) { 41715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_layerTreeView); 4172197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // This means that we're transitioning to a new page. Suppress commits until WebKit generates invalidations so 41735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we don't attempt to paint too early in the next page load. 41745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layerTreeView->setDeferCommits(true); 41755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layerTreeViewCommitsDeferred = true; 41765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 41775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 4178197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch TRACE_EVENT0("blink", "WebViewImpl::setIsAcceleratedCompositingActive(true)"); 4179c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_layerTreeView->setRootLayer(*m_rootLayer); 41805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4181c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) bool visible = page()->visibilityState() == PageVisibilityStateVisible; 4182c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_layerTreeView->setVisible(visible); 4183c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) updateLayerTreeDeviceScaleFactor(); 4184c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_layerTreeView->setPageScaleFactorAndLimits(pageScaleFactor(), minimumPageScaleFactor(), maximumPageScaleFactor()); 4185c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) updateLayerTreeBackgroundColor(); 4186c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_layerTreeView->setHasTransparentBackground(isTransparent()); 4187f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#if USE(RUBBER_BANDING) 4188c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtr<Image> overhangImage = OverscrollTheme::theme()->getOverhangImage(); 4189c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (overhangImage && overhangImage->nativeImageForCurrentFrame()) 4190c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_layerTreeView->setOverhangBitmap(overhangImage->nativeImageForCurrentFrame()->bitmap()); 4191f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#endif 4192c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) updateLayerTreeViewport(); 4193c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_isAcceleratedCompositingActive = true; 4194c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (m_pageOverlays) 4195c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_pageOverlays->update(); 4196c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_layerTreeView->setShowFPSCounter(m_showFPSCounter); 4197c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_layerTreeView->setShowPaintRects(m_showPaintRects); 4198c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_layerTreeView->setShowDebugBorders(m_showDebugBorders); 4199c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_layerTreeView->setContinuousPaintingEnabled(m_continuousPaintingEnabled); 4200c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_layerTreeView->setShowScrollBottleneckRects(m_showScrollBottleneckRects); 4201c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_layerTreeView->heuristicsForGpuRasterizationUpdated(m_matchesHeuristicsForGpuRasterization); 42025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 42035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (page() && page()->mainFrame()->isLocalFrame()) 42045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) page()->deprecatedLocalMainFrame()->view()->setClipsRepaints(!m_isAcceleratedCompositingActive); 42055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 42065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebViewImpl::updateMainFrameScrollPosition(const IntPoint& scrollPosition, bool programmaticScroll) 4208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 42095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!page()->mainFrame()->isLocalFrame()) 42105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 42115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 42125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FrameView* frameView = page()->deprecatedLocalMainFrame()->view(); 4213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!frameView) 4214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 4215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (frameView->scrollPosition() == scrollPosition) 4217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 4218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool oldProgrammaticScroll = frameView->inProgrammaticScroll(); 4220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) frameView->setInProgrammaticScroll(programmaticScroll); 4221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) frameView->notifyScrollPositionChanged(scrollPosition); 4222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) frameView->setInProgrammaticScroll(oldProgrammaticScroll); 4223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 4224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 42257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebViewImpl::applyViewportDeltas( 42267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const WebSize& pinchViewportDelta, 42277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const WebSize& mainFrameDelta, 42287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci float pageScaleDelta, 42297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci float topControlsDelta) 42307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 42317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME(bokan): Will be replaced in 3-sided patch once Chromium side is landed. 42327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci applyViewportDeltas(pinchViewportDelta + mainFrameDelta, pageScaleDelta, topControlsDelta); 42337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 42347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 42357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebViewImpl::applyViewportDeltas(const WebSize& scrollDelta, float pageScaleDelta, float topControlsDelta) 42365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 42375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!mainFrameImpl() || !mainFrameImpl()->frameView()) 42385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 42395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 42407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setTopControlsContentOffset(m_topControlsContentOffset + topControlsDelta); 42417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 424210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (pinchVirtualViewportEnabled()) { 424310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (pageScaleDelta != 1) { 424410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // When the virtual viewport is enabled, offsets are already set for us. 424510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch setPageScaleFactor(pageScaleFactor() * pageScaleDelta); 424610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_doubleTapZoomPending = false; 424710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 424810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 424907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return; 425007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 425107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 425207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch // TODO(bokan): Old pinch path only - virtual viewport pinch scrolls are automatically updated via GraphicsLayer::DidScroll. 425307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch // this should be removed once old pinch is removed. 42545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pageScaleDelta == 1) { 4255197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch TRACE_EVENT_INSTANT2("blink", "WebViewImpl::applyScrollAndScale::scrollBy", "x", scrollDelta.width, "y", scrollDelta.height); 4256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebSize webScrollOffset = mainFrame()->scrollOffset(); 4257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) IntPoint scrollOffset(webScrollOffset.width + scrollDelta.width, webScrollOffset.height + scrollDelta.height); 4258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) updateMainFrameScrollPosition(scrollOffset, false); 42595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 42605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The page scale changed, so apply a scale and scroll in a single 42615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // operation. 42625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebSize scrollOffset = mainFrame()->scrollOffset(); 42635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollOffset.width += scrollDelta.width; 42645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollOffset.height += scrollDelta.height; 42655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 42665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebPoint scrollPoint(scrollOffset.width, scrollOffset.height); 42675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setPageScaleFactor(pageScaleFactor() * pageScaleDelta, scrollPoint); 4268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_doubleTapZoomPending = false; 42695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 42705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 42715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 42725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::updateLayerTreeViewport() 42735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 42745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!page() || !m_layerTreeView) 42755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 42765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 427793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_layerTreeView->setPageScaleFactorAndLimits(pageScaleFactor(), minimumPageScaleFactor(), maximumPageScaleFactor()); 42785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 42795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 428019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void WebViewImpl::updateLayerTreeBackgroundColor() 428119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){ 428219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (!m_layerTreeView) 428319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) return; 428419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 428509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_layerTreeView->setBackgroundColor(alphaChannel(m_backgroundColorOverride) ? m_backgroundColorOverride : backgroundColor()); 428619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 428719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 42881e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebViewImpl::updateLayerTreeDeviceScaleFactor() 42891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 42901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ASSERT(page()); 42911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ASSERT(m_layerTreeView); 42921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 42931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) float deviceScaleFactor = m_compositorDeviceScaleFactorOverride ? m_compositorDeviceScaleFactorOverride : page()->deviceScaleFactor(); 42941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_layerTreeView->setDeviceScaleFactor(deviceScaleFactor); 42951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 42961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 42971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebViewImpl::updateRootLayerTransform() 42981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 4299d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // If we don't have a root graphics layer, we won't bother trying to find 4300d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // or update the transform layer. 4301d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!m_rootGraphicsLayer) 4302d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 4303d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 4304f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // FIXME(bokan): m_rootTransformLayer is always set here in pinch virtual viewport. This can go away once 4305f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // that's default everywhere. 43065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!m_rootTransformLayer && m_page->mainFrame()->isLocalFrame()) 43075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_rootTransformLayer = m_page->deprecatedLocalMainFrame()->view()->renderView()->compositor()->ensureRootTransformLayer(); 4308d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 4309d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_rootTransformLayer) { 4310e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) TransformationMatrix transform; 431151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) transform.translate(m_rootLayerOffset.width, m_rootLayerOffset.height); 43121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) transform = transform.scale(m_rootLayerScale); 4313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_rootTransformLayer->setTransform(transform); 43141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } 43151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 43161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 43175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::detectContentOnTouch(const WebPoint& position) 43185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 43195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HitTestResult touchHit = hitTestResultForWindowPos(position); 43205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (touchHit.isContentEditable()) 43225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 43235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* node = touchHit.innerNode(); 43255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node || !node->isTextNode()) 43265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 43275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Ignore when tapping on links or nodes listening to click events, unless the click event is on the 43295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // body element, in which case it's unlikely that the original node itself was intended to be clickable. 4330c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) for (; node && !isHTMLBodyElement(*node); node = NodeRenderingTraversal::parent(node)) { 43315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node->isLink() || node->willRespondToTouchEvents() || node->willRespondToMouseClickEvents()) 43325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 43335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 43345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebContentDetectionResult content = m_client->detectContentAround(touchHit); 43365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!content.isValid()) 43375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 43385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->scheduleContentIntent(content.intent()); 43405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 43415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 43425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::setVisibilityState(WebPageVisibilityState visibilityState, 43445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isInitialState) { 43455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page()) 43465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 43475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 434851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ASSERT(visibilityState == WebPageVisibilityStateVisible || visibilityState == WebPageVisibilityStateHidden || visibilityState == WebPageVisibilityStatePrerender); 43495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_page->setVisibilityState(static_cast<PageVisibilityState>(static_cast<int>(visibilityState)), isInitialState); 43505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_layerTreeView) { 43525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool visible = visibilityState == WebPageVisibilityStateVisible; 43535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layerTreeView->setVisible(visible); 43545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 43555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 43565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::requestPointerLock() 43585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 43595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client && m_client->requestPointerLock(); 43605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 43615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::requestPointerUnlock() 43635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 43645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_client) 43655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->requestPointerUnlock(); 43665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 43675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebViewImpl::isPointerLocked() 43695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 43705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_client && m_client->isPointerLocked(); 43715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 43725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebViewImpl::pointerLockMouseEvent(const WebInputEvent& event) 43745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 43757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci OwnPtr<UserGestureIndicator> gestureIndicator; 43765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AtomicString eventType; 43775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (event.type) { 43785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseDown: 43791e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mousedown; 43807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessingNewUserGesture)); 43817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_pointerLockGestureToken = gestureIndicator->currentToken(); 43825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 43835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseUp: 43841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mouseup; 43857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci gestureIndicator = adoptPtr(new UserGestureIndicator(m_pointerLockGestureToken.release())); 43865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 43875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case WebInputEvent::MouseMove: 43881e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) eventType = EventTypeNames::mousemove; 43895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 43905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 43915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 43925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 43935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const WebMouseEvent& mouseEvent = static_cast<const WebMouseEvent&>(event); 43955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (page()) 4397e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) page()->pointerLockController().dispatchLockedMouseEvent( 43985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PlatformMouseEventBuilder(mainFrameImpl()->frameView(), mouseEvent), 43995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) eventType); 44005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 44015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4402926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebViewImpl::shouldDisableDesktopWorkarounds() 4403926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 4404bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (!settings()->viewportEnabled()) 44058abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return false; 44068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 44078abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // A document is considered adapted to small screen UAs if one of these holds: 44088abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // 1. The author specified viewport has a constrained width that is equal to 44098abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // the initial viewport width. 44108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // 2. The author has disabled viewport zoom. 44118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 44128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) const PageScaleConstraints& constraints = m_pageScaleConstraintsSet.pageDefinedConstraints(); 44138abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 4414bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (!mainFrameImpl() || !mainFrameImpl()->frameView()) 4415bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return false; 4416bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 4417bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return mainFrameImpl()->frameView()->layoutSize().width() == m_size.width 44188abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) || (constraints.minimumScale == constraints.maximumScale && constraints.minimumScale != -1); 4419926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 4420926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 442151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink 4422