Changeset 244744 in webkit


Ignore:
Timestamp:
Apr 29, 2019 12:08:18 PM (5 years ago)
Author:
commit-queue@webkit.org
Message:

[GTK] Back/forward gesture snapshot always times out
https://bugs.webkit.org/show_bug.cgi?id=197233

Patch by Alexander Mikhaylenko <exalm7659@gmail.com> on 2019-04-29
Reviewed by Michael Catanzaro.

Delaying web process launch caused a regression where we create ViewGestureController when the
web process doesn't yet exist. The controller immediately tries to connect to it and fails,
and because of that never receives DidHitRenderTreeSizeThreshold() message, so navigation
snapshot always stays until timeout after performing the gesture.

To prevent this, create the controller in webkitWebViewBaseDidRelaunchWebProcess() instead of
webkitWebViewBaseCreateWebPage(). Additionally, since settings are now created earlier than
ViewGestureController, store the value of whether swipe gesture is enabled in WebKitWebViewBase
and immediately apply it when creating the controller.

Since there is now a point where controller is null, make webkitWebViewBaseViewGestureController()
return null and add null checks everywhere.

  • UIProcess/API/glib/WebKitWebView.cpp:

(enableBackForwardNavigationGesturesChanged):
Move the logic into webkitWebViewBaseSetEnableBackForwardNavigationGesture().

  • UIProcess/API/gtk/PageClientImpl.cpp:

(WebKit::PageClientImpl::wheelEventWasNotHandledByWebCore): Add a null check.

  • UIProcess/API/gtk/WebKitWebViewBase.cpp:

(webkitWebViewBaseDraw): Ditto.
(webkitWebViewBaseScrollEvent): Ditto.
(webkitWebViewBaseSetEnableBackForwardNavigationGesture): Added. In addition to what was in
WebKitWebViewBase::enableBackForwardNavigationGesturesChanged(), store the value in a field
for the case ViewGestureController doesn't exist yet.
(webkitWebViewBaseViewGestureController): Return a pointer instead of reference.
(webkitWebViewBaseCreateWebPage): Stop creating ViewGestureController.
(webkitWebViewBaseDidRelaunchWebProcess): Move creating ViewGestureController here. Also
immediately call setSwipeGestureEnabled() with the stored value.
(webkitWebViewBaseDidStartProvisionalLoadForMainFrame): Add a null check.
(webkitWebViewBaseDidFirstVisuallyNonEmptyLayoutForMainFrame):Ditto.
(webkitWebViewBaseDidFinishLoadForMainFrame): Ditto.
(webkitWebViewBaseDidFailLoadForMainFrame): Ditto.
(webkitWebViewBaseDidSameDocumentNavigationForMainFrame): Ditto.
(webkitWebViewBaseDidRestoreScrollPosition): Ditto.

  • UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
Location:
trunk/Source/WebKit
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r244742 r244744  
     12019-04-29  Alexander Mikhaylenko  <exalm7659@gmail.com>
     2
     3        [GTK] Back/forward gesture snapshot always times out
     4        https://bugs.webkit.org/show_bug.cgi?id=197233
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        Delaying web process launch caused a regression where we create ViewGestureController when the
     9        web process doesn't yet exist. The controller immediately tries to connect to it and fails,
     10        and because of that never receives DidHitRenderTreeSizeThreshold() message, so navigation
     11        snapshot always stays until timeout after performing the gesture.
     12
     13        To prevent this, create the controller in webkitWebViewBaseDidRelaunchWebProcess() instead of
     14        webkitWebViewBaseCreateWebPage(). Additionally, since settings are now created earlier than
     15        ViewGestureController, store the value of whether swipe gesture is enabled in WebKitWebViewBase
     16        and immediately apply it when creating the controller.
     17
     18        Since there is now a point where controller is null, make webkitWebViewBaseViewGestureController()
     19        return null and add null checks everywhere.
     20
     21        * UIProcess/API/glib/WebKitWebView.cpp:
     22        (enableBackForwardNavigationGesturesChanged):
     23        Move the logic into webkitWebViewBaseSetEnableBackForwardNavigationGesture().
     24        * UIProcess/API/gtk/PageClientImpl.cpp:
     25        (WebKit::PageClientImpl::wheelEventWasNotHandledByWebCore): Add a null check.
     26        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
     27        (webkitWebViewBaseDraw): Ditto.
     28        (webkitWebViewBaseScrollEvent): Ditto.
     29        (webkitWebViewBaseSetEnableBackForwardNavigationGesture): Added. In addition to what was in
     30        WebKitWebViewBase::enableBackForwardNavigationGesturesChanged(), store the value in a field
     31        for the case ViewGestureController doesn't exist yet.
     32        (webkitWebViewBaseViewGestureController): Return a pointer instead of reference.
     33        (webkitWebViewBaseCreateWebPage): Stop creating ViewGestureController.
     34        (webkitWebViewBaseDidRelaunchWebProcess): Move creating ViewGestureController here. Also
     35        immediately call setSwipeGestureEnabled() with the stored value.
     36        (webkitWebViewBaseDidStartProvisionalLoadForMainFrame): Add a null check.
     37        (webkitWebViewBaseDidFirstVisuallyNonEmptyLayoutForMainFrame):Ditto.
     38        (webkitWebViewBaseDidFinishLoadForMainFrame): Ditto.
     39        (webkitWebViewBaseDidFailLoadForMainFrame): Ditto.
     40        (webkitWebViewBaseDidSameDocumentNavigationForMainFrame): Ditto.
     41        (webkitWebViewBaseDidRestoreScrollPosition): Ditto.
     42        * UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
     43
    1442019-04-29  Chris Dumez  <cdumez@apple.com>
    245
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp

    r244732 r244744  
    515515{
    516516    gboolean enable = webkit_settings_get_enable_back_forward_navigation_gestures(settings);
    517 
    518     ViewGestureController& controller = webkitWebViewBaseViewGestureController(WEBKIT_WEB_VIEW_BASE(webView));
    519     controller.setSwipeGestureEnabled(enable);
    520 
    521     getPage(webView).setShouldRecordNavigationSnapshots(enable);
     517    webkitWebViewBaseSetEnableBackForwardNavigationGesture(WEBKIT_WEB_VIEW_BASE(webView), enable);
    522518}
    523519
  • trunk/Source/WebKit/UIProcess/API/gtk/PageClientImpl.cpp

    r244635 r244744  
    432432void PageClientImpl::wheelEventWasNotHandledByWebCore(const NativeWebWheelEvent& event)
    433433{
    434     ViewGestureController& controller = webkitWebViewBaseViewGestureController(WEBKIT_WEB_VIEW_BASE(m_viewWidget));
    435     if (controller.isSwipeGestureEnabled()) {
    436         controller.wheelEventWasNotHandledByWebCore(&event.nativeEvent()->scroll);
     434    ViewGestureController* controller = webkitWebViewBaseViewGestureController(WEBKIT_WEB_VIEW_BASE(m_viewWidget));
     435    if (controller && controller->isSwipeGestureEnabled()) {
     436        controller->wheelEventWasNotHandledByWebCore(&event.nativeEvent()->scroll);
    437437        return;
    438438    }
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp

    r244732 r244744  
    207207#endif
    208208    std::unique_ptr<ViewGestureController> viewGestureController;
     209    bool isBackForwardNavigationGestureEnabled { false };
    209210};
    210211
     
    573574
    574575    if (showingNavigationSnapshot) {
    575         ViewGestureController& controller = webkitWebViewBaseViewGestureController(webViewBase);
    576576        RefPtr<cairo_pattern_t> group = adoptRef(cairo_pop_group(cr));
    577         controller.draw(cr, group.get());
     577        if (auto* controller = webkitWebViewBaseViewGestureController(webViewBase))
     578            controller->draw(cr, group.get());
    578579    }
    579580
     
    890891    }
    891892
    892     ViewGestureController& controller = webkitWebViewBaseViewGestureController(webViewBase);
    893     if (controller.isSwipeGestureEnabled() && controller.handleScrollWheelEvent(event))
     893    ViewGestureController* controller = webkitWebViewBaseViewGestureController(webViewBase);
     894    if (controller && controller->isSwipeGestureEnabled() && controller->handleScrollWheelEvent(event))
    894895        return GDK_EVENT_STOP;
    895896
     
    11901191#endif
    11911192
    1192 ViewGestureController& webkitWebViewBaseViewGestureController(WebKitWebViewBase* webViewBase)
    1193 {
    1194     return *webViewBase->priv->viewGestureController;
     1193void webkitWebViewBaseSetEnableBackForwardNavigationGesture(WebKitWebViewBase* webViewBase, bool enabled)
     1194{
     1195    WebKitWebViewBasePrivate* priv = webViewBase->priv;
     1196
     1197    priv->isBackForwardNavigationGestureEnabled = enabled;
     1198
     1199    if (priv->pageProxy->hasRunningProcess())
     1200        webViewBase->priv->viewGestureController->setSwipeGestureEnabled(enabled);
     1201
     1202    priv->pageProxy->setShouldRecordNavigationSnapshots(enabled);
     1203}
     1204
     1205ViewGestureController* webkitWebViewBaseViewGestureController(WebKitWebViewBase* webViewBase)
     1206{
     1207    return webViewBase->priv->viewGestureController.get();
    11951208}
    11961209
     
    14211434    g_signal_connect(webkitWebViewBase, "notify::scale-factor", G_CALLBACK(deviceScaleFactorChanged), nullptr);
    14221435#endif
    1423 
    1424     priv->viewGestureController = std::make_unique<WebKit::ViewGestureController>(*priv->pageProxy);
    14251436}
    14261437
     
    16401651    gtk_widget_queue_resize_no_redraw(GTK_WIDGET(webkitWebViewBase));
    16411652
     1653    WebKitWebViewBasePrivate* priv = webkitWebViewBase->priv;
     1654
    16421655#if PLATFORM(X11) && USE(TEXTURE_MAPPER_GL) && !USE(REDIRECTED_XCOMPOSITE_WINDOW)
    16431656    if (PlatformDisplay::sharedDisplay().type() != PlatformDisplay::Type::X11)
    16441657        return;
    16451658
    1646     WebKitWebViewBasePrivate* priv = webkitWebViewBase->priv;
    16471659    auto* drawingArea = static_cast<DrawingAreaProxyCoordinatedGraphics*>(priv->pageProxy->drawingArea());
    16481660    ASSERT(drawingArea);
     
    16561668    UNUSED_PARAM(webkitWebViewBase);
    16571669#endif
     1670
     1671    priv->viewGestureController = std::make_unique<WebKit::ViewGestureController>(*priv->pageProxy);
     1672    priv->viewGestureController->setSwipeGestureEnabled(priv->isBackForwardNavigationGestureEnabled);
    16581673}
    16591674
     
    17011716void webkitWebViewBaseDidStartProvisionalLoadForMainFrame(WebKitWebViewBase* webkitWebViewBase)
    17021717{
    1703     if (webkitWebViewBase->priv->viewGestureController->isSwipeGestureEnabled())
    1704         webkitWebViewBase->priv->viewGestureController->didStartProvisionalLoadForMainFrame();
     1718    ViewGestureController* controller = webkitWebViewBaseViewGestureController(webkitWebViewBase);
     1719    if (controller && controller->isSwipeGestureEnabled())
     1720        controller->didStartProvisionalLoadForMainFrame();
    17051721}
    17061722
    17071723void webkitWebViewBaseDidFirstVisuallyNonEmptyLayoutForMainFrame(WebKitWebViewBase* webkitWebViewBase)
    17081724{
    1709     if (webkitWebViewBase->priv->viewGestureController->isSwipeGestureEnabled())
    1710         webkitWebViewBase->priv->viewGestureController->didFirstVisuallyNonEmptyLayoutForMainFrame();
     1725    ViewGestureController* controller = webkitWebViewBaseViewGestureController(webkitWebViewBase);
     1726    if (controller && controller->isSwipeGestureEnabled())
     1727        controller->didFirstVisuallyNonEmptyLayoutForMainFrame();
    17111728}
    17121729
    17131730void webkitWebViewBaseDidFinishLoadForMainFrame(WebKitWebViewBase* webkitWebViewBase)
    17141731{
    1715     if (webkitWebViewBase->priv->viewGestureController->isSwipeGestureEnabled())
    1716         webkitWebViewBase->priv->viewGestureController->didFinishLoadForMainFrame();
     1732    ViewGestureController* controller = webkitWebViewBaseViewGestureController(webkitWebViewBase);
     1733    if (controller && controller->isSwipeGestureEnabled())
     1734        controller->didFinishLoadForMainFrame();
    17171735}
    17181736
    17191737void webkitWebViewBaseDidFailLoadForMainFrame(WebKitWebViewBase* webkitWebViewBase)
    17201738{
    1721     if (webkitWebViewBase->priv->viewGestureController->isSwipeGestureEnabled())
    1722         webkitWebViewBase->priv->viewGestureController->didFailLoadForMainFrame();
     1739    ViewGestureController* controller = webkitWebViewBaseViewGestureController(webkitWebViewBase);
     1740    if (controller && controller->isSwipeGestureEnabled())
     1741        controller->didFailLoadForMainFrame();
    17231742}
    17241743
    17251744void webkitWebViewBaseDidSameDocumentNavigationForMainFrame(WebKitWebViewBase* webkitWebViewBase, SameDocumentNavigationType type)
    17261745{
    1727     if (webkitWebViewBase->priv->viewGestureController->isSwipeGestureEnabled())
    1728         webkitWebViewBase->priv->viewGestureController->didSameDocumentNavigationForMainFrame(type);
     1746    ViewGestureController* controller = webkitWebViewBaseViewGestureController(webkitWebViewBase);
     1747    if (controller && controller->isSwipeGestureEnabled())
     1748        controller->didSameDocumentNavigationForMainFrame(type);
    17291749}
    17301750
    17311751void webkitWebViewBaseDidRestoreScrollPosition(WebKitWebViewBase* webkitWebViewBase)
    17321752{
    1733     if (webkitWebViewBase->priv->viewGestureController->isSwipeGestureEnabled())
     1753    ViewGestureController* controller = webkitWebViewBaseViewGestureController(webkitWebViewBase);
     1754    if (controller && controller->isSwipeGestureEnabled())
    17341755        webkitWebViewBase->priv->viewGestureController->didRestoreScrollPosition();
    17351756}
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBasePrivate.h

    r244732 r244744  
    8585RefPtr<WebKit::ViewSnapshot> webkitWebViewBaseTakeViewSnapshot(WebKitWebViewBase*);
    8686
    87 WebKit::ViewGestureController& webkitWebViewBaseViewGestureController(WebKitWebViewBase*);
     87void webkitWebViewBaseSetEnableBackForwardNavigationGesture(WebKitWebViewBase*, bool enabled);
     88WebKit::ViewGestureController* webkitWebViewBaseViewGestureController(WebKitWebViewBase*);
    8889
    8990void webkitWebViewBaseDidStartProvisionalLoadForMainFrame(WebKitWebViewBase*);
Note: See TracChangeset for help on using the changeset viewer.