[IFC][Integration] RenderBlockFlow::findClosestTextAtAbsolutePoint should use root inline box iterator
https://bugs.webkit.org/show_bug.cgi?id=237786
Reviewed by Antti Koivisto.
Let's remove root inline box APIs from the line iterator interface.
* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::findClosestTextAtAbsolutePoint): Replace line iterator with root inline box iterator
and check whether the local point is in between these root inline boxes.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@291207 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/rendering/RenderBlockFlow.cpp b/Source/WebCore/rendering/RenderBlockFlow.cpp
index 6954ae6..f60f537 100644
--- a/Source/WebCore/rendering/RenderBlockFlow.cpp
+++ b/Source/WebCore/rendering/RenderBlockFlow.cpp
@@ -3331,18 +3331,19 @@
// Only check the gaps between the root line boxes. We deliberately ignore overflow because
// experience has shown that hit tests on an exploded text node can fail when within the
// overflow fragment.
- for (auto current = InlineIterator::firstLineFor(blockFlow), last = InlineIterator::lastLineFor(blockFlow); current && current != last; current.traverseNext()) {
- float currentBottom = current->y() + current->logicalHeight();
- if (localPoint.y() < currentBottom)
- return nullptr;
-
- auto next = current->next();
- float nextTop = next->y();
- if (localPoint.y() < nextTop) {
- auto run = current->closestRunForLogicalLeftPosition(localPoint.x());
- if (run && is<RenderText>(run->renderer()))
- return const_cast<RenderText*>(&downcast<RenderText>(run->renderer()));
+ auto previousRootInlineBoxBottom = std::optional<float> { };
+ for (auto box = InlineIterator::firstRootInlineBoxFor(blockFlow); box; box.traverseNextInlineBox()) {
+ if (previousRootInlineBoxBottom) {
+ if (localPoint.y() < *previousRootInlineBoxBottom)
+ return nullptr;
+
+ if (localPoint.y() > *previousRootInlineBoxBottom && localPoint.y() < box->logicalTop()) {
+ auto run = box->line()->closestRunForLogicalLeftPosition(localPoint.x());
+ if (run && is<RenderText>(run->renderer()))
+ return const_cast<RenderText*>(&downcast<RenderText>(run->renderer()));
+ }
}
+ previousRootInlineBoxBottom = box->logicalBottom();
}
return nullptr;
}