Title: [229675] trunk
Revision
229675
Author
[email protected]
Date
2018-03-16 11:33:48 -0700 (Fri, 16 Mar 2018)

Log Message

WebKit.RestoreSessionStateContainingScrollRestorationDefault API test is failing with async policy delegates
https://bugs.webkit.org/show_bug.cgi?id=183679

Reviewed by Alex Christensen.

Source/WebCore:

Update CachedRawResource::didAddClient() to not send data until we've received
the policy decision for the response.

No new tests, covered by new API test.

* loader/DocumentLoader.cpp:
(WebCore::DocumentLoader::handleSubstituteDataLoadNow):
(WebCore::DocumentLoader::responseReceived):
* loader/DocumentLoader.h:
* loader/DocumentThreadableLoader.cpp:
(WebCore::DocumentThreadableLoader::responseReceived):
* loader/DocumentThreadableLoader.h:
* loader/MediaResourceLoader.cpp:
(WebCore::MediaResource::responseReceived):
* loader/MediaResourceLoader.h:
* loader/appcache/ApplicationCacheResourceLoader.cpp:
(WebCore::ApplicationCacheResourceLoader::responseReceived):
* loader/appcache/ApplicationCacheResourceLoader.h:
* loader/cache/CachedRawResource.cpp:
(WebCore::CachedRawResource::didAddClient):
(WebCore::CachedRawResource::responseReceived):
* loader/cache/CachedRawResourceClient.h:
(WebCore::CachedRawResourceClient::responseReceived):
* loader/cache/KeepaliveRequestTracker.cpp:
(WebCore::KeepaliveRequestTracker::responseReceived):
* loader/cache/KeepaliveRequestTracker.h:
* platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.h:
* platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm:
(WebCore::WebCoreAVFResourceLoader::responseReceived):

Tools:

Add API test coverage.

* TestWebKitAPI/Tests/WebKit/RestoreSessionState.cpp:
(TestWebKitAPI::decidePolicyForNavigationAction):
(TestWebKitAPI::decidePolicyForResponse):
(TestWebKitAPI::TEST):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (229674 => 229675)


--- trunk/Source/WebCore/ChangeLog	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/ChangeLog	2018-03-16 18:33:48 UTC (rev 229675)
@@ -1,3 +1,40 @@
+2018-03-16  Chris Dumez  <[email protected]>
+
+        WebKit.RestoreSessionStateContainingScrollRestorationDefault API test is failing with async policy delegates
+        https://bugs.webkit.org/show_bug.cgi?id=183679
+
+        Reviewed by Alex Christensen.
+
+        Update CachedRawResource::didAddClient() to not send data until we've received
+        the policy decision for the response.
+
+        No new tests, covered by new API test.
+
+        * loader/DocumentLoader.cpp:
+        (WebCore::DocumentLoader::handleSubstituteDataLoadNow):
+        (WebCore::DocumentLoader::responseReceived):
+        * loader/DocumentLoader.h:
+        * loader/DocumentThreadableLoader.cpp:
+        (WebCore::DocumentThreadableLoader::responseReceived):
+        * loader/DocumentThreadableLoader.h:
+        * loader/MediaResourceLoader.cpp:
+        (WebCore::MediaResource::responseReceived):
+        * loader/MediaResourceLoader.h:
+        * loader/appcache/ApplicationCacheResourceLoader.cpp:
+        (WebCore::ApplicationCacheResourceLoader::responseReceived):
+        * loader/appcache/ApplicationCacheResourceLoader.h:
+        * loader/cache/CachedRawResource.cpp:
+        (WebCore::CachedRawResource::didAddClient):
+        (WebCore::CachedRawResource::responseReceived):
+        * loader/cache/CachedRawResourceClient.h:
+        (WebCore::CachedRawResourceClient::responseReceived):
+        * loader/cache/KeepaliveRequestTracker.cpp:
+        (WebCore::KeepaliveRequestTracker::responseReceived):
+        * loader/cache/KeepaliveRequestTracker.h:
+        * platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.h:
+        * platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm:
+        (WebCore::WebCoreAVFResourceLoader::responseReceived):
+
 2018-03-16  Youenn Fablet  <[email protected]>
 
         Name Service Worker threads differently from regular Worker threads

Modified: trunk/Source/WebCore/loader/DocumentLoader.cpp (229674 => 229675)


--- trunk/Source/WebCore/loader/DocumentLoader.cpp	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/loader/DocumentLoader.cpp	2018-03-16 18:33:48 UTC (rev 229675)
@@ -461,7 +461,7 @@
     if (response.url().isEmpty())
         response = ResourceResponse(m_request.url(), m_substituteData.mimeType(), m_substituteData.content()->size(), m_substituteData.textEncoding());
 
-    responseReceived(response);
+    responseReceived(response, nullptr);
 }
 
 void DocumentLoader::startDataLoadTimer()
@@ -716,14 +716,16 @@
         cancelMainResourceLoad(frameLoader->cancelledError(m_request));
 }
 
-void DocumentLoader::responseReceived(CachedResource& resource, const ResourceResponse& response)
+void DocumentLoader::responseReceived(CachedResource& resource, const ResourceResponse& response, CompletionHandler<void()>&& completionHandler)
 {
     ASSERT_UNUSED(resource, m_mainResource == &resource);
-    responseReceived(response);
+    responseReceived(response, WTFMove(completionHandler));
 }
 
-void DocumentLoader::responseReceived(const ResourceResponse& response)
+void DocumentLoader::responseReceived(const ResourceResponse& response, CompletionHandler<void()>&& completionHandler)
 {
+    CompletionHandlerCallingScope completionHandlerCaller(WTFMove(completionHandler));
+
 #if ENABLE(CONTENT_FILTERING)
     if (m_contentFilter && !m_contentFilter->continueAfterResponseReceived(response))
         return;
@@ -809,10 +811,12 @@
     RefPtr<SubresourceLoader> mainResourceLoader = this->mainResourceLoader();
     if (mainResourceLoader)
         mainResourceLoader->markInAsyncResponsePolicyCheck();
-    frameLoader()->checkContentPolicy(m_response, [this, protectedThis = makeRef(*this), mainResourceLoader = WTFMove(mainResourceLoader)](PolicyAction policy) {
+    frameLoader()->checkContentPolicy(m_response, [this, protectedThis = makeRef(*this), mainResourceLoader = WTFMove(mainResourceLoader), completionHandler = completionHandlerCaller.release()](PolicyAction policy) {
         continueAfterContentPolicy(policy);
         if (mainResourceLoader)
             mainResourceLoader->didReceiveResponsePolicy();
+        if (completionHandler)
+            completionHandler();
     });
 }
 

Modified: trunk/Source/WebCore/loader/DocumentLoader.h (229674 => 229675)


--- trunk/Source/WebCore/loader/DocumentLoader.h	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/loader/DocumentLoader.h	2018-03-16 18:33:48 UTC (rev 229675)
@@ -355,11 +355,11 @@
     void finishedLoading();
     void mainReceivedError(const ResourceError&);
     WEBCORE_EXPORT void redirectReceived(CachedResource&, ResourceRequest&&, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&&) override;
-    WEBCORE_EXPORT void responseReceived(CachedResource&, const ResourceResponse&) override;
+    WEBCORE_EXPORT void responseReceived(CachedResource&, const ResourceResponse&, CompletionHandler<void()>&&) override;
     WEBCORE_EXPORT void dataReceived(CachedResource&, const char* data, int length) override;
     WEBCORE_EXPORT void notifyFinished(CachedResource&) override;
 
-    void responseReceived(const ResourceResponse&);
+    void responseReceived(const ResourceResponse&, CompletionHandler<void()>&&);
     void dataReceived(const char* data, int length);
 
     bool maybeLoadEmpty();

Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp (229674 => 229675)


--- trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp	2018-03-16 18:33:48 UTC (rev 229675)
@@ -308,10 +308,13 @@
     m_client->didSendData(bytesSent, totalBytesToBeSent);
 }
 
-void DocumentThreadableLoader::responseReceived(CachedResource& resource, const ResourceResponse& response)
+void DocumentThreadableLoader::responseReceived(CachedResource& resource, const ResourceResponse& response, CompletionHandler<void()>&& completionHandler)
 {
     ASSERT_UNUSED(resource, &resource == m_resource);
     didReceiveResponse(m_resource->identifier(), response);
+
+    if (completionHandler)
+        completionHandler();
 }
 
 void DocumentThreadableLoader::didReceiveResponse(unsigned long identifier, const ResourceResponse& response)

Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.h (229674 => 229675)


--- trunk/Source/WebCore/loader/DocumentThreadableLoader.h	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/loader/DocumentThreadableLoader.h	2018-03-16 18:33:48 UTC (rev 229675)
@@ -81,7 +81,7 @@
 
         // CachedRawResourceClient
         void dataSent(CachedResource&, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
-        void responseReceived(CachedResource&, const ResourceResponse&) override;
+        void responseReceived(CachedResource&, const ResourceResponse&, CompletionHandler<void()>&&) override;
         void dataReceived(CachedResource&, const char* data, int dataLength) override;
         void redirectReceived(CachedResource&, ResourceRequest&&, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&&) override;
         void finishedTimingForWorkerLoad(CachedResource&, const ResourceTiming&) override;

Modified: trunk/Source/WebCore/loader/MediaResourceLoader.cpp (229674 => 229675)


--- trunk/Source/WebCore/loader/MediaResourceLoader.cpp	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/loader/MediaResourceLoader.cpp	2018-03-16 18:33:48 UTC (rev 229675)
@@ -139,9 +139,10 @@
         m_resource->setDefersLoading(defersLoading);
 }
 
-void MediaResource::responseReceived(CachedResource& resource, const ResourceResponse& response)
+void MediaResource::responseReceived(CachedResource& resource, const ResourceResponse& response, CompletionHandler<void()>&& completionHandler)
 {
     ASSERT_UNUSED(resource, &resource == m_resource);
+    CompletionHandlerCallingScope completionHandlerCaller(WTFMove(completionHandler));
 
     if (!m_loader->document())
         return;

Modified: trunk/Source/WebCore/loader/MediaResourceLoader.h (229674 => 229675)


--- trunk/Source/WebCore/loader/MediaResourceLoader.h	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/loader/MediaResourceLoader.h	2018-03-16 18:33:48 UTC (rev 229675)
@@ -82,7 +82,7 @@
     bool didPassAccessControlCheck() const override { return m_didPassAccessControlCheck; }
 
     // CachedRawResourceClient
-    void responseReceived(CachedResource&, const ResourceResponse&) override;
+    void responseReceived(CachedResource&, const ResourceResponse&, CompletionHandler<void()>&&) override;
     void redirectReceived(CachedResource&, ResourceRequest&&, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&&) override;
     bool shouldCacheResponse(CachedResource&, const ResourceResponse&) override;
     void dataSent(CachedResource&, unsigned long long, unsigned long long) override;

Modified: trunk/Source/WebCore/loader/appcache/ApplicationCacheResourceLoader.cpp (229674 => 229675)


--- trunk/Source/WebCore/loader/appcache/ApplicationCacheResourceLoader.cpp	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/loader/appcache/ApplicationCacheResourceLoader.cpp	2018-03-16 18:33:48 UTC (rev 229675)
@@ -75,9 +75,10 @@
     }
 }
 
-void ApplicationCacheResourceLoader::responseReceived(CachedResource& resource, const ResourceResponse& response)
+void ApplicationCacheResourceLoader::responseReceived(CachedResource& resource, const ResourceResponse& response, CompletionHandler<void()>&& completionHandler)
 {
     ASSERT_UNUSED(resource, &resource == m_resource);
+    CompletionHandlerCallingScope completionHandlerCaller(WTFMove(completionHandler));
 
     if (response.httpStatusCode() == 404 || response.httpStatusCode() == 410) {
         cancel(Error::NotFound);

Modified: trunk/Source/WebCore/loader/appcache/ApplicationCacheResourceLoader.h (229674 => 229675)


--- trunk/Source/WebCore/loader/appcache/ApplicationCacheResourceLoader.h	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/loader/appcache/ApplicationCacheResourceLoader.h	2018-03-16 18:33:48 UTC (rev 229675)
@@ -54,7 +54,7 @@
     explicit ApplicationCacheResourceLoader(unsigned, CachedResourceHandle<CachedRawResource>&&, CompletionHandler<void(ResourceOrError&&)>&&);
 
     // CachedRawResourceClient
-    void responseReceived(CachedResource&, const ResourceResponse&) final;
+    void responseReceived(CachedResource&, const ResourceResponse&, CompletionHandler<void()>&&) final;
     void dataReceived(CachedResource&, const char* data, int dataLength) final;
     void redirectReceived(CachedResource&, ResourceRequest&&, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&&) final;
     void notifyFinished(CachedResource&) final;

Modified: trunk/Source/WebCore/loader/cache/CachedRawResource.cpp (229674 => 229675)


--- trunk/Source/WebCore/loader/cache/CachedRawResource.cpp	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/loader/cache/CachedRawResource.cpp	2018-03-16 18:33:48 UTC (rev 229675)
@@ -158,6 +158,16 @@
     iterateRedirects(CachedResourceHandle<CachedRawResource>(this), client, WTFMove(redirectsInReverseOrder), [this, protectedThis = CachedResourceHandle<CachedRawResource>(this), client = &client] (ResourceRequest&&) mutable {
         if (!hasClient(*client))
             return;
+        auto responseProcessedHandler = [this, protectedThis = WTFMove(protectedThis), client] {
+            if (!hasClient(*client))
+                return;
+            if (m_data)
+                client->dataReceived(*this, m_data->data(), m_data->size());
+            if (!hasClient(*client))
+                return;
+            CachedResource::didAddClient(*client);
+        };
+
         if (!m_response.isNull()) {
             ResourceResponse response(m_response);
             if (validationCompleting())
@@ -166,15 +176,9 @@
                 ASSERT(!validationInProgress());
                 response.setSource(ResourceResponse::Source::MemoryCache);
             }
-            client->responseReceived(*this, response);
-        }
-        if (!hasClient(*client))
-            return;
-        if (m_data)
-            client->dataReceived(*this, m_data->data(), m_data->size());
-        if (!hasClient(*client))
-            return;
-        CachedResource::didAddClient(*client);
+            client->responseReceived(*this, response, WTFMove(responseProcessedHandler));
+        } else
+            responseProcessedHandler();
     });
 }
 
@@ -215,7 +219,7 @@
     CachedResource::responseReceived(response);
     CachedResourceClientWalker<CachedRawResourceClient> w(m_clients);
     while (CachedRawResourceClient* c = w.next())
-        c->responseReceived(*this, m_response);
+        c->responseReceived(*this, m_response, nullptr);
 }
 
 bool CachedRawResource::shouldCacheResponse(const ResourceResponse& response)

Modified: trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h (229674 => 229675)


--- trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h	2018-03-16 18:33:48 UTC (rev 229675)
@@ -39,7 +39,12 @@
     CachedResourceClientType resourceClientType() const override { return expectedType(); }
 
     virtual void dataSent(CachedResource&, unsigned long long /* bytesSent */, unsigned long long /* totalBytesToBeSent */) { }
-    virtual void responseReceived(CachedResource&, const ResourceResponse&) { }
+    virtual void responseReceived(CachedResource&, const ResourceResponse&, CompletionHandler<void()>&& completionHandler)
+    {
+        if (completionHandler)
+            completionHandler();
+    }
+
     virtual bool shouldCacheResponse(CachedResource&, const ResourceResponse&) { return true; }
     virtual void dataReceived(CachedResource&, const char* /* data */, int /* length */) { }
     virtual void redirectReceived(CachedResource&, ResourceRequest&& request, const ResourceResponse&, CompletionHandler<void(ResourceRequest&&)>&& completionHandler) { completionHandler(WTFMove(request)); }

Modified: trunk/Source/WebCore/loader/cache/KeepaliveRequestTracker.cpp (229674 => 229675)


--- trunk/Source/WebCore/loader/cache/KeepaliveRequestTracker.cpp	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/loader/cache/KeepaliveRequestTracker.cpp	2018-03-16 18:33:48 UTC (rev 229675)
@@ -66,11 +66,14 @@
     resource.addClient(*this);
 }
 
-void KeepaliveRequestTracker::responseReceived(CachedResource& resource, const ResourceResponse&)
+void KeepaliveRequestTracker::responseReceived(CachedResource& resource, const ResourceResponse&, CompletionHandler<void()>&& completionHandler)
 {
     // Per Fetch specification, allocated quota should be returned before the promise is resolved,
     // which is when the response is received.
     unregisterRequest(resource);
+
+    if (completionHandler)
+        completionHandler();
 }
 
 void KeepaliveRequestTracker::notifyFinished(CachedResource& resource)

Modified: trunk/Source/WebCore/loader/cache/KeepaliveRequestTracker.h (229674 => 229675)


--- trunk/Source/WebCore/loader/cache/KeepaliveRequestTracker.h	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/loader/cache/KeepaliveRequestTracker.h	2018-03-16 18:33:48 UTC (rev 229675)
@@ -38,7 +38,7 @@
     bool tryRegisterRequest(CachedResource&);
 
     // CachedRawResourceClient.
-    void responseReceived(CachedResource&, const ResourceResponse&) final;
+    void responseReceived(CachedResource&, const ResourceResponse&, CompletionHandler<void()>&&) final;
     void notifyFinished(CachedResource&) final;
 
 private:

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.cpp (229674 => 229675)


--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.cpp	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.cpp	2018-03-16 18:33:48 UTC (rev 229675)
@@ -111,9 +111,10 @@
     });
 }
 
-void WebCoreAVCFResourceLoader::responseReceived(CachedResource& resource, const ResourceResponse& response)
+void WebCoreAVCFResourceLoader::responseReceived(CachedResource& resource, const ResourceResponse& response, CompletionHandler<void()>&& completionHandler)
 {
     ASSERT_UNUSED(resource, &resource == m_resource);
+    CompletionHandlerCallingScope completionHandlerCaller(WTFMove(completionHandler));
 
     int status = response.httpStatusCode();
     if (status && (status < 200 || status > 299)) {

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.h (229674 => 229675)


--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.h	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.h	2018-03-16 18:33:48 UTC (rev 229675)
@@ -56,7 +56,7 @@
 
 private:
     // CachedRawResourceClient
-    void responseReceived(CachedResource&, const ResourceResponse&) override;
+    void responseReceived(CachedResource&, const ResourceResponse&, CompletionHandler<void()>&&) override;
     void dataReceived(CachedResource&, const char*, int) override;
     void notifyFinished(CachedResource&) override;
 

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.h (229674 => 229675)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.h	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.h	2018-03-16 18:33:48 UTC (rev 229675)
@@ -56,7 +56,7 @@
 
 private:
     // CachedResourceClient
-    void responseReceived(CachedResource&, const ResourceResponse&) override;
+    void responseReceived(CachedResource&, const ResourceResponse&, CompletionHandler<void()>&&) override;
     void dataReceived(CachedResource&, const char*, int) override;
     void notifyFinished(CachedResource&) override;
 

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm (229674 => 229675)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm	2018-03-16 18:33:48 UTC (rev 229675)
@@ -108,9 +108,10 @@
     });
 }
 
-void WebCoreAVFResourceLoader::responseReceived(CachedResource& resource, const ResourceResponse& response)
+void WebCoreAVFResourceLoader::responseReceived(CachedResource& resource, const ResourceResponse& response, CompletionHandler<void()>&& completionHandler)
 {
     ASSERT_UNUSED(resource, &resource == m_resource);
+    CompletionHandlerCallingScope completionHandlerCaller(WTFMove(completionHandler));
 
     int status = response.httpStatusCode();
     if (status && (status < 200 || status > 299)) {

Modified: trunk/Tools/ChangeLog (229674 => 229675)


--- trunk/Tools/ChangeLog	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Tools/ChangeLog	2018-03-16 18:33:48 UTC (rev 229675)
@@ -1,3 +1,17 @@
+2018-03-16  Chris Dumez  <[email protected]>
+
+        WebKit.RestoreSessionStateContainingScrollRestorationDefault API test is failing with async policy delegates
+        https://bugs.webkit.org/show_bug.cgi?id=183679
+
+        Reviewed by Alex Christensen.
+
+        Add API test coverage.
+
+        * TestWebKitAPI/Tests/WebKit/RestoreSessionState.cpp:
+        (TestWebKitAPI::decidePolicyForNavigationAction):
+        (TestWebKitAPI::decidePolicyForResponse):
+        (TestWebKitAPI::TEST):
+
 2018-03-16  Zalan Bujtas  <[email protected]>
 
         [LayoutReloaded] Introduce Display.Box

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit/RestoreSessionState.cpp (229674 => 229675)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit/RestoreSessionState.cpp	2018-03-16 17:38:23 UTC (rev 229674)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit/RestoreSessionState.cpp	2018-03-16 18:33:48 UTC (rev 229675)
@@ -32,6 +32,7 @@
 #include "PlatformWebView.h"
 #include "Test.h"
 #include <WebKit/WKSessionStateRef.h>
+#include <wtf/RunLoop.h>
 
 namespace TestWebKitAPI {
 
@@ -42,6 +43,22 @@
     didFinishLoad = true;
 }
 
+static void decidePolicyForNavigationAction(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKFrameRef originatingFrame, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
+{
+    WKRetainPtr<WKFramePolicyListenerRef> retainedListener(listener);
+    RunLoop::main().dispatch([retainedListener = WTFMove(retainedListener)] {
+        WKFramePolicyListenerUse(retainedListener.get());
+    });
+}
+
+static void decidePolicyForResponse(WKPageRef page, WKFrameRef frame, WKURLResponseRef response, WKURLRequestRef request, bool canShowMIMEType, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
+{
+    WKRetainPtr<WKFramePolicyListenerRef> retainedListener(listener);
+    RunLoop::main().dispatch([retainedListener = WTFMove(retainedListener)] {
+        WKFramePolicyListenerUse(retainedListener.get());
+    });
+}
+
 static void setPageLoaderClient(WKPageRef page)
 {
     WKPageLoaderClientV0 loaderClient;
@@ -84,6 +101,31 @@
     EXPECT_JS_EQ(webView.page(), "history.scrollRestoration", "auto");
 }
 
+TEST(WebKit, RestoreSessionStateContainingScrollRestorationDefaultWithAsyncPolicyDelegates)
+{
+    WKRetainPtr<WKContextRef> context(AdoptWK, WKContextCreate());
+
+    PlatformWebView webView(context.get());
+    setPageLoaderClient(webView.page());
+
+    WKPagePolicyClientV1 policyClient;
+    memset(&policyClient, 0, sizeof(policyClient));
+    policyClient.base.version = 1;
+    policyClient.decidePolicyForNavigationAction = decidePolicyForNavigationAction;
+    policyClient.decidePolicyForResponse = decidePolicyForResponse;
+    WKPageSetPagePolicyClient(webView.page(), &policyClient.base);
+
+    WKRetainPtr<WKDataRef> data = ""
+    EXPECT_NOT_NULL(data);
+
+    auto sessionState = adoptWK(WKSessionStateCreateFromData(data.get()));
+    WKPageRestoreFromSessionState(webView.page(), sessionState.get());
+
+    Util::run(&didFinishLoad);
+
+    EXPECT_JS_EQ(webView.page(), "history.scrollRestoration", "auto");
+}
+
 } // namespace TestWebKitAPI
 
 #endif
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to