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