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