Title: [114719] trunk/Source/WebKit2
Revision
114719
Author
carlo...@webkit.org
Date
2012-04-19 23:44:45 -0700 (Thu, 19 Apr 2012)

Log Message

[GTK] Ignore resources while replacing content in WebKit2 GTK+ API
https://bugs.webkit.org/show_bug.cgi?id=79777

Reviewed by Philippe Normand.

* UIProcess/API/gtk/WebKitResourceLoadClient.cpp:
(didSendRequestForResource): Return early if resources is Null.
(didReceiveResponseForResource): Ditto.
(didReceiveContentLengthForResource): Ditto.
(didFinishLoadForResource): Ditto.
(didFailLoadForResource): Ditto.
* UIProcess/API/gtk/WebKitWebView.cpp:
(webkitWebViewLoadChanged): Clear resources before checking
whether we are replacing content.
(webkitWebViewIsReplacingContentOrDidReplaceContent): Helper
function to check whether view is replacing content or current
content is replaced.
(webkitWebViewResourceLoadStarted): Do not create resources when
replacing content.
(webkitWebViewGetLoadingWebResource): Ignore when replacing
content. Also add an assert when getting a loading resources to
make sure we only return Null when replacing content.
(webkitWebViewRemoveLoadingWebResource): Ditto.
(webkitWebViewResourceLoadFinished): Ditto.
* UIProcess/API/gtk/tests/TestResources.cpp:
(replacedContentResourceLoadStartedCallback):
(testWebViewResourcesReplacedContent):
(beforeAll):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (114718 => 114719)


--- trunk/Source/WebKit2/ChangeLog	2012-04-20 06:18:46 UTC (rev 114718)
+++ trunk/Source/WebKit2/ChangeLog	2012-04-20 06:44:45 UTC (rev 114719)
@@ -1,3 +1,34 @@
+2012-04-19  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        [GTK] Ignore resources while replacing content in WebKit2 GTK+ API
+        https://bugs.webkit.org/show_bug.cgi?id=79777
+
+        Reviewed by Philippe Normand.
+
+        * UIProcess/API/gtk/WebKitResourceLoadClient.cpp:
+        (didSendRequestForResource): Return early if resources is Null.
+        (didReceiveResponseForResource): Ditto.
+        (didReceiveContentLengthForResource): Ditto.
+        (didFinishLoadForResource): Ditto.
+        (didFailLoadForResource): Ditto.
+        * UIProcess/API/gtk/WebKitWebView.cpp:
+        (webkitWebViewLoadChanged): Clear resources before checking
+        whether we are replacing content.
+        (webkitWebViewIsReplacingContentOrDidReplaceContent): Helper
+        function to check whether view is replacing content or current
+        content is replaced.
+        (webkitWebViewResourceLoadStarted): Do not create resources when
+        replacing content.
+        (webkitWebViewGetLoadingWebResource): Ignore when replacing
+        content. Also add an assert when getting a loading resources to
+        make sure we only return Null when replacing content.
+        (webkitWebViewRemoveLoadingWebResource): Ditto.
+        (webkitWebViewResourceLoadFinished): Ditto.
+        * UIProcess/API/gtk/tests/TestResources.cpp:
+        (replacedContentResourceLoadStartedCallback):
+        (testWebViewResourcesReplacedContent):
+        (beforeAll):
+
 2012-04-19  Viatcheslav Ostapenko  <ostapenko.viatches...@nokia.com>
 
         [Qt] ASSERT(m_thread == currentThread()) on Mac when threaded rendering is enabled for the Qt scenegraph

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitResourceLoadClient.cpp (114718 => 114719)


--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitResourceLoadClient.cpp	2012-04-20 06:18:46 UTC (rev 114718)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitResourceLoadClient.cpp	2012-04-20 06:44:45 UTC (rev 114719)
@@ -44,6 +44,9 @@
 static void didSendRequestForResource(WKPageRef, WKFrameRef, uint64_t resourceIdentifier, WKURLRequestRef wkRequest, WKURLResponseRef wkRedirectResponse, const void* clientInfo)
 {
     GRefPtr<WebKitWebResource> resource = webkitWebViewGetLoadingWebResource(WEBKIT_WEB_VIEW(clientInfo), resourceIdentifier);
+    if (!resource)
+        return;
+
     GRefPtr<WebKitURIRequest> request = adoptGRef(webkitURIRequestCreateForResourceRequest(toImpl(wkRequest)->resourceRequest()));
     GRefPtr<WebKitURIResponse> redirectResponse = wkRedirectResponse ? adoptGRef(webkitURIResponseCreateForResourceResponse(toImpl(wkRedirectResponse)->resourceResponse())) : 0;
     webkitWebResourceSentRequest(resource.get(), request.get(), redirectResponse.get());
@@ -52,6 +55,9 @@
 static void didReceiveResponseForResource(WKPageRef, WKFrameRef, uint64_t resourceIdentifier, WKURLResponseRef wkResponse, const void* clientInfo)
 {
     GRefPtr<WebKitWebResource> resource = webkitWebViewGetLoadingWebResource(WEBKIT_WEB_VIEW(clientInfo), resourceIdentifier);
+    if (!resource)
+        return;
+
     GRefPtr<WebKitURIResponse> response = adoptGRef(webkitURIResponseCreateForResourceResponse(toImpl(wkResponse)->resourceResponse()));
     webkitWebResourceSetResponse(resource.get(), response.get());
 }
@@ -59,12 +65,18 @@
 static void didReceiveContentLengthForResource(WKPageRef, WKFrameRef, uint64_t resourceIdentifier, uint64_t contentLength, const void* clientInfo)
 {
     GRefPtr<WebKitWebResource> resource = webkitWebViewGetLoadingWebResource(WEBKIT_WEB_VIEW(clientInfo), resourceIdentifier);
+    if (!resource)
+        return;
+
     webkitWebResourceNotifyProgress(resource.get(), contentLength);
 }
 
 static void didFinishLoadForResource(WKPageRef, WKFrameRef, uint64_t resourceIdentifier, const void* clientInfo)
 {
     GRefPtr<WebKitWebResource> resource = webkitWebViewResourceLoadFinished(WEBKIT_WEB_VIEW(clientInfo), resourceIdentifier);
+    if (!resource)
+        return;
+
     webkitWebResourceFinished(resource.get());
 }
 
@@ -72,6 +84,9 @@
 {
     WebKitWebView* webView = WEBKIT_WEB_VIEW(clientInfo);
     GRefPtr<WebKitWebResource> resource = webkitWebViewGetLoadingWebResource(webView, resourceIdentifier);
+    if (!resource)
+        return;
+
     const ResourceError& resourceError = toImpl(wkError)->platformError();
     GOwnPtr<GError> webError(g_error_new_literal(g_quark_from_string(resourceError.domain().utf8().data()),
                                                  resourceError.errorCode(),

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp (114718 => 114719)


--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp	2012-04-20 06:18:46 UTC (rev 114718)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp	2012-04-20 06:44:45 UTC (rev 114719)
@@ -780,14 +780,15 @@
 
 void webkitWebViewLoadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent)
 {
+    if (loadEvent == WEBKIT_LOAD_STARTED) {
+        webView->priv->loadingResourcesMap.clear();
+        webView->priv->mainResource = 0;
+    } else if (loadEvent == WEBKIT_LOAD_COMMITTED)
+        webView->priv->subresourcesMap.clear();
+
     if (updateReplaceContentStatus(webView, loadEvent))
         return;
 
-    if (loadEvent == WEBKIT_LOAD_STARTED)
-        webView->priv->loadingResourcesMap.clear();
-    else if (loadEvent == WEBKIT_LOAD_COMMITTED)
-        webView->priv->subresourcesMap.clear();
-
     if (loadEvent != WEBKIT_LOAD_FINISHED)
         webkitWebViewUpdateURI(webView);
     g_signal_emit(webView, signals[LOAD_CHANGED], 0, loadEvent);
@@ -918,11 +919,18 @@
     g_signal_connect(printOperation.leakRef(), "finished", G_CALLBACK(g_object_unref), 0);
 }
 
+static inline bool webkitWebViewIsReplacingContentOrDidReplaceContent(WebKitWebView* webView)
+{
+    return (webView->priv->replaceContentStatus == ReplacingContent || webView->priv->replaceContentStatus == DidReplaceContent);
+}
+
 void webkitWebViewResourceLoadStarted(WebKitWebView* webView, WKFrameRef wkFrame, uint64_t resourceIdentifier, WebKitURIRequest* request, bool isMainResource)
 {
-    // FIXME: ignore resources when replacing content.
+    if (webkitWebViewIsReplacingContentOrDidReplaceContent(webView))
+        return;
+
+    WebKitWebViewPrivate* priv = webView->priv;
     WebKitWebResource* resource = webkitWebResourceCreate(wkFrame, request, isMainResource);
-    WebKitWebViewPrivate* priv = webView->priv;
     if (WKFrameIsMainFrame(wkFrame) && isMainResource)
         priv->mainResource = resource;
     priv->loadingResourcesMap.set(resourceIdentifier, adoptGRef(resource));
@@ -931,19 +939,31 @@
 
 WebKitWebResource* webkitWebViewGetLoadingWebResource(WebKitWebView* webView, uint64_t resourceIdentifier)
 {
+    if (webkitWebViewIsReplacingContentOrDidReplaceContent(webView))
+        return 0;
+
     GRefPtr<WebKitWebResource> resource = webView->priv->loadingResourcesMap.get(resourceIdentifier);
+    ASSERT(resource.get());
     return resource.get();
 }
 
 void webkitWebViewRemoveLoadingWebResource(WebKitWebView* webView, uint64_t resourceIdentifier)
 {
-    webView->priv->loadingResourcesMap.remove(resourceIdentifier);
+    if (webkitWebViewIsReplacingContentOrDidReplaceContent(webView))
+        return;
+
+    WebKitWebViewPrivate* priv = webView->priv;
+    ASSERT(priv->loadingResourcesMap.contains(resourceIdentifier));
+    priv->loadingResourcesMap.remove(resourceIdentifier);
 }
 
 WebKitWebResource* webkitWebViewResourceLoadFinished(WebKitWebView* webView, uint64_t resourceIdentifier)
 {
+    if (webkitWebViewIsReplacingContentOrDidReplaceContent(webView))
+        return 0;
+
+    WebKitWebViewPrivate* priv = webView->priv;
     WebKitWebResource* resource = webkitWebViewGetLoadingWebResource(webView, resourceIdentifier);
-    WebKitWebViewPrivate* priv = webView->priv;
     if (resource != priv->mainResource)
         priv->subresourcesMap.set(String::fromUTF8(webkit_web_resource_get_uri(resource)), resource);
     webkitWebViewRemoveLoadingWebResource(webView, resourceIdentifier);

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp (114718 => 114719)


--- trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp	2012-04-20 06:18:46 UTC (rev 114718)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp	2012-04-20 06:44:45 UTC (rev 114719)
@@ -481,6 +481,32 @@
         test->checkResourceData(WEBKIT_WEB_RESOURCE(item->data));
 }
 
+static void replacedContentResourceLoadStartedCallback()
+{
+    g_assert_not_reached();
+}
+
+static void testWebViewResourcesReplacedContent(ResourcesTest* test, gconstpointer)
+{
+    test->loadURI(kServer->getURIForPath("/").data());
+    // FIXME: this should be 4 instead of 3, but we don't get the css image resource
+    // due to bug https://bugs.webkit.org/show_bug.cgi?id=78510.
+    test->waitUntilResourcesLoaded(3);
+
+    static const char* replacedHtml =
+        "<html><head>"
+        " <title>Content Replaced</title>"
+        " <link rel='stylesheet' href='' type='text/css'>"
+        " <script language='_javascript_' src=''></script>"
+        "</head><body _onload_='document.title=\"Loaded\"'>WebKitGTK+ resources on replaced content test</body></html>";
+    g_signal_connect(test->m_webView, "resource-load-started", G_CALLBACK(replacedContentResourceLoadStartedCallback), test);
+    test->replaceContent(replacedHtml, "http://error-page.foo", 0);
+    test->waitUntilTitleChangedTo("Loaded");
+
+    g_assert(!webkit_web_view_get_main_resource(test->m_webView));
+    g_assert(!webkit_web_view_get_subresources(test->m_webView));
+}
+
 static void addCacheHTTPHeadersToResponse(SoupMessage* message)
 {
     // The actual date doesn't really matter.
@@ -561,6 +587,7 @@
     SingleResourceLoadTest::add("WebKitWebResource", "response", testWebResourceResponse);
     ResourceURITrackingTest::add("WebKitWebResource", "active-uri", testWebResourceActiveURI);
     ResourcesTest::add("WebKitWebResource", "get-data", testWebResourceGetData);
+    ResourcesTest::add("WebKitWebView", "replaced-content", testWebViewResourcesReplacedContent);
 }
 
 void afterAll()
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to