Commit 6ed6d831 authored by hyatt's avatar hyatt

Make sure layer autoscrolling puts the event coordinates into the...

        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):



git-svn-id: svn://svn.chromium.org/blink/trunk@18951 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 95bb1970
2007-01-18 David Hyatt <hyatt@apple.com>
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):
2007-01-18 Anders Carlsson <acarlsson@apple.com> 2007-01-18 Anders Carlsson <acarlsson@apple.com>
Reviewed by Adam. Reviewed by Adam.
......
...@@ -870,6 +870,10 @@ void RenderLayer::autoscroll() ...@@ -870,6 +870,10 @@ void RenderLayer::autoscroll()
IntPoint currentPos = currentFrame->view()->windowToContents(currentFrame->eventHandler()->currentMousePosition()); IntPoint currentPos = currentFrame->view()->windowToContents(currentFrame->eventHandler()->currentMousePosition());
if (currentFrame->eventHandler()->mouseDownMayStartSelect()) { if (currentFrame->eventHandler()->mouseDownMayStartSelect()) {
// Convert the mouse position to local layer space.
int objectX, objectY;
renderer()->absolutePosition(objectX, objectY);
currentPos.move(-objectX, -objectY);
HitTestRequest request(true, false, true); HitTestRequest request(true, false, true);
HitTestResult result(currentPos); HitTestResult result(currentPos);
if (hitTest(request, result) && result.innerNode()->renderer()) { if (hitTest(request, result) && result.innerNode()->renderer()) {
......
...@@ -589,24 +589,44 @@ bool RenderTextControl::nodeAtPoint(const HitTestRequest& request, HitTestResult ...@@ -589,24 +589,44 @@ bool RenderTextControl::nodeAtPoint(const HitTestRequest& request, HitTestResult
// In a search field, we want to act as if we've hit the results block if we're to the left of the inner text block, // In a search field, we want to act as if we've hit the results block if we're to the left of the inner text block,
// and act as if we've hit the close block if we're to the right of the inner text block. // and act as if we've hit the close block if we're to the right of the inner text block.
if (RenderBlock::nodeAtPoint(request, result, x, y, tx, ty, hitTestAction)) { if (RenderBlock::nodeAtPoint(request, result, x, y, tx, ty, hitTestAction) &&
Node* leftNode; (result.innerNode() == element() || result.innerNode() == m_innerBlock)) {
Node* rightNode; IntPoint localPoint = IntPoint(x - tx - m_x, y - ty - m_y);
if (style()->direction() == LTR) { if (m_innerBlock) {
leftNode = m_resultsButton.get(); Node* leftNode;
rightNode = m_cancelButton.get(); Node* rightNode;
} else { if (style()->direction() == LTR) {
leftNode = m_cancelButton.get(); leftNode = m_resultsButton.get();
rightNode = m_resultsButton.get(); rightNode = m_cancelButton.get();
} else {
leftNode = m_cancelButton.get();
rightNode = m_resultsButton.get();
}
int textLeft = tx + m_x + m_innerBlock->renderer()->xPos() + m_innerText->renderer()->xPos();
int textRight = textLeft + m_innerText->renderer()->width();
if (leftNode && x < textLeft) {
result.setInnerNode(leftNode);
result.setLocalPoint(IntPoint(localPoint.x() - m_innerText->renderer()->xPos() - m_innerBlock->renderer()->xPos() - leftNode->renderer()->xPos(),
localPoint.y() - m_innerText->renderer()->yPos() - m_innerBlock->renderer()->yPos() - leftNode->renderer()->yPos()));
return true;
}
if (rightNode && x > textRight) {
result.setInnerNode(rightNode);
result.setLocalPoint(IntPoint(localPoint.x() - m_innerText->renderer()->xPos() - m_innerBlock->renderer()->xPos() - rightNode->renderer()->xPos(),
localPoint.y() - m_innerText->renderer()->yPos() - m_innerBlock->renderer()->yPos() - rightNode->renderer()->yPos()));
return true;
}
} }
if (leftNode && x < m_innerText->renderer()->absoluteBoundingBoxRect().x())
result.setInnerNode(leftNode); // Hit the inner text block.
else if (rightNode && x > m_innerText->renderer()->absoluteBoundingBoxRect().right()) result.setInnerNode(m_innerText.get());
result.setInnerNode(rightNode); result.setLocalPoint(IntPoint(localPoint.x() - m_innerText->renderer()->xPos() - (m_innerBlock.get() ? m_innerBlock->renderer()->xPos() : 0),
else localPoint.y() - m_innerText->renderer()->yPos() - (m_innerBlock.get() ? m_innerBlock->renderer()->yPos() : 0)));
result.setInnerNode(m_innerText.get());
return true; return true;
} }
return false; return false;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment