Changeset 18951 in webkit


Ignore:
Timestamp:
Jan 18, 2007 1:14:26 PM (17 years ago)
Author:
hyatt
Message:

Make sure layer autoscrolling puts the event coordinates into the layer's coordinate space before
calling hitTest on it. Fixes "flashy" selection in textareas.

Reviewed by darin

  • rendering/RenderLayer.cpp: (WebCore::RenderLayer::autoscroll):
  • rendering/RenderTextControl.cpp: (WebCore::RenderTextControl::nodeAtPoint):
Location:
trunk/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r18950 r18951  
     12007-01-18  David Hyatt  <hyatt@apple.com>
     2
     3        Make sure layer autoscrolling puts the event coordinates into the layer's coordinate space before
     4        calling hitTest on it.  Fixes "flashy" selection in textareas.
     5
     6        Reviewed by darin
     7
     8        * rendering/RenderLayer.cpp:
     9        (WebCore::RenderLayer::autoscroll):
     10        * rendering/RenderTextControl.cpp:
     11        (WebCore::RenderTextControl::nodeAtPoint):
     12
    1132007-01-18  Anders Carlsson  <acarlsson@apple.com>
    214
  • trunk/WebCore/rendering/RenderLayer.cpp

    r18838 r18951  
    871871   
    872872    if (currentFrame->eventHandler()->mouseDownMayStartSelect()) {
     873        // Convert the mouse position to local layer space.
     874        int objectX, objectY;
     875        renderer()->absolutePosition(objectX, objectY);
     876        currentPos.move(-objectX, -objectY);
    873877        HitTestRequest request(true, false, true);
    874878        HitTestResult result(currentPos);
  • trunk/WebCore/rendering/RenderTextControl.cpp

    r18944 r18951  
    590590    // and act as if we've hit the close block if we're to the right of the inner text block.
    591591
    592     if (RenderBlock::nodeAtPoint(request, result, x, y, tx, ty, hitTestAction)) {
    593         Node* leftNode;
    594         Node* rightNode;
    595         if (style()->direction() == LTR) {
    596             leftNode = m_resultsButton.get();
    597             rightNode = m_cancelButton.get();
    598         } else {
    599             leftNode = m_cancelButton.get();
    600             rightNode = m_resultsButton.get();
     592    if (RenderBlock::nodeAtPoint(request, result, x, y, tx, ty, hitTestAction) &&
     593        (result.innerNode() == element() || result.innerNode() == m_innerBlock)) {
     594        IntPoint localPoint = IntPoint(x - tx - m_x, y - ty - m_y);
     595        if (m_innerBlock) {
     596            Node* leftNode;
     597            Node* rightNode;
     598            if (style()->direction() == LTR) {
     599                leftNode = m_resultsButton.get();
     600                rightNode = m_cancelButton.get();
     601            } else {
     602                leftNode = m_cancelButton.get();
     603                rightNode = m_resultsButton.get();
     604            }
     605           
     606            int textLeft = tx + m_x + m_innerBlock->renderer()->xPos() + m_innerText->renderer()->xPos();
     607            int textRight = textLeft + m_innerText->renderer()->width();
     608            if (leftNode && x < textLeft) {
     609                result.setInnerNode(leftNode);
     610                result.setLocalPoint(IntPoint(localPoint.x() - m_innerText->renderer()->xPos() - m_innerBlock->renderer()->xPos() - leftNode->renderer()->xPos(),
     611                                              localPoint.y() - m_innerText->renderer()->yPos() - m_innerBlock->renderer()->yPos() - leftNode->renderer()->yPos()));
     612                return true;
     613            }
     614            if (rightNode && x > textRight) {
     615                result.setInnerNode(rightNode);
     616                result.setLocalPoint(IntPoint(localPoint.x() - m_innerText->renderer()->xPos() - m_innerBlock->renderer()->xPos() - rightNode->renderer()->xPos(),
     617                                              localPoint.y() - m_innerText->renderer()->yPos() - m_innerBlock->renderer()->yPos() - rightNode->renderer()->yPos()));
     618                return true;
     619            }
    601620        }
    602         if (leftNode && x < m_innerText->renderer()->absoluteBoundingBoxRect().x())
    603             result.setInnerNode(leftNode);
    604         else if (rightNode && x > m_innerText->renderer()->absoluteBoundingBoxRect().right())
    605             result.setInnerNode(rightNode);
    606         else
    607             result.setInnerNode(m_innerText.get());
     621       
     622        // Hit the inner text block.
     623        result.setInnerNode(m_innerText.get());
     624        result.setLocalPoint(IntPoint(localPoint.x() - m_innerText->renderer()->xPos() - (m_innerBlock.get() ? m_innerBlock->renderer()->xPos() : 0),
     625                                      localPoint.y() - m_innerText->renderer()->yPos() - (m_innerBlock.get() ? m_innerBlock->renderer()->yPos() : 0)));
     626       
    608627        return true;
    609628    }
     629
    610630    return false;
    611631}
Note: See TracChangeset for help on using the changeset viewer.