Diff
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/ChangeLog (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/ChangeLog 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/ChangeLog 2019-07-01 11:03:32 UTC (rev 246992)
@@ -1,3 +1,60 @@
+2019-05-23 Zalan Bujtas <za...@apple.com>
+
+ [Hittest] Move hittesting from RenderView to Document
+ https://bugs.webkit.org/show_bug.cgi?id=198192
+ <rdar://problem/51077762>
+
+ Reviewed by Antti Koivisto.
+
+ RenderView is not refcounted and may be destroyed in updateLayout(), so enter hit-testing from Document.
+
+ * accessibility/AccessibilityObject.cpp:
+ (WebCore::AccessibilityObject::press):
+ * accessibility/AccessibilityRenderObject.cpp:
+ (WebCore::AccessibilityRenderObject::visiblePositionForPoint const):
+ * dom/Document.cpp:
+ (WebCore::FrameFlatteningLayoutDisallower::FrameFlatteningLayoutDisallower):
+ (WebCore::FrameFlatteningLayoutDisallower::~FrameFlatteningLayoutDisallower):
+ (WebCore::Document::scheduleStyleRecalc):
+ (WebCore::Document::prepareMouseEvent):
+ (WebCore::Document::hitTest):
+ * dom/Document.h:
+ (WebCore::Document::inHitTesting const):
+ * dom/TreeScope.cpp:
+ (WebCore::TreeScope::nodeFromPoint):
+ (WebCore::TreeScope::elementsFromPoint):
+ * editing/FrameSelection.cpp:
+ (WebCore::FrameSelection::contains const):
+ * html/HTMLPlugInElement.cpp:
+ (WebCore::HTMLPlugInElement::isReplacementObscured):
+ * html/MediaElementSession.cpp:
+ (WebCore::isElementMainContentForPurposesOfAutoplay):
+ * page/DragController.cpp:
+ (WebCore::elementUnderMouse):
+ * page/EventHandler.cpp:
+ (WebCore::EventHandler::handleMouseDraggedEvent):
+ (WebCore::EventHandler::eventMayStartDrag const):
+ (WebCore::EventHandler::updateSelectionForMouseDrag):
+ (WebCore::EventHandler::hitTestResultAtPoint const):
+ (WebCore::EventHandler::updateCursor):
+ (WebCore::EventHandler::isInsideScrollbar const):
+ (WebCore::EventHandler::handleWheelEvent):
+ (WebCore::EventHandler::hoverTimerFired):
+ (WebCore::EventHandler::handleDrag):
+ (WebCore::hitTestResultInFrame):
+ * page/FrameViewLayoutContext.cpp:
+ (WebCore::FrameViewLayoutContext::setNeedsLayoutAfterViewConfigurationChange):
+ * rendering/RenderView.cpp:
+ (WebCore::FrameFlatteningLayoutDisallower::FrameFlatteningLayoutDisallower): Deleted.
+ (WebCore::FrameFlatteningLayoutDisallower::~FrameFlatteningLayoutDisallower): Deleted.
+ (): Deleted.
+ (WebCore::RenderView::hitTest): Deleted.
+ * rendering/RenderView.h:
+ * rendering/RenderWidget.cpp:
+ (WebCore::RenderWidget::nodeAtPoint):
+ * testing/Internals.cpp:
+ (WebCore::Internals::nodesFromRect const):
+
2019-05-22 Antti Koivisto <an...@apple.com>
Subselectors not searched when determining property whitelist for selector
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/accessibility/AccessibilityObject.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/accessibility/AccessibilityObject.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/accessibility/AccessibilityObject.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -974,7 +974,7 @@
if (document) {
HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::AccessibilityHitTest);
HitTestResult hitTestResult(clickPoint());
- document->renderView()->hitTest(request, hitTestResult);
+ document->hitTest(request, hitTestResult);
if (auto* innerNode = hitTestResult.innerNode()) {
if (auto* shadowHost = innerNode->shadowHost())
hitTestElement = shadowHost;
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/accessibility/AccessibilityRenderObject.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/accessibility/AccessibilityRenderObject.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -2158,7 +2158,7 @@
HitTestRequest request(HitTestRequest::ReadOnly |
HitTestRequest::Active);
HitTestResult result(ourpoint);
- renderView->hitTest(request, result);
+ renderView->document().hitTest(request, result);
innerNode = result.innerNode();
if (!innerNode)
return VisiblePosition();
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/dom/Document.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/dom/Document.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/dom/Document.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -183,6 +183,7 @@
#include "ScriptSourceCode.h"
#include "ScriptState.h"
#include "ScriptedAnimationController.h"
+#include "ScrollbarTheme.h"
#include "ScrollingCoordinator.h"
#include "SecurityOrigin.h"
#include "SecurityOriginData.h"
@@ -335,6 +336,26 @@
unsigned ScriptDisallowedScope::LayoutAssertionDisableScope::s_layoutAssertionDisableCount = 0;
+struct FrameFlatteningLayoutDisallower {
+ FrameFlatteningLayoutDisallower(FrameView& frameView)
+ : m_frameView(frameView)
+ , m_disallowLayout(frameView.effectiveFrameFlattening() != FrameFlattening::Disabled)
+ {
+ if (m_disallowLayout)
+ m_frameView.startDisallowingLayout();
+ }
+
+ ~FrameFlatteningLayoutDisallower()
+ {
+ if (m_disallowLayout)
+ m_frameView.endDisallowingLayout();
+ }
+
+private:
+ FrameView& m_frameView;
+ bool m_disallowLayout { false };
+};
+
// DOM Level 2 says (letters added):
//
// a) Name start characters must have one of the categories Ll, Lu, Lo, Lt, Nl.
@@ -1805,7 +1826,7 @@
void Document::scheduleStyleRecalc()
{
- ASSERT(!m_renderView || !m_renderView->inHitTesting());
+ ASSERT(!m_renderView || !inHitTesting());
if (m_styleRecalcTimer.isActive() || pageCacheState() != NotInPageCache)
return;
@@ -3782,7 +3803,7 @@
return MouseEventWithHitTestResults(event, HitTestResult(LayoutPoint()));
HitTestResult result(documentPoint);
- renderView()->hitTest(request, result);
+ hitTest(request, result);
if (!request.readOnly())
updateHoverActiveState(request, result.targetElement());
@@ -8659,6 +8680,45 @@
detachFromFrame();
}
+bool Document::hitTest(const HitTestRequest& request, HitTestResult& result)
+{
+ return hitTest(request, result.hitTestLocation(), result);
+}
+
+bool Document::hitTest(const HitTestRequest& request, const HitTestLocation& location, HitTestResult& result)
+{
+ Ref<Document> protectedThis(*this);
+ updateLayout();
+ if (!renderView())
+ return false;
+
+#if !ASSERT_DISABLED
+ SetForScope<bool> hitTestRestorer { m_inHitTesting, true };
+#endif
+
+ auto& frameView = renderView()->frameView();
+ Ref<FrameView> protector(frameView);
+
+ FrameFlatteningLayoutDisallower disallower(frameView);
+
+ bool resultLayer = renderView()->layer()->hitTest(request, location, result);
+
+ // ScrollView scrollbars are not the same as RenderLayer scrollbars tested by RenderLayer::hitTestOverflowControls,
+ // so we need to test ScrollView scrollbars separately here. In case of using overlay scrollbars, the layer hit test
+ // will always work so we need to check the ScrollView scrollbars in that case too.
+ if (!resultLayer || ScrollbarTheme::theme().usesOverlayScrollbars()) {
+ // FIXME: Consider if this test should be done unconditionally.
+ if (request.allowsFrameScrollbars()) {
+ IntPoint windowPoint = frameView.contentsToWindow(location.roundedPoint());
+ if (auto* frameScrollbar = frameView.scrollbarAtPoint(windowPoint)) {
+ result.setScrollbar(frameScrollbar);
+ return true;
+ }
+ }
+ }
+ return resultLayer;
+}
+
#if ENABLE(CSS_PAINTING_API)
Worklet& Document::ensurePaintWorklet()
{
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/dom/Document.h (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/dom/Document.h 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/dom/Document.h 2019-07-01 11:03:32 UTC (rev 246992)
@@ -134,6 +134,7 @@
class HTMLMediaElement;
class HTMLPictureElement;
class HTMLScriptElement;
+class HitTestLocation;
class HitTestRequest;
class HitTestResult;
class ImageBitmapRenderingContext;
@@ -1522,6 +1523,12 @@
void frameWasDisconnectedFromOwner();
+ WEBCORE_EXPORT bool hitTest(const HitTestRequest&, HitTestResult&);
+ bool hitTest(const HitTestRequest&, const HitTestLocation&, HitTestResult&);
+#if !ASSERT_DISABLED
+ bool inHitTesting() const { return m_inHitTesting; }
+#endif
+
protected:
enum ConstructionFlags { Synthesized = 1, NonRenderedPlaceholder = 1 << 1 };
Document(Frame*, const URL&, unsigned = DefaultDocumentClass, unsigned constructionFlags = 0);
@@ -2019,6 +2026,9 @@
bool m_areDeviceMotionAndOrientationUpdatesSuspended { false };
bool m_userDidInteractWithPage { false };
+#if !ASSERT_DISABLED
+ bool m_inHitTesting { false };
+#endif
#if ENABLE(TELEPHONE_NUMBER_DETECTION)
bool m_isTelephoneNumberParsingAllowed { true };
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/dom/TreeScope.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/dom/TreeScope.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/dom/TreeScope.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -356,11 +356,9 @@
return nullptr;
HitTestResult result(absolutePoint.value());
- documentScope().renderView()->hitTest(HitTestRequest(), result);
-
+ documentScope().hitTest(HitTestRequest(), result);
if (localPoint)
*localPoint = result.localPoint();
-
return result.innerNode();
}
@@ -403,7 +401,7 @@
| HitTestRequest::CollectMultipleElements
| HitTestRequest::IncludeAllElementsUnderPoint);
HitTestResult result(absolutePoint.value());
- documentScope().renderView()->hitTest(request, result);
+ documentScope().hitTest(request, result);
Node* lastNode = nullptr;
for (const auto& listBasedNode : result.listBasedTestResult()) {
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/editing/FrameSelection.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/editing/FrameSelection.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/editing/FrameSelection.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -1879,12 +1879,12 @@
if (!isRange())
return false;
- RenderView* renderView = m_frame->contentRenderer();
- if (!renderView)
+ auto* document = m_frame->document();
+ if (!document)
return false;
HitTestResult result(point);
- renderView->hitTest(HitTestRequest(), result);
+ document->hitTest(HitTestRequest(), result);
Node* innerNode = result.innerNode();
if (!innerNode || !innerNode->renderer())
return false;
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/html/HTMLPlugInElement.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/html/HTMLPlugInElement.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/html/HTMLPlugInElement.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -464,27 +464,27 @@
HitTestLocation location = LayoutPoint(x + width / 2, y + height / 2);
ASSERT(!renderView->needsLayout());
ASSERT(!renderView->document().needsStyleRecalc());
- bool hit = renderView->hitTest(request, location, result);
+ bool hit = topDocument->hitTest(request, location, result);
if (!hit || result.innerNode() != &pluginRenderer.frameOwnerElement())
return true;
location = LayoutPoint(x, y);
- hit = renderView->hitTest(request, location, result);
+ hit = topDocument->hitTest(request, location, result);
if (!hit || result.innerNode() != &pluginRenderer.frameOwnerElement())
return true;
location = LayoutPoint(x + width, y);
- hit = renderView->hitTest(request, location, result);
+ hit = topDocument->hitTest(request, location, result);
if (!hit || result.innerNode() != &pluginRenderer.frameOwnerElement())
return true;
location = LayoutPoint(x + width, y + height);
- hit = renderView->hitTest(request, location, result);
+ hit = topDocument->hitTest(request, location, result);
if (!hit || result.innerNode() != &pluginRenderer.frameOwnerElement())
return true;
location = LayoutPoint(x, y + height);
- hit = renderView->hitTest(request, location, result);
+ hit = topDocument->hitTest(request, location, result);
if (!hit || result.innerNode() != &pluginRenderer.frameOwnerElement())
return true;
return false;
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/html/MediaElementSession.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/html/MediaElementSession.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/html/MediaElementSession.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -854,8 +854,6 @@
if (!shouldHitTestMainFrame)
return true;
- RenderView& mainRenderView = *mainFrame.view()->renderView();
-
// Hit test the area of the main frame where the element appears, to determine if the element is being obscured.
IntRect rectRelativeToView = element.clientRect();
ScrollPosition scrollPosition = mainFrame.view()->documentScrollPositionRelativeToViewOrigin();
@@ -864,7 +862,9 @@
HitTestResult result(rectRelativeToTopDocument.center());
// Elements which are obscured by other elements cannot be main content.
- mainRenderView.hitTest(request, result);
+ if (!mainFrame.document())
+ return false;
+ mainFrame.document()->hitTest(request, result);
result.setToNonUserAgentShadowAncestor();
RefPtr<Element> hitElement = result.targetElement();
if (hitElement != &element)
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/page/DragController.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/page/DragController.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/page/DragController.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -366,7 +366,7 @@
LayoutPoint point(p.x() * zoomFactor, p.y() * zoomFactor);
HitTestResult result(point);
- documentUnderMouse->renderView()->hitTest(HitTestRequest(), result);
+ documentUnderMouse->hitTest(HitTestRequest(), result);
auto* node = result.innerNode();
if (!node)
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/page/EventHandler.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/page/EventHandler.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/page/EventHandler.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -884,7 +884,7 @@
if (m_selectionInitiationState != ExtendedSelection) {
HitTestResult result(m_mouseDownPos);
- m_frame.document()->renderView()->hitTest(HitTestRequest(), result);
+ m_frame.document()->hitTest(HitTestRequest(), result);
updateSelectionForMouseDrag(result);
}
@@ -897,8 +897,8 @@
// This is a pre-flight check of whether the event might lead to a drag being started. Be careful
// that its logic needs to stay in sync with handleMouseMoveEvent() and the way we setMouseDownMayStartDrag
// in handleMousePressEvent
- RenderView* renderView = m_frame.contentRenderer();
- if (!renderView)
+ auto* document = m_frame.document();
+ if (!document)
return false;
if (event.button() != LeftButton || event.clickCount() != 1)
@@ -917,7 +917,7 @@
updateDragSourceActionsAllowed();
HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::DisallowUserAgentShadowContent);
HitTestResult result(view->windowToContents(event.position()));
- renderView->hitTest(request, result);
+ document->hitTest(request, result);
DragState state;
Element* targetElement = result.targetElement();
return targetElement && page->dragController().draggableElement(&m_frame, targetElement, result.roundedPointInInnerNodeFrame(), state);
@@ -928,13 +928,13 @@
FrameView* view = m_frame.view();
if (!view)
return;
- RenderView* renderView = m_frame.contentRenderer();
- if (!renderView)
+ auto* document = m_frame.document();
+ if (!document)
return;
HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::Move | HitTestRequest::DisallowUserAgentShadowContent);
HitTestResult result(view->windowToContents(m_lastKnownMousePosition));
- renderView->hitTest(request, result);
+ document->hitTest(request, result);
updateSelectionForMouseDrag(result);
}
@@ -1176,13 +1176,13 @@
frameView->updateLayoutAndStyleIfNeededRecursive();
HitTestResult result(point, nonNegativePaddingHeight, nonNegativePaddingWidth, nonNegativePaddingHeight, nonNegativePaddingWidth);
- RenderView* renderView = m_frame.contentRenderer();
- if (!renderView)
+ auto* document = m_frame.document();
+ if (!document)
return result;
// hitTestResultAtPoint is specifically used to hitTest into all frames, thus it always allows child frame content.
HitTestRequest request(hitType | HitTestRequest::AllowChildFrameContent);
- renderView->hitTest(request, result);
+ document->hitTest(request, result);
if (!request.readOnly())
m_frame.document()->updateHoverActiveState(request, result.targetElement());
@@ -1378,8 +1378,8 @@
if (!view)
return;
- RenderView* renderView = view->renderView();
- if (!renderView)
+ auto* document = m_frame.document();
+ if (!document)
return;
if (!view->shouldSetCursor())
@@ -1393,7 +1393,7 @@
HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::AllowFrameScrollbars);
HitTestResult result(view->windowToContents(m_lastKnownMousePosition));
- renderView->hitTest(request, result);
+ document->hitTest(request, result);
updateCursor(*view, result, shiftKey);
}
@@ -2642,10 +2642,10 @@
bool EventHandler::isInsideScrollbar(const IntPoint& windowPoint) const
{
- if (RenderView* renderView = m_frame.contentRenderer()) {
+ if (auto* document = m_frame.document()) {
HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::DisallowUserAgentShadowContent);
HitTestResult result(windowPoint);
- renderView->hitTest(request, result);
+ document->hitTest(request, result);
return result.scrollbar();
}
@@ -2761,8 +2761,8 @@
bool EventHandler::handleWheelEvent(const PlatformWheelEvent& event)
{
- RenderView* renderView = m_frame.contentRenderer();
- if (!renderView)
+ auto* document = m_frame.document();
+ if (!document)
return false;
Ref<Frame> protectedFrame(m_frame);
@@ -2784,7 +2784,7 @@
HitTestRequest request;
HitTestResult result(view->windowToContents(event.position()));
- renderView->hitTest(request, result);
+ document->hitTest(request, result);
RefPtr<Element> element = result.targetElement();
RefPtr<ContainerNode> scrollableContainer;
@@ -3096,12 +3096,12 @@
Ref<Frame> protectedFrame(m_frame);
- if (RenderView* renderView = m_frame.contentRenderer()) {
+ if (auto* document = m_frame.document()) {
if (FrameView* view = m_frame.view()) {
HitTestRequest request(HitTestRequest::Move | HitTestRequest::DisallowUserAgentShadowContent);
HitTestResult result(view->windowToContents(m_lastKnownMousePosition));
- renderView->hitTest(request, result);
- m_frame.document()->updateHoverActiveState(request, result.targetElement());
+ document->hitTest(request, result);
+ document->updateHoverActiveState(request, result.targetElement());
}
}
}
@@ -3660,7 +3660,7 @@
// try to find an element that wants to be dragged
HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::DisallowUserAgentShadowContent);
HitTestResult result(m_mouseDownPos);
- m_frame.contentRenderer()->hitTest(request, result);
+ m_frame.document()->hitTest(request, result);
if (m_frame.page())
dragState().source = m_frame.page()->dragController().draggableElement(&m_frame, result.targetElement(), m_mouseDownPos, dragState());
@@ -4035,7 +4035,7 @@
if (!rect.contains(roundedIntPoint(point)))
return result;
}
- frame->contentRenderer()->hitTest(HitTestRequest(hitType), result);
+ frame->document()->hitTest(HitTestRequest(hitType), result);
return result;
}
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/page/FrameViewLayoutContext.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/page/FrameViewLayoutContext.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/page/FrameViewLayoutContext.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -321,7 +321,7 @@
}
if (auto* renderView = this->renderView()) {
- ASSERT(!renderView->inHitTesting());
+ ASSERT(!frame().document()->inHitTesting());
renderView->setNeedsLayout();
scheduleLayout();
}
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/rendering/RenderView.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/rendering/RenderView.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/rendering/RenderView.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -49,7 +49,6 @@
#include "RenderQuote.h"
#include "RenderTreeBuilder.h"
#include "RenderWidget.h"
-#include "ScrollbarTheme.h"
#include "Settings.h"
#include "StyleInheritedData.h"
#include "TransformState.h"
@@ -61,26 +60,6 @@
WTF_MAKE_ISO_ALLOCATED_IMPL(RenderView);
-struct FrameFlatteningLayoutDisallower {
- FrameFlatteningLayoutDisallower(FrameView& frameView)
- : m_frameView(frameView)
- , m_disallowLayout(frameView.effectiveFrameFlattening() != FrameFlattening::Disabled)
- {
- if (m_disallowLayout)
- m_frameView.startDisallowingLayout();
- }
-
- ~FrameFlatteningLayoutDisallower()
- {
- if (m_disallowLayout)
- m_frameView.endDisallowingLayout();
- }
-
-private:
- FrameView& m_frameView;
- bool m_disallowLayout { false };
-};
-
RenderView::RenderView(Document& document, RenderStyle&& style)
: RenderBlockFlow(document, WTFMove(style))
, m_frameView(*document.view())
@@ -137,40 +116,6 @@
m_renderersNeedingLazyRepaint.clear();
}
-bool RenderView::hitTest(const HitTestRequest& request, HitTestResult& result)
-{
- return hitTest(request, result.hitTestLocation(), result);
-}
-
-bool RenderView::hitTest(const HitTestRequest& request, const HitTestLocation& location, HitTestResult& result)
-{
- document().updateLayout();
-
-#if !ASSERT_DISABLED
- SetForScope<bool> hitTestRestorer { m_inHitTesting, true };
-#endif
-
- FrameFlatteningLayoutDisallower disallower(frameView());
-
- bool resultLayer = layer()->hitTest(request, location, result);
-
- // ScrollView scrollbars are not the same as RenderLayer scrollbars tested by RenderLayer::hitTestOverflowControls,
- // so we need to test ScrollView scrollbars separately here. In case of using overlay scrollbars, the layer hit test
- // will always work so we need to check the ScrollView scrollbars in that case too.
- if (!resultLayer || ScrollbarTheme::theme().usesOverlayScrollbars()) {
- // FIXME: Consider if this test should be done unconditionally.
- if (request.allowsFrameScrollbars()) {
- IntPoint windowPoint = frameView().contentsToWindow(location.roundedPoint());
- if (Scrollbar* frameScrollbar = frameView().scrollbarAtPoint(windowPoint)) {
- result.setScrollbar(frameScrollbar);
- return true;
- }
- }
- }
-
- return resultLayer;
-}
-
RenderBox::LogicalExtentComputedValues RenderView::computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit) const
{
return { !shouldUsePrintingLayout() ? LayoutUnit(viewLogicalHeight()) : logicalHeight, 0_lu, ComputedMarginValues() };
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/rendering/RenderView.h (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/rendering/RenderView.h 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/rendering/RenderView.h 2019-07-01 11:03:32 UTC (rev 246992)
@@ -43,9 +43,6 @@
RenderView(Document&, RenderStyle&&);
virtual ~RenderView();
- WEBCORE_EXPORT bool hitTest(const HitTestRequest&, HitTestResult&);
- bool hitTest(const HitTestRequest&, const HitTestLocation&, HitTestResult&);
-
const char* renderName() const override { return "RenderView"; }
bool requiresLayer() const override { return true; }
@@ -194,10 +191,6 @@
const HashSet<const RenderBox*>& boxesWithScrollSnapPositions() { return m_boxesWithScrollSnapPositions; }
#endif
-#if !ASSERT_DISABLED
- bool inHitTesting() const { return m_inHitTesting; }
-#endif
-
protected:
void mapLocalToContainer(const RenderLayerModelObject* repaintContainer, TransformState&, MapCoordinatesFlags, bool* wasFixed) const override;
const RenderObject* pushMappingToContainer(const RenderLayerModelObject* ancestorToStopAt, RenderGeometryMap&) const override;
@@ -253,9 +246,6 @@
bool m_hasSoftwareFilters { false };
bool m_usesFirstLineRules { false };
bool m_usesFirstLetterRules { false };
-#if !ASSERT_DISABLED
- bool m_inHitTesting { false };
-#endif
HashMap<RenderElement*, Vector<CachedImage*>> m_renderersWithPausedImageAnimation;
HashSet<RenderElement*> m_visibleInViewportRenderers;
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/rendering/RenderWidget.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/rendering/RenderWidget.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/rendering/RenderWidget.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -364,7 +364,6 @@
{
if (request.allowsChildFrameContent() && is<FrameView>(widget()) && downcast<FrameView>(*widget()).renderView()) {
FrameView& childFrameView = downcast<FrameView>(*widget());
- RenderView& childRoot = *childFrameView.renderView();
LayoutPoint adjustedLocation = accumulatedOffset + location();
LayoutPoint contentOffset = LayoutPoint(borderLeft() + paddingLeft(), borderTop() + paddingTop()) - toIntSize(childFrameView.scrollPosition());
@@ -372,7 +371,10 @@
HitTestRequest newHitTestRequest(request.type() | HitTestRequest::ChildFrameHitTest);
HitTestResult childFrameResult(newHitTestLocation);
- bool isInsideChildFrame = childRoot.hitTest(newHitTestRequest, newHitTestLocation, childFrameResult);
+ auto* document = childFrameView.frame().document();
+ if (!document)
+ return false;
+ bool isInsideChildFrame = document->hitTest(newHitTestRequest, newHitTestLocation, childFrameResult);
if (request.resultIsElementList())
result.append(childFrameResult, request);
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/testing/Internals.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/testing/Internals.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/testing/Internals.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -2083,7 +2083,7 @@
return nullptr;
HitTestResult result(point, topPadding, rightPadding, bottomPadding, leftPadding);
- renderView->hitTest(request, result);
+ document.hitTest(request, result);
const HitTestResult::NodeSet& nodeSet = result.listBasedTestResult();
Vector<Ref<Node>> matches;
matches.reserveInitialCapacity(nodeSet.size());
Modified: releases/WebKitGTK/webkit-2.24/Source/WebKit/ChangeLog (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebKit/ChangeLog 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebKit/ChangeLog 2019-07-01 11:03:32 UTC (rev 246992)
@@ -1,3 +1,18 @@
+2019-05-23 Zalan Bujtas <za...@apple.com>
+
+ [Hittest] Move hittesting from RenderView to Document
+ https://bugs.webkit.org/show_bug.cgi?id=198192
+ <rdar://problem/51077762>
+
+ Reviewed by Antti Koivisto.
+
+ * WebProcess/WebPage/ViewGestureGeometryCollector.cpp:
+ (WebKit::ViewGestureGeometryCollector::collectGeometryForSmartMagnificationGesture):
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::determinePrimarySnapshottedPlugIn):
+ * WebProcess/WebPage/ios/WebPageIOS.mm:
+ (WebKit::WebPage::dynamicViewportSizeUpdate):
+
2019-07-01 Miguel Gomez <mago...@igalia.com>
[WPE][GTK] Content disappearing when using CSS transforms
Modified: releases/WebKitGTK/webkit-2.24/Source/WebKit/WebProcess/WebPage/ViewGestureGeometryCollector.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebKit/WebProcess/WebPage/ViewGestureGeometryCollector.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebKit/WebProcess/WebPage/ViewGestureGeometryCollector.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -115,7 +115,7 @@
IntPoint originInContentsSpace = m_webPage.mainFrameView()->windowToContents(roundedIntPoint(origin));
HitTestResult hitTestResult = HitTestResult(originInContentsSpace);
- m_webPage.mainFrameView()->renderView()->hitTest(HitTestRequest(), hitTestResult);
+ m_webPage.mainFrame()->document()->hitTest(HitTestRequest(), hitTestResult);
Node* node = hitTestResult.innerNode();
if (!node) {
dispatchDidCollectGeometryForSmartMagnificationGesture(FloatPoint(), FloatRect(), FloatRect(), false, 0, 0);
Modified: releases/WebKitGTK/webkit-2.24/Source/WebKit/WebProcess/WebPage/WebPage.cpp (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2019-07-01 11:03:32 UTC (rev 246992)
@@ -5797,9 +5797,9 @@
IntRect plugInRectRelativeToTopDocument(plugInRectRelativeToView.location() + scrollPosition, plugInRectRelativeToView.size());
HitTestResult hitTestResult(plugInRectRelativeToTopDocument.center());
- if (!mainFrameView->renderView())
+ if (!mainFrame() || !mainFrame()->document())
return;
- mainFrameView->renderView()->hitTest(request, hitTestResult);
+ mainFrame()->document()->hitTest(request, hitTestResult);
RefPtr<Element> element = hitTestResult.targetElement();
if (!element)
Modified: releases/WebKitGTK/webkit-2.24/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm (246991 => 246992)
--- releases/WebKitGTK/webkit-2.24/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm 2019-07-01 11:03:22 UTC (rev 246991)
+++ releases/WebKitGTK/webkit-2.24/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm 2019-07-01 11:03:32 UTC (rev 246992)
@@ -2635,8 +2635,8 @@
HitTestResult hitTestResult = HitTestResult(unobscuredContentRectCenter);
- if (RenderView* mainFrameRenderView = frameView.renderView())
- mainFrameRenderView->hitTest(HitTestRequest(), hitTestResult);
+ if (auto* document = frameView.frame().document())
+ document->hitTest(HitTestRequest(), hitTestResult);
if (Node* node = hitTestResult.innerNode()) {
if (RenderObject* renderer = node->renderer()) {