15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "HTMLNames.h"
323c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "RuntimeEnabledFeatures.h"
3393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "SVGNames.h"
34df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "bindings/v8/ExceptionStatePlaceholder.h"
351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/Clipboard.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/dom/DocumentMarkerController.h"
38f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#include "core/dom/FullscreenElementStack.h"
39a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/dom/NodeRenderingTraversal.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/TouchList.h"
41e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/Editor.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/TextIterator.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/htmlediting.h"
46f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/events/DOMWindowEventQueue.h"
47bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/events/EventPath.h"
481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/KeyboardEvent.h"
491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/MouseEvent.h"
501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/TextEvent.h"
511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/ThreadLocalEventNames.h"
521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/TouchEvent.h"
531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/WheelEvent.h"
54e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ImageResource.h"
55c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "core/html/HTMLDialogElement.h"
5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFrameElementBase.h"
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFrameSetElement.h"
5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h"
5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h"
60bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/loader/FrameLoaderClient.h"
6119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "core/page/AutoscrollController.h"
62bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/page/BackForwardClient.h"
6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h"
64a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/page/ChromeClient.h"
6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/DragController.h"
6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/DragState.h"
6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EditorClient.h"
6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FocusController.h"
691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/Frame.h"
7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h"
711e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/FrameView.h"
7219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "core/inspector/InspectorController.h"
7353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/MouseEventWithHitTestResults.h"
7453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
75e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)#include "core/frame/Settings.h"
7653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/SpatialNavigation.h"
7753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/TouchAdjustment.h"
7853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/chromium/ChromiumDataObject.h"
7953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestRequest.h"
8053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestResult.h"
81a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/rendering/RenderFlowThread.h"
8253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayer.h"
83a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/rendering/RenderRegion.h"
8453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTextControlSingleLine.h"
8553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
8653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderWidget.h"
8753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/CursorList.h"
88a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/rendering/style/RenderStyle.h"
8993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/svg/SVGDocument.h"
9093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/svg/SVGElementInstance.h"
9193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/svg/SVGUseElement.h"
921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformGestureEvent.h"
931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformKeyboardEvent.h"
941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformTouchEvent.h"
951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformWheelEvent.h"
9651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/WindowsKeyboardCodes.h"
971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatPoint.h"
98a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/Image.h"
99a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollAnimator.h"
100a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/Scrollbar.h"
1010019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/Assertions.h"
1020019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/CurrentTime.h"
1030019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/StdLibExtras.h"
1040019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/TemporaryChange.h"
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
1091e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)using namespace SVGNames;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The link drag hysteresis is much larger than the others because there
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// needs to be enough space to cancel the link press without starting a link drag,
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// and because dragging links is rare.
1141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static const int LinkDragHysteresis = 40;
1151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static const int ImageDragHysteresis = 5;
1161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static const int TextDragHysteresis = 3;
1171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static const int GeneralDragHysteresis = 3;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// The amount of time to wait before sending a fake mouse event, triggered
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// during a scroll. The short interval is used if the content responds to the mouse events quickly enough,
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// otherwise the long interval is used.
1221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static const double fakeMouseMoveShortInterval = 0.1;
1231e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static const double fakeMouseMoveLongInterval = 0.250;
1241e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)// The amount of time to wait for a cursor update on style and layout changes
1261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)// Set to 50Hz, no need to be faster than common screen refresh rate
1271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static const double cursorUpdateInterval = 0.02;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static const int maximumCursorSize = 128;
13053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// It's pretty unlikely that a scale of less than one would ever be used. But all we really
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// need to ensure here is that the scale isn't so small that integer overflow can occur when
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// dividing cursor sizes (limited above) by the scale.
1341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static const double minimumCursorScale = 0.001;
13553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
136a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)// The minimum amount of time an element stays active after a ShowPress
137a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)// This is roughly 2 frames, which should be long enough to be noticeable.
138a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)static const double minimumActiveInterval = 0.032;
139a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
1411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static const double TextDragDelay = 0.15;
14253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#else
1431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static const double TextDragDelay = 0.0;
144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum NoCursorChangeType { NoCursorChange };
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class OptionalCursor {
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OptionalCursor(NoCursorChangeType) : m_isCursorChange(false) { }
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OptionalCursor(const Cursor& cursor) : m_isCursorChange(true), m_cursor(cursor) { }
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isCursorChange() const { return m_isCursorChange; }
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const Cursor& cursor() const { ASSERT(m_isCursorChange); return m_cursor; }
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_isCursorChange;
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Cursor m_cursor;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class MaximumDurationTracker {
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    explicit MaximumDurationTracker(double *maxDuration)
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        : m_maxDuration(maxDuration)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_start(monotonicallyIncreasingTime())
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ~MaximumDurationTracker()
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        *m_maxDuration = max(*m_maxDuration, monotonicallyIncreasingTime() - m_start);
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    double* m_maxDuration;
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double m_start;
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SyntheticTouchPoint : public PlatformTouchPoint {
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The default values are based on http://dvcs.w3.org/hg/webevents/raw-file/tip/touchevents.html
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    explicit SyntheticTouchPoint(const PlatformMouseEvent& event)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const static int idDefaultValue = 0;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const static int radiusYDefaultValue = 1;
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const static int radiusXDefaultValue = 1;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const static float rotationAngleDefaultValue = 0.0f;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const static float forceDefaultValue = 1.0f;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_id = idDefaultValue; // There is only one active TouchPoint.
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_screenPos = event.globalPosition();
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_pos = event.position();
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_radiusY = radiusYDefaultValue;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_radiusX = radiusXDefaultValue;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_rotationAngle = rotationAngleDefaultValue;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_force = forceDefaultValue;
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PlatformEvent::Type type = event.type();
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(type == PlatformEvent::MouseMoved || type == PlatformEvent::MousePressed || type == PlatformEvent::MouseReleased);
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (type) {
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PlatformEvent::MouseMoved:
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_state = TouchMoved;
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PlatformEvent::MousePressed:
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_state = TouchPressed;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PlatformEvent::MouseReleased:
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_state = TouchReleased;
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ASSERT_NOT_REACHED();
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SyntheticSingleTouchEvent : public PlatformTouchEvent {
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    explicit SyntheticSingleTouchEvent(const PlatformMouseEvent& event)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (event.type()) {
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PlatformEvent::MouseMoved:
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_type = TouchMove;
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PlatformEvent::MousePressed:
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_type = TouchStart;
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PlatformEvent::MouseReleased:
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_type = TouchEnd;
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ASSERT_NOT_REACHED();
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_type = NoType;
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_timestamp = event.timestamp();
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_modifiers = event.modifiers();
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_touchPoints.append(SyntheticTouchPoint(event));
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static inline ScrollGranularity wheelGranularityToScrollGranularity(unsigned deltaMode)
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    switch (deltaMode) {
247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case WheelEvent::DOM_DELTA_PAGE:
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ScrollByPage;
249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case WheelEvent::DOM_DELTA_LINE:
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ScrollByLine;
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case WheelEvent::DOM_DELTA_PIXEL:
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return ScrollByPixel;
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    default:
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ScrollByPixel;
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
258e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)static inline bool scrollNode(float delta, ScrollGranularity granularity, ScrollDirection direction, Node* node, Node** stopNode, IntPoint absolutePoint = IntPoint())
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!delta)
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node->renderer())
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
264a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
265a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    RenderBox* curBox = node->renderer()->enclosingBox();
266a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
267a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    while (curBox && !curBox->isRenderView()) {
268e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        ScrollDirection physicalDirection = toPhysicalDirection(
269e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)            direction, curBox->isHorizontalWritingMode(), curBox->style()->isFlippedBlocksWritingMode());
270a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
271a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (curBox->scroll(physicalDirection, granularity, delta)) {
272a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (stopNode)
273a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                *stopNode = curBox->node();
274a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return true;
275a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
276a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
277a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (stopNode && *stopNode && curBox->node() == *stopNode)
278a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return true;
279a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
280a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // FIXME: This should probably move to a virtual method on RenderBox, something like RenderBox::scrollAncestor, and specialized for RenderFlowThread
281a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        curBox = curBox->containingBlock();
282a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (curBox && curBox->isRenderNamedFlowThread()) {
283a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            RenderBox* flowedBox = curBox;
284a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
285a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (RenderBox* startBox = node->renderBox())
286a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                flowedBox = startBox;
287a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
288a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            curBox = toRenderFlowThread(curBox)->regionFromAbsolutePointAndBox(absolutePoint, flowedBox);
289a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
290a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
291a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
292a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return false;
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2950019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch// Refetch the event target node if it is removed or currently is the shadow node inside an <input> element.
2960019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch// If a mouse event handler changes the input element type to one that has a widget associated,
2970019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch// we'd like to EventHandler::handleMousePressEvent to pass the event to the widget and thus the
2980019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch// event target node can't still be the shadow node.
2990019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochstatic inline bool shouldRefetchEventTarget(const MouseEventWithHitTestResults& mev)
3000019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{
3010019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    Node* targetNode = mev.targetNode();
3021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!targetNode || !targetNode->parentNode())
3030019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch        return true;
3040019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    return targetNode->isShadowRoot() && toShadowRoot(targetNode)->host()->hasTagName(inputTag);
3050019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch}
3060019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)EventHandler::EventHandler(Frame* frame)
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_frame(frame)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_mousePressed(false)
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_capturesDragging(false)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_mouseDownMayStartSelect(false)
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_mouseDownMayStartDrag(false)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_mouseDownWasSingleClickInSelection(false)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_selectionInitiationState(HaveNotStartedSelection)
3151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_panScrollButtonPressed(false)
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_hoverTimer(this, &EventHandler::hoverTimerFired)
3171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_cursorUpdateTimer(this, &EventHandler::cursorUpdateTimerFired)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_mouseDownMayStartAutoscroll(false)
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_mouseDownWasInSubframe(false)
320926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_fakeMouseMoveEventTimer(this, &EventHandler::fakeMouseMoveEventTimerFired)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_svgPan(false)
322f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    , m_resizeScrollableArea(0)
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_eventHandlerWillResetCapturingMouseEventsNode(0)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_clickCount(0)
3251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_shouldOnlyFireDragOverEvent(false)
326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_mousePositionIsUnknown(true)
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_mouseDownTimestamp(0)
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_widgetIsLatched(false)
329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_originatingTouchPointTargetKey(0)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_touchPressed(false)
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_scrollGestureHandlingNode(0)
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_lastHitTestResultOverWidget(false)
333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_maxMouseMovedDuration(0)
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_baseEventType(PlatformEvent::NoType)
335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_didStartDrag(false)
33653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    , m_longTapShouldInvokeContextMenu(false)
33719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    , m_syntheticPageScaleFactor(0)
338a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired)
339a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_lastShowPressTimestamp(0)
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)EventHandler::~EventHandler()
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_fakeMouseMoveEventTimer.isActive());
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
34753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DragState& EventHandler::dragState()
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(DragState, state, ());
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return state;
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
35353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::clear()
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_hoverTimer.stop();
3571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_cursorUpdateTimer.stop();
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_fakeMouseMoveEventTimer.stop();
359a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_activeIntervalTimer.stop();
360f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_resizeScrollableArea = 0;
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nodeUnderMouse = 0;
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastNodeUnderMouse = 0;
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_instanceUnderMouse = 0;
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastInstanceUnderMouse = 0;
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastMouseMoveEventSubframe = 0;
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastScrollbarUnderMouse = 0;
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_clickCount = 0;
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_clickNode = 0;
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frameSetBeingResized = 0;
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_dragTarget = 0;
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_shouldOnlyFireDragOverEvent = false;
372926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_mousePositionIsUnknown = true;
373926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_lastKnownMousePosition = IntPoint();
374926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_lastKnownMouseGlobalPosition = IntPoint();
375926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_lastMouseDownUserGestureToken.clear();
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mousePressNode = 0;
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mousePressed = false;
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_capturesDragging = false;
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_capturingMouseEventsNode = 0;
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_latchedWheelEventNode = 0;
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_previousWheelScrolledNode = 0;
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_originatingTouchPointTargets.clear();
383926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_originatingTouchPointDocument.clear();
384926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_originatingTouchPointTargetKey = 0;
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_scrollGestureHandlingNode = 0;
386926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_lastHitTestResultOverWidget = false;
387926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_previousGestureScrolledNode = 0;
388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_scrollbarHandlingScrollGesture = 0;
389926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_maxMouseMovedDuration = 0;
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_baseEventType = PlatformEvent::NoType;
391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_didStartDrag = false;
3923c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    m_touchPressed = false;
393bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_mouseDownMayStartSelect = false;
394bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_mouseDownMayStartDrag = false;
395a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_lastShowPressTimestamp = 0;
396a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_lastDeferredTapElement = 0;
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void EventHandler::nodeWillBeRemoved(Node& nodeToBeRemoved)
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
40151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!nodeToBeRemoved.containsIncludingShadowDOM(m_clickNode.get()))
40251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return;
40351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (nodeToBeRemoved.isInShadowTree()) {
40451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_clickNode = nodeToBeRemoved.parentOrShadowHostNode();
40551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    } else {
40651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        // We don't dispatch click events if the mousedown node is removed
40751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        // before a mouseup event. It is compatible with IE and Firefox.
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_clickNode = 0;
40951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)static void setSelectionIfNeeded(FrameSelection& selection, const VisibleSelection& newSelection)
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (selection.selection() != newSelection)
4158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        selection.setSelection(newSelection);
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool dispatchSelectStart(Node* node)
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node || !node->renderer())
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4231e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return node->dispatchEvent(Event::createCancelableBubble(EventTypeNames::selectstart));
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static VisibleSelection expandSelectionToRespectUserSelectAll(Node* targetNode, const VisibleSelection& selection)
42753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
42853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Node* rootUserSelectAll = Position::rootUserSelectAllForNode(targetNode);
42953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!rootUserSelectAll)
43053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return selection;
43153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
43253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    VisibleSelection newSelection(selection);
43353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    newSelection.setBase(positionBeforeNode(rootUserSelectAll).upstream(CanCrossEditingBoundary));
43453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    newSelection.setExtent(positionAfterNode(rootUserSelectAll).downstream(CanCrossEditingBoundary));
43553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
43653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return newSelection;
43753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
43853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
43953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool EventHandler::updateSelectionForMouseDownDispatchingSelectStart(Node* targetNode, const VisibleSelection& selection, TextGranularity granularity)
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Position::nodeIsUserSelectNone(targetNode))
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!dispatchSelectStart(targetNode))
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (selection.isRange())
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_selectionInitiationState = ExtendedSelection;
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else {
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        granularity = CharacterGranularity;
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_selectionInitiationState = PlacedCaret;
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_frame->selection().setNonDirectionalSelectionIfNeeded(selection, granularity);
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::selectClosestWordFromHitTestResult(const HitTestResult& result, AppendTrailingWhitespace appendTrailingWhitespace)
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* innerNode = result.targetNode();
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisibleSelection newSelection;
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (innerNode && innerNode->renderer()) {
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        VisiblePosition pos(innerNode->renderer()->positionForPoint(result.localPoint()));
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (pos.isNotNull()) {
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            newSelection = VisibleSelection(pos);
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            newSelection.expandUsingGranularity(WordGranularity);
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (appendTrailingWhitespace == ShouldAppendTrailingWhitespace && newSelection.isRange())
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            newSelection.appendTrailingWhitespace();
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSelectionToRespectUserSelectAll(innerNode, newSelection), WordGranularity);
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void EventHandler::selectClosestMisspellingFromHitTestResult(const HitTestResult& result, AppendTrailingWhitespace appendTrailingWhitespace)
4795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
4805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    Node* innerNode = result.targetNode();
4815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    VisibleSelection newSelection;
4825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (innerNode && innerNode->renderer()) {
4845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        VisiblePosition pos(innerNode->renderer()->positionForPoint(result.localPoint()));
485591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        Position start = pos.deepEquivalent();
486591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        Position end = pos.deepEquivalent();
4875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (pos.isNotNull()) {
48806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            Vector<DocumentMarker*> markers = innerNode->document().markers()->markersInRange(makeRange(pos, pos).get(), DocumentMarker::MisspellingMarkers());
4895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            if (markers.size() == 1) {
490591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                start.moveToOffset(markers[0]->startOffset());
491591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                end.moveToOffset(markers[0]->endOffset());
492591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                newSelection = VisibleSelection(start, end);
4935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            }
4945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
4955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (appendTrailingWhitespace == ShouldAppendTrailingWhitespace && newSelection.isRange())
4975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            newSelection.appendTrailingWhitespace();
4985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSelectionToRespectUserSelectAll(innerNode, newSelection), WordGranularity);
5005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
5015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
5025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::selectClosestWordFromMouseEvent(const MouseEventWithHitTestResults& result)
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_mouseDownMayStartSelect) {
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        selectClosestWordFromHitTestResult(result.hitTestResult(),
507c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            (result.event().clickCount() == 2 && m_frame->editor().isSelectTrailingWhitespaceEnabled()) ? ShouldAppendTrailingWhitespace : DontAppendTrailingWhitespace);
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void EventHandler::selectClosestMisspellingFromMouseEvent(const MouseEventWithHitTestResults& result)
5125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
5135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (m_mouseDownMayStartSelect) {
5145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        selectClosestMisspellingFromHitTestResult(result.hitTestResult(),
515c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            (result.event().clickCount() == 2 && m_frame->editor().isSelectTrailingWhitespaceEnabled()) ? ShouldAppendTrailingWhitespace : DontAppendTrailingWhitespace);
5165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
5175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
5185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::selectClosestWordOrLinkFromMouseEvent(const MouseEventWithHitTestResults& result)
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!result.hitTestResult().isLiveLink())
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return selectClosestWordFromMouseEvent(result);
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* innerNode = result.targetNode();
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (innerNode && innerNode->renderer() && m_mouseDownMayStartSelect) {
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        VisibleSelection newSelection;
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Element* URLElement = result.hitTestResult().URLElement();
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        VisiblePosition pos(innerNode->renderer()->positionForPoint(result.localPoint()));
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (pos.isNotNull() && pos.deepEquivalent().deprecatedNode()->isDescendantOf(URLElement))
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            newSelection = VisibleSelection::selectionFromContentsOfNode(URLElement);
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSelectionToRespectUserSelectAll(innerNode, newSelection), WordGranularity);
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleMousePressEventDoubleClick(const MouseEventWithHitTestResults& event)
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event.event().button() != LeftButton)
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (m_frame->selection().isRange()) {
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // A double-click when range is already selected
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // should not change the selection.  So, do not call
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // selectClosestWordFromMouseEvent, but do set
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // m_beganSelectingText to prevent handleMouseReleaseEvent
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // from setting caret selection.
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_selectionInitiationState = ExtendedSelection;
5498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    } else {
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        selectClosestWordFromMouseEvent(event);
5518abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    }
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleMousePressEventTripleClick(const MouseEventWithHitTestResults& event)
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event.event().button() != LeftButton)
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
55902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* innerNode = event.targetNode();
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(innerNode && innerNode->renderer() && m_mouseDownMayStartSelect))
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisibleSelection newSelection;
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition pos(innerNode->renderer()->positionForPoint(event.localPoint()));
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pos.isNotNull()) {
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        newSelection = VisibleSelection(pos);
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        newSelection.expandUsingGranularity(ParagraphGranularity);
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSelectionToRespectUserSelectAll(innerNode, newSelection), ParagraphGranularity);
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static int textDistance(const Position& start, const Position& end)
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5768abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    RefPtr<Range> range = Range::create(*start.document(), start, end);
5778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return TextIterator::rangeLength(range.get(), true);
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleMousePressEventSingleClick(const MouseEventWithHitTestResults& event)
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->updateLayoutIgnorePendingStylesheets();
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* innerNode = event.targetNode();
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(innerNode && innerNode->renderer() && m_mouseDownMayStartSelect))
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Extend the selection if the Shift key is down, unless the click is in a link.
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool extendSelection = event.event().shiftKey() && !event.isOverLink();
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Don't restart the selection when the mouse is pressed on an
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // existing selection so we can allow for text dragging.
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* view = m_frame->view()) {
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutPoint vPoint = view->windowToContents(event.event().position());
5948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (!extendSelection && m_frame->selection().contains(vPoint)) {
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_mouseDownWasSingleClickInSelection = true;
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisiblePosition visiblePos(innerNode->renderer()->positionForPoint(event.localPoint()));
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (visiblePos.isNull())
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        visiblePos = VisiblePosition(firstPositionInOrBeforeNode(innerNode), DOWNSTREAM);
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Position pos = visiblePos.deepEquivalent();
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6058abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    VisibleSelection newSelection = m_frame->selection().selection();
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextGranularity granularity = CharacterGranularity;
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (extendSelection && newSelection.isCaretOrRange()) {
60953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        VisibleSelection selectionInUserSelectAll = expandSelectionToRespectUserSelectAll(innerNode, VisibleSelection(pos));
61053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (selectionInUserSelectAll.isRange()) {
61153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (comparePositions(selectionInUserSelectAll.start(), newSelection.start()) < 0)
61253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                pos = selectionInUserSelectAll.start();
61353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            else if (comparePositions(newSelection.end(), selectionInUserSelectAll.end()) < 0)
61453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                pos = selectionInUserSelectAll.end();
61553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
61653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
617c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        if (!m_frame->editor().behavior().shouldConsiderSelectionAsDirectional()) {
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // See <rdar://problem/3668157> REGRESSION (Mail): shift-click deselects when selection
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // was created right-to-left
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Position start = newSelection.start();
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Position end = newSelection.end();
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int distanceToStart = textDistance(start, pos);
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int distanceToEnd = textDistance(pos, end);
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (distanceToStart <= distanceToEnd)
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                newSelection = VisibleSelection(end, pos);
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                newSelection = VisibleSelection(start, pos);
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            newSelection.setExtent(pos);
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6318abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (m_frame->selection().granularity() != CharacterGranularity) {
6328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            granularity = m_frame->selection().granularity();
6338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            newSelection.expandUsingGranularity(m_frame->selection().granularity());
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
63653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        newSelection = expandSelectionToRespectUserSelectAll(innerNode, visiblePos);
63753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool handled = updateSelectionForMouseDownDispatchingSelectStart(innerNode, newSelection, granularity);
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return handled;
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool canMouseDownStartSelect(Node* node)
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node || !node->renderer())
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node->canStartSelection())
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleMousePressEvent(const MouseEventWithHitTestResults& event)
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Reset drag state.
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dragState().m_dragSrc = 0;
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cancelFakeMouseMoveEvent();
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->updateLayoutIgnorePendingStylesheets();
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ScrollView* scrollView = m_frame->view()) {
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (scrollView->isPointInScrollbarCorner(event.event().position()))
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool singleClick = event.event().clickCount() <= 1;
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we got the event back, that must mean it wasn't prevented,
670926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // so it's allowed to start a drag or selection if it wasn't in a scrollbar.
671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_mouseDownMayStartSelect = canMouseDownStartSelect(event.targetNode()) && !event.scrollbar();
67253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownMayStartDrag = singleClick;
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownWasSingleClickInSelection = false;
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDown = event.event();
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event.isOverWidget() && passWidgetMouseDownEventToWidget(event))
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->document()->isSVGDocument()
683926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        && toSVGDocument(m_frame->document())->zoomAndPanEnabled()) {
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event.event().shiftKey() && singleClick) {
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_svgPan = true;
686926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            toSVGDocument(m_frame->document())->startPan(m_frame->view()->windowToContents(event.event().position()));
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We don't do this at the start of mouse down handling,
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // because we don't want to do it until we know we didn't hit a widget.
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (singleClick)
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        focusDocumentView();
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* innerNode = event.targetNode();
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mousePressNode = innerNode;
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_dragStartPos = event.event().position();
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool swallowEvent = false;
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mousePressed = true;
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_selectionInitiationState = HaveNotStartedSelection;
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event.event().clickCount() == 2)
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        swallowEvent = handleMousePressEventDoubleClick(event);
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (event.event().clickCount() >= 3)
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        swallowEvent = handleMousePressEventTripleClick(event);
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        swallowEvent = handleMousePressEventSingleClick(event);
71102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownMayStartAutoscroll = m_mouseDownMayStartSelect
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || (m_mousePressNode && m_mousePressNode->renderBox() && m_mousePressNode->renderBox()->canBeProgramaticallyScrolled());
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return swallowEvent;
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleMouseDraggedEvent(const MouseEventWithHitTestResults& event)
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_mousePressed)
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
723926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (handleDrag(event, ShouldCheckDragHysteresis))
724926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
725926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* targetNode = event.targetNode();
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event.event().button() != LeftButton || !targetNode)
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* renderer = targetNode->renderer();
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer) {
732bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        Node* parent = EventPath::parent(targetNode);
733926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!parent)
734926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return false;
735926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
736926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderer = parent->renderer();
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!renderer || !renderer->isListBox())
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownMayStartDrag = false;
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
743926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_mouseDownMayStartAutoscroll && !panScrollInProgress()) {
74419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        if (AutoscrollController* controller = autoscrollController()) {
74519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            controller->startAutoscrollForSelection(renderer);
7465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            m_mouseDownMayStartAutoscroll = false;
7475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_selectionInitiationState != ExtendedSelection) {
75119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HitTestResult result(m_mouseDownPos);
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frame->document()->renderView()->hitTest(request, result);
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateSelectionForMouseDrag(result);
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateSelectionForMouseDrag(event.hitTestResult());
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::updateSelectionForMouseDrag()
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = m_frame->view();
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderView* renderer = m_frame->contentRenderer();
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer)
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
77019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::Move | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
771926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HitTestResult result(view->windowToContents(m_lastKnownMousePosition));
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    renderer->hitTest(request, result);
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateSelectionForMouseDrag(result);
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::updateSelectionForMouseDrag(const HitTestResult& hitTestResult)
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_mouseDownMayStartSelect)
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* target = hitTestResult.targetNode();
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!target)
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    VisiblePosition targetPosition = m_frame->selection().selection().visiblePositionRespectingEditingBoundary(hitTestResult.localPoint(), target);
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Don't modify the selection if we're not on a node.
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (targetPosition.isNull())
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Restart the selection if this is the first mouse move. This work is usually
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // done in handleMousePressEvent, but not if the mouse press was on an existing selection.
7928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    VisibleSelection newSelection = m_frame->selection().selection();
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Special case to limit selection to the containing block for SVG text.
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Isn't there a better non-SVG-specific way to do this?
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Node* selectionBaseNode = newSelection.base().deprecatedNode())
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (RenderObject* selectionBaseRenderer = selectionBaseNode->renderer())
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (selectionBaseRenderer->isSVGText())
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (target->renderer()->containingBlock() != selectionBaseRenderer->containingBlock())
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    return;
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_selectionInitiationState == HaveNotStartedSelection && !dispatchSelectStart(target))
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_selectionInitiationState != ExtendedSelection) {
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Always extend selection here because it's caused by a mouse drag
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_selectionInitiationState = ExtendedSelection;
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        newSelection = VisibleSelection(targetPosition);
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8113c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    if (RuntimeEnabledFeatures::userSelectAllEnabled()) {
8123c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        Node* rootUserSelectAllForMousePressNode = Position::rootUserSelectAllForNode(m_mousePressNode.get());
8133c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        if (rootUserSelectAllForMousePressNode && rootUserSelectAllForMousePressNode == Position::rootUserSelectAllForNode(target)) {
8143c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            newSelection.setBase(positionBeforeNode(rootUserSelectAllForMousePressNode).upstream(CanCrossEditingBoundary));
8153c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            newSelection.setExtent(positionAfterNode(rootUserSelectAllForMousePressNode).downstream(CanCrossEditingBoundary));
8163c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        } else {
8173c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            // Reset base for user select all when base is inside user-select-all area and extent < base.
8183c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            if (rootUserSelectAllForMousePressNode && comparePositions(target->renderer()->positionForPoint(hitTestResult.localPoint()), m_mousePressNode->renderer()->positionForPoint(m_dragStartPos)) < 0)
8193c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch                newSelection.setBase(positionAfterNode(rootUserSelectAllForMousePressNode).downstream(CanCrossEditingBoundary));
8203c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
8213c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            Node* rootUserSelectAllForTarget = Position::rootUserSelectAllForNode(target);
8223c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            if (rootUserSelectAllForTarget && m_mousePressNode->renderer() && comparePositions(target->renderer()->positionForPoint(hitTestResult.localPoint()), m_mousePressNode->renderer()->positionForPoint(m_dragStartPos)) < 0)
8233c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch                newSelection.setExtent(positionBeforeNode(rootUserSelectAllForTarget).upstream(CanCrossEditingBoundary));
8243c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            else if (rootUserSelectAllForTarget && m_mousePressNode->renderer())
8253c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch                newSelection.setExtent(positionAfterNode(rootUserSelectAllForTarget).downstream(CanCrossEditingBoundary));
8263c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            else
8273c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch                newSelection.setExtent(targetPosition);
8283c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        }
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
8303c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        newSelection.setExtent(targetPosition);
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (m_frame->selection().granularity() != CharacterGranularity)
8348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        newSelection.expandUsingGranularity(m_frame->selection().granularity());
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_frame->selection().setNonDirectionalSelectionIfNeeded(newSelection, m_frame->selection().granularity(),
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FrameSelection::AdjustEndpointsAtBidiBoundary);
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleMouseReleaseEvent(const MouseEventWithHitTestResults& event)
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
84219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    AutoscrollController* controller = autoscrollController();
84319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (controller && controller->autoscrollInProgress())
84419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        stopAutoscroll();
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Used to prevent mouseMoveEvent from initiating a drag before
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the mouse is pressed again.
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mousePressed = false;
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_capturesDragging = false;
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownMayStartDrag = false;
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownMayStartSelect = false;
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownMayStartAutoscroll = false;
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownWasInSubframe = false;
85402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool handled = false;
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Clear the selection if the mouse didn't move after the last mouse
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // press and it's not a context menu click.  We do this so when clicking
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // on the selection, the selection goes away.  However, if we are
8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // editing, place the caret.
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_mouseDownWasSingleClickInSelection && m_selectionInitiationState != ExtendedSelection
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            && m_dragStartPos == event.event().position()
8638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            && m_frame->selection().isRange()
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            && event.event().button() != RightButton) {
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        VisibleSelection newSelection;
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Node* node = event.targetNode();
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool caretBrowsing = m_frame->settings() && m_frame->settings()->caretBrowsingEnabled();
8681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (node && node->renderer() && (caretBrowsing || node->rendererIsEditable())) {
869f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            VisiblePosition pos = VisiblePosition(node->renderer()->positionForPoint(event.localPoint()));
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            newSelection = VisibleSelection(pos);
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setSelectionIfNeeded(m_frame->selection(), newSelection);
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        handled = true;
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8788abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_frame->selection().notifyRendererOfSelectionChange(UserTriggered);
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8808abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_frame->selection().selectFrameElementInParentIfFullySelected();
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
882e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (event.event().button() == MiddleButton && !event.isOverLink()) {
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Ignore handled, since we want to paste to where the caret was placed anyway.
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        handled = handlePasteGlobalSelection(event.event()) || handled;
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return handled;
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN)
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
892926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void EventHandler::startPanScrolling(RenderObject* renderer)
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
894926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderer->isBox())
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
89619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    AutoscrollController* controller = autoscrollController();
89719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (!controller)
8985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return;
89919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    controller->startPanScrolling(toRenderBox(renderer), lastKnownMousePosition());
900926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    invalidateClick();
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#endif // OS(WIN)
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
90519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)AutoscrollController* EventHandler::autoscrollController() const
90619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){
90719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (Page* page = m_frame->page())
90819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        return &page->autoscrollController();
90919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    return 0;
91019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)}
91119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
912926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool EventHandler::panScrollInProgress() const
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
91419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    return autoscrollController() && autoscrollController()->panScrollInProgress();
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
917926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)HitTestResult EventHandler::hitTestResultAtPoint(const LayoutPoint& point, HitTestRequest::HitTestRequestType hitType, const LayoutSize& padding)
918926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
919926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // We always send hitTestResultAtPoint to the main frame if we have one,
920926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // otherwise we might hit areas that are obscured by higher frames.
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Page* page = m_frame->page()) {
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Frame* mainFrame = page->mainFrame();
923926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (m_frame != mainFrame) {
924926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            FrameView* frameView = m_frame->view();
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            FrameView* mainView = mainFrame->view();
926926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (frameView && mainView) {
927926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                IntPoint mainFramePoint = mainView->rootViewToContents(frameView->contentsToRootView(roundedIntPoint(point)));
928f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)                return mainFrame->eventHandler().hitTestResultAtPoint(mainFramePoint, hitType, padding);
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
933926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HitTestResult result(point, padding.height(), padding.width(), padding.height(), padding.width());
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // RenderView::hitTest causes a layout, and we don't want to hit that until the first
93693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // layout because until then, there is nothing shown on the screen - the user can't
93793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // have intentionally clicked on something belonging to this page. Furthermore,
93893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // mousemove events before the first layout should not lead to a premature layout()
93993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // happening, which could show a flash of white.
94093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // See also the similar code in Document::prepareMouseEvent.
94193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (!m_frame->contentRenderer() || !m_frame->view() || !m_frame->view()->didFirstLayout())
942926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return result;
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
944926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // hitTestResultAtPoint is specifically used to hitTest into all frames, thus it always allows child frame content.
945926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HitTestRequest request(hitType | HitTestRequest::AllowChildFrameContent);
946926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_frame->contentRenderer()->hitTest(request, result);
947926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!request.readOnly())
948926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_frame->document()->updateHoverActiveState(request, result.innerElement());
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (request.disallowsShadowContent())
951e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        result.setToNodesInDocumentTreeScope();
952926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
953926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return result;
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void EventHandler::stopAutoscroll()
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
95819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (AutoscrollController* controller = autoscrollController())
95919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        controller->stopAutoscroll();
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* EventHandler::mousePressNode() const
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_mousePressNode.get();
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::scrollOverflow(ScrollDirection direction, ScrollGranularity granularity, Node* startingNode)
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* node = startingNode;
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node)
9727757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        node = m_frame->document()->focusedElement();
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node)
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node = m_mousePressNode.get();
97602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node) {
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* r = node->renderer();
979e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        if (r && !r->isListBox() && scrollNode(1.0f, granularity, direction, node, 0)) {
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setFrameWasScrolledByUser();
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::scrollRecursively(ScrollDirection direction, ScrollGranularity granularity, Node* startingNode)
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The layout needs to be up to date to determine if we can scroll. We may be
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // here because of an onLoad event, in which case the final layout hasn't been performed yet.
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->document()->updateLayoutIgnorePendingStylesheets();
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (scrollOverflow(direction, granularity, startingNode))
99402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return true;
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Frame* frame = m_frame;
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = frame->view();
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (view && view->scroll(direction, granularity))
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
999f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame = frame->tree().parent();
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame)
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1002f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return frame->eventHandler().scrollRecursively(direction, granularity, m_frame->ownerElement());
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)IntPoint EventHandler::lastKnownMousePosition() const
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1007926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_lastKnownMousePosition;
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static Frame* subframeForTargetNode(Node* node)
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node)
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* renderer = node->renderer();
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer || !renderer->isWidget())
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Widget* widget = toRenderWidget(renderer)->widget();
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!widget || !widget->isFrameView())
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10238abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return &toFrameView(widget)->frame();
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static Frame* subframeForHitTestResult(const MouseEventWithHitTestResults& hitTestResult)
10271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
10281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!hitTestResult.isOverWidget())
10291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return 0;
10301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return subframeForTargetNode(hitTestResult.targetNode());
10311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
10321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isSubmitImage(Node* node)
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return node && node->hasTagName(inputTag) && toHTMLInputElement(node)->isImageButton();
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Returns true if the node's editable block is not current focused for editing
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool nodeIsNotBeingEdited(Node* node, Frame* frame)
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return frame->selection().rootEditableElement() != node->rootEditableElement();
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::useHandCursor(Node* node, bool isOverLink, bool shiftKey)
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node)
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool editable = node->rendererIsEditable();
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool editableLinkEnabled = false;
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the link is editable, then we need to check the settings to see whether or not the link should be followed
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (editable) {
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(m_frame->settings());
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (m_frame->settings()->editableLinkBehavior()) {
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case EditableLinkDefaultBehavior:
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case EditableLinkAlwaysLive:
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            editableLinkEnabled = true;
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case EditableLinkNeverLive:
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            editableLinkEnabled = false;
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case EditableLinkLiveWhenNotFocused:
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            editableLinkEnabled = nodeIsNotBeingEdited(node, m_frame) || shiftKey;
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case EditableLinkOnlyLiveWithShiftKey:
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            editableLinkEnabled = shiftKey;
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ((isOverLink || isSubmitImage(node)) && (!editable || editableLinkEnabled));
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10791e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void EventHandler::cursorUpdateTimerFired(Timer<EventHandler>*)
10801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
10811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(m_frame);
10821e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(m_frame->document());
10831e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
10841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    updateCursor();
10851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
10861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
10871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void EventHandler::updateCursor()
10881e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
10891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (m_mousePositionIsUnknown)
10901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return;
10911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
10921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    FrameView* view = m_frame->view();
10931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!view || !view->shouldSetCursor())
10941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return;
10951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
10961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    RenderView* renderView = view->renderView();
10971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!renderView)
10981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return;
10991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
11001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool shiftKey;
11011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool ctrlKey;
11021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool altKey;
11031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool metaKey;
11041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    PlatformKeyboardEvent::getCurrentModifierState(shiftKey, ctrlKey, altKey, metaKey);
11051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
11061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_frame->document()->updateLayout();
11071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
11081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    HitTestRequest request(HitTestRequest::ReadOnly);
11091e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    HitTestResult result(view->windowToContents(m_lastKnownMousePosition));
11101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    renderView->hitTest(request, result);
11111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
11121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    OptionalCursor optionalCursor = selectCursor(result, shiftKey);
11131e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (optionalCursor.isCursorChange()) {
11141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_currentMouseCursor = optionalCursor.cursor();
11151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        view->setCursor(m_currentMouseCursor);
11161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    }
11171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
11181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
11191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)OptionalCursor EventHandler::selectCursor(const HitTestResult& result, bool shiftKey)
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1121f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode())
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return NoCursorChange;
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return NoCursorChange;
11278abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN)
112853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (panScrollInProgress())
11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return NoCursorChange;
1130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    Node* node = result.targetNode();
11331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!node)
1134bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return selectAutoCursor(result, node, iBeamCursor(), shiftKey);
11351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
11361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    RenderObject* renderer = node->renderer();
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderStyle* style = renderer ? renderer->style() : 0;
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer) {
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Cursor overrideCursor;
11411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        switch (renderer->getCursor(roundedIntPoint(result.localPoint()), overrideCursor)) {
11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case SetCursorBasedOnStyle:
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case SetCursor:
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return overrideCursor;
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case DoNotSetCursor:
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return NoCursorChange;
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (style && style->cursors()) {
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const CursorList* cursors = style->cursors();
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (unsigned i = 0; i < cursors->size(); ++i) {
1154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            StyleImage* styleImage = (*cursors)[i].image();
1155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (!styleImage)
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                continue;
11573c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            ImageResource* cachedImage = styleImage->cachedImage();
1158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (!cachedImage)
1159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                continue;
1160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            float scale = styleImage->imageScaleFactor();
1161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // Get hotspot and convert from logical pixels to physical pixels.
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            IntPoint hotSpot = (*cursors)[i].hotSpot();
1163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            hotSpot.scale(scale, scale);
1164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            IntSize size = cachedImage->imageForRenderer(renderer)->size();
1165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (cachedImage->errorOccurred())
1166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                continue;
1167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // Limit the size of cursors (in UI pixels) so that they cannot be
1168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // used to cover UI elements in chrome.
1169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            size.scale(1 / scale);
1170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (size.width() > maximumCursorSize || size.height() > maximumCursorSize)
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                continue;
1172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            Image* image = cachedImage->imageForRenderer(renderer);
1174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // Ensure no overflow possible in calculations above.
1175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (scale < minimumCursorScale)
1176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                continue;
1177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return Cursor(image, hotSpot, scale);
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (style ? style->cursor() : CURSOR_AUTO) {
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_AUTO: {
1183bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        bool horizontalText = !style || style->isHorizontalWritingMode();
1184bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        const Cursor& iBeam = horizontalText ? iBeamCursor() : verticalTextCursor();
1185bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return selectAutoCursor(result, node, iBeam, shiftKey);
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_CROSS:
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return crossCursor();
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_POINTER:
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return handCursor();
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_MOVE:
11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return moveCursor();
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_ALL_SCROLL:
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return moveCursor();
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_E_RESIZE:
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return eastResizeCursor();
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_W_RESIZE:
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return westResizeCursor();
11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_N_RESIZE:
12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return northResizeCursor();
12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_S_RESIZE:
12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return southResizeCursor();
12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_NE_RESIZE:
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return northEastResizeCursor();
12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_SW_RESIZE:
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return southWestResizeCursor();
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_NW_RESIZE:
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return northWestResizeCursor();
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_SE_RESIZE:
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return southEastResizeCursor();
12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_NS_RESIZE:
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return northSouthResizeCursor();
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_EW_RESIZE:
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return eastWestResizeCursor();
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_NESW_RESIZE:
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return northEastSouthWestResizeCursor();
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_NWSE_RESIZE:
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return northWestSouthEastResizeCursor();
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_COL_RESIZE:
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return columnResizeCursor();
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_ROW_RESIZE:
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return rowResizeCursor();
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_TEXT:
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return iBeamCursor();
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_WAIT:
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return waitCursor();
12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_HELP:
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return helpCursor();
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_VERTICAL_TEXT:
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return verticalTextCursor();
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_CELL:
12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return cellCursor();
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_CONTEXT_MENU:
12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return contextMenuCursor();
12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_PROGRESS:
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return progressCursor();
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_NO_DROP:
12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return noDropCursor();
12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_ALIAS:
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return aliasCursor();
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_COPY:
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return copyCursor();
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_NONE:
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return noneCursor();
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_NOT_ALLOWED:
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return notAllowedCursor();
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_DEFAULT:
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return pointerCursor();
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_WEBKIT_ZOOM_IN:
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return zoomInCursor();
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_WEBKIT_ZOOM_OUT:
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return zoomOutCursor();
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_WEBKIT_GRAB:
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return grabCursor();
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CURSOR_WEBKIT_GRABBING:
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return grabbingCursor();
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return pointerCursor();
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1261bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)OptionalCursor EventHandler::selectAutoCursor(const HitTestResult& result, Node* node, const Cursor& iBeam, bool shiftKey)
1262bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
1263bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    bool editable = (node && node->rendererIsEditable());
1264bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1265bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (useHandCursor(node, result.isOverLink(), shiftKey))
1266bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return handCursor();
1267bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1268bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    bool inResizer = false;
1269bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    RenderObject* renderer = node ? node->renderer() : 0;
1270bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (renderer) {
1271bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        if (RenderLayer* layer = renderer->enclosingLayer()) {
1272f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            if (m_frame->view())
1273f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)                inResizer = layer->scrollableArea() && layer->scrollableArea()->isPointInResizeControl(result.roundedPointInMainFrame(), ResizerForPointer);
1274bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        }
1275bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    }
1276bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1277bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    // During selection, use an I-beam no matter what we're over.
1278bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    // If a drag may be starting or we're capturing mouse events for a particular node, don't treat this as a selection.
1279bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (m_mousePressed && m_mouseDownMayStartSelect
1280bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        && !m_mouseDownMayStartDrag
1281bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        && m_frame->selection().isCaretOrRange()
1282bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        && !m_capturingMouseEventsNode) {
1283bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return iBeam;
1284bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    }
1285bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1286bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if ((editable || (renderer && renderer->isText() && node->canStartSelection())) && !inResizer && !result.scrollbar())
1287bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return iBeam;
1288bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return pointerCursor();
1289bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
1290bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static LayoutPoint documentPointForWindowPoint(Frame* frame, const IntPoint& windowPoint)
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = frame->view();
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Is it really OK to use the wrong coordinates here when view is 0?
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Historically the code would just crash; this is clearly no worse than that.
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return view ? view->windowToContents(windowPoint) : windowPoint;
12975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleMousePressEvent(const PlatformMouseEvent& mouseEvent)
13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> protector(m_frame->view());
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool defaultPrevented = dispatchSyntheticTouchEventIfEnabled(mouseEvent);
13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (defaultPrevented)
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture);
1308f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_frame->tree().top()->eventHandler().m_lastMouseDownUserGestureToken = gestureIndicator.currentToken();
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cancelFakeMouseMoveEvent();
131183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    if (m_eventHandlerWillResetCapturingMouseEventsNode)
131283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        m_capturingMouseEventsNode = 0;
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mousePressed = true;
13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_capturesDragging = true;
1315926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setLastKnownMousePosition(mouseEvent);
13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownTimestamp = mouseEvent.timestamp();
13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownMayStartDrag = false;
13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownMayStartSelect = false;
13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownMayStartAutoscroll = false;
13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* view = m_frame->view())
13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_mouseDownPos = view->windowToContents(mouseEvent.position());
13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else {
13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        invalidateClick();
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownWasInSubframe = false;
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1328e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    HitTestRequest::HitTestRequestType hitType = HitTestRequest::Active | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent;
1329e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (mouseEvent.fromTouch())
1330e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        hitType |= HitTestRequest::ReadOnly;
1331e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    HitTestRequest request(hitType);
1332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Save the document point we generate in case the window coordinate is invalidated by what happens
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // when we dispatch the event.
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutPoint documentPoint = documentPointForWindowPoint(m_frame, mouseEvent.position());
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(request, documentPoint, mouseEvent);
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!mev.targetNode()) {
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        invalidateClick();
13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mousePressNode = mev.targetNode();
13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<Frame> subframe = subframeForHitTestResult(mev);
1345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (subframe && passMousePressEventToSubframe(mev, subframe.get())) {
13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Start capturing future events for this frame.  We only do this if we didn't clear
13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // the m_mousePressed flag, which may happen if an AppKit widget entered a modal event loop.
1348f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        m_capturesDragging = subframe->eventHandler().capturesDragging();
13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_mousePressed && m_capturesDragging) {
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_capturingMouseEventsNode = mev.targetNode();
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_eventHandlerWillResetCapturingMouseEventsNode = true;
13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        invalidateClick();
13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN)
135819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    // We store whether pan scrolling is in progress before calling stopAutoscroll()
1359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // because it will set m_autoscrollType to NoAutoscroll on return.
136053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool isPanScrollInProgress = panScrollInProgress();
136119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    stopAutoscroll();
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isPanScrollInProgress) {
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We invalidate the click when exiting pan scrolling so that we don't inadvertently navigate
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // away from the current page (e.g. the click was on a hyperlink). See <rdar://problem/6095023>.
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        invalidateClick();
13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_clickCount = mouseEvent.clickCount();
137151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_clickNode = mev.targetNode()->isTextNode() ?  mev.targetNode()->parentOrShadowHostNode() : mev.targetNode();
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* view = m_frame->view()) {
137451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        RenderLayer* layer = mev.targetNode()->renderer() ? mev.targetNode()->renderer()->enclosingLayer() : 0;
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntPoint p = view->windowToContents(mouseEvent.position());
1376f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (layer && layer->scrollableArea() && layer->scrollableArea()->isPointInResizeControl(p, ResizerForPointer)) {
1377f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_resizeScrollableArea = layer->scrollableArea();
1378f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_resizeScrollableArea->setInResizeMode(true);
1379f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_offsetFromResizeCorner = m_resizeScrollableArea->offsetFromResizeCorner(p);
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            invalidateClick();
13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_frame->selection().setCaretBlinkingSuspended(true);
13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool swallowEvent = !dispatchMouseEvent(EventTypeNames::mousedown, mev.targetNode(), true, m_clickCount, mouseEvent, true);
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_capturesDragging = !swallowEvent || mev.scrollbar();
13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the hit testing originally determined the event was in a scrollbar, refetch the MouseEventWithHitTestResults
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // in case the scrollbar widget was destroyed when the mouse event was handled.
13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (mev.scrollbar()) {
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const bool wasLastScrollBar = mev.scrollbar() == m_lastScrollbarUnderMouse.get();
139419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        mev = m_frame->document()->prepareMouseEvent(request, documentPoint, mouseEvent);
13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (wasLastScrollBar && mev.scrollbar() != m_lastScrollbarUnderMouse.get())
13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_lastScrollbarUnderMouse = 0;
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (swallowEvent) {
14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // scrollbars should get events anyway, even disabled controls might be scrollable
14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Scrollbar* scrollbar = mev.scrollbar();
14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateLastScrollbarUnderMouse(scrollbar, true);
14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (scrollbar)
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            passMousePressEventToScrollbar(mev, scrollbar);
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
14090019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch        if (shouldRefetchEventTarget(mev)) {
141019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            mev = m_frame->document()->prepareMouseEvent(request, documentPoint, mouseEvent);
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FrameView* view = m_frame->view();
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Scrollbar* scrollbar = view ? view->scrollbarAtPoint(mouseEvent.position()) : 0;
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!scrollbar)
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            scrollbar = mev.scrollbar();
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateLastScrollbarUnderMouse(scrollbar, true);
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (scrollbar && passMousePressEventToScrollbar(mev, scrollbar))
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            swallowEvent = true;
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            swallowEvent = handleMousePressEvent(mev);
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return swallowEvent;
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static RenderLayer* layerForNode(Node* node)
14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node)
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* renderer = node->renderer();
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer)
14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* layer = renderer->enclosingLayer();
14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!layer)
14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return layer;
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1446e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)ScrollableArea* EventHandler::associatedScrollableArea(const RenderLayer* layer) const
1447e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
1448e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    ScrollableArea* layerScrollableArea = layer->scrollableArea();
1449e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (!layerScrollableArea)
1450e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return 0;
1451e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
1452e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (FrameView* frameView = m_frame->view()) {
1453e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        if (frameView->containsScrollableArea(layerScrollableArea))
1454e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            return layerScrollableArea;
1455e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
1456e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
1457e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return 0;
1458e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
1459e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
1460c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)bool EventHandler::handleMouseMoveEvent(const PlatformMouseEvent& event)
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> protector(m_frame->view());
1463926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    MaximumDurationTracker maxDurationTracker(&m_maxMouseMovedDuration);
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HitTestResult hoveredNode = HitTestResult(LayoutPoint());
1466c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    bool result = handleMouseMoveOrLeaveEvent(event, &hoveredNode);
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result;
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (RenderLayer* layer = layerForNode(hoveredNode.innerNode())) {
1473e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        if (ScrollableArea* layerScrollableArea = associatedScrollableArea(layer))
1474e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            layerScrollableArea->mouseMovedInContentArea();
14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* frameView = m_frame->view())
147802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        frameView->mouseMovedInContentArea();
14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1480e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    hoveredNode.setToShadowHostIfInUserAgentShadowRoot();
148193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    page->chrome().mouseDidMoveOverElement(hoveredNode, event.modifierFlags());
148293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    page->chrome().setToolTip(hoveredNode);
148353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1487c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)void EventHandler::handleMouseLeaveEvent(const PlatformMouseEvent& event)
1488c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
1489c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    RefPtr<FrameView> protector(m_frame->view());
1490c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    handleMouseMoveOrLeaveEvent(event);
1491c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
1492c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
149353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static Cursor& syntheticTouchCursor()
149453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
149553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    DEFINE_STATIC_LOCAL(Cursor, c, (Image::loadPlatformResource("syntheticTouchCursor").get(), IntPoint(10, 10)));
149653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return c;
149753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
149853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1499c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)bool EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMouseEvent& mouseEvent, HitTestResult* hoveredNode, bool onlyUpdateScrollbars)
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame);
1502e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    ASSERT(m_frame->view());
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1504926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool defaultPrevented = dispatchSyntheticTouchEventIfEnabled(mouseEvent);
150553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (defaultPrevented) {
150653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        m_frame->view()->setCursor(syntheticTouchCursor());
1507926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
150853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
1509926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1510926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setLastKnownMousePosition(mouseEvent);
15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_hoverTimer.isActive())
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_hoverTimer.stop();
15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_cursorUpdateTimer.stop();
15161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cancelFakeMouseMoveEvent();
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_svgPan) {
1520926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        toSVGDocument(m_frame->document())->updatePan(m_frame->view()->windowToContents(m_lastKnownMousePosition));
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frameSetBeingResized)
15251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return !dispatchMouseEvent(EventTypeNames::mousemove, m_frameSetBeingResized.get(), false, 0, mouseEvent, false);
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Send events right to a scrollbar if the mouse is pressed.
152853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_lastScrollbarUnderMouse && m_mousePressed) {
152953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        m_lastScrollbarUnderMouse->mouseMoved(mouseEvent);
153053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return true;
153153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
153319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent;
1534e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (mouseEvent.fromTouch())
1535e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        hitType |= HitTestRequest::ReadOnly;
1536e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_mousePressed)
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hitType |= HitTestRequest::Active;
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (onlyUpdateScrollbars) {
154002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        // Mouse events should be treated as "read-only" if we're updating only scrollbars. This
154102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        // means that :hover and :active freeze in the state they were in, rather than updating
154202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        // for nodes the mouse moves while the window is not key (which will be the case if
154302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        // onlyUpdateScrollbars is true).
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hitType |= HitTestRequest::ReadOnly;
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Treat any mouse move events as readonly if the user is currently touching the screen.
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_touchPressed)
15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hitType |= HitTestRequest::Active | HitTestRequest::ReadOnly;
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HitTestRequest request(hitType);
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent);
15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hoveredNode)
15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        *hoveredNode = mev.hitTestResult();
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Scrollbar* scrollbar = 0;
15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1557f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode())
1558f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        m_resizeScrollableArea->resize(mouseEvent, m_offsetFromResizeCorner);
15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else {
15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (FrameView* view = m_frame->view())
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            scrollbar = view->scrollbarAtPoint(mouseEvent.position());
15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!scrollbar)
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            scrollbar = mev.scrollbar();
15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateLastScrollbarUnderMouse(scrollbar, !m_mousePressed);
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (onlyUpdateScrollbars)
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool swallowEvent = false;
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<Frame> newSubframe = m_capturingMouseEventsNode.get() ? subframeForTargetNode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev);
157302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We want mouseouts to happen first, from the inside out.  First send a move event to the last subframe so that it will fire mouseouts.
1575f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (m_lastMouseMoveEventSubframe && m_lastMouseMoveEventSubframe->tree().isDescendantOf(m_frame) && m_lastMouseMoveEventSubframe != newSubframe)
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        passMouseMoveEventToSubframe(mev, m_lastMouseMoveEventSubframe.get());
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (newSubframe) {
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Update over/out state before passing the event to the subframe.
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateMouseEventTargetNode(mev.targetNode(), mouseEvent, true);
158102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Event dispatch in updateMouseEventTargetNode may have caused the subframe of the target
15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // node to be detached from its FrameView, in which case the event should not be passed.
15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (newSubframe->view())
15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            swallowEvent |= passMouseMoveEventToSubframe(mev, newSubframe.get(), hoveredNode);
15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (scrollbar && !m_mousePressed)
15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            scrollbar->mouseMoved(mouseEvent); // Handle hover effects on platforms that support visual feedback on scrollbar hovering.
15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (FrameView* view = m_frame->view()) {
15901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            OptionalCursor optionalCursor = selectCursor(mev.hitTestResult(), mouseEvent.shiftKey());
1591926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (optionalCursor.isCursorChange()) {
1592926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                m_currentMouseCursor = optionalCursor.cursor();
1593926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                view->setCursor(m_currentMouseCursor);
1594926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
159702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_lastMouseMoveEventSubframe = newSubframe;
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (swallowEvent)
16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
160202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
16031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    swallowEvent = !dispatchMouseEvent(EventTypeNames::mousemove, mev.targetNode(), false, 0, mouseEvent, true);
16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!swallowEvent)
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        swallowEvent = handleMouseDraggedEvent(mev);
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return swallowEvent;
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::invalidateClick()
16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_clickCount = 0;
16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_clickNode = 0;
16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16169243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)static Node* parentForClickEvent(const Node& node)
16179243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles){
16189243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)    // IE doesn't dispatch click events for mousedown/mouseup events across form
16199243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)    // controls.
16209243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)    if (node.isHTMLElement() && toHTMLElement(node).isInteractiveContent())
16219243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)        return 0;
16229243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)    return node.parentOrShadowHostNode();
16239243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)}
16249243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleMouseReleaseEvent(const PlatformMouseEvent& mouseEvent)
16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> protector(m_frame->view());
16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_frame->selection().setCaretBlinkingSuspended(false);
1630926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool defaultPrevented = dispatchSyntheticTouchEventIfEnabled(mouseEvent);
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (defaultPrevented)
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1635926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    OwnPtr<UserGestureIndicator> gestureIndicator;
1636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1637f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (m_frame->tree().top()->eventHandler().m_lastMouseDownUserGestureToken)
1638f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        gestureIndicator = adoptPtr(new UserGestureIndicator(m_frame->tree().top()->eventHandler().m_lastMouseDownUserGestureToken.release()));
1639926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
1640926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessingUserGesture));
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN)
16435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (Page* page = m_frame->page())
164419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        page->autoscrollController().handleMouseReleaseForPanScrolling(m_frame, mouseEvent);
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mousePressed = false;
1648926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setLastKnownMousePosition(mouseEvent);
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_svgPan) {
16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_svgPan = false;
1652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        toSVGDocument(m_frame->document())->updatePan(m_frame->view()->windowToContents(m_lastKnownMousePosition));
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frameSetBeingResized)
16571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return !dispatchMouseEvent(EventTypeNames::mouseup, m_frameSetBeingResized.get(), true, m_clickCount, mouseEvent, false);
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_lastScrollbarUnderMouse) {
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        invalidateClick();
1661926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_lastScrollbarUnderMouse->mouseUp(mouseEvent);
1662926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool cancelable = true;
1663926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool setUnder = false;
16641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return !dispatchMouseEvent(EventTypeNames::mouseup, m_lastNodeUnderMouse.get(), cancelable, m_clickCount, mouseEvent, setUnder);
16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1667a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    HitTestRequest::HitTestRequestType hitType = HitTestRequest::Release | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent;
1668e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (mouseEvent.fromTouch())
1669a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        hitType |= HitTestRequest::ReadOnly;
1670a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    HitTestRequest request(hitType);
16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent);
16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Frame* subframe = m_capturingMouseEventsNode.get() ? subframeForTargetNode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev);
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_eventHandlerWillResetCapturingMouseEventsNode)
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_capturingMouseEventsNode = 0;
16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (subframe && passMouseReleaseEventToSubframe(mev, subframe))
16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, mev.targetNode(), true, m_clickCount, mouseEvent, false);
16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1680926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool contextMenuEvent = mouseEvent.button() == RightButton;
16818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
1682926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // FIXME: The Mac port achieves the same behavior by checking whether the context menu is currently open in WebPage::mouseEvent(). Consider merging the implementations.
1683926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (mouseEvent.button() == LeftButton && mouseEvent.modifiers() & PlatformEvent::CtrlKey)
1684926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        contextMenuEvent = true;
1685926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
168751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool swallowClickEvent = false;
168851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_clickCount > 0 && !contextMenuEvent && mev.targetNode() && m_clickNode) {
16899243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)        if (Node* clickTargetNode = mev.targetNode()->commonAncestor(*m_clickNode, parentForClickEvent))
169051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            swallowClickEvent = !dispatchMouseEvent(EventTypeNames::click, clickTargetNode, true, m_clickCount, mouseEvent, true);
169151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1693f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (m_resizeScrollableArea) {
1694f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        m_resizeScrollableArea->setInResizeMode(false);
1695f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        m_resizeScrollableArea = 0;
16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool swallowMouseReleaseEvent = false;
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!swallowMouseUpEvent)
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        swallowMouseReleaseEvent = handleMouseReleaseEvent(mev);
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    invalidateClick();
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return swallowMouseUpEvent || swallowClickEvent || swallowMouseReleaseEvent;
17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handlePasteGlobalSelection(const PlatformMouseEvent& mouseEvent)
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the event was a middle click, attempt to copy global selection in after
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the newly set caret position.
17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This code is called from either the mouse up or mouse down handling. There
17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // is some debate about when the global selection is pasted:
17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   xterm: pastes on up.
17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   GTK: pastes on down.
17165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   Qt: pastes on up.
17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   Firefox: pastes on up.
17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   Chromium: pastes on up.
17195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
17205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // There is something of a webcompat angle to this well, as highlighted by
17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // crbug.com/14608. Pages can clear text boxes 'onclick' and, if we paste on
17225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // down then the text is pasted just before the onclick handler runs and
17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // clears the text box. So it's important this happens after the event
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // handlers have been fired.
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (mouseEvent.type() != PlatformEvent::MouseReleased)
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1728926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_frame->page())
1729926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
17303c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    Frame* focusFrame = m_frame->page()->focusController().focusedOrMainFrame();
17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Do not paste here if the focus was moved somewhere else.
173251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_frame == focusFrame && m_frame->editor().behavior().supportsGlobalSelection())
1733c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return m_frame->editor().command("PasteGlobalSelection").execute();
17345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::dispatchDragEvent(const AtomicString& eventType, Node* dragTarget, const PlatformMouseEvent& event, Clipboard* clipboard)
17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = m_frame->view();
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: We might want to dispatch a dragleave even if the view is gone.
17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    view->resetDeferredRepaintDelay();
17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<MouseEvent> me = MouseEvent::create(eventType,
1749bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        true, true, m_frame->document()->domWindow(),
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        0, event.globalPosition().x(), event.globalPosition().y(), event.position().x(), event.position().y(),
17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event.movementDelta().x(), event.movementDelta().y(),
17525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(),
17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        0, 0, clipboard);
17545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17551fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    dragTarget->dispatchEvent(me.get(), IGNORE_EXCEPTION);
17565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return me->defaultPrevented();
17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool targetIsFrame(Node* target, Frame*& frame)
17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!target)
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!target->hasTagName(frameTag) && !target->hasTagName(iframeTag))
17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1767e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    frame = toHTMLFrameElementBase(target)->contentFrame();
17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool findDropZone(Node* target, Clipboard* clipboard)
17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* element = target->isElementNode() ? toElement(target) : target->parentElement();
17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (; element; element = element->parentElement()) {
17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool matched = false;
1776a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        AtomicString dropZoneStr = element->fastGetAttribute(webkitdropzoneAttr);
17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (dropZoneStr.isEmpty())
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
178002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
17811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        dropZoneStr = dropZoneStr.lower();
178202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SpaceSplitString keywords(dropZoneStr, false);
17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (keywords.isNull())
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
178602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DragOperation dragOperation = DragOperationNone;
17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (unsigned int i = 0; i < keywords.size(); i++) {
17895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            DragOperation op = convertDropZoneOperationToDragOperation(keywords[i]);
17905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (op != DragOperationNone) {
17915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (dragOperation == DragOperationNone)
17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    dragOperation = op;
17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else
17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                matched = matched || clipboard->hasDropZoneType(keywords[i].string());
17955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (matched && dragOperation != DragOperationNone)
17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (matched) {
18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            clipboard->setDropEffect(convertDragOperationToDropZoneOperation(dragOperation));
18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
18055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
180602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::updateDragAndDrop(const PlatformMouseEvent& event, Clipboard* clipboard)
18085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool accept = false;
18105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame->view())
18125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
18135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
181419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
18155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MouseEventWithHitTestResults mev = prepareMouseEvent(request, event);
18165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Drag events should never go to text nodes (following IE, and proper mouseover/out dispatch)
18185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<Node> newTarget = mev.targetNode();
18195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (newTarget && newTarget->isTextNode())
1820bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        newTarget = EventPath::parent(newTarget.get());
1821926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
182219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (AutoscrollController* controller = autoscrollController())
182319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        controller->updateDragAndDrop(newTarget.get(), event.position(), event.timestamp());
18245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_dragTarget != newTarget) {
18265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: this ordering was explicitly chosen to match WinIE. However,
18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // it is sometimes incorrect when dragging within subframes, as seen with
18285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // LayoutTests/fast/events/drag-in-frames.html.
18295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        //
18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Moreover, this ordering conforms to section 7.9.4 of the HTML 5 spec. <http://dev.w3.org/html5/spec/Overview.html#drag-and-drop-processing-model>.
18315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Frame* targetFrame;
18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (targetIsFrame(newTarget.get(), targetFrame)) {
18335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (targetFrame)
1834f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)                accept = targetFrame->eventHandler().updateDragAndDrop(event, clipboard);
18355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (newTarget) {
18365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // As per section 7.9.4 of the HTML 5 spec., we must always fire a drag event before firing a dragenter, dragleave, or dragover event.
1837e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            if (dragState().m_dragSrc) {
18385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // for now we don't care if event handler cancels default behavior, since there is none
18391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)                dispatchDragSrcEvent(EventTypeNames::drag, event);
18405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
18411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            accept = dispatchDragEvent(EventTypeNames::dragenter, newTarget.get(), event, clipboard);
18425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!accept)
18435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                accept = findDropZone(newTarget.get(), clipboard);
18445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
18455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (targetIsFrame(m_dragTarget.get(), targetFrame)) {
18475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (targetFrame)
1848f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)                accept = targetFrame->eventHandler().updateDragAndDrop(event, clipboard);
18495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (m_dragTarget)
18501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            dispatchDragEvent(EventTypeNames::dragleave, m_dragTarget.get(), event, clipboard);
18515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (newTarget) {
18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // We do not explicitly call dispatchDragEvent here because it could ultimately result in the appearance that
18545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // two dragover events fired. So, we mark that we should only fire a dragover event on the next call to this function.
18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_shouldOnlyFireDragOverEvent = true;
18565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
18575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
18585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Frame* targetFrame;
18595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (targetIsFrame(newTarget.get(), targetFrame)) {
18605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (targetFrame)
1861f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)                accept = targetFrame->eventHandler().updateDragAndDrop(event, clipboard);
18625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (newTarget) {
18635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Note, when dealing with sub-frames, we may need to fire only a dragover event as a drag event may have been fired earlier.
1864e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            if (!m_shouldOnlyFireDragOverEvent && dragState().m_dragSrc) {
18655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // for now we don't care if event handler cancels default behavior, since there is none
18661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)                dispatchDragSrcEvent(EventTypeNames::drag, event);
18675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
18681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            accept = dispatchDragEvent(EventTypeNames::dragover, newTarget.get(), event, clipboard);
18695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!accept)
18705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                accept = findDropZone(newTarget.get(), clipboard);
18715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_shouldOnlyFireDragOverEvent = false;
18725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
18735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_dragTarget = newTarget;
18755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return accept;
18775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::cancelDragAndDrop(const PlatformMouseEvent& event, Clipboard* clipboard)
18805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Frame* targetFrame;
18825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (targetIsFrame(m_dragTarget.get(), targetFrame)) {
18835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (targetFrame)
1884f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            targetFrame->eventHandler().cancelDragAndDrop(event, clipboard);
18855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (m_dragTarget.get()) {
1886e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (dragState().m_dragSrc)
18871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            dispatchDragSrcEvent(EventTypeNames::drag, event);
18881e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        dispatchDragEvent(EventTypeNames::dragleave, m_dragTarget.get(), event, clipboard);
18895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearDragState();
18915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::performDragAndDrop(const PlatformMouseEvent& event, Clipboard* clipboard)
18945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Frame* targetFrame;
18965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool preventedDefault = false;
18975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (targetIsFrame(m_dragTarget.get(), targetFrame)) {
18985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (targetFrame)
1899f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            preventedDefault = targetFrame->eventHandler().performDragAndDrop(event, clipboard);
19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (m_dragTarget.get())
19011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        preventedDefault = dispatchDragEvent(EventTypeNames::drop, m_dragTarget.get(), event, clipboard);
19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearDragState();
19035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return preventedDefault;
19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::clearDragState()
19075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
190819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    stopAutoscroll();
19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_dragTarget = 0;
19105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_capturingMouseEventsNode = 0;
19115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_shouldOnlyFireDragOverEvent = false;
19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::setCapturingMouseEventsNode(PassRefPtr<Node> n)
19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_capturingMouseEventsNode = n;
19175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_eventHandlerWillResetCapturingMouseEventsNode = false;
19185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestRequest& request, const PlatformMouseEvent& mev)
19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame);
19235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->document());
192483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_frame->document()->prepareMouseEvent(request, documentPointForWindowPoint(m_frame, mev.position()), mev);
19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline SVGElementInstance* instanceAssociatedWithShadowTreeElement(Node* referenceNode)
19295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!referenceNode || !referenceNode->isSVGElement())
19315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
19325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1933926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ShadowRoot* shadowRoot = referenceNode->containingShadowRoot();
19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!shadowRoot)
19355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
19365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* shadowTreeParentElement = shadowRoot->host();
19385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!shadowTreeParentElement || !shadowTreeParentElement->hasTagName(useTag))
19395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
19405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19417757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    return toSVGUseElement(shadowTreeParentElement)->instanceForShadowTreeElement(referenceNode);
19425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMouseEvent& mouseEvent, bool fireMouseOverOut)
19455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* result = targetNode;
194702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
19485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we're capturing, we always go right to that node.
19495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_capturingMouseEventsNode)
19505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = m_capturingMouseEventsNode.get();
19515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else {
19525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the target node is a text node, dispatch on the parent node - rdar://4196646
1953926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (result && result->isTextNode())
1954bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            result = EventPath::parent(result);
19555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nodeUnderMouse = result;
19575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_instanceUnderMouse = instanceAssociatedWithShadowTreeElement(result);
19585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // <use> shadow tree elements may have been recloned, update node under mouse in any case
19605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_lastInstanceUnderMouse) {
19615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SVGElement* lastCorrespondingElement = m_lastInstanceUnderMouse->correspondingElement();
19625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SVGElement* lastCorrespondingUseElement = m_lastInstanceUnderMouse->correspondingUseElement();
19635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (lastCorrespondingElement && lastCorrespondingUseElement) {
19655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            HashSet<SVGElementInstance*> instances = lastCorrespondingElement->instancesForElement();
19665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Locate the recloned shadow tree element for our corresponding instance
19685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            HashSet<SVGElementInstance*>::iterator end = instances.end();
19695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (HashSet<SVGElementInstance*>::iterator it = instances.begin(); it != end; ++it) {
19705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                SVGElementInstance* instance = (*it);
19715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ASSERT(instance->correspondingElement() == lastCorrespondingElement);
19725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (instance == m_lastInstanceUnderMouse)
19745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    continue;
19755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (instance->correspondingUseElement() != lastCorrespondingUseElement)
19775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    continue;
19785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                SVGElement* shadowTreeElement = instance->shadowTreeElement();
19805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (!shadowTreeElement->inDocument() || m_lastNodeUnderMouse == shadowTreeElement)
19815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    continue;
19825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_lastNodeUnderMouse = shadowTreeElement;
19845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_lastInstanceUnderMouse = instance;
19855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
19865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
19875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
19885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Fire mouseout/mouseover if the mouse has shifted to a different node.
19915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (fireMouseOverOut) {
19925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderLayer* layerForLastNode = layerForNode(m_lastNodeUnderMouse.get());
19935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderLayer* layerForNodeUnderMouse = layerForNode(m_nodeUnderMouse.get());
19945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Page* page = m_frame->page();
19955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (m_lastNodeUnderMouse && (!m_nodeUnderMouse || m_nodeUnderMouse->document() != m_frame->document())) {
19975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // The mouse has moved between frames.
19988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            if (Frame* frame = m_lastNodeUnderMouse->document().frame()) {
19995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (FrameView* frameView = frame->view())
20005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    frameView->mouseExitedContentArea();
20015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
20025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (page && (layerForLastNode && (!layerForNodeUnderMouse || layerForNodeUnderMouse != layerForLastNode))) {
20035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // The mouse has moved between layers.
2004e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            if (ScrollableArea* scrollableAreaForLastNode = associatedScrollableArea(layerForLastNode))
2005e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                scrollableAreaForLastNode->mouseExitedContentArea();
20065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
20075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (m_nodeUnderMouse && (!m_lastNodeUnderMouse || m_lastNodeUnderMouse->document() != m_frame->document())) {
20095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // The mouse has moved between frames.
20108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            if (Frame* frame = m_nodeUnderMouse->document().frame()) {
20115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (FrameView* frameView = frame->view())
20125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    frameView->mouseEnteredContentArea();
20135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
20145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (page && (layerForNodeUnderMouse && (!layerForLastNode || layerForNodeUnderMouse != layerForLastNode))) {
20155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // The mouse has moved between layers.
2016e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            if (ScrollableArea* scrollableAreaForNodeUnderMouse = associatedScrollableArea(layerForNodeUnderMouse))
2017e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                scrollableAreaForNodeUnderMouse->mouseEnteredContentArea();
20185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
20195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (m_lastNodeUnderMouse && m_lastNodeUnderMouse->document() != m_frame->document()) {
20215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_lastNodeUnderMouse = 0;
20225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_lastScrollbarUnderMouse = 0;
20235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_lastInstanceUnderMouse = 0;
20245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
20255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_lastNodeUnderMouse != m_nodeUnderMouse) {
20275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // send mouseout event to the old node
20285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (m_lastNodeUnderMouse)
20291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)                m_lastNodeUnderMouse->dispatchMouseEvent(mouseEvent, EventTypeNames::mouseout, 0, m_nodeUnderMouse.get());
20305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // send mouseover event to the new node
20315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (m_nodeUnderMouse)
20321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)                m_nodeUnderMouse->dispatchMouseEvent(mouseEvent, EventTypeNames::mouseover, 0, m_lastNodeUnderMouse.get());
20335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
20345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_lastNodeUnderMouse = m_nodeUnderMouse;
20355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_lastInstanceUnderMouse = instanceAssociatedWithShadowTreeElement(m_nodeUnderMouse.get());
20365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::dispatchMouseEvent(const AtomicString& eventType, Node* targetNode, bool /*cancelable*/, int clickCount, const PlatformMouseEvent& mouseEvent, bool setUnder)
20405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* view = m_frame->view())
20425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        view->resetDeferredRepaintDelay();
20435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateMouseEventTargetNode(targetNode, mouseEvent, setUnder);
20455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool swallowEvent = false;
20475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_nodeUnderMouse)
2049926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        swallowEvent = !(m_nodeUnderMouse->dispatchMouseEvent(mouseEvent, eventType, clickCount));
20505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (swallowEvent || eventType != EventTypeNames::mousedown)
2052f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return !swallowEvent;
20535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2054f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // If clicking on a frame scrollbar, do not mess up with content focus.
2055f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (FrameView* view = m_frame->view()) {
2056f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (view->scrollbarAtPoint(mouseEvent.position()))
2057f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            return true;
2058f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
20595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2060f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // The layout needs to be up to date to determine if an element is focusable.
2061f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    m_frame->document()->updateLayoutIgnorePendingStylesheets();
206202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2063f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    Element* element = 0;
2064f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (m_nodeUnderMouse)
2065f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        element = m_nodeUnderMouse->isElementNode() ? toElement(m_nodeUnderMouse) : m_nodeUnderMouse->parentOrShadowHostElement();
2066f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    for (; element; element = element->parentOrShadowHostElement()) {
20671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (element->isFocusable() && element->focused())
20681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            return !swallowEvent;
20691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (element->isMouseFocusable())
2070f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            break;
2071f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
20721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(!element || element->isMouseFocusable());
2073f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
2074f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // To fix <rdar://problem/4895428> Can't drag selected ToDo, we don't focus
2075f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // a node on mouse down if it's selected and inside a focused node. It will
2076f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // be focused if the user does a mouseup over it, however, because the
2077f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // mouseup will set a selection inside it, which will call
2078f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // FrameSelection::setFocusedNodeIfNeeded.
2079f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (element
20808abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        && m_frame->selection().isRange()
20818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        && m_frame->selection().toNormalizedRange()->compareNode(element, IGNORE_EXCEPTION) == Range::NODE_INSIDE
2082f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        && element->isDescendantOf(m_frame->document()->focusedElement()))
2083f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return true;
20845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2085f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // Only change the focus when clicking scrollbars if it can transfered to a
2086f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // mouse focusable node.
20871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!element && isInsideScrollbar(mouseEvent.position()))
2088f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return false;
2089f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
2090f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (Page* page = m_frame->page()) {
2091f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        // If focus shift is blocked, we eat the event. Note we should never
2092f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        // clear swallowEvent if the page already set it (e.g., by canceling
2093f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        // default behavior).
20941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (element) {
20953c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            if (!page->focusController().setFocusedElement(element, m_frame, FocusDirectionMouse))
2096f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)                swallowEvent = true;
20971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        } else {
2098f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            // We call setFocusedElement even with !element in order to blur
2099f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            // current focus element when a link is clicked; this is expected by
2100f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            // some sites that rely on onChange handlers running from form
2101f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            // fields before the button click is processed.
21023c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            if (!page->focusController().setFocusedElement(0, m_frame))
2103f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)                swallowEvent = true;
21045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
21055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return !swallowEvent;
2108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool EventHandler::isInsideScrollbar(const IntPoint& windowPoint) const
2111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (RenderView* renderView = m_frame->contentRenderer()) {
211319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
2114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HitTestResult result(windowPoint);
2115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderView->hitTest(request, result);
2116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return result.scrollbar();
2117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
21205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
212253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool EventHandler::shouldTurnVerticalTicksIntoHorizontal(const HitTestResult& result, const PlatformWheelEvent& event) const
21235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(ANDROID) || OS(MACOSX) || OS(WIN)
21258abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return false;
21268abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#else
212753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // GTK+ must scroll horizontally if the mouse pointer is on top of the
212853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // horizontal scrollbar while scrolling with the wheel.
212953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // This code comes from gtk/EventHandlerGtk.cpp.
213053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return !event.hasPreciseScrollingDeltas() && result.scrollbar() && result.scrollbar()->orientation() == HorizontalScrollbar;
21315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
213253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
21335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleWheelEvent(const PlatformWheelEvent& e)
21355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2136521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#define RETURN_WHEEL_EVENT_HANDLED() \
2137521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    { \
2138521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        setFrameWasScrolledByUser(); \
2139521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return true; \
2140521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
2141521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
21425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* doc = m_frame->document();
21435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2144521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (!doc->renderer())
21455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
214602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
21475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<FrameView> protector(m_frame->view());
21485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = m_frame->view();
21505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
21515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2152521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
215319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (handleWheelEventAsEmulatedGesture(e))
215419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        return true;
215519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
21565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutPoint vPoint = view->windowToContents(e.position());
21575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
21595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HitTestResult result(vPoint);
21605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    doc->renderView()->hitTest(request, result);
21615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Node* node = result.innerNode();
2163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Wheel events should not dispatch to text nodes.
2164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (node && node->isTextNode())
2165bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        node = EventPath::parent(node);
2166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isOverWidget;
2168521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (e.useLatchedEventNode()) {
21695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_latchedWheelEventNode) {
2170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            m_latchedWheelEventNode = node;
21715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_widgetIsLatched = result.isOverWidget();
2172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        } else
2173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            node = m_latchedWheelEventNode.get();
21745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        isOverWidget = m_widgetIsLatched;
21765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
21775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_latchedWheelEventNode)
21785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_latchedWheelEventNode = 0;
21795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_previousWheelScrolledNode)
21805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_previousWheelScrolledNode = 0;
21815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        isOverWidget = result.isOverWidget();
21835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: It should not be necessary to do this mutation here.
21865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Instead, the handlers should know convert vertical scrolls
21875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // appropriately.
21885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformWheelEvent event = e;
21895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_baseEventType == PlatformEvent::NoType && shouldTurnVerticalTicksIntoHorizontal(result, e))
21905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event = event.copyTurningVerticalTicksIntoHorizontalTicks();
21915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node) {
21935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Figure out which view to send the event to.
21945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* target = node->renderer();
219502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
21965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isOverWidget && target && target->isWidget()) {
21975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Widget* widget = toRenderWidget(target)->widget();
21985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (widget && passWheelEventToWidget(e, widget))
2199521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                RETURN_WHEEL_EVENT_HANDLED();
22005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
22015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node && !node->dispatchWheelEvent(event))
2203521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            RETURN_WHEEL_EVENT_HANDLED();
22045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We do another check on the frame view because the event handler can run JS which results in the frame getting destroyed.
22085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    view = m_frame->view();
2209521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (!view || !view->wheelEvent(event))
22105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2211521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
2212521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    RETURN_WHEEL_EVENT_HANDLED();
2213521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
2214521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#undef RETURN_WHEEL_EVENT_HANDLED
22155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::defaultWheelEventHandler(Node* startNode, WheelEvent* wheelEvent)
22185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!startNode || !wheelEvent)
22205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
222102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
22225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* stopNode = m_previousWheelScrolledNode.get();
2223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ScrollGranularity granularity = wheelGranularityToScrollGranularity(wheelEvent->deltaMode());
222402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
222502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    // Break up into two scrolls if we need to.  Diagonal movement on
22265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // a MacBook pro is an example of a 2-dimensional mouse wheel event (where both deltaX and deltaY can be set).
2227e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (scrollNode(wheelEvent->deltaX(), granularity, ScrollRight, startNode, &stopNode, roundedIntPoint(wheelEvent->absoluteLocation())))
22285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        wheelEvent->setDefaultHandled();
222902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2230e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (scrollNode(wheelEvent->deltaY(), granularity, ScrollDown, startNode, &stopNode, roundedIntPoint(wheelEvent->absoluteLocation())))
22315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        wheelEvent->setDefaultHandled();
223202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
22335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_latchedWheelEventNode)
22345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_previousWheelScrolledNode = stopNode;
22355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool EventHandler::handleGestureShowPress()
22385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2239a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_lastShowPressTimestamp = WTF::currentTime();
2240a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
22415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = m_frame->view();
22425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
22435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
22445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ScrollAnimator* scrollAnimator = view->existingScrollAnimator())
22455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        scrollAnimator->cancelAnimations();
22465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const FrameView::ScrollableAreaSet* areas = view->scrollableAreas();
22475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!areas)
22485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
22495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (FrameView::ScrollableAreaSet::const_iterator it = areas->begin(); it != areas->end(); ++it) {
22505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollableArea* sa = *it;
22515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ScrollAnimator* animator = sa->scrollAnimator();
22525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (animator)
22535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            animator->cancelAnimations();
22545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
22565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleGestureEvent(const PlatformGestureEvent& gestureEvent)
22595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
226051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    IntPoint adjustedPoint = gestureEvent.position();
2261a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    RefPtr<Frame> subframe = 0;
2262a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    switch (gestureEvent.type()) {
2263a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GestureScrollBegin:
2264a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GestureScrollUpdate:
2265a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GestureScrollUpdateWithoutPropagation:
2266a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GestureScrollEnd:
2267e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    case PlatformEvent::GestureFlingStart:
2268a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // Handle directly in main frame
2269a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        break;
2270a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
2271a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GestureTap:
2272a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GestureTapUnconfirmed:
2273a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GestureTapDown:
2274a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GestureShowPress:
2275a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GestureTapDownCancel:
2276a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GestureTwoFingerTap:
2277a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GestureLongPress:
2278a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GestureLongTap:
2279a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GesturePinchBegin:
2280a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GesturePinchEnd:
2281a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    case PlatformEvent::GesturePinchUpdate:
228251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        adjustGesturePosition(gestureEvent, adjustedPoint);
2283a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        subframe = getSubFrameForGestureEvent(adjustedPoint, gestureEvent);
228451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (subframe)
228551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            return subframe->eventHandler().handleGestureEvent(gestureEvent);
2286a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        break;
2287a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
2288a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    default:
2289a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        ASSERT_NOT_REACHED();
229051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
229151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
22925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* eventTarget = 0;
2293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Scrollbar* scrollbar = 0;
2294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (gestureEvent.type() == PlatformEvent::GestureScrollEnd
2295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        || gestureEvent.type() == PlatformEvent::GestureScrollUpdate
2296e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        || gestureEvent.type() == PlatformEvent::GestureScrollUpdateWithoutPropagation
2297e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        || gestureEvent.type() == PlatformEvent::GestureFlingStart) {
2298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        scrollbar = m_scrollbarHandlingScrollGesture.get();
22995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        eventTarget = m_scrollGestureHandlingNode.get();
2300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
23015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
230253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEvent;
2303e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    double activeInterval = 0;
2304e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    bool shouldKeepActiveForMinInterval = false;
23051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (gestureEvent.type() == PlatformEvent::GestureShowPress
23061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        || gestureEvent.type() == PlatformEvent::GestureTapUnconfirmed) {
23075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hitType |= HitTestRequest::Active;
2308a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    } else if (gestureEvent.type() == PlatformEvent::GestureTapDownCancel) {
23095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hitType |= HitTestRequest::Release;
2310a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // A TapDownCancel received when no element is active shouldn't really be changing hover state.
2311a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (!m_frame->document()->activeElement())
2312a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            hitType |= HitTestRequest::ReadOnly;
2313a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    } else if (gestureEvent.type() == PlatformEvent::GestureTap) {
2314e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        hitType |= HitTestRequest::Release;
2315e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        // If the Tap is received very shortly after ShowPress, we want to delay clearing
2316e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        // of the active state so that it's visible to the user for at least one frame.
2317e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        activeInterval = WTF::currentTime() - m_lastShowPressTimestamp;
2318e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        shouldKeepActiveForMinInterval = m_lastShowPressTimestamp && activeInterval < minimumActiveInterval;
2319e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        if (shouldKeepActiveForMinInterval)
2320e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)            hitType |= HitTestRequest::ReadOnly;
2321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
23225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
23235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hitType |= HitTestRequest::Active | HitTestRequest::ReadOnly;
23245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if ((!scrollbar && !eventTarget) || !(hitType & HitTestRequest::ReadOnly)) {
23265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntPoint hitTestPoint = m_frame->view()->windowToContents(adjustedPoint);
2327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HitTestResult result = hitTestResultAtPoint(hitTestPoint, hitType | HitTestRequest::AllowFrameScrollbars);
2328e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
2329e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        if (shouldKeepActiveForMinInterval) {
2330e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)            m_lastDeferredTapElement = result.innerElement();
2331e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)            m_activeIntervalTimer.startOneShot(minimumActiveInterval - activeInterval);
2332e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        }
2333e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
23345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        eventTarget = result.targetNode();
2335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!scrollbar) {
2336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            FrameView* view = m_frame->view();
2337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            scrollbar = view ? view->scrollbarAtPoint(gestureEvent.position()) : 0;
2338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
2339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!scrollbar)
2340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            scrollbar = result.scrollbar();
2341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (scrollbar) {
2344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool eventSwallowed = scrollbar->gestureEvent(gestureEvent);
2345e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        if (gestureEvent.type() == PlatformEvent::GestureTapDown && eventSwallowed) {
2346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            m_scrollbarHandlingScrollGesture = scrollbar;
2347e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        } else if (gestureEvent.type() == PlatformEvent::GestureScrollEnd
2348e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)            || gestureEvent.type() == PlatformEvent::GestureFlingStart
2349e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)            || !eventSwallowed) {
2350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            m_scrollbarHandlingScrollGesture = 0;
2351e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        }
2352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (eventSwallowed)
2354926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return true;
23555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
23565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventTarget) {
235881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        bool eventSwallowed = false;
235981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        if (handleScrollGestureOnResizer(eventTarget, gestureEvent))
236081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)            eventSwallowed = true;
236181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        else
236281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)            eventSwallowed = eventTarget->dispatchGestureEvent(gestureEvent);
2363926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (gestureEvent.type() == PlatformEvent::GestureScrollBegin || gestureEvent.type() == PlatformEvent::GestureScrollEnd) {
23645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (eventSwallowed)
23655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_scrollGestureHandlingNode = eventTarget;
23665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
23675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (eventSwallowed)
23695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
23705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
23715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: A more general scroll system (https://bugs.webkit.org/show_bug.cgi?id=80596) will
23735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // eliminate the need for this.
23745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TemporaryChange<PlatformEvent::Type> baseEventType(m_baseEventType, gestureEvent.type());
23755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (gestureEvent.type()) {
23775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformEvent::GestureScrollBegin:
2378926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return handleGestureScrollBegin(gestureEvent);
23795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformEvent::GestureScrollUpdate:
2380926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case PlatformEvent::GestureScrollUpdateWithoutPropagation:
23815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return handleGestureScrollUpdate(gestureEvent);
2382926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case PlatformEvent::GestureScrollEnd:
238353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return handleGestureScrollEnd(gestureEvent);
23845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformEvent::GestureTap:
2385a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return handleGestureTap(gestureEvent, adjustedPoint);
23861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    case PlatformEvent::GestureShowPress:
23871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return handleGestureShowPress();
23885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformEvent::GestureLongPress:
238951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return handleGestureLongPress(gestureEvent, adjustedPoint);
2390926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case PlatformEvent::GestureLongTap:
239151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return handleGestureLongTap(gestureEvent, adjustedPoint);
23925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformEvent::GestureTwoFingerTap:
239351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return handleGestureTwoFingerTap(gestureEvent, adjustedPoint);
2394f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case PlatformEvent::GestureTapDown:
23955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformEvent::GesturePinchBegin:
23965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformEvent::GesturePinchEnd:
23975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformEvent::GesturePinchUpdate:
23985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformEvent::GestureTapDownCancel:
239953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case PlatformEvent::GestureTapUnconfirmed:
2400e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    case PlatformEvent::GestureFlingStart:
24015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
24025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
24035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
24045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
24055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
24075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2409a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)bool EventHandler::handleGestureTap(const PlatformGestureEvent& gestureEvent, const IntPoint& adjustedPoint)
24105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Refactor this code to not hit test multiple times. We use the adjusted position to ensure that the correct node is targeted by the later redundant hit tests.
24125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2413e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    unsigned modifierFlags = 0;
2414e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (gestureEvent.altKey())
2415e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        modifierFlags |= PlatformEvent::AltKey;
2416e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (gestureEvent.ctrlKey())
2417e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        modifierFlags |= PlatformEvent::CtrlKey;
2418e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (gestureEvent.metaKey())
2419e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        modifierFlags |= PlatformEvent::MetaKey;
2420e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (gestureEvent.shiftKey())
2421e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        modifierFlags |= PlatformEvent::ShiftKey;
2422e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    PlatformEvent::Modifiers modifiers = static_cast<PlatformEvent::Modifiers>(modifierFlags);
2423e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
24245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformMouseEvent fakeMouseMove(adjustedPoint, gestureEvent.globalPosition(),
24255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0,
2426e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp());
2427c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    handleMouseMoveEvent(fakeMouseMove);
24285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool defaultPrevented = false;
24305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformMouseEvent fakeMouseDown(adjustedPoint, gestureEvent.globalPosition(),
24311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(),
2432e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        modifiers, PlatformMouseEvent::FromTouch,  gestureEvent.timestamp());
24335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    defaultPrevented |= handleMousePressEvent(fakeMouseDown);
24345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformMouseEvent fakeMouseUp(adjustedPoint, gestureEvent.globalPosition(),
24361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        LeftButton, PlatformEvent::MouseReleased, gestureEvent.tapCount(),
2437e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        modifiers, PlatformMouseEvent::FromTouch,  gestureEvent.timestamp());
24385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    defaultPrevented |= handleMouseReleaseEvent(fakeMouseUp);
24395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return defaultPrevented;
24415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
244351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool EventHandler::handleGestureLongPress(const PlatformGestureEvent& gestureEvent, const IntPoint& adjustedPoint)
24445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
244553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_longTapShouldInvokeContextMenu = false;
244653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_frame->settings() && m_frame->settings()->touchDragDropEnabled() && m_frame->view()) {
244793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        PlatformMouseEvent mouseDownEvent(adjustedPoint, gestureEvent.globalPosition(), LeftButton, PlatformEvent::MousePressed, 1,
244893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), WTF::currentTime());
244993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        m_mouseDown = mouseDownEvent;
245093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
245153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        PlatformMouseEvent mouseDragEvent(adjustedPoint, gestureEvent.globalPosition(), LeftButton, PlatformEvent::MouseMoved, 1,
245253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), WTF::currentTime());
245319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
2454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDragEvent);
2455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_didStartDrag = false;
245653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        m_mouseDownMayStartDrag = true;
245753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        dragState().m_dragSrc = 0;
245853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        m_mouseDownPos = m_frame->view()->windowToContents(mouseDragEvent.position());
2459e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        RefPtr<FrameView> protector(m_frame->view());
2460926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        handleDrag(mev, DontCheckDragHysteresis);
246153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (m_didStartDrag) {
246253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            m_longTapShouldInvokeContextMenu = true;
2463926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return true;
246453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
2465926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
246653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if OS(ANDROID)
246753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool shouldLongPressSelectWord = true;
246853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#else
246953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool shouldLongPressSelectWord = m_frame->settings() && m_frame->settings()->touchEditingEnabled();
247053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#endif
247153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (shouldLongPressSelectWord) {
247281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        IntPoint hitTestPoint = m_frame->view()->windowToContents(gestureEvent.position());
2473591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        HitTestResult result = hitTestResultAtPoint(hitTestPoint);
247481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        Node* innerNode = result.targetNode();
247581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        if (!result.isLiveLink() && innerNode && (innerNode->isContentEditable() || innerNode->isTextNode())) {
247681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)            selectClosestWordFromHitTestResult(result, DontAppendTrailingWhitespace);
24778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            if (m_frame->selection().isRange()) {
247881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)                focusDocumentView();
247981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)                return true;
248081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)            }
248181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        }
248253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
248353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return sendContextMenuEventForGesture(gestureEvent);
24845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
248651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool EventHandler::handleGestureLongTap(const PlatformGestureEvent& gestureEvent, const IntPoint& adjustedPoint)
2487926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
248853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if !OS(ANDROID)
248953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_longTapShouldInvokeContextMenu) {
249053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        m_longTapShouldInvokeContextMenu = false;
2491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return sendContextMenuEventForGesture(gestureEvent);
24925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
24935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
24945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
24955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
249781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)bool EventHandler::handleScrollGestureOnResizer(Node* eventTarget, const PlatformGestureEvent& gestureEvent) {
249881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (gestureEvent.type() == PlatformEvent::GestureScrollBegin) {
249981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        RenderLayer* layer = eventTarget->renderer() ? eventTarget->renderer()->enclosingLayer() : 0;
250081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        IntPoint p = m_frame->view()->windowToContents(gestureEvent.position());
2501f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (layer && layer->scrollableArea() && layer->scrollableArea()->isPointInResizeControl(p, ResizerForTouch)) {
2502f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_resizeScrollableArea = layer->scrollableArea();
2503f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_resizeScrollableArea->setInResizeMode(true);
2504f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_offsetFromResizeCorner = m_resizeScrollableArea->offsetFromResizeCorner(p);
250581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)            return true;
250681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        }
250781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    } else if (gestureEvent.type() == PlatformEvent::GestureScrollUpdate ||
250881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)               gestureEvent.type() == PlatformEvent::GestureScrollUpdateWithoutPropagation) {
2509f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) {
2510f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_resizeScrollableArea->resize(gestureEvent, m_offsetFromResizeCorner);
251181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)            return true;
251281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        }
251381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    } else if (gestureEvent.type() == PlatformEvent::GestureScrollEnd) {
2514f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) {
2515f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_resizeScrollableArea->setInResizeMode(false);
2516f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_resizeScrollableArea = 0;
251781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)            return false;
251881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        }
251981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    }
252081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
252181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    return false;
252281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
252381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
252451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool EventHandler::handleGestureTwoFingerTap(const PlatformGestureEvent& gestureEvent, const IntPoint& adjustedPoint)
25255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
252653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return sendContextMenuEventForGesture(gestureEvent);
25275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2529926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool EventHandler::passGestureEventToWidget(const PlatformGestureEvent& gestureEvent, Widget* widget)
2530926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2531926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!widget)
2532926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2533926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2534926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!widget->isFrameView())
2535926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2536926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2537f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return toFrameView(widget)->frame().eventHandler().handleGestureEvent(gestureEvent);
2538926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2539926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2540926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool EventHandler::passGestureEventToWidgetIfPossible(const PlatformGestureEvent& gestureEvent, RenderObject* renderer)
2541926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2542926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_lastHitTestResultOverWidget && renderer && renderer->isWidget()) {
2543926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Widget* widget = toRenderWidget(renderer)->widget();
2544926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return widget && passGestureEventToWidget(gestureEvent, widget);
2545926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2546926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
2547926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2548926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
254953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool EventHandler::handleGestureScrollEnd(const PlatformGestureEvent& gestureEvent) {
2550bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    RefPtr<Node> node = m_scrollGestureHandlingNode;
255153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    clearGestureScrollNodes();
255253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2553bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (node) {
2554bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        ASSERT(node->refCount() > 0);
255553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        passGestureEventToWidgetIfPossible(gestureEvent, node->renderer());
2556bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    }
255753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
255853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return false;
255953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
256053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2561926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool EventHandler::handleGestureScrollBegin(const PlatformGestureEvent& gestureEvent)
2562926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2563926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Document* document = m_frame->document();
25641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!document->renderView())
2565926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2566926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2567926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    FrameView* view = m_frame->view();
2568926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!view)
2569926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2570926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2571926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutPoint viewPoint = view->windowToContents(gestureEvent.position());
257219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
2573926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HitTestResult result(viewPoint);
2574926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    document->renderView()->hitTest(request, result);
2575926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
257681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    m_lastHitTestResultOverWidget = result.isOverWidget();
2577926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_scrollGestureHandlingNode = result.innerNode();
2578926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_previousGestureScrolledNode = 0;
2579926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2580e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // If there's no renderer on the node, send the event to the nearest ancestor with a renderer.
2581e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // Needed for <option> and <optgroup> elements so we can touch scroll <select>s
2582e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    while (m_scrollGestureHandlingNode && !m_scrollGestureHandlingNode->renderer())
2583e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_scrollGestureHandlingNode = m_scrollGestureHandlingNode->parentOrShadowHostNode();
2584e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
2585e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (!m_scrollGestureHandlingNode)
2586e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return false;
258781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
2588e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    passGestureEventToWidgetIfPossible(gestureEvent, m_scrollGestureHandlingNode->renderer());
2589e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
2590e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return true;
2591926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2592926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
25935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleGestureScrollUpdate(const PlatformGestureEvent& gestureEvent)
25945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2595926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    FloatSize delta(gestureEvent.deltaX(), gestureEvent.deltaY());
2596926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (delta.isZero())
2597926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2598926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
259953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    const float scaleFactor = m_frame->pageZoomFactor();
2600926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    delta.scale(1 / scaleFactor, 1 / scaleFactor);
2601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Node* node = m_scrollGestureHandlingNode.get();
2603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!node)
2604926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return sendScrollEventToView(gestureEvent, delta);
2605926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2606926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Ignore this event if the targeted node does not have a valid renderer.
2607926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderObject* renderer = node->renderer();
2608926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderer)
2609926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2610926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<FrameView> protector(m_frame->view());
2612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
261353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Node* stopNode = 0;
261453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool scrollShouldNotPropagate = gestureEvent.type() == PlatformEvent::GestureScrollUpdateWithoutPropagation;
261553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2616926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Try to send the event to the correct view.
261753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (passGestureEventToWidgetIfPossible(gestureEvent, renderer)) {
261853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if(scrollShouldNotPropagate)
261953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)              m_previousGestureScrolledNode = m_scrollGestureHandlingNode;
262053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2621926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
262253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
2623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2624926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (scrollShouldNotPropagate)
2625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        stopNode = m_previousGestureScrolledNode.get();
2626926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2627926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // First try to scroll the closest scrollable RenderBox ancestor of |node|.
262802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    ScrollGranularity granularity = ScrollByPixel;
2629e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    bool horizontalScroll = scrollNode(delta.width(), granularity, ScrollLeft, node, &stopNode);
2630e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    bool verticalScroll = scrollNode(delta.height(), granularity, ScrollUp, node, &stopNode);
2631926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2632926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (scrollShouldNotPropagate)
2633926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_previousGestureScrolledNode = stopNode;
2634926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2635926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (horizontalScroll || verticalScroll) {
2636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setFrameWasScrolledByUser();
2637926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
2638926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2639926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2640926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Otherwise try to scroll the view.
2641926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return sendScrollEventToView(gestureEvent, delta);
26425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2644926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool EventHandler::sendScrollEventToView(const PlatformGestureEvent& gestureEvent, const FloatSize& scaledDelta)
26455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2646926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    FrameView* view = m_frame->view();
2647926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!view)
2648926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2649926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2650926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const float tickDivisor = static_cast<float>(WheelEvent::TickMultiplier);
26515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint point(gestureEvent.position().x(), gestureEvent.position().y());
26525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint globalPoint(gestureEvent.globalPosition().x(), gestureEvent.globalPosition().y());
26535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformWheelEvent syntheticWheelEvent(point, globalPoint,
265402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        scaledDelta.width(), scaledDelta.height(),
2655926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        scaledDelta.width() / tickDivisor, scaledDelta.height() / tickDivisor,
2656926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ScrollByPixelWheelEvent,
26575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey());
2658926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    syntheticWheelEvent.setHasPreciseScrollingDeltas(true);
26595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2660926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool scrolledFrame = view->wheelEvent(syntheticWheelEvent);
2661926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (scrolledFrame)
2662926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setFrameWasScrolledByUser();
2663926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2664926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return scrolledFrame;
2665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
266753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)Frame* EventHandler::getSubFrameForGestureEvent(const IntPoint& touchAdjustedPoint, const PlatformGestureEvent& gestureEvent)
266853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
266953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    PlatformMouseEvent mouseDown(touchAdjustedPoint, gestureEvent.globalPosition(), LeftButton, PlatformEvent::MousePressed, 1,
267053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), gestureEvent.timestamp());
267153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    HitTestRequest request(HitTestRequest::ReadOnly);
267253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDown);
26731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return subframeForHitTestResult(mev);
267453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
267553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2676926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void EventHandler::clearGestureScrollNodes()
2677926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2678926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_scrollGestureHandlingNode = 0;
2679926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_previousGestureScrolledNode = 0;
2680926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2681926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2682926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool EventHandler::isScrollbarHandlingGestures() const
2683926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2684926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_scrollbarHandlingScrollGesture.get();
2685926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2686926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2687926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool EventHandler::shouldApplyTouchAdjustment(const PlatformGestureEvent& event) const
2688926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2689926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_frame->settings() && !m_frame->settings()->touchAdjustmentEnabled())
2690926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2691926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return !event.area().isEmpty();
2692926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2693926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2694926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
26955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::bestClickableNodeForTouchPoint(const IntPoint& touchCenter, const IntSize& touchRadius, IntPoint& targetPoint, Node*& targetNode)
26965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint hitTestPoint = m_frame->view()->windowToContents(touchCenter);
269853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    HitTestResult result = hitTestResultAtPoint(hitTestPoint, HitTestRequest::ReadOnly | HitTestRequest::Active, touchRadius);
26995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2700a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // If the touch is over a scrollbar, don't adjust the touch point since touch adjustment only takes into account
2701a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // DOM nodes so a touch over a scrollbar will be adjusted towards nearby nodes. This leads to things like textarea
2702a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // scrollbars being untouchable.
2703a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (result.scrollbar())
2704a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return false;
2705a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
27065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect touchRect(touchCenter - touchRadius, touchRadius + touchRadius);
270753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Vector<RefPtr<Node>, 11> nodes;
270853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    copyToVector(result.rectBasedTestResult(), nodes);
27095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Should be able to handle targetNode being a shadow DOM node to avoid performing uncessary hit tests
27115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // in the case where further processing on the node is required. Returning the shadow ancestor prevents a
27125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // regression in touchadjustment/html-label.html. Some refinement is required to testing/internals to
271302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    // handle targetNode being a shadow DOM node.
27149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
27159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    // FIXME: the explicit Vector conversion copies into a temporary and is
27169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    // wasteful.
27179bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    bool success = findBestClickableCandidate(targetNode, targetPoint, touchCenter, touchRect, Vector<RefPtr<Node> > (nodes));
27185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (success && targetNode)
2719926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        targetNode = targetNode->deprecatedShadowAncestorNode();
27205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return success;
27215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::bestContextMenuNodeForTouchPoint(const IntPoint& touchCenter, const IntSize& touchRadius, IntPoint& targetPoint, Node*& targetNode)
27245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint hitTestPoint = m_frame->view()->windowToContents(touchCenter);
272653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    HitTestResult result = hitTestResultAtPoint(hitTestPoint, HitTestRequest::ReadOnly | HitTestRequest::Active, touchRadius);
27275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect touchRect(touchCenter - touchRadius, touchRadius + touchRadius);
272953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Vector<RefPtr<Node>, 11> nodes;
273053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    copyToVector(result.rectBasedTestResult(), nodes);
27319bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
27329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    // FIXME: the explicit Vector conversion copies into a temporary and is
27339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    // wasteful.
27349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return findBestContextMenuCandidate(targetNode, targetPoint, touchCenter, touchRect, Vector<RefPtr<Node> >(nodes));
27355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::bestZoomableAreaForTouchPoint(const IntPoint& touchCenter, const IntSize& touchRadius, IntRect& targetArea, Node*& targetNode)
27385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint hitTestPoint = m_frame->view()->windowToContents(touchCenter);
274019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    HitTestResult result = hitTestResultAtPoint(hitTestPoint, HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent, touchRadius);
27415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect touchRect(touchCenter - touchRadius, touchRadius + touchRadius);
274353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Vector<RefPtr<Node>, 11> nodes;
274453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    copyToVector(result.rectBasedTestResult(), nodes);
27459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
27469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    // FIXME: the explicit Vector conversion copies into a temporary and is
27479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    // wasteful.
27489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return findBestZoomableArea(targetNode, targetArea, touchCenter, touchRect, Vector<RefPtr<Node> >(nodes));
27495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::adjustGesturePosition(const PlatformGestureEvent& gestureEvent, IntPoint& adjustedPoint)
27525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2753926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!shouldApplyTouchAdjustment(gestureEvent))
2754926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2755926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
27565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* targetNode = 0;
27575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (gestureEvent.type()) {
27585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformEvent::GestureTap:
275981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    case PlatformEvent::GestureTapUnconfirmed:
27605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformEvent::GestureTapDown:
27611e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    case PlatformEvent::GestureShowPress:
27625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bestClickableNodeForTouchPoint(gestureEvent.position(), IntSize(gestureEvent.area().width() / 2, gestureEvent.area().height() / 2), adjustedPoint, targetNode);
27635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
27645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformEvent::GestureLongPress:
2765926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case PlatformEvent::GestureLongTap:
27665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformEvent::GestureTwoFingerTap:
27675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bestContextMenuNodeForTouchPoint(gestureEvent.position(), IntSize(gestureEvent.area().width() / 2, gestureEvent.area().height() / 2), adjustedPoint, targetNode);
27685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
27695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
27705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: Implement handling for other types as needed.
27715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
27725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return targetNode;
27745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::sendContextMenuEvent(const PlatformMouseEvent& event)
27775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* doc = m_frame->document();
27795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* v = m_frame->view();
27805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!v)
27815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
278253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2783926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Clear mouse press state to avoid initiating a drag while context menu is up.
2784926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_mousePressed = false;
27855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool swallowEvent;
27865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutPoint viewportPos = v->windowToContents(event.position());
278719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    HitTestRequest request(HitTestRequest::Active | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
27885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MouseEventWithHitTestResults mev = doc->prepareMouseEvent(request, viewportPos, event);
27895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!m_frame->selection().contains(viewportPos)
2791926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        && !mev.scrollbar()
27925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: In the editable case, word selection sometimes selects content that isn't underneath the mouse.
27935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the selection is non-editable, we do word selection to make it easier to use the contextual menu items
27945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // available for text selections.  But only if we're above text.
27958abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        && (m_frame->selection().isContentEditable() || (mev.targetNode() && mev.targetNode()->isTextNode()))) {
27965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_mouseDownMayStartSelect = true; // context menu events are always allowed to perform a selection
27975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
27985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (mev.hitTestResult().isMisspelled())
27995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            selectClosestMisspellingFromMouseEvent(mev);
2800c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        else if (m_frame->editor().behavior().shouldSelectOnContextualMenuClick())
28015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            selectClosestWordOrLinkFromMouseEvent(mev);
28025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    swallowEvent = !dispatchMouseEvent(EventTypeNames::contextmenu, mev.targetNode(), true, 0, event, false);
280553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
28065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return swallowEvent;
28075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::sendContextMenuEventForKey()
28105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = m_frame->view();
28125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
28135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
28145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* doc = m_frame->document();
28165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!doc)
28175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
28185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2819926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Clear mouse press state to avoid initiating a drag while context menu is up.
2820926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_mousePressed = false;
2821926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
28225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const int kContextMenuMargin = 1;
28235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN)
28255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int rightAligned = ::GetSystemMetrics(SM_MENUDROPALIGNMENT);
28265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
28275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int rightAligned = 0;
28285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
28295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint location;
28305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28317757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    Element* focusedElement = doc->focusedElement();
28328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FrameSelection& selection = m_frame->selection();
28338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Position start = selection.selection().start();
28345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28358abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (start.deprecatedNode() && (selection.rootEditableElement() || selection.isRange())) {
28368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        RefPtr<Range> selectionRange = selection.toNormalizedRange();
2837c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        IntRect firstRect = m_frame->editor().firstRectForRange(selectionRange.get());
28385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int x = rightAligned ? firstRect.maxX() : firstRect.x();
28405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // In a multiline edit, firstRect.maxY() would endup on the next line, so -1.
28415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int y = firstRect.maxY() ? firstRect.maxY() - 1 : 0;
28425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        location = IntPoint(x, y);
28437757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    } else if (focusedElement) {
28447757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        RenderBoxModelObject* box = focusedElement->renderBoxModelObject();
28455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!box)
28465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
28475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect clippedRect = box->pixelSnappedAbsoluteClippedOverflowRect();
28485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        location = IntPoint(clippedRect.x(), clippedRect.maxY() - 1);
28495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
28505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        location = IntPoint(
28515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            rightAligned ? view->contentsWidth() - kContextMenuMargin : kContextMenuMargin,
28525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            kContextMenuMargin);
28535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame->view()->setCursor(pointerCursor());
28565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint position = view->contentsToRootView(location);
28585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint globalPosition = view->hostWindow()->rootViewToScreen(IntRect(position, IntSize())).location();
28595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28607757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    Node* targetNode = doc->focusedElement();
28615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!targetNode)
28625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        targetNode = doc;
28635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Use the focused node as the target for hover and active.
28655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HitTestResult result(position);
28665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.setInnerNode(targetNode);
286719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    doc->updateHoverActiveState(HitTestRequest::Active | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent, result.innerElement());
2868926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
28695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The contextmenu event is a mouse event even when invoked using the keyboard.
28705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is required for web compatibility.
28715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN)
28735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformEvent::Type eventType = PlatformEvent::MouseReleased;
28745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
28755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformEvent::Type eventType = PlatformEvent::MousePressed;
28765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
28775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformMouseEvent mouseEvent(position, globalPosition, RightButton, eventType, 1, false, false, false, false, WTF::currentTime());
28795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return !dispatchMouseEvent(EventTypeNames::contextmenu, targetNode, true, 0, mouseEvent, false);
28815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::sendContextMenuEventForGesture(const PlatformGestureEvent& event)
28845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN)
28865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformEvent::Type eventType = PlatformEvent::MouseReleased;
28875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
28885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformEvent::Type eventType = PlatformEvent::MousePressed;
28895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
28905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint adjustedPoint = event.position();
2892926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    adjustGesturePosition(event, adjustedPoint);
28935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformMouseEvent mouseEvent(adjustedPoint, event.globalPosition(), RightButton, eventType, 1, false, false, false, false, WTF::currentTime());
28945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // To simulate right-click behavior, we send a right mouse down and then
28955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // context menu event.
28965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    handleMousePressEvent(mouseEvent);
28975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return sendContextMenuEvent(mouseEvent);
28985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We do not need to send a corresponding mouse release because in case of
28995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // right-click, the context menu takes capture and consumes all events.
29005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::scheduleHoverStateUpdate()
29035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_hoverTimer.isActive())
29055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_hoverTimer.startOneShot(0);
29065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void EventHandler::scheduleCursorUpdate()
29091e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
29101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!m_cursorUpdateTimer.isActive())
29111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_cursorUpdateTimer.startOneShot(cursorUpdateInterval);
29121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
29131e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
29145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::dispatchFakeMouseMoveEventSoon()
29155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_mousePressed)
29175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2919926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_mousePositionIsUnknown)
2920926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
2921926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
29225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Settings* settings = m_frame->settings();
29235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (settings && !settings->deviceSupportsMouse())
29245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2926926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If the content has ever taken longer than fakeMouseMoveShortInterval we
2927926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // reschedule the timer and use a longer time. This will cause the content
2928926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // to receive these moves only after the user is done scrolling, reducing
2929926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // pauses during the scroll.
2930926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_maxMouseMovedDuration > fakeMouseMoveShortInterval) {
2931926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (m_fakeMouseMoveEventTimer.isActive())
2932926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            m_fakeMouseMoveEventTimer.stop();
2933926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveLongInterval);
2934926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else {
2935926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!m_fakeMouseMoveEventTimer.isActive())
2936926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveShortInterval);
2937926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
29385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::dispatchFakeMouseMoveEventSoonInQuad(const FloatQuad& quad)
29415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = m_frame->view();
29435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
29445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2946926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!quad.containsPoint(view->windowToContents(m_lastKnownMousePosition)))
29475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dispatchFakeMouseMoveEventSoon();
29505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2952926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void EventHandler::fakeMouseMoveEventTimerFired(Timer<EventHandler>* timer)
29535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_UNUSED(timer, timer == &m_fakeMouseMoveEventTimer);
29555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_mousePressed);
29565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Settings* settings = m_frame->settings();
29585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (settings && !settings->deviceSupportsMouse())
29595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = m_frame->view();
29625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
29635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29653c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    if (!m_frame->page() || !m_frame->page()->focusController().isActive())
296653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
296753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
296853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Don't dispatch a synthetic mouse move event if the mouse cursor is not visible to the user.
296953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!isCursorVisible())
29705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool shiftKey;
29735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool ctrlKey;
29745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool altKey;
29755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool metaKey;
29765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformKeyboardEvent::getCurrentModifierState(shiftKey, ctrlKey, altKey, metaKey);
2977926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    PlatformMouseEvent fakeMouseMoveEvent(m_lastKnownMousePosition, m_lastKnownMouseGlobalPosition, NoButton, PlatformEvent::MouseMoved, 0, shiftKey, ctrlKey, altKey, metaKey, currentTime());
2978c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    handleMouseMoveEvent(fakeMouseMoveEvent);
29795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
298153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void EventHandler::cancelFakeMouseMoveEvent()
298253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
298353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_fakeMouseMoveEventTimer.stop();
298453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
298553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
298653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool EventHandler::isCursorVisible() const
298753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
298853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return m_frame->page()->isCursorVisible();
298953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
299053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
29915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::setResizingFrameSet(HTMLFrameSetElement* frameSet)
29925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frameSetBeingResized = frameSet;
29945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2996f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void EventHandler::resizeScrollableAreaDestroyed()
29975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2998f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(m_resizeScrollableArea);
2999f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_resizeScrollableArea = 0;
30005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::hoverTimerFired(Timer<EventHandler>*)
30035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_hoverTimer.stop();
30055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame);
30075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->document());
30085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (RenderView* renderer = m_frame->contentRenderer()) {
30105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (FrameView* view = m_frame->view()) {
301119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            HitTestRequest request(HitTestRequest::Move | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
3012926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            HitTestResult result(view->windowToContents(m_lastKnownMousePosition));
30135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            renderer->hitTest(request, result);
3014926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            m_frame->document()->updateHoverActiveState(request, result.innerElement());
30155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
30165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
30175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3019a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void EventHandler::activeIntervalTimerFired(Timer<EventHandler>*)
3020a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
3021a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_activeIntervalTimer.stop();
3022a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
3023a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_frame
3024a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        && m_frame->document()
3025e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        && m_lastDeferredTapElement) {
3026e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        // FIXME: Enable condition when http://crbug.com/226842 lands
3027e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        // m_lastDeferredTapElement.get() == m_frame->document()->activeElement()
3028e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        HitTestRequest request(HitTestRequest::TouchEvent | HitTestRequest::Release);
3029a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_frame->document()->updateHoverActiveState(request, m_lastDeferredTapElement.get());
3030a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
3031a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_lastDeferredTapElement = 0;
3032a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
3033a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
3034a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void EventHandler::notifyElementActivated()
3035a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
3036a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // Since another element has been set to active, stop current timer and clear reference.
3037a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_activeIntervalTimer.isActive())
3038a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_activeIntervalTimer.stop();
3039a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_lastDeferredTapElement = 0;
3040a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
3041a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
30425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleAccessKey(const PlatformKeyboardEvent& evt)
30435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Ignoring the state of Shift key is what neither IE nor Firefox do.
30455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // IE matches lower and upper case access keys regardless of Shift key state - but if both upper and
30465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // lower case variants are present in a document, the correct element is matched based on Shift key state.
30475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Firefox only matches an access key if Shift is not pressed, and does that case-insensitively.
30485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!(accessKeyModifiers() & PlatformEvent::ShiftKey));
30495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ((evt.modifiers() & ~PlatformEvent::ShiftKey) != accessKeyModifiers())
30505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
30515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String key = evt.unmodifiedText();
30525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* elem = m_frame->document()->getElementByAccessKey(key.lower());
30535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!elem)
30545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
30555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    elem->accessKeyAction(false);
30565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
30575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3059f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)bool EventHandler::isKeyEventAllowedInFullScreen(FullscreenElementStack* fullscreen, const PlatformKeyboardEvent& keyEvent) const
30605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3061521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (fullscreen->webkitFullScreenKeyboardInputAllowed())
30625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
30635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (keyEvent.type() == PlatformKeyboardEvent::Char) {
30655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (keyEvent.text().length() != 1)
30665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
30675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        UChar character = keyEvent.text()[0];
30685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return character == ' ';
30695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
30705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int keyCode = keyEvent.windowsVirtualKeyCode();
30725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (keyCode >= VK_BACK && keyCode <= VK_CAPITAL)
30735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || (keyCode >= VK_SPACE && keyCode <= VK_DELETE)
30745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || (keyCode >= VK_OEM_1 && keyCode <= VK_OEM_PLUS)
30755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || (keyCode >= VK_MULTIPLY && keyCode <= VK_OEM_8);
30765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::keyEvent(const PlatformKeyboardEvent& initialKeyEvent)
30795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
308002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    RefPtr<FrameView> protector(m_frame->view());
30815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3082f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (FullscreenElementStack* fullscreen = FullscreenElementStack::fromIfExists(m_frame->document())) {
3083521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (fullscreen->webkitIsFullScreen() && !isKeyEventAllowedInFullScreen(fullscreen, initialKeyEvent))
3084521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            return false;
3085521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
30865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (initialKeyEvent.windowsVirtualKeyCode() == VK_CAPITAL)
30885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        capsLockStateMayHaveChanged();
30895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN)
309153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (panScrollInProgress()) {
309253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // If a key is pressed while the panScroll is in progress then we want to stop
309353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (initialKeyEvent.type() == PlatformEvent::KeyDown || initialKeyEvent.type() == PlatformEvent::RawKeyDown)
309419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            stopAutoscroll();
30955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
309653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // If we were in panscroll mode, we swallow the key event
309753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return true;
30985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
30995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
31005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Check for cases where we are too early for events -- possible unmatched key up
31025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // from pressing return in the location bar.
31035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<Node> node = eventTargetNodeForDocument(m_frame->document());
31045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node)
31055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
31065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture);
31085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* view = m_frame->view())
31105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        view->resetDeferredRepaintDelay();
31115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // In IE, access keys are special, they are handled after default keydown processing, but cannot be canceled - this is hard to match.
31135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // On Mac OS X, we process them before dispatching keydown, as the default keydown handler implements Emacs key bindings, which may conflict
31145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // with access keys. Then we dispatch keydown, but suppress its default handling.
31155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // On Windows, WebKit explicitly calls handleAccessKey() instead of dispatching a keypress event for WM_SYSCHAR messages.
31165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Other platforms currently match either Mac or Windows behavior, depending on whether they send combined KeyDown events.
31175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool matchedAnAccessKey = false;
31185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (initialKeyEvent.type() == PlatformEvent::KeyDown)
31195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        matchedAnAccessKey = handleAccessKey(initialKeyEvent);
31205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: it would be fair to let an input method handle KeyUp events before DOM dispatch.
31225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (initialKeyEvent.type() == PlatformEvent::KeyUp || initialKeyEvent.type() == PlatformEvent::Char)
31235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return !node->dispatchKeyEvent(initialKeyEvent);
31245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
312502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    PlatformKeyboardEvent keyDownEvent = initialKeyEvent;
31265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (keyDownEvent.type() != PlatformEvent::RawKeyDown)
312753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        keyDownEvent.disambiguateKeyDownEvent(PlatformEvent::RawKeyDown);
3128bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    RefPtr<KeyboardEvent> keydown = KeyboardEvent::create(keyDownEvent, m_frame->document()->domWindow());
31295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (matchedAnAccessKey)
31305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        keydown->setDefaultPrevented(true);
31315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    keydown->setTarget(node);
31325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (initialKeyEvent.type() == PlatformEvent::RawKeyDown) {
31341fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        node->dispatchEvent(keydown, IGNORE_EXCEPTION);
31355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If frame changed as a result of keydown dispatch, then return true to avoid sending a subsequent keypress message to the new frame.
31363c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        bool changedFocusedFrame = m_frame->page() && m_frame != m_frame->page()->focusController().focusedOrMainFrame();
31375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return keydown->defaultHandled() || keydown->defaultPrevented() || changedFocusedFrame;
31385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
31395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31401fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    node->dispatchEvent(keydown, IGNORE_EXCEPTION);
31415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If frame changed as a result of keydown dispatch, then return early to avoid sending a subsequent keypress message to the new frame.
31423c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    bool changedFocusedFrame = m_frame->page() && m_frame != m_frame->page()->focusController().focusedOrMainFrame();
31435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool keydownResult = keydown->defaultHandled() || keydown->defaultPrevented() || changedFocusedFrame;
314481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (keydownResult)
31455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return keydownResult;
314602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
31475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Focus may have changed during keydown handling, so refetch node.
31485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // But if we are dispatching a fake backward compatibility keypress, then we pretend that the keypress happened on the original node.
314981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    node = eventTargetNodeForDocument(m_frame->document());
315081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (!node)
315181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        return false;
31525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformKeyboardEvent keyPressEvent = initialKeyEvent;
315453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    keyPressEvent.disambiguateKeyDownEvent(PlatformEvent::Char);
31555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (keyPressEvent.text().isEmpty())
31565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return keydownResult;
3157bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    RefPtr<KeyboardEvent> keypress = KeyboardEvent::create(keyPressEvent, m_frame->document()->domWindow());
31585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    keypress->setTarget(node);
31595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (keydownResult)
31605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        keypress->setDefaultPrevented(true);
31611fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    node->dispatchEvent(keypress, IGNORE_EXCEPTION);
31625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return keydownResult || keypress->defaultPrevented() || keypress->defaultHandled();
31645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static FocusDirection focusDirectionForKey(const AtomicString& keyIdentifier)
31675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
31685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, Down, ("Down", AtomicString::ConstructFromLiteral));
31695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, Up, ("Up", AtomicString::ConstructFromLiteral));
31705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, Left, ("Left", AtomicString::ConstructFromLiteral));
31715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, Right, ("Right", AtomicString::ConstructFromLiteral));
31725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FocusDirection retVal = FocusDirectionNone;
31745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (keyIdentifier == Down)
31765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        retVal = FocusDirectionDown;
31775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (keyIdentifier == Up)
31785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        retVal = FocusDirectionUp;
31795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (keyIdentifier == Left)
31805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        retVal = FocusDirectionLeft;
31815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (keyIdentifier == Right)
31825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        retVal = FocusDirectionRight;
31835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return retVal;
31855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::defaultKeyboardEventHandler(KeyboardEvent* event)
31885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
31891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::keydown) {
3190c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_frame->editor().handleKeyboardEvent(event);
31915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event->defaultHandled())
31925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
31935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event->keyIdentifier() == "U+0009")
31945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            defaultTabEventHandler(event);
31955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else if (event->keyIdentifier() == "U+0008")
31965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            defaultBackspaceEventHandler(event);
3197c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        else if (event->keyIdentifier() == "U+001B")
3198c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            defaultEscapeEventHandler(event);
31995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else {
32005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            FocusDirection direction = focusDirectionForKey(event->keyIdentifier());
32015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (direction != FocusDirectionNone)
32025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                defaultArrowEventHandler(direction, event);
32035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
32045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
32051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::keypress) {
3206c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_frame->editor().handleKeyboardEvent(event);
32075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event->defaultHandled())
32085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
32095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event->charCode() == ' ')
32105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            defaultSpaceEventHandler(event);
32115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
32125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::dragHysteresisExceeded(const IntPoint& floatDragViewportLocation) const
32155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatPoint dragViewportLocation(floatDragViewportLocation.x(), floatDragViewportLocation.y());
32175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return dragHysteresisExceeded(dragViewportLocation);
32185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::dragHysteresisExceeded(const FloatPoint& dragViewportLocation) const
32215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = m_frame->view();
32235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
32245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
32255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint dragLocation = view->windowToContents(flooredIntPoint(dragViewportLocation));
32265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize delta = dragLocation - m_mouseDownPos;
322702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
32285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int threshold = GeneralDragHysteresis;
32295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (dragState().m_dragType) {
32305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case DragSourceActionSelection:
32315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        threshold = TextDragHysteresis;
32325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
32335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case DragSourceActionImage:
32345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        threshold = ImageDragHysteresis;
32355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
32365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case DragSourceActionLink:
32375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        threshold = LinkDragHysteresis;
32385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
32395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case DragSourceActionDHTML:
32405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
32415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case DragSourceActionNone:
32425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
32435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
324402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
32455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return abs(delta.width()) >= threshold || abs(delta.height()) >= threshold;
32465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
324702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
32485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::freeClipboard()
32495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (dragState().m_dragClipboard)
32515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dragState().m_dragClipboard->setAccessPolicy(ClipboardNumb);
32525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::dragSourceEndedAt(const PlatformMouseEvent& event, DragOperation operation)
32555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Send a hit test request so that RenderLayer gets a chance to update the :hover and :active pseudoclasses.
325719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    HitTestRequest request(HitTestRequest::Release | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
32585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    prepareMouseEvent(request, event);
32595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3260e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (dragState().m_dragSrc) {
32615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dragState().m_dragClipboard->setDestinationOperation(operation);
32625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // for now we don't care if event handler cancels default behavior, since there is none
32631e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        dispatchDragSrcEvent(EventTypeNames::dragend, event);
32645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
32655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    freeClipboard();
32665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dragState().m_dragSrc = 0;
32675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // In case the drag was ended due to an escape key press we need to ensure
32685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // that consecutive mousemove events don't reinitiate the drag and drop.
32695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mouseDownMayStartDrag = false;
32705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::updateDragStateAfterEditDragIfNeeded(Element* rootEditableElement)
32735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If inserting the dragged contents removed the drag source, we still want to fire dragend at the root editble element.
32755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (dragState().m_dragSrc && !dragState().m_dragSrc->inDocument())
32765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dragState().m_dragSrc = rootEditableElement;
32775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// returns if we should continue "default processing", i.e., whether eventhandler canceled
32805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::dispatchDragSrcEvent(const AtomicString& eventType, const PlatformMouseEvent& event)
32815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !dispatchDragEvent(eventType, dragState().m_dragSrc.get(), event, dragState().m_dragClipboard.get());
32835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
328402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool EventHandler::handleDrag(const MouseEventWithHitTestResults& event, CheckDragHysteresis checkDragHysteresis)
32865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
328751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT(event.event().type() == PlatformEvent::MouseMoved);
3288e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // Callers must protect the reference to FrameView, since this function may dispatch DOM
32891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    // events, causing page/FrameView to go away.
3290e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    ASSERT(m_frame);
3291e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    ASSERT(m_frame->view());
3292e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!m_frame->page())
3293e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return false;
3294e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
32955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event.event().button() != LeftButton || event.event().type() != PlatformEvent::MouseMoved) {
32965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If we allowed the other side of the bridge to handle a drag
32975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // last time, then m_mousePressed might still be set. So we
32985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // clear it now to make sure the next move after a drag
32995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // doesn't look like a drag.
33005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_mousePressed = false;
33015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
33025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
330353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
330451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_mouseDownMayStartDrag) {
330551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        HitTestRequest request(HitTestRequest::ReadOnly);
33065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HitTestResult result(m_mouseDownPos);
33075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_frame->contentRenderer()->hitTest(request, result);
33085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Node* node = result.innerNode();
330951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (node) {
331051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            DragController::SelectionDragPolicy selectionDragPolicy = event.event().timestamp() - m_mouseDownTimestamp < TextDragDelay
331151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)                ? DragController::DelayedSelectionDragResolution
331251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)                : DragController::ImmediateSelectionDragResolution;
331351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            dragState().m_dragSrc = m_frame->page()->dragController().draggableNode(m_frame, node, m_mouseDownPos, selectionDragPolicy, dragState().m_dragType);
331451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        } else {
33155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dragState().m_dragSrc = 0;
331651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        }
331702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
33185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!dragState().m_dragSrc)
33195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_mouseDownMayStartDrag = false; // no element is draggable
33205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
332102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
33225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_mouseDownMayStartDrag)
33235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return !mouseDownMayStartSelect() && !m_mouseDownMayStartAutoscroll;
332402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
33255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We are starting a text/image/url drag, so the cursor should be an arrow
3326e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // FIXME <rdar://7577595>: Custom cursors aren't supported during drag and drop (default to pointer).
3327e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    m_frame->view()->setCursor(pointerCursor());
33285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (checkDragHysteresis == ShouldCheckDragHysteresis && !dragHysteresisExceeded(event.event().position()))
33305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
333102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
33325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Once we're past the hysteresis point, we don't want to treat this gesture as a click
33335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    invalidateClick();
333402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3335e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!tryStartDrag(event)) {
3336e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        // Something failed to start the drag, clean up.
3337e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        freeClipboard();
3338e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        dragState().m_dragSrc = 0;
3339e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
3340e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
3341e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    m_mouseDownMayStartDrag = false;
3342e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // Whether or not the drag actually started, no more default handling (like selection).
3343e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return true;
3344e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
3345e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
3346e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochbool EventHandler::tryStartDrag(const MouseEventWithHitTestResults& event)
3347e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
33485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    freeClipboard(); // would only happen if we missed a dragEnd.  Do it anyway, just
33495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     // to make sure it gets numbified
335002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    dragState().m_dragClipboard = createDraggingClipboard();
335102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3352e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // Check to see if this a DOM based drag, if it is get the DOM specified drag
3353e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // image and offset
3354e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (dragState().m_dragType == DragSourceActionDHTML) {
3355e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (RenderObject* renderer = dragState().m_dragSrc->renderer()) {
3356e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            // FIXME: This doesn't work correctly with transforms.
3357e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            FloatPoint absPos = renderer->localToAbsolute();
3358e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            IntSize delta = m_mouseDownPos - roundedIntPoint(absPos);
3359e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            dragState().m_dragClipboard->setDragImageElement(dragState().m_dragSrc.get(), IntPoint(delta));
3360e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        } else {
3361e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            // The renderer has disappeared, this can happen if the onStartDrag handler has hidden
3362e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            // the element in some way. In this case we just kill the drag.
3363e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            return false;
33645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
33655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3366e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
336700d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch    DragController& dragController = m_frame->page()->dragController();
336800d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch    if (!dragController.populateDragClipboard(m_frame, dragState(), m_mouseDownPos))
3369e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return false;
33701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_mouseDownMayStartDrag = dispatchDragSrcEvent(EventTypeNames::dragstart, m_mouseDown)
33718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        && !m_frame->selection().isInPasswordField();
3372e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
3373e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // Invalidate clipboard here against anymore pasteboard writing for security. The drag
3374e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // image can still be changed as we drag, but not the pasteboard data.
3375e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    dragState().m_dragClipboard->setAccessPolicy(ClipboardImageWritable);
337602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
33775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_mouseDownMayStartDrag) {
3378e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        // Dispatching the event could cause Page to go away. Make sure it's still valid before trying to use DragController.
337900d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch        m_didStartDrag = m_frame->page() && dragController.startDrag(m_frame, dragState(), event.event(), m_mouseDownPos);
3380e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        // FIXME: This seems pretty useless now. The gesture code uses this as a signal for
3381e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        // whether or not the drag started, but perhaps it can simply use the return value from
3382e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        // handleDrag(), even though it doesn't mean exactly the same thing.
3383e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (m_didStartDrag)
33845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
3385e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        // Drag was canned at the last minute - we owe m_dragSrc a DRAGEND event
33861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        dispatchDragSrcEvent(EventTypeNames::dragend, event.event());
33875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3388e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
3389e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return false;
33905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
339153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
33925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleTextInputEvent(const String& text, Event* underlyingEvent, TextEventInputType inputType)
33935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Platforms should differentiate real commands like selectAll from text input in disguise (like insertNewline),
33955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // and avoid dispatching text input events from keydown default handlers.
33961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(!underlyingEvent || !underlyingEvent->isKeyboardEvent() || toKeyboardEvent(underlyingEvent)->type() == EventTypeNames::keypress);
33975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame)
33995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
34005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EventTarget* target;
34025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (underlyingEvent)
34035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        target = underlyingEvent->target();
34045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
34055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        target = eventTargetNodeForDocument(m_frame->document());
34065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!target)
34075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
340802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
34095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* view = m_frame->view())
34105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        view->resetDeferredRepaintDelay();
34115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34127757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    RefPtr<TextEvent> event = TextEvent::create(m_frame->domWindow(), text, inputType);
34135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event->setUnderlyingEvent(underlyingEvent);
34145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34151fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    target->dispatchEvent(event, IGNORE_EXCEPTION);
34165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return event->defaultHandled();
34175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
341802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
34195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::defaultTextInputEventHandler(TextEvent* event)
34205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3421c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (m_frame->editor().handleTextEvent(event))
34225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->setDefaultHandled();
34235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
34245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::defaultSpaceEventHandler(KeyboardEvent* event)
34265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
34271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(event->type() == EventTypeNames::keypress);
34285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event->ctrlKey() || event->metaKey() || event->altKey() || event->altGraphKey())
34305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
34315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3432e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    ScrollDirection direction = event->shiftKey() ? ScrollBlockDirectionBackward : ScrollBlockDirectionForward;
3433e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (scrollOverflow(direction, ScrollByPage)) {
34345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->setDefaultHandled();
34355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
34365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
34375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = m_frame->view();
34395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
34405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
34415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3442e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (view->scroll(direction, ScrollByPage))
34435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->setDefaultHandled();
34445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
34455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::defaultBackspaceEventHandler(KeyboardEvent* event)
34475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
34481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(event->type() == EventTypeNames::keydown);
34495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event->ctrlKey() || event->metaKey() || event->altKey() || event->altGraphKey())
34515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
34525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3453c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (!m_frame->editor().behavior().shouldNavigateBackOnBackspace())
34545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
34557757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
34565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
34575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
34585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3459f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    bool handledEvent = page->mainFrame()->loader().client()->navigateBackForward(event->shiftKey() ? 1 : -1);
34605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (handledEvent)
34615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->setDefaultHandled();
34625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
34635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::defaultArrowEventHandler(FocusDirection focusDirection, KeyboardEvent* event)
34655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
34661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(event->type() == EventTypeNames::keydown);
34675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event->ctrlKey() || event->metaKey() || event->altGraphKey() || event->shiftKey())
34695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
34705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
34725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
34735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
34745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isSpatialNavigationEnabled(m_frame))
34765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
34775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Arrows and other possible directional navigation keys can be used in design
34795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // mode editing.
34805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->document()->inDesignMode())
34815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
34825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34833c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    if (page->focusController().advanceFocus(focusDirection))
34845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->setDefaultHandled();
34855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
34865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::defaultTabEventHandler(KeyboardEvent* event)
34885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
34891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(event->type() == EventTypeNames::keydown);
34905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We should only advance focus on tabs if no special modifier keys are held down.
34925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event->ctrlKey() || event->metaKey() || event->altGraphKey())
34935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
34945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = m_frame->page();
34965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
34975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
34985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page->tabKeyCyclesThroughElements())
34995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
35005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FocusDirection focusDirection = event->shiftKey() ? FocusDirectionBackward : FocusDirectionForward;
35025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Tabs can be used in design mode editing.
35045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame->document()->inDesignMode())
35055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
35065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35073c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    if (page->focusController().advanceFocus(focusDirection))
35085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->setDefaultHandled();
35095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
35105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3511c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)void EventHandler::defaultEscapeEventHandler(KeyboardEvent* event)
3512c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
3513c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (HTMLDialogElement* dialog = m_frame->document()->activeModalDialog())
35141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        dialog->dispatchEvent(Event::createCancelable(EventTypeNames::cancel));
3515c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
3516c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
35175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::capsLockStateMayHaveChanged()
35185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
35197757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (Element* element = m_frame->document()->focusedElement()) {
35207757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        if (RenderObject* r = element->renderer()) {
35215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (r->isTextField())
35225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                toRenderTextControlSingleLine(r)->capsLockStateMayHaveChanged();
35235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
35245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
35255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
35265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::setFrameWasScrolledByUser()
35285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3529e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (FrameView* view = m_frame->view())
3530e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        view->setWasScrolledByUser(true);
35315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
35325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::passMousePressEventToScrollbar(MouseEventWithHitTestResults& mev, Scrollbar* scrollbar)
35345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
35355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!scrollbar || !scrollbar->enabled())
35365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
35375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setFrameWasScrolledByUser();
353853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    scrollbar->mouseDown(mev.event());
353953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
35405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
35415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// If scrollbar (under mouse) is different from last, send a mouse exited. Set
35435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// last to scrollbar if setLast is true; else set last to 0.
35445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EventHandler::updateLastScrollbarUnderMouse(Scrollbar* scrollbar, bool setLast)
35455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
35465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_lastScrollbarUnderMouse != scrollbar) {
35475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Send mouse exited to the old scrollbar.
35485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_lastScrollbarUnderMouse)
35495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_lastScrollbarUnderMouse->mouseExited();
35505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Send mouse entered if we're setting a new scrollbar.
35525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (scrollbar && setLast)
35535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            scrollbar->mouseEntered();
35545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_lastScrollbarUnderMouse = setLast ? scrollbar : 0;
35565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
35575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
35585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const AtomicString& eventNameForTouchPointState(PlatformTouchPoint::State state)
35605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
35615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (state) {
35625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformTouchPoint::TouchReleased:
35631e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return EventTypeNames::touchend;
35645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformTouchPoint::TouchCancelled:
35651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return EventTypeNames::touchcancel;
35665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformTouchPoint::TouchPressed:
35671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return EventTypeNames::touchstart;
35685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformTouchPoint::TouchMoved:
35691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return EventTypeNames::touchmove;
35705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PlatformTouchPoint::TouchStationary:
35715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // TouchStationary state is not converted to touch events, so fall through to assert.
35725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
35735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
35745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return emptyAtom;
35755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
35765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
35775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3578926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)HitTestResult EventHandler::hitTestResultInFrame(Frame* frame, const LayoutPoint& point, HitTestRequest::HitTestRequestType hitType)
3579926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
3580926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HitTestResult result(point);
3581926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3582926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!frame || !frame->contentRenderer())
3583926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return result;
3584926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (frame->view()) {
3585926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        IntRect rect = frame->view()->visibleContentRect();
3586926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!rect.contains(roundedIntPoint(point)))
3587926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return result;
3588926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
3589926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    frame->contentRenderer()->hitTest(HitTestRequest(hitType), result);
3590926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return result;
3591926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
3592926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
35935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
35945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
35955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // First build up the lists to use for the 'touches', 'targetTouches' and 'changedTouches' attributes
35965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // in the JS event. See http://www.sitepen.com/blog/2008/07/10/touching-and-gesturing-on-the-iphone/
35975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // for an overview of how these lists fit together.
35985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Holds the complete set of touches on the screen and will be used as the 'touches' list in the JS event.
36005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<TouchList> touches = TouchList::create();
36015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // A different view on the 'touches' list above, filtered and grouped by event target. Used for the
36035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 'targetTouches' list in the JS event.
36045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef HashMap<EventTarget*, RefPtr<TouchList> > TargetTouchesMap;
36055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TargetTouchesMap touchesByTarget;
36065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Array of touches per state, used to assemble the 'changedTouches' list in the JS event.
36085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef HashSet<RefPtr<EventTarget> > EventTargetSet;
36095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct {
36105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The touches corresponding to the particular change state this struct instance represents.
36115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<TouchList> m_touches;
36125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Set of targets involved in m_touches.
36135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        EventTargetSet m_targets;
36145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } changedTouches[PlatformTouchPoint::TouchStateEnd];
36155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Vector<PlatformTouchPoint>& points = event.touchPoints();
36175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture);
36195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3620926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned i;
3621926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool freshTouchEvents = true;
3622926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool allTouchReleased = true;
3623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (i = 0; i < points.size(); ++i) {
3624926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const PlatformTouchPoint& point = points[i];
3625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (point.state() != PlatformTouchPoint::TouchPressed)
3626926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            freshTouchEvents = false;
3627926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (point.state() != PlatformTouchPoint::TouchReleased && point.state() != PlatformTouchPoint::TouchCancelled)
3628926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            allTouchReleased = false;
3629926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
3630926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3631926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (i = 0; i < points.size(); ++i) {
36325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const PlatformTouchPoint& point = points[i];
36335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PlatformTouchPoint::State pointState = point.state();
36345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutPoint pagePoint = documentPointForWindowPoint(m_frame, point.pos());
36355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
363651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        // Gesture events trigger the active state, not touch events,
363751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        // so touch event hit tests can always be read only.
363851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEvent | HitTestRequest::ReadOnly;
36395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The HitTestRequest types used for mouse events map quite adequately
36405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // to touch events. Note that in addition to meaning that the hit test
36415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // should affect the active state of the current node if necessary,
36425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // HitTestRequest::Active signifies that the hit test is taking place
36435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // with the mouse (or finger in this case) being pressed.
36445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (pointState) {
36455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PlatformTouchPoint::TouchPressed:
36465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            hitType |= HitTestRequest::Active;
36475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
36485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PlatformTouchPoint::TouchMoved:
364951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            hitType |= HitTestRequest::Active | HitTestRequest::Move;
36505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
36515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PlatformTouchPoint::TouchReleased:
36525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PlatformTouchPoint::TouchCancelled:
36535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            hitType |= HitTestRequest::Release;
36545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
36555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PlatformTouchPoint::TouchStationary:
365651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            hitType |= HitTestRequest::Active;
36575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
36585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
36595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ASSERT_NOT_REACHED();
36605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
36615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
36625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Increment the platform touch id by 1 to avoid storing a key of 0 in the hashmap.
36645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned touchPointTargetKey = point.id() + 1;
36655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<EventTarget> touchTarget;
36665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (pointState == PlatformTouchPoint::TouchPressed) {
3667926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            HitTestResult result;
3668926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (freshTouchEvents) {
366953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                result = hitTestResultAtPoint(pagePoint, hitType);
3670926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                m_originatingTouchPointTargetKey = touchPointTargetKey;
3671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            } else if (m_originatingTouchPointDocument.get() && m_originatingTouchPointDocument->frame()) {
3672926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                LayoutPoint pagePointInOriginatingDocument = documentPointForWindowPoint(m_originatingTouchPointDocument->frame(), point.pos());
3673926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                result = hitTestResultInFrame(m_originatingTouchPointDocument->frame(), pagePointInOriginatingDocument, hitType);
3674926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            } else
3675926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                continue;
3676521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
36775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Node* node = result.innerNode();
3678521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            if (!node)
3679521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                continue;
36805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Touch events should not go to text nodes
36825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (node->isTextNode())
3683bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)                node = EventPath::parent(node);
36845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            Document& doc = node->document();
3686926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // Record the originating touch document even if it does not have a touch listener.
3687926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (freshTouchEvents) {
36888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)                m_originatingTouchPointDocument = &doc;
3689926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                freshTouchEvents = false;
3690926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
36911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            if (!doc.hasTouchEventHandlers())
36925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                continue;
36935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_originatingTouchPointTargets.set(touchPointTargetKey, node);
36945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            touchTarget = node;
3695a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
3696a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            // FIXME(rbyers): Should really be doing a second hit test that ignores inline elements - crbug.com/319479.
3697a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            TouchAction effectiveTouchAction = computeEffectiveTouchAction(*node);
3698a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (effectiveTouchAction != TouchActionAuto)
3699a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                m_frame->page()->chrome().client().setTouchAction(effectiveTouchAction);
3700a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
37015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (pointState == PlatformTouchPoint::TouchReleased || pointState == PlatformTouchPoint::TouchCancelled) {
37025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // The target should be the original target for this touch, so get it from the hashmap. As it's a release or cancel
37035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // we also remove it from the map.
37045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            touchTarget = m_originatingTouchPointTargets.take(touchPointTargetKey);
37055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else
37065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // No hittest is performed on move or stationary, since the target is not allowed to change anyway.
37075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            touchTarget = m_originatingTouchPointTargets.get(touchPointTargetKey);
37085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!touchTarget.get())
37105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
37118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        Document& doc = touchTarget->toNode()->document();
37121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (!doc.hasTouchEventHandlers())
37135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
37148abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        Frame* targetFrame = doc.frame();
37155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!targetFrame)
37165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
37175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_frame != targetFrame) {
37195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // pagePoint should always be relative to the target elements containing frame.
37205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            pagePoint = documentPointForWindowPoint(targetFrame, point.pos());
37215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
37225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
372353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        float scaleFactor = targetFrame->pageZoomFactor();
37245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int adjustedPageX = lroundf(pagePoint.x() / scaleFactor);
37265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int adjustedPageY = lroundf(pagePoint.y() / scaleFactor);
3727e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        int adjustedRadiusX = lroundf(point.radiusX() / scaleFactor);
3728e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        int adjustedRadiusY = lroundf(point.radiusY() / scaleFactor);
37295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<Touch> touch = Touch::create(targetFrame, touchTarget.get(), point.id(),
37315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                            point.screenPos().x(), point.screenPos().y(),
37325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                            adjustedPageX, adjustedPageY,
3733e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)                                            adjustedRadiusX, adjustedRadiusY,
3734e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)                                            point.rotationAngle(), point.force());
37355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Ensure this target's touch list exists, even if it ends up empty, so it can always be passed to TouchEvent::Create below.
37375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TargetTouchesMap::iterator targetTouchesIterator = touchesByTarget.find(touchTarget.get());
37385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (targetTouchesIterator == touchesByTarget.end())
37395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            targetTouchesIterator = touchesByTarget.set(touchTarget.get(), TouchList::create()).iterator;
37405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // touches and targetTouches should only contain information about touches still on the screen, so if this point is
37425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // released or cancelled it will only appear in the changedTouches list.
37435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (pointState != PlatformTouchPoint::TouchReleased && pointState != PlatformTouchPoint::TouchCancelled) {
37445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            touches->append(touch);
37455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            targetTouchesIterator->value->append(touch);
37465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
37475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Now build up the correct list for changedTouches.
37495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Note that  any touches that are in the TouchStationary state (e.g. if
37505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // the user had several points touched but did not move them all) should
37515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // never be in the changedTouches list so we do not handle them explicitly here.
37525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // See https://bugs.webkit.org/show_bug.cgi?id=37609 for further discussion
37535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // about the TouchStationary state.
37545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (pointState != PlatformTouchPoint::TouchStationary) {
37555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ASSERT(pointState < PlatformTouchPoint::TouchStateEnd);
37565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!changedTouches[pointState].m_touches)
37575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                changedTouches[pointState].m_touches = TouchList::create();
37585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            changedTouches[pointState].m_touches->append(touch);
37595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            changedTouches[pointState].m_targets.add(touchTarget);
37605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
37615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
37625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_touchPressed = touches->length() > 0;
3763926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (allTouchReleased)
3764926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_originatingTouchPointDocument.clear();
37655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Now iterate the changedTouches list and m_targets within it, sending events to the targets as required.
37675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool swallowedEvent = false;
37685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<TouchList> emptyList = TouchList::create();
37695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; ++state) {
37705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!changedTouches[state].m_touches)
37715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
37725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // When sending a touch cancel event, use empty touches and targetTouches lists.
37745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool isTouchCancelEvent = (state == PlatformTouchPoint::TouchCancelled);
37755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<TouchList>& effectiveTouches(isTouchCancelEvent ? emptyList : touches);
37765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const AtomicString& stateName(eventNameForTouchPointState(static_cast<PlatformTouchPoint::State>(state)));
37775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const EventTargetSet& targetsForState = changedTouches[state].m_targets;
37785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (EventTargetSet::const_iterator it = targetsForState.begin(); it != targetsForState.end(); ++it) {
37805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            EventTarget* touchEventTarget = it->get();
37815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RefPtr<TouchList> targetTouches(isTouchCancelEvent ? emptyList : touchesByTarget.get(touchEventTarget));
37825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ASSERT(targetTouches);
37835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RefPtr<TouchEvent> touchEvent =
37855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                TouchEvent::create(effectiveTouches.get(), targetTouches.get(), changedTouches[state].m_touches.get(),
3786bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)                    stateName, touchEventTarget->toNode()->document().domWindow(),
3787bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)                    0, 0, 0, 0, event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey());
3788926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            touchEventTarget->toNode()->dispatchTouchEvent(touchEvent.get());
37895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            swallowedEvent = swallowedEvent || touchEvent->defaultPrevented() || touchEvent->defaultHandled();
37905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
37915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
37925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return swallowedEvent;
37945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
37955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool EventHandler::dispatchSyntheticTouchEventIfEnabled(const PlatformMouseEvent& event)
37975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3798e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (!m_frame || !m_frame->settings() || !m_frame->settings()->touchEventEmulationEnabled())
37995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
38005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PlatformEvent::Type eventType = event.type();
38025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventType != PlatformEvent::MouseMoved && eventType != PlatformEvent::MousePressed && eventType != PlatformEvent::MouseReleased)
38035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
38045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
380519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    HitTestRequest request(HitTestRequest::Active | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
3806926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    MouseEventWithHitTestResults mev = prepareMouseEvent(request, event);
3807926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (mev.scrollbar() || subframeForHitTestResult(mev))
38085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
38095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3810926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // The order is important. This check should follow the subframe test: http://webkit.org/b/111292.
381119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (eventType == PlatformEvent::MouseMoved && event.button() == NoButton)
3812926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
3813926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
38145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SyntheticSingleTouchEvent touchEvent(event);
381519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (handleTouchEvent(touchEvent))
381619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        return true;
381719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
381819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    return handleMouseEventAsEmulatedGesture(event);
381919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)}
382019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
382119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)bool EventHandler::handleMouseEventAsEmulatedGesture(const PlatformMouseEvent& event)
382219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){
382319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    PlatformEvent::Type eventType = event.type();
382451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (event.button() != LeftButton || !m_frame->isMainFrame())
382519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        return false;
382619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
382719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    // Simulate pinch / scroll gesture.
382819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    const IntPoint& position = event.position();
382919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    bool swallowEvent = false;
383019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
383151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    FrameView* view = m_frame->view();
383219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (event.shiftKey()) {
383319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        // Shift pressed - consider it gesture.
383419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        swallowEvent = true;
383551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        Page* page = m_frame->page();
383619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        float pageScaleFactor = page->pageScaleFactor();
383719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        switch (eventType) {
383819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        case PlatformEvent::MousePressed:
383919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            m_lastSyntheticPinchAnchorCss = adoptPtr(new IntPoint(view->scrollPosition() + position));
384019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            m_lastSyntheticPinchAnchorDip = adoptPtr(new IntPoint(position));
384119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            m_lastSyntheticPinchAnchorDip->scale(pageScaleFactor, pageScaleFactor);
384219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            m_syntheticPageScaleFactor = pageScaleFactor;
384319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            break;
384419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        case PlatformEvent::MouseMoved:
384519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            {
384619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                if (!m_lastSyntheticPinchAnchorCss)
384719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                    break;
384819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
384919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                float dy = m_lastSyntheticPinchAnchorDip->y() - position.y() * pageScaleFactor;
385019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                float magnifyDelta = exp(dy * 0.002f);
385119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                float newPageScaleFactor = m_syntheticPageScaleFactor * magnifyDelta;
385219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
385319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                IntPoint anchorCss(*m_lastSyntheticPinchAnchorDip.get());
385419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                anchorCss.scale(1.f / newPageScaleFactor, 1.f / newPageScaleFactor);
385519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                page->inspectorController().requestPageScaleFactor(newPageScaleFactor, *m_lastSyntheticPinchAnchorCss.get() - toIntSize(anchorCss));
385619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                break;
385719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            }
385819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        case PlatformEvent::MouseReleased:
385919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            m_lastSyntheticPinchAnchorCss.clear();
386019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            m_lastSyntheticPinchAnchorDip.clear();
386119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        default:
386219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            break;
386319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        }
386419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    } else {
386519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        switch (eventType) {
386619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        case PlatformEvent::MouseMoved:
386719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            {
386819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                // Always consume move events.
386919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                swallowEvent = true;
387019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                int dx = m_lastSyntheticPanLocation ? position.x() - m_lastSyntheticPanLocation->x() : 0;
387119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                int dy = m_lastSyntheticPanLocation ? position.y() - m_lastSyntheticPanLocation->y() : 0;
387219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                if (dx || dy)
387319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                    view->scrollBy(IntSize(-dx, -dy));
387419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                // Mouse dragged - consider it gesture.
387519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                m_lastSyntheticPanLocation = adoptPtr(new IntPoint(position));
387619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)                break;
387719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            }
387819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        case PlatformEvent::MouseReleased:
387919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            // There was a drag -> gesture.
388019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            swallowEvent = !!m_lastSyntheticPanLocation;
388119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            m_lastSyntheticPanLocation.clear();
388219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        default:
388319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            break;
388419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        }
388519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    }
388619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
388719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    return swallowEvent;
388819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)}
388919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
389019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)bool EventHandler::handleWheelEventAsEmulatedGesture(const PlatformWheelEvent& event)
389119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){
3892e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (!m_frame || !m_frame->settings() || !m_frame->settings()->touchEventEmulationEnabled())
389319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        return false;
389419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
389519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    // Only convert vertical wheel w/ shift into pinch for touch-enabled device convenience.
389619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (!event.shiftKey() || !event.deltaY())
389719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        return false;
389819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
389919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    Page* page = m_frame->page();
390019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    FrameView* view = m_frame->view();
390119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    float pageScaleFactor = page->pageScaleFactor();
390219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    IntPoint anchorBeforeCss(view->scrollPosition() + event.position());
390319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    IntPoint anchorBeforeDip(event.position());
390419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    anchorBeforeDip.scale(pageScaleFactor, pageScaleFactor);
390519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
390619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    float magnifyDelta = exp(event.deltaY() * 0.002f);
390719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    float newPageScaleFactor = pageScaleFactor * magnifyDelta;
390819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
390919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    IntPoint anchorAfterCss(anchorBeforeDip);
391019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    anchorAfterCss.scale(1.f / newPageScaleFactor, 1.f / newPageScaleFactor);
391119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    page->inspectorController().requestPageScaleFactor(newPageScaleFactor, anchorBeforeCss - toIntSize(anchorAfterCss));
391219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    return true;
39135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
39145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3915a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TouchAction EventHandler::computeEffectiveTouchAction(const Node& node)
3916a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
3917a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // Optimization to minimize risk of this new feature (behavior should be identical
3918a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // since there's no way to get non-default touch-action values).
3919a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!RuntimeEnabledFeatures::cssTouchActionEnabled())
3920a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return TouchActionAuto;
3921a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
3922a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // Start by permitting all actions, then walk the block level elements from
3923a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // the target node up to the nearest scrollable ancestor and exclude any
3924a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // prohibited actions. For now this is trivial, but when we add more types
3925a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // of actions it'll get a little more complex.
3926a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    for (const Node* curNode = &node; curNode; curNode = NodeRenderingTraversal::parent(curNode)) {
3927a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // The spec says only block and SVG elements get touch-action.
3928a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        // FIXME(rbyers): Add correct support for SVG, crbug.com/247396.
3929a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (RenderObject* renderer = curNode->renderer()) {
3930a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (renderer->isRenderBlockFlow()) {
3931a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                if (renderer->style()->touchAction() == TouchActionNone)
3932a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                    return TouchActionNone;
3933a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            }
3934a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
3935a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            // If we've reached an ancestor that supports a touch action, search no further.
3936a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            if (renderer->isBox() && toRenderBox(renderer)->scrollsOverflow())
3937a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                break;
3938a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
3939a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
3940a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return TouchActionAuto;
3941a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
3942a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
3943926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void EventHandler::setLastKnownMousePosition(const PlatformMouseEvent& event)
3944926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
3945926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_mousePositionIsUnknown = false;
3946926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_lastKnownMousePosition = event.position();
3947926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_lastKnownMouseGlobalPosition = event.globalPosition();
39485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3949926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
395053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool EventHandler::passMousePressEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe)
395153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
395253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // If we're clicking into a frame that is selected, the frame will appear
395353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // greyed out even though we're clicking on the selection.  This looks
395453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // really strange (having the whole frame be greyed out), so we deselect the
395553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // selection.
395653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    IntPoint p = m_frame->view()->windowToContents(mev.event().position());
39578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (m_frame->selection().contains(p)) {
395853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        VisiblePosition visiblePos(
395953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            mev.targetNode()->renderer()->positionForPoint(mev.localPoint()));
396053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        VisibleSelection newSelection(visiblePos);
39611e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_frame->selection().setSelection(newSelection);
396253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
396353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3964f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    subframe->eventHandler().handleMousePressEvent(mev.event());
396553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
396653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
396753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
396853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool EventHandler::passMouseMoveEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe, HitTestResult* hoveredNode)
396953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
397053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_mouseDownMayStartDrag && !m_mouseDownWasInSubframe)
397153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
3972f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    subframe->eventHandler().handleMouseMoveOrLeaveEvent(mev.event(), hoveredNode);
397353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
397453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
397553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
397653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool EventHandler::passMouseReleaseEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe)
397753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
3978f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    subframe->eventHandler().handleMouseReleaseEvent(mev.event());
397953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
398053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
398153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
398253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool EventHandler::passWheelEventToWidget(const PlatformWheelEvent& wheelEvent, Widget* widget)
398353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
398453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // We can sometimes get a null widget!  EventHandlerMac handles a null
398553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // widget by returning false, so we do the same.
398653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!widget)
398753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
398853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
398953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // If not a FrameView, then probably a plugin widget.  Those will receive
399053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // the event via an EventTargetNode dispatch when this returns false.
399153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!widget->isFrameView())
399253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
399353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3994f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return toFrameView(widget)->frame().eventHandler().handleWheelEvent(wheelEvent);
399553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
399653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
399753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool EventHandler::passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults& event)
399853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
399953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Figure out which view to send the event to.
400053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!event.targetNode() || !event.targetNode()->renderer() || !event.targetNode()->renderer()->isWidget())
400153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
400253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return false;
400353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
400453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
400553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)PassRefPtr<Clipboard> EventHandler::createDraggingClipboard() const
400653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
40071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return Clipboard::create(Clipboard::DragAndDrop, ClipboardWritable, ChromiumDataObject::create());
400853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
400953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
401053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void EventHandler::focusDocumentView()
401153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
401253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Page* page = m_frame->page();
401353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!page)
401453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
40153c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    page->focusController().setFocusedFrame(m_frame);
401653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
401753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
401853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)unsigned EventHandler::accessKeyModifiers()
401953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
40208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
402153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return PlatformEvent::CtrlKey | PlatformEvent::AltKey;
402253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#else
402353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return PlatformEvent::AltKey;
402453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#endif
402553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
402653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
4027926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} // namespace WebCore
4028