Changeset 87101 in webkit
- Timestamp:
- May 23, 2011 3:15:19 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r87099 r87101 1 2011-05-23 Emil A Eklund <eae@chromium.org> 2 3 Reviewed by Eric Seidel. 4 5 Change RenderBlock hit testing to use IntPoint instead x,y pair 6 https://bugs.webkit.org/show_bug.cgi?id=61146 7 8 Covered by existing tests. 9 10 * platform/graphics/IntPoint.h: 11 (WebCore::toSize): 12 Add toSize function for converting from point to size. 13 14 * rendering/RenderBlock.cpp: 15 (WebCore::RenderBlock::isPointInOverflowControl): 16 (WebCore::RenderBlock::nodeAtPoint): 17 (WebCore::RenderBlock::hitTestFloats): 18 (WebCore::RenderBlock::hitTestColumns): 19 (WebCore::RenderBlock::hitTestContents): 20 * rendering/RenderBlock.h: 21 Change hit testing code in RenderBlock to use IntPoint. 22 23 * rendering/RenderListBox.cpp: 24 (WebCore::RenderListBox::isPointInOverflowControl): 25 * rendering/RenderListBox.h: 26 Change overridden method to use IntPoint. 27 1 28 2011-05-23 Mike Reed <reed@google.com> 2 29 -
trunk/Source/WebCore/platform/graphics/IntPoint.h
r84101 r87101 206 206 } 207 207 208 inline IntSize toSize(const IntPoint& a) 209 { 210 return IntSize(a.x(), a.y()); 211 } 212 208 213 #if PLATFORM(QT) 209 214 inline QDataStream& operator<<(QDataStream& stream, const IntPoint& point) -
trunk/Source/WebCore/rendering/RenderBlock.cpp
r87019 r87101 3890 3890 } 3891 3891 3892 bool RenderBlock::isPointInOverflowControl(HitTestResult& result, int _x, int _y, int _tx, int _ty)3892 bool RenderBlock::isPointInOverflowControl(HitTestResult& result, const IntPoint& pointInContainer, int tx, int ty) 3893 3893 { 3894 3894 if (!scrollsOverflow()) 3895 3895 return false; 3896 3896 3897 return layer()->hitTestOverflowControls(result, IntPoint(_x - _tx, _y - _ty));3897 return layer()->hitTestOverflowControls(result, pointInContainer - IntSize(tx, ty)); 3898 3898 } 3899 3899 … … 3910 3910 } 3911 3911 3912 if ((hitTestAction == HitTestBlockBackground || hitTestAction == HitTestChildBlockBackground) && isPointInOverflowControl(result, pointInContainer .x(), pointInContainer.y(), localOffset.width(), localOffset.height())) {3912 if ((hitTestAction == HitTestBlockBackground || hitTestAction == HitTestChildBlockBackground) && isPointInOverflowControl(result, pointInContainer, localOffset.width(), localOffset.height())) { 3913 3913 updateHitTestResult(result, pointInContainer - localOffset); 3914 3914 // FIXME: isPointInOverflowControl() doesn't handle rect-based tests yet. … … 3931 3931 // Hit test contents if we don't have columns. 3932 3932 if (!hasColumns()) { 3933 if (hitTestContents(request, result, pointInContainer .x(), pointInContainer.y(), scrolledOffset.width(), scrolledOffset.height(), hitTestAction)) {3933 if (hitTestContents(request, result, pointInContainer, scrolledOffset.width(), scrolledOffset.height(), hitTestAction)) { 3934 3934 updateHitTestResult(result, pointInContainer - localOffset); 3935 3935 return true; 3936 3936 } 3937 if (hitTestAction == HitTestFloat && hitTestFloats(request, result, pointInContainer .x(), pointInContainer.y(), scrolledOffset.width(), scrolledOffset.height()))3937 if (hitTestAction == HitTestFloat && hitTestFloats(request, result, pointInContainer, scrolledOffset.width(), scrolledOffset.height())) 3938 3938 return true; 3939 } else if (hitTestColumns(request, result, pointInContainer .x(), pointInContainer.y(), scrolledOffset.width(), scrolledOffset.height(), hitTestAction)) {3939 } else if (hitTestColumns(request, result, pointInContainer, scrolledOffset.width(), scrolledOffset.height(), hitTestAction)) { 3940 3940 updateHitTestResult(result, pointInContainer - localOffset); 3941 3941 return true; … … 3956 3956 } 3957 3957 3958 bool RenderBlock::hitTestFloats(const HitTestRequest& request, HitTestResult& result, int x, int y, int tx, int ty)3958 bool RenderBlock::hitTestFloats(const HitTestRequest& request, HitTestResult& result, const IntPoint& pointInContainer, int tx, int ty) 3959 3959 { 3960 3960 if (!m_floatingObjects) … … 3975 3975 int yOffset = yPositionForFloatIncludingMargin(floatingObject) - floatingObject->m_renderer->y(); 3976 3976 IntPoint childPoint = flipFloatForWritingMode(floatingObject, IntPoint(tx + xOffset, ty + yOffset)); 3977 if (floatingObject->m_renderer->hitTest(request, result, IntPoint(x, y), childPoint.x(), childPoint.y())) {3978 updateHitTestResult(result, IntPoint(x - childPoint.x(), y - childPoint.y()));3977 if (floatingObject->m_renderer->hitTest(request, result, pointInContainer, childPoint.x(), childPoint.y())) { 3978 updateHitTestResult(result, pointInContainer - toSize(childPoint)); 3979 3979 return true; 3980 3980 } … … 3985 3985 } 3986 3986 3987 bool RenderBlock::hitTestColumns(const HitTestRequest& request, HitTestResult& result, int x, int y, int tx, int ty, HitTestAction hitTestAction)3987 bool RenderBlock::hitTestColumns(const HitTestRequest& request, HitTestResult& result, const IntPoint& pointInContainer, int tx, int ty, HitTestAction hitTestAction) 3988 3988 { 3989 3989 // We need to do multiple passes, breaking up our hit testing into strips. … … 4015 4015 colRect.move(tx, ty); 4016 4016 4017 if (colRect.intersects(result.rectForPoint( IntPoint(x, y)))) {4017 if (colRect.intersects(result.rectForPoint(pointInContainer))) { 4018 4018 // The point is inside this column. 4019 4019 // Adjust tx and ty to change where we hit test. … … 4022 4022 int finalX = tx + offset.width(); 4023 4023 int finalY = ty + offset.height(); 4024 if (result.isRectBasedTest() && !colRect.contains(result.rectForPoint( IntPoint(x, y))))4025 hitTestContents(request, result, x, y, finalX, finalY, hitTestAction);4024 if (result.isRectBasedTest() && !colRect.contains(result.rectForPoint(pointInContainer))) 4025 hitTestContents(request, result, pointInContainer, finalX, finalY, hitTestAction); 4026 4026 else 4027 return hitTestContents(request, result, x, y, finalX, finalY, hitTestAction) || (hitTestAction == HitTestFloat && hitTestFloats(request, result, x, y, finalX, finalY));4027 return hitTestContents(request, result, pointInContainer, finalX, finalY, hitTestAction) || (hitTestAction == HitTestFloat && hitTestFloats(request, result, pointInContainer, finalX, finalY)); 4028 4028 } 4029 4029 } … … 4032 4032 } 4033 4033 4034 bool RenderBlock::hitTestContents(const HitTestRequest& request, HitTestResult& result, int x, int y, int tx, int ty, HitTestAction hitTestAction)4034 bool RenderBlock::hitTestContents(const HitTestRequest& request, HitTestResult& result, const IntPoint& pointInContainer, int tx, int ty, HitTestAction hitTestAction) 4035 4035 { 4036 4036 if (childrenInline() && !isTable()) { 4037 4037 // We have to hit-test our line boxes. 4038 if (m_lineBoxes.hitTest(this, request, result, IntPoint(x, y), tx, ty, hitTestAction))4038 if (m_lineBoxes.hitTest(this, request, result, pointInContainer, tx, ty, hitTestAction)) 4039 4039 return true; 4040 4040 } else { … … 4045 4045 for (RenderBox* child = lastChildBox(); child; child = child->previousSiblingBox()) { 4046 4046 IntPoint childPoint = flipForWritingMode(child, IntPoint(tx, ty), ParentToChildFlippingAdjustment); 4047 if (!child->hasSelfPaintingLayer() && !child->isFloating() && child->nodeAtPoint(request, result, IntPoint(x, y), childPoint.x(), childPoint.y(), childHitTest))4047 if (!child->hasSelfPaintingLayer() && !child->isFloating() && child->nodeAtPoint(request, result, pointInContainer, childPoint.x(), childPoint.y(), childHitTest)) 4048 4048 return true; 4049 4049 } -
trunk/Source/WebCore/rendering/RenderBlock.h
r86739 r87101 585 585 int nextFloatLogicalBottomBelow(int) const; 586 586 587 virtual bool hitTestColumns(const HitTestRequest&, HitTestResult&, int x, int y, int tx, int ty, HitTestAction);588 virtual bool hitTestContents(const HitTestRequest&, HitTestResult&, int x, int y, int tx, int ty, HitTestAction);589 bool hitTestFloats(const HitTestRequest&, HitTestResult&, int x, int y, int tx, int ty);590 591 virtual bool isPointInOverflowControl(HitTestResult&, int x, int y, int tx, int ty);587 virtual bool hitTestColumns(const HitTestRequest&, HitTestResult&, const IntPoint& pointInContainer, int tx, int ty, HitTestAction); 588 virtual bool hitTestContents(const HitTestRequest&, HitTestResult&, const IntPoint& pointInContainer, int tx, int ty, HitTestAction); 589 bool hitTestFloats(const HitTestRequest&, HitTestResult&, const IntPoint& pointInContainer, int tx, int ty); 590 591 virtual bool isPointInOverflowControl(HitTestResult&, const IntPoint& pointInContainer, int tx, int ty); 592 592 593 593 void computeInlinePreferredLogicalWidths(); -
trunk/Source/WebCore/rendering/RenderListBox.cpp
r86739 r87101 435 435 } 436 436 437 bool RenderListBox::isPointInOverflowControl(HitTestResult& result, int _x, int _y, int _tx, int _ty)437 bool RenderListBox::isPointInOverflowControl(HitTestResult& result, const IntPoint& pointInContainer, int tx, int ty) 438 438 { 439 439 if (!m_vBar) 440 440 return false; 441 441 442 IntRect vertRect( _tx + width() - borderRight() - m_vBar->width(),443 _ty + borderTop(),442 IntRect vertRect(tx + width() - borderRight() - m_vBar->width(), 443 ty + borderTop(), 444 444 m_vBar->width(), 445 445 height() - borderTop() - borderBottom()); 446 446 447 if (vertRect.contains( _x, _y)) {447 if (vertRect.contains(pointInContainer)) { 448 448 result.setScrollbar(m_vBar.get()); 449 449 return true; -
trunk/Source/WebCore/rendering/RenderListBox.h
r86705 r87101 69 69 virtual IntRect controlClipRect(int tx, int ty) const; 70 70 71 virtual bool isPointInOverflowControl(HitTestResult&, int x, int y, int tx, int ty);71 virtual bool isPointInOverflowControl(HitTestResult&, const IntPoint& pointInContainer, int tx, int ty); 72 72 73 73 virtual bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1, Node** stopNode = 0);
Note: See TracChangeset
for help on using the changeset viewer.