Consider Antonio's comment from https://bugs.webkit.org/show_bug.cgi?id=103952#c59: > Source/WebCore/page/EventHandler.cpp:2613 > + for (Node* scrollableNode = node; scrollableNode; scrollableNode = scrollableNode->parentNode()) { > + if (scrollableNode->isDocumentNode()) > + break; > + RenderObject* renderer = scrollableNode->renderer(); > + if (renderer && renderer->isBox() && toRenderBox(renderer)->canBeScrolledAndHasScrollableArea()) > + return scrollableNode; > + } It would be faster (sometimes measurably faster) if instead of traversing the Render tree upwards, you traversed the Layer tree, given that any scrollable renderer will have an associated RenderLayer.
I should also re-consider Antonio's comment regarding a possibly-redundant boolean member variable: > Source/WebCore/page/EventHandler.cpp:2633 > + m_lastHitTestResultOverWidget = result.isOverWidget(); I do not think you need this m_lastHitTestResultOverWidget boolean. The Renderer can tell you this as well no? RenderObject::isWidget()
The function closestScrollableNodeCandidate() in EventHandler.cpp is being removed in https://bugs.webkit.org/show_bug.cgi?id=109769 since we're no longer going to be using it, so this issue is no longer valid.