Changeset 194890 in webkit


Ignore:
Timestamp:
Jan 12, 2016 3:41:21 AM (8 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK] UI process crashes if webkit_web_view_get_tls_info is called before internal load-committed event
https://bugs.webkit.org/show_bug.cgi?id=142375

Reviewed by Michael Catanzaro.

Remove all the hacks to emit delayed load events now that the
page cache resource load delegates are consistent with all other
resource loads.

  • UIProcess/API/gtk/WebKitWebView.cpp:

(webkitWebViewLoadChanged):
(webkitWebViewResourceLoadStarted):
(webkit_web_view_get_tls_info): Add a g_return_val_if_fail to
prevent this function from being misused.
(webkitWebViewDisconnectMainResourceResponseChangedSignalHandler): Deleted.
(webkitWebViewDispose): Deleted.
(webkitWebViewEmitLoadChanged): Deleted.
(webkitWebViewEmitDelayedLoadEvents): Deleted.
(mainResourceResponseChangedCallback): Deleted.
(waitForMainResourceResponseIfWaitingForResource): Deleted.

Location:
trunk/Source/WebKit2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r194886 r194890  
     12016-01-12  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] UI process crashes if webkit_web_view_get_tls_info is called before internal load-committed event
     4        https://bugs.webkit.org/show_bug.cgi?id=142375
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        Remove all the hacks to emit delayed load events now that the
     9        page cache resource load delegates are consistent with all other
     10        resource loads.
     11
     12        * UIProcess/API/gtk/WebKitWebView.cpp:
     13        (webkitWebViewLoadChanged):
     14        (webkitWebViewResourceLoadStarted):
     15        (webkit_web_view_get_tls_info): Add a g_return_val_if_fail to
     16        prevent this function from being misused.
     17        (webkitWebViewDisconnectMainResourceResponseChangedSignalHandler): Deleted.
     18        (webkitWebViewDispose): Deleted.
     19        (webkitWebViewEmitLoadChanged): Deleted.
     20        (webkitWebViewEmitDelayedLoadEvents): Deleted.
     21        (mainResourceResponseChangedCallback): Deleted.
     22        (waitForMainResourceResponseIfWaitingForResource): Deleted.
     23
    1242016-01-11  Carlos Garcia Campos  <cgarcia@igalia.com>
    225
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp

    r194579 r194890  
    180180
    181181    std::unique_ptr<PageLoadStateObserver> loadObserver;
    182     bool waitingForMainResource;
    183     unsigned long mainResourceResponseHandlerID;
    184     WebKitLoadEvent lastDelayedEvent;
    185182
    186183    GRefPtr<WebKitBackForwardList> backForwardList;
     
    251248    virtual void didChangeIsLoading() override
    252249    {
    253         if (m_webView->priv->waitingForMainResource) {
    254             // The actual load has finished but we haven't emitted the delayed load events yet, so we are still loading.
    255             g_object_thaw_notify(G_OBJECT(m_webView));
    256             return;
    257         }
    258250        webkitWebViewSetIsLoading(m_webView, getPage(m_webView)->pageLoadState().isLoading());
    259251        g_object_thaw_notify(G_OBJECT(m_webView));
     
    513505    g_signal_handlers_disconnect_by_func(settings, reinterpret_cast<gpointer>(zoomTextOnlyChanged), webView);
    514506    g_signal_handlers_disconnect_by_func(settings, reinterpret_cast<gpointer>(userAgentChanged), webView);
    515 }
    516 
    517 static void webkitWebViewDisconnectMainResourceResponseChangedSignalHandler(WebKitWebView* webView)
    518 {
    519     WebKitWebViewPrivate* priv = webView->priv;
    520     if (priv->mainResourceResponseHandlerID)
    521         g_signal_handler_disconnect(priv->mainResource.get(), priv->mainResourceResponseHandlerID);
    522     priv->mainResourceResponseHandlerID = 0;
    523507}
    524508
     
    773757    WebKitWebView* webView = WEBKIT_WEB_VIEW(object);
    774758    webkitWebViewCancelFaviconRequest(webView);
    775     webkitWebViewDisconnectMainResourceResponseChangedSignalHandler(webView);
    776759    webkitWebViewDisconnectSettingsSignalHandlers(webView);
    777760    webkitWebViewDisconnectFaviconDatabaseSignalHandlers(webView);
     
    17931776}
    17941777
    1795 static void webkitWebViewEmitLoadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent, bool isDelayedEvent)
    1796 {
    1797     if (loadEvent == WEBKIT_LOAD_STARTED) {
     1778void webkitWebViewLoadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent)
     1779{
     1780    WebKitWebViewPrivate* priv = webView->priv;
     1781    switch (loadEvent) {
     1782    case WEBKIT_LOAD_STARTED:
     1783        webkitWebViewCancelFaviconRequest(webView);
    17981784        webkitWebViewWatchForChangesInFavicon(webView);
    17991785        webkitWebViewCancelAuthenticationRequest(webView);
    1800     } else if (loadEvent == WEBKIT_LOAD_FINISHED) {
    1801         if (isDelayedEvent) {
    1802             // In case of the delayed event, we need to manually set is-loading to false.
    1803             webkitWebViewSetIsLoading(webView, false);
    1804         }
    1805         webkitWebViewCancelAuthenticationRequest(webView);
    1806         webkitWebViewDisconnectMainResourceResponseChangedSignalHandler(webView);
    1807     }
    1808 
    1809     g_signal_emit(webView, signals[LOAD_CHANGED], 0, loadEvent);
    1810 
    1811     if (isDelayedEvent) {
    1812         if (loadEvent == WEBKIT_LOAD_COMMITTED)
    1813             webView->priv->waitingForMainResource = false;
    1814         else if (loadEvent == WEBKIT_LOAD_FINISHED) {
    1815             // Manually set is-loading again in case a new load was started.
    1816             webkitWebViewSetIsLoading(webView, getPage(webView)->pageLoadState().isLoading());
    1817         }
    1818     }
    1819 }
    1820 
    1821 static void webkitWebViewEmitDelayedLoadEvents(WebKitWebView* webView)
    1822 {
    1823     WebKitWebViewPrivate* priv = webView->priv;
    1824     if (!priv->waitingForMainResource)
    1825         return;
    1826     ASSERT(priv->lastDelayedEvent == WEBKIT_LOAD_COMMITTED || priv->lastDelayedEvent == WEBKIT_LOAD_FINISHED);
    1827 
    1828     if (priv->lastDelayedEvent == WEBKIT_LOAD_FINISHED)
    1829         webkitWebViewEmitLoadChanged(webView, WEBKIT_LOAD_COMMITTED, true);
    1830     webkitWebViewEmitLoadChanged(webView, priv->lastDelayedEvent, true);
    1831 }
    1832 
    1833 void webkitWebViewLoadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent)
    1834 {
    1835     WebKitWebViewPrivate* priv = webView->priv;
    1836     if (loadEvent == WEBKIT_LOAD_STARTED) {
    1837         // Finish a possible previous load waiting for main resource.
    1838         webkitWebViewEmitDelayedLoadEvents(webView);
    1839 
    1840         webkitWebViewCancelFaviconRequest(webView);
    18411786        priv->loadingResourcesMap.clear();
    1842         priv->mainResource = 0;
    1843         priv->waitingForMainResource = false;
    1844     } else if (loadEvent == WEBKIT_LOAD_COMMITTED) {
     1787        priv->mainResource = nullptr;
     1788        break;
     1789    case WEBKIT_LOAD_COMMITTED: {
    18451790        WebKitFaviconDatabase* database = webkit_web_context_get_favicon_database(priv->context.get());
    18461791        GUniquePtr<char> faviconURI(webkit_favicon_database_get_favicon_uri(database, priv->activeURI.data()));
    18471792        webkitWebViewUpdateFaviconURI(webView, faviconURI.get());
    1848 
    1849         if (!priv->mainResource) {
    1850             // When a page is loaded from the history cache, the main resource load callbacks
    1851             // are called when the main frame load is finished. We want to make sure there's a
    1852             // main resource available when load has been committed, so we delay the emission of
    1853             // load-changed signal until main resource object has been created.
    1854             priv->waitingForMainResource = true;
    1855         }
     1793        break;
    18561794    }
    1857 
    1858     if (priv->waitingForMainResource)
    1859         priv->lastDelayedEvent = loadEvent;
    1860     else
    1861         webkitWebViewEmitLoadChanged(webView, loadEvent, false);
     1795    case WEBKIT_LOAD_FINISHED:
     1796        webkitWebViewCancelAuthenticationRequest(webView);
     1797        break;
     1798    default:
     1799        break;
     1800    }
     1801
     1802    g_signal_emit(webView, signals[LOAD_CHANGED], 0, loadEvent);
    18621803}
    18631804
     
    19971938}
    19981939
    1999 static void mainResourceResponseChangedCallback(WebKitWebResource*, GParamSpec*, WebKitWebView* webView)
    2000 {
    2001     webkitWebViewDisconnectMainResourceResponseChangedSignalHandler(webView);
    2002     webkitWebViewEmitDelayedLoadEvents(webView);
    2003 }
    2004 
    2005 static void waitForMainResourceResponseIfWaitingForResource(WebKitWebView* webView)
    2006 {
    2007     WebKitWebViewPrivate* priv = webView->priv;
    2008     if (!priv->waitingForMainResource)
    2009         return;
    2010 
    2011     webkitWebViewDisconnectMainResourceResponseChangedSignalHandler(webView);
    2012     priv->mainResourceResponseHandlerID =
    2013         g_signal_connect(priv->mainResource.get(), "notify::response", G_CALLBACK(mainResourceResponseChangedCallback), webView);
    2014 }
    2015 
    20161940void webkitWebViewResourceLoadStarted(WebKitWebView* webView, WebFrameProxy* frame, uint64_t resourceIdentifier, WebKitURIRequest* request)
    20171941{
     
    20191943    bool isMainResource = frame->isMainFrame() && !priv->mainResource;
    20201944    WebKitWebResource* resource = webkitWebResourceCreate(frame, request, isMainResource);
    2021     if (isMainResource) {
     1945    if (isMainResource)
    20221946        priv->mainResource = resource;
    2023         waitForMainResourceResponseIfWaitingForResource(webView);
    2024     }
    20251947    priv->loadingResourcesMap.set(resourceIdentifier, adoptGRef(resource));
    20261948    g_signal_emit(webView, signals[RESOURCE_LOAD_STARTED], 0, resource, request);
     
    34703392        return FALSE;
    34713393
    3472     const WebCore::CertificateInfo& certificateInfo = mainFrame->certificateInfo()->certificateInfo();
     3394    auto* wkCertificateInfo = mainFrame->certificateInfo();
     3395    g_return_val_if_fail(wkCertificateInfo, FALSE);
     3396
     3397    const auto& certificateInfo = wkCertificateInfo->certificateInfo();
    34733398    if (certificate)
    34743399        *certificate = certificateInfo.certificate();
Note: See TracChangeset for help on using the changeset viewer.