Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1390)

Unified Diff: Source/core/rendering/InlineFlowBox.cpp

Issue 685963002: We need to account for culled inline parents of the hit-tested nodes.(Reland) (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/rendering/InlineFlowBox.cpp
diff --git a/Source/core/rendering/InlineFlowBox.cpp b/Source/core/rendering/InlineFlowBox.cpp
index 10918f9e4886f4037c2b3e46bb0a46be044f9f21..8b7e768944965c3952a5ae3cc50b03327fc8eaa6 100644
--- a/Source/core/rendering/InlineFlowBox.cpp
+++ b/Source/core/rendering/InlineFlowBox.cpp
@@ -1028,42 +1028,48 @@ bool InlineFlowBox::nodeAtPoint(const HitTestRequest& request, HitTestResult& re
if (!locationInContainer.intersects(overflowRect))
return false;
- // Check children first.
- // We need to account for culled inline parents of the hit-tested nodes, so that they may also get included in area-based hit-tests.
- RenderObject* culledParent = 0;
- for (InlineBox* curr = lastChild(); curr; curr = curr->prevOnLine()) {
+ // Check all of children including culled inlines.
pdr. 2014/12/10 07:16:19 These comments helped me a lot, thank you :) I tr
Miyoung Shin(g) 2014/12/12 14:46:57 thank you. it's perfect. Should I replace all of c
pdr. 2014/12/12 21:21:08 Lets replace the entire comment.
+ // We need to account for culled inline parents of the hit-tested nodes,
+ // so that they may also get included in not only area-based hit-tests but also point-based ones.
+ // And we should consider of running the minimal loops for hit-test
+
+ // Behaviour of hit-test is as follows:
+ // - the main loop is the first loop and the sub loop is the second loop.
+ // the main loop is for inline boxes and the sub loop is for render object of culled inline.
+ // - the main loop tries to hit-test all of inline box, if one of them is hit, then return.
+ // although one of them is not hit, culled parent of inline box can be hit. so we enter the sub loop.
+ // - the sub loop tries to hit-test the culled parent of inline box.
+ // However, if there is a sibling, we yield own parent to sibling becase we should check first the children before parent.
+ // the direction of sibling depends on BIDI direction.
+ InlineBox* prev;
+ for (InlineBox* curr = lastChild(); curr; curr = prev) {
+ prev = curr->prevOnLine();
if (curr->renderer().isText() || !curr->boxModelObject()->hasSelfPaintingLayer()) {
pdr. 2014/12/10 07:16:19 I think I understand what this is doing now. If yo
Miyoung Shin(g) 2014/12/12 14:46:57 Ok, I will try.
- RenderObject* newParent = 0;
- // Culled parents are only relevant for area-based hit-tests, so ignore it in point-based ones.
- if (locationInContainer.isRectBasedTest()) {
- newParent = curr->renderer().parent();
- if (newParent == renderer())
- newParent = 0;
- }
- // Check the culled parent after all its children have been checked, to do this we wait until
- // we are about to test an element with a different parent.
- if (newParent != culledParent) {
- if (!newParent || !newParent->isDescendantOf(culledParent)) {
- while (culledParent && culledParent != renderer() && culledParent != newParent) {
- if (culledParent->isRenderInline() && toRenderInline(culledParent)->hitTestCulledInline(request, result, locationInContainer, accumulatedOffset))
- return true;
- culledParent = culledParent->parent();
- }
- }
- culledParent = newParent;
- }
if (curr->nodeAtPoint(request, result, locationInContainer, accumulatedOffset, lineTop, lineBottom)) {
renderer().updateHitTestResult(result, locationInContainer.point() - toLayoutSize(accumulatedOffset));
return true;
}
+
+ RenderObject* culledParent = &curr->renderer();
+ if (!prev || curr->renderer() != prev->renderer()) {
pdr. 2014/12/10 07:16:19 Can you help me understand the "curr->renderer() !
Miyoung Shin(g) 2014/12/12 14:46:57 current inlinebox and next inlinbox in the main lo
pdr. 2014/12/12 21:21:08 Ah, I see. Should this check be moved up then, so
Miyoung Shin(g) 2014/12/14 06:54:56 No, we should call inlinebox::nodeAtPoint for each
+ while (culledParent) {
+ if (culledParent->style()->isLeftToRightDirection()) {
pdr. 2014/12/10 07:16:19 Imagine a case where you have three culled inline
Miyoung Shin(g) 2014/12/12 14:46:57 Ah... you're right. I was back on track. I should
pdr. 2014/12/12 21:21:08 I still don't really understand why the order matt
Miyoung Shin(g) 2014/12/14 06:54:56 I realized we don't need to care three culled inli
+ if (culledParent->previousSibling())
+ break;
+ } else if (culledParent->nextSibling()) {
+ break;
+ }
+ culledParent = culledParent->parent();
+ if (culledParent == renderer())
+ break;
+
+ if (culledParent && culledParent->isRenderInline() && toRenderInline(culledParent)->hitTestCulledInline(request, result, locationInContainer, accumulatedOffset)) {
pdr. 2014/12/10 07:16:19 In the worst case, we'll iterate up the culled inl
Miyoung Shin(g) 2014/12/12 14:46:57 I think, it's impossible to be null. I will add AS
+ return true;
+ }
+ }
+ }
}
}
- // Check any culled ancestor of the final children tested.
- while (culledParent && culledParent != renderer()) {
- if (culledParent->isRenderInline() && toRenderInline(culledParent)->hitTestCulledInline(request, result, locationInContainer, accumulatedOffset))
- return true;
- culledParent = culledParent->parent();
- }
// Now check ourselves. Pixel snap hit testing.
LayoutRect frameRect = roundedFrameRect();

Powered by Google App Engine
This is Rietveld 408576698