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