Changeset 194890 in webkit
- Timestamp:
- Jan 12, 2016 3:41:21 AM (8 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r194886 r194890 1 2016-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 1 24 2016-01-11 Carlos Garcia Campos <cgarcia@igalia.com> 2 25 -
trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp
r194579 r194890 180 180 181 181 std::unique_ptr<PageLoadStateObserver> loadObserver; 182 bool waitingForMainResource;183 unsigned long mainResourceResponseHandlerID;184 WebKitLoadEvent lastDelayedEvent;185 182 186 183 GRefPtr<WebKitBackForwardList> backForwardList; … … 251 248 virtual void didChangeIsLoading() override 252 249 { 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 }258 250 webkitWebViewSetIsLoading(m_webView, getPage(m_webView)->pageLoadState().isLoading()); 259 251 g_object_thaw_notify(G_OBJECT(m_webView)); … … 513 505 g_signal_handlers_disconnect_by_func(settings, reinterpret_cast<gpointer>(zoomTextOnlyChanged), webView); 514 506 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;523 507 } 524 508 … … 773 757 WebKitWebView* webView = WEBKIT_WEB_VIEW(object); 774 758 webkitWebViewCancelFaviconRequest(webView); 775 webkitWebViewDisconnectMainResourceResponseChangedSignalHandler(webView);776 759 webkitWebViewDisconnectSettingsSignalHandlers(webView); 777 760 webkitWebViewDisconnectFaviconDatabaseSignalHandlers(webView); … … 1793 1776 } 1794 1777 1795 static void webkitWebViewEmitLoadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent, bool isDelayedEvent) 1796 { 1797 if (loadEvent == WEBKIT_LOAD_STARTED) { 1778 void webkitWebViewLoadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent) 1779 { 1780 WebKitWebViewPrivate* priv = webView->priv; 1781 switch (loadEvent) { 1782 case WEBKIT_LOAD_STARTED: 1783 webkitWebViewCancelFaviconRequest(webView); 1798 1784 webkitWebViewWatchForChangesInFavicon(webView); 1799 1785 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);1841 1786 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: { 1845 1790 WebKitFaviconDatabase* database = webkit_web_context_get_favicon_database(priv->context.get()); 1846 1791 GUniquePtr<char> faviconURI(webkit_favicon_database_get_favicon_uri(database, priv->activeURI.data())); 1847 1792 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; 1856 1794 } 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); 1862 1803 } 1863 1804 … … 1997 1938 } 1998 1939 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 2016 1940 void webkitWebViewResourceLoadStarted(WebKitWebView* webView, WebFrameProxy* frame, uint64_t resourceIdentifier, WebKitURIRequest* request) 2017 1941 { … … 2019 1943 bool isMainResource = frame->isMainFrame() && !priv->mainResource; 2020 1944 WebKitWebResource* resource = webkitWebResourceCreate(frame, request, isMainResource); 2021 if (isMainResource) {1945 if (isMainResource) 2022 1946 priv->mainResource = resource; 2023 waitForMainResourceResponseIfWaitingForResource(webView);2024 }2025 1947 priv->loadingResourcesMap.set(resourceIdentifier, adoptGRef(resource)); 2026 1948 g_signal_emit(webView, signals[RESOURCE_LOAD_STARTED], 0, resource, request); … … 3470 3392 return FALSE; 3471 3393 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(); 3473 3398 if (certificate) 3474 3399 *certificate = certificateInfo.certificate();
Note: See TracChangeset
for help on using the changeset viewer.