Title: [246992] releases/WebKitGTK/webkit-2.24/Source
Revision
246992
Author
carlo...@webkit.org
Date
2019-07-01 04:03:32 -0700 (Mon, 01 Jul 2019)

Log Message

Merge r245716 - [Hittest] Move hittesting from RenderView to Document
https://bugs.webkit.org/show_bug.cgi?id=198192
<rdar://problem/51077762>

Reviewed by Antti Koivisto.

Source/WebCore:

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):

Source/WebKit:

* WebProcess/WebPage/ViewGestureGeometryCollector.cpp:
(WebKit::ViewGestureGeometryCollector::collectGeometryForSmartMagnificationGesture):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::determinePrimarySnapshottedPlugIn):
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::dynamicViewportSizeUpdate):

Modified Paths

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()) {
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to