Changeset 106554 in webkit


Ignore:
Timestamp:
Feb 2, 2012 7:09:48 AM (12 years ago)
Author:
commit-queue@webkit.org
Message:

Source/WebCore: Update active and hover state on touch release.
https://bugs.webkit.org/show_bug.cgi?id=77620

Patch by Allan Sandfeld Jensen <allan.jensen@nokia.com> on 2012-02-02
Reviewed by Kenneth Rohde Christiansen.

  • rendering/HitTestRequest.h:

(WebCore::HitTestRequest::move):
(WebCore::HitTestRequest::release):
(WebCore::HitTestRequest::touchEvent):
(WebCore::HitTestRequest::mouseEvent):
(WebCore::HitTestRequest::touchMove):
(WebCore::HitTestRequest::touchRelease):

Rename the enum values in HitTestRequest to be mouse/touch
agnostic, and add value for recognizing touch events.

  • rendering/RenderFrameSet.cpp:

(WebCore::RenderFrameSet::nodeAtPoint): Update for HitTestRequest rename.

  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::hitTest): ditto
(WebCore::RenderLayer::updateHoverActiveState): Reset hoverstate on touch release.

  • page/EventHandler.cpp:

(WebCore::EventHandler::updateSelectionForMouseDrag): Update for HitTestRequest rename.
(WebCore::EventHandler::handleMouseMoveEvent): ditto
(WebCore::EventHandler::handleMouseReleaseEvent): ditto
(WebCore::EventHandler::hoverTimerFired): ditto
(WebCore::EventHandler::dragSourceEndedAt): ditto
(WebCore::EventHandler::handleTouchEvent): Hittest touch release to reset

active and hover states and add touch enum to all touch hittests.

Source/WebKit/chromium: Update enum name for HitTestRequest::RequestType
https://bugs.webkit.org/show_bug.cgi?id=77620

Patch by Allan Sandfeld Jensen <allan.jensen@nokia.com> on 2012-02-02
Reviewed by Kenneth Rohde Christiansen.

  • src/WebFrameImpl.cpp:

(WebKit::WebFrameImpl::visiblePositionForWindowPoint):

Location:
trunk/Source
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r106552 r106554  
     12012-02-02  Allan Sandfeld Jensen  <allan.jensen@nokia.com>
     2
     3        Update active and hover state on touch release.
     4        https://bugs.webkit.org/show_bug.cgi?id=77620
     5
     6        Reviewed by Kenneth Rohde Christiansen.
     7
     8        * rendering/HitTestRequest.h:
     9        (WebCore::HitTestRequest::move):
     10        (WebCore::HitTestRequest::release):
     11        (WebCore::HitTestRequest::touchEvent):
     12        (WebCore::HitTestRequest::mouseEvent):
     13        (WebCore::HitTestRequest::touchMove):
     14        (WebCore::HitTestRequest::touchRelease):
     15            Rename the enum values in HitTestRequest to be mouse/touch
     16            agnostic, and add value for recognizing touch events.
     17        * rendering/RenderFrameSet.cpp:
     18        (WebCore::RenderFrameSet::nodeAtPoint): Update for HitTestRequest rename.
     19        * rendering/RenderLayer.cpp:
     20        (WebCore::RenderLayer::hitTest): ditto
     21        (WebCore::RenderLayer::updateHoverActiveState): Reset hoverstate on touch release.
     22        * page/EventHandler.cpp:
     23        (WebCore::EventHandler::updateSelectionForMouseDrag): Update for HitTestRequest rename.
     24        (WebCore::EventHandler::handleMouseMoveEvent): ditto
     25        (WebCore::EventHandler::handleMouseReleaseEvent): ditto
     26        (WebCore::EventHandler::hoverTimerFired): ditto
     27        (WebCore::EventHandler::dragSourceEndedAt): ditto
     28        (WebCore::EventHandler::handleTouchEvent): Hittest touch release to reset
     29            active and hover states and add touch enum to all touch hittests.
     30
    1312012-02-02  Pavel Feldman  <pfeldman@google.com>
    232
  • trunk/Source/WebCore/page/EventHandler.cpp

    r106488 r106554  
    647647    HitTestRequest request(HitTestRequest::ReadOnly |
    648648                           HitTestRequest::Active |
    649                            HitTestRequest::MouseMove);
     649                           HitTestRequest::Move);
    650650    HitTestResult result(view->windowToContents(m_currentMousePosition));
    651651    layer->hitTest(request, result);
     
    16211621        return m_lastScrollbarUnderMouse->mouseMoved(mouseEvent);
    16221622
    1623     HitTestRequest::HitTestRequestType hitType = HitTestRequest::MouseMove;
     1623    HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move;
    16241624    if (m_mousePressed)
    16251625        hitType |= HitTestRequest::Active;
     
    17281728    }
    17291729
    1730     HitTestRequest request(HitTestRequest::MouseUp);
     1730    HitTestRequest request(HitTestRequest::Release);
    17311731    MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent);
    17321732    Frame* subframe = m_capturingMouseEventsNode.get() ? subframeForTargetNode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev);
     
    24572457    if (RenderView* renderer = m_frame->contentRenderer()) {
    24582458        if (FrameView* view = m_frame->view()) {
    2459             HitTestRequest request(HitTestRequest::MouseMove);
     2459            HitTestRequest request(HitTestRequest::Move);
    24602460            HitTestResult result(view->windowToContents(m_currentMousePosition));
    24612461            renderer->layer()->hitTest(request, result);
     
    27742774{
    27752775    // Send a hit test request so that RenderLayer gets a chance to update the :hover and :active pseudoclasses.
    2776     HitTestRequest request(HitTestRequest::MouseUp);
     2776    HitTestRequest request(HitTestRequest::Release);
    27772777    prepareMouseEvent(request, event);
    27782778
     
    32333233        LayoutPoint pagePoint = documentPointForWindowPoint(m_frame, point.pos());
    32343234
    3235         HitTestRequest::HitTestRequestType hitType = HitTestRequest::Active | HitTestRequest::ReadOnly;
     3235        HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEvent;
    32363236        // The HitTestRequest types used for mouse events map quite adequately
    32373237        // to touch events. Note that in addition to meaning that the hit test
     
    32413241        switch (pointState) {
    32423242        case PlatformTouchPoint::TouchPressed:
    3243             hitType = HitTestRequest::Active;
     3243            hitType |= HitTestRequest::Active;
    32443244            break;
    32453245        case PlatformTouchPoint::TouchMoved:
    3246             hitType = HitTestRequest::Active | HitTestRequest::MouseMove | HitTestRequest::ReadOnly;
     3246            hitType |= HitTestRequest::Active | HitTestRequest::Move | HitTestRequest::ReadOnly;
    32473247            break;
    32483248        case PlatformTouchPoint::TouchReleased:
    32493249        case PlatformTouchPoint::TouchCancelled:
    3250             hitType = HitTestRequest::MouseUp;
     3250            hitType |= HitTestRequest::Release;
    32513251            break;
    32523252        default:
     3253            ASSERT_NOT_REACHED();
    32533254            break;
    32543255        }
     
    32753276            touchTarget = node;
    32763277        } else if (pointState == PlatformTouchPoint::TouchReleased || pointState == PlatformTouchPoint::TouchCancelled) {
     3278            // We only perform a hittest on release or cancel to unset :active or :hover state.
     3279            hitTestResultAtPoint(pagePoint, /*allowShadowContent*/ false, false, DontHitTestScrollbars, hitType);
    32773280            // The target should be the original target for this touch, so get it from the hashmap. As it's a release or cancel
    32783281            // we also remove it from the map.
    32793282            touchTarget = m_originatingTouchPointTargets.take(touchPointTargetKey);
    32803283        } else
     3284            // No hittest is performed on move, since the target is not allowed to change anyway.
    32813285            touchTarget = m_originatingTouchPointTargets.get(touchPointTargetKey);
    32823286
  • trunk/Source/WebCore/rendering/HitTestRequest.h

    r92993 r106554  
    22 * Copyright (C) 2006 Apple Computer, Inc.
    33 * Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
     4 * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies)
    45 *
    56 * This library is free software; you can redistribute it and/or
     
    3031        ReadOnly = 1 << 1,
    3132        Active = 1 << 2,
    32         MouseMove = 1 << 3,
    33         MouseUp = 1 << 4,
     33        Move = 1 << 3,
     34        Release = 1 << 4,
    3435        IgnoreClipping = 1 << 5,
    35         SVGClipContent = 1 << 6
     36        SVGClipContent = 1 << 6,
     37        TouchEvent = 1 << 7
    3638    };
    3739
     
    4547    bool readOnly() const { return m_requestType & ReadOnly; }
    4648    bool active() const { return m_requestType & Active; }
    47     bool mouseMove() const { return m_requestType & MouseMove; }
    48     bool mouseUp() const { return m_requestType & MouseUp; }
     49    bool move() const { return m_requestType & Move; }
     50    bool release() const { return m_requestType & Release; }
    4951    bool ignoreClipping() const { return m_requestType & IgnoreClipping; }
    5052    bool svgClipContent() const { return m_requestType & SVGClipContent; }
     53    bool touchEvent() const { return m_requestType & TouchEvent; }
     54    bool mouseEvent() const { return !touchEvent(); }
     55
     56    // Convenience functions
     57    bool touchMove() const { return move() && touchEvent(); }
     58    bool touchRelease() const { return release() && touchEvent(); }
    5159
    5260    HitTestRequestType type() const { return m_requestType; }
  • trunk/Source/WebCore/rendering/RenderFrameSet.cpp

    r104552 r106554  
    168168
    169169    if (inside && frameSet()->noResize()
    170             && !request.readOnly() && !result.innerNode()) {
     170            && !request.readOnly() && !result.innerNode() && !request.touchMove()) {
    171171        result.setInnerNode(node());
    172172        result.setInnerNonSharedNode(node());
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r106281 r106554  
    31053105        // return ourselves. We do this so mouse events continue getting delivered after a drag has
    31063106        // exited the WebView, and so hit testing over a scrollbar hits the content document.
    3107         if ((request.active() || request.mouseUp()) && renderer()->isRenderView()) {
     3107        if ((request.active() || request.release()) && renderer()->isRenderView()) {
    31083108            renderer()->updateHitTestResult(result, result.point());
    31093109            insideLayer = this;
     
    40144014    } else {
    40154015        Node* newActiveNode = result.innerNode();
    4016         if (!activeNode && newActiveNode && request.active()) {
     4016        if (!activeNode && newActiveNode && request.active() && !request.touchMove()) {
    40174017            // We are setting the :active chain and freezing it. If future moves happen, they
    40184018            // will need to reference this chain.
    40194019            for (RenderObject* curr = newActiveNode->renderer(); curr; curr = curr->parent()) {
    4020                 if (curr->node() && !curr->isText()) {
     4020                if (curr->node() && !curr->isText())
    40214021                    curr->node()->setInActiveChain();
    4022                 }
    40234022            }
    40244023            doc->setActiveNode(newActiveNode);
     
    40324031    // :hover/:active to only apply to elements that are in the :active chain that we froze
    40334032    // at the time the mouse went down.
    4034     bool mustBeInActiveChain = request.active() && request.mouseMove();
    4035 
    4036     // Check to see if the hovered node has changed.  If not, then we don't need to
    4037     // do anything. 
     4033    bool mustBeInActiveChain = request.active() && request.move();
     4034
    40384035    RefPtr<Node> oldHoverNode = doc->hoverNode();
     4036    // Clear the :hover chain when the touch gesture is over.
     4037    if (request.touchRelease()) {
     4038        if (oldHoverNode) {
     4039            for (RenderObject* curr = oldHoverNode->renderer(); curr; curr = curr->parent()) {
     4040                if (curr->node() && !curr->isText())
     4041                    curr->node()->setHovered(false);
     4042            }
     4043            doc->setHoverNode(0);
     4044        }
     4045        // A touch release can not set new hover or active target.
     4046        return;
     4047    }
     4048
     4049    // Check to see if the hovered node has changed.
     4050    // If it hasn't, we do not need to do anything.
    40394051    Node* newHoverNode = result.innerNode();
    40404052    if (newHoverNode && !newHoverNode->renderer())
  • trunk/Source/WebKit/chromium/ChangeLog

    r106542 r106554  
     12012-02-02  Allan Sandfeld Jensen  <allan.jensen@nokia.com>
     2
     3        Update enum name for HitTestRequest::RequestType
     4        https://bugs.webkit.org/show_bug.cgi?id=77620
     5
     6        Reviewed by Kenneth Rohde Christiansen.
     7
     8        * src/WebFrameImpl.cpp:
     9        (WebKit::WebFrameImpl::visiblePositionForWindowPoint):
     10
    1112012-02-02  Kinuko Yasuda  <kinuko@chromium.org>
    212
  • trunk/Source/WebKit/chromium/src/WebFrameImpl.cpp

    r106216 r106554  
    13851385VisiblePosition WebFrameImpl::visiblePositionForWindowPoint(const WebPoint& point)
    13861386{
    1387     HitTestRequest::HitTestRequestType hitType = HitTestRequest::MouseMove;
     1387    HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move;
    13881388    hitType |= HitTestRequest::ReadOnly;
    13891389    hitType |= HitTestRequest::Active;
Note: See TracChangeset for help on using the changeset viewer.