| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) | 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) |
| 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) |
| 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. | 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. |
| 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. | 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. |
| 8 * | 8 * |
| 9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
| 10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
| (...skipping 1173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1184 if (style()->boxSizing() == BoxSizingBorderBox) | 1184 if (style()->boxSizing() == BoxSizingBorderBox) |
| 1185 result -= borderAndPaddingLogicalHeight(); | 1185 result -= borderAndPaddingLogicalHeight(); |
| 1186 return std::max(LayoutUnit(), result); | 1186 return std::max(LayoutUnit(), result); |
| 1187 } | 1187 } |
| 1188 | 1188 |
| 1189 // Hit Testing | 1189 // Hit Testing |
| 1190 bool LayoutBox::nodeAtPoint(HitTestResult& result, const HitTestLocation& locati
onInContainer, const LayoutPoint& accumulatedOffset, HitTestAction action) | 1190 bool LayoutBox::nodeAtPoint(HitTestResult& result, const HitTestLocation& locati
onInContainer, const LayoutPoint& accumulatedOffset, HitTestAction action) |
| 1191 { | 1191 { |
| 1192 LayoutPoint adjustedLocation = accumulatedOffset + location(); | 1192 LayoutPoint adjustedLocation = accumulatedOffset + location(); |
| 1193 | 1193 |
| 1194 // Exit early if no children can be hit. | 1194 if (!isLayoutView()) { |
| 1195 LayoutRect overflowRect = visualOverflowRect(); | 1195 // Check if we need to do anything at all. |
| 1196 overflowRect.moveBy(adjustedLocation); | 1196 // If we have clipping, then we can't have any spillout. |
| 1197 if (!locationInContainer.intersects(overflowRect)) | 1197 LayoutRect overflowBox = hasOverflowClip() ? borderBoxRect() : visualOve
rflowRect(); |
| 1198 return false; | 1198 flipForWritingMode(overflowBox); |
| 1199 overflowBox.moveBy(adjustedLocation); |
| 1200 if (!locationInContainer.intersects(overflowBox)) |
| 1201 return false; |
| 1202 } |
| 1199 | 1203 |
| 1200 // TODO(pdr): We should also check for css clip in the !isSelfPaintingLayer | 1204 // TODO(pdr): We should also check for css clip in the !isSelfPaintingLayer |
| 1201 // case, similar to overflow clip in LayoutBlock::nodeAtPoint. | 1205 // case, similar to overflow clip in LayoutBlock::nodeAtPoint. |
| 1202 | 1206 |
| 1207 // TODO(pdr): We should also include checks for hit testing border radius at |
| 1208 // the layer level (see: crbug.com/568904). |
| 1209 |
| 1203 if (hitTestChildren(result, locationInContainer, adjustedLocation, action)) | 1210 if (hitTestChildren(result, locationInContainer, adjustedLocation, action)) |
| 1204 return true; | 1211 return true; |
| 1205 | 1212 |
| 1206 if (hitTestClippedOutByRoundedBorder(locationInContainer, adjustedLocation)) | 1213 if (hitTestClippedOutByRoundedBorder(locationInContainer, adjustedLocation)) |
| 1207 return false; | 1214 return false; |
| 1208 | 1215 |
| 1209 // Check our bounds next. For this purpose always assume that we can only be
hit in the | 1216 // Now hit test ourselves. |
| 1210 // foreground phase (which is true for replaced elements like images). | 1217 if (isInSelfHitTestingPhase(action) && visibleToHitTestRequest(result.hitTes
tRequest())) { |
| 1211 LayoutRect boundsRect = borderBoxRect(); | 1218 LayoutRect boundsRect(adjustedLocation, size()); |
| 1212 boundsRect.moveBy(adjustedLocation); | 1219 if (locationInContainer.intersects(boundsRect)) { |
| 1213 if (visibleToHitTestRequest(result.hitTestRequest()) && action == HitTestFor
eground && locationInContainer.intersects(boundsRect)) { | 1220 updateHitTestResult(result, flipForWritingMode(locationInContainer.p
oint() - toLayoutSize(adjustedLocation))); |
| 1214 updateHitTestResult(result, locationInContainer.point() - toLayoutSize(a
djustedLocation)); | 1221 if (result.addNodeToListBasedTestResult(nodeForHitTest(), locationIn
Container, boundsRect) == StopHitTesting) |
| 1215 if (result.addNodeToListBasedTestResult(node(), locationInContainer, bou
ndsRect) == StopHitTesting) | 1222 return true; |
| 1216 return true; | 1223 } |
| 1217 } | 1224 } |
| 1218 | 1225 |
| 1219 return false; | 1226 return false; |
| 1220 } | 1227 } |
| 1221 | 1228 |
| 1222 bool LayoutBox::hitTestChildren(HitTestResult& result, const HitTestLocation& lo
cationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction action) | 1229 bool LayoutBox::hitTestChildren(HitTestResult& result, const HitTestLocation& lo
cationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction action) |
| 1223 { | 1230 { |
| 1224 for (LayoutObject* child = slowLastChild(); child; child = child->previousSi
bling()) { | 1231 for (LayoutObject* child = slowLastChild(); child; child = child->previousSi
bling()) { |
| 1225 if ((!child->hasLayer() || !toLayoutBoxModelObject(child)->layer()->isSe
lfPaintingLayer()) && child->nodeAtPoint(result, locationInContainer, accumulate
dOffset, action)) | 1232 if ((!child->hasLayer() || !toLayoutBoxModelObject(child)->layer()->isSe
lfPaintingLayer()) && child->nodeAtPoint(result, locationInContainer, accumulate
dOffset, action)) |
| 1226 return true; | 1233 return true; |
| (...skipping 3545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4772 | 4779 |
| 4773 void LayoutBox::clearPercentHeightDescendants() | 4780 void LayoutBox::clearPercentHeightDescendants() |
| 4774 { | 4781 { |
| 4775 for (LayoutObject* curr = slowFirstChild(); curr; curr = curr->nextInPreOrde
r(this)) { | 4782 for (LayoutObject* curr = slowFirstChild(); curr; curr = curr->nextInPreOrde
r(this)) { |
| 4776 if (curr->isBox()) | 4783 if (curr->isBox()) |
| 4777 toLayoutBox(curr)->removeFromPercentHeightContainer(); | 4784 toLayoutBox(curr)->removeFromPercentHeightContainer(); |
| 4778 } | 4785 } |
| 4779 } | 4786 } |
| 4780 | 4787 |
| 4781 } // namespace blink | 4788 } // namespace blink |
| OLD | NEW |