Title: [249001] trunk
Revision
249001
Author
[email protected]
Date
2019-08-22 04:05:12 -0700 (Thu, 22 Aug 2019)

Log Message

Add a WebsiteDataStore delegate to handle AuthenticationChallenge that do not come from pages
https://bugs.webkit.org/show_bug.cgi?id=196870

Reviewed by Alex Christensen.

Source/WebKit:

Make NetworkProcess provide the session ID for any authentication challenge.
In case there is no associated page for the authentication challenge or this is related to a service worker,
ask the website data store to take a decision.
Add website data store delegate to allow applications to make the decision.
Restrict using the delegate to server trust evaluation only.

Make ping loads reuse the same mechanism.

Covered by service worker tests and updated beacon test.

* NetworkProcess/NetworkCORSPreflightChecker.cpp:
(WebKit::NetworkCORSPreflightChecker::didReceiveChallenge):
* NetworkProcess/NetworkDataTask.cpp:
(WebKit::NetworkDataTask::sessionID const):
* NetworkProcess/NetworkDataTask.h:
* NetworkProcess/NetworkLoad.cpp:
(WebKit::NetworkLoad::didReceiveChallenge):
* NetworkProcess/NetworkLoadChecker.h:
(WebKit::NetworkLoadChecker::networkProcess):
* NetworkProcess/PingLoad.cpp:
(WebKit::PingLoad::didReceiveChallenge):
* Shared/Authentication/AuthenticationManager.cpp:
(WebKit::AuthenticationManager::didReceiveAuthenticationChallenge):
* Shared/Authentication/AuthenticationManager.h:
* Shared/Authentication/cocoa/AuthenticationChallengeDispositionCocoa.h: Copied from Tools/WebKitTestRunner/cocoa/TestWebsiteDataStoreDelegate.h.
* Shared/Authentication/cocoa/AuthenticationChallengeDispositionCocoa.mm: Copied from Source/WebKit/Shared/Authentication/cocoa/ClientCertificateAuthenticationXPCConstants.h.
(WebKit::toAuthenticationChallengeDisposition):
* SourcesCocoa.txt:
* UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
(WebsiteDataStoreClient::WebsiteDataStoreClient):
* UIProcess/API/Cocoa/_WKWebsiteDataStoreDelegate.h:
* UIProcess/Cocoa/NavigationState.mm:
(WebKit::NavigationState::NavigationClient::didReceiveAuthenticationChallenge):
* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::didReceiveAuthenticationChallenge):
* UIProcess/Network/NetworkProcessProxy.h:
* UIProcess/Network/NetworkProcessProxy.messages.in:
* UIProcess/ServiceWorkerProcessProxy.cpp:
* UIProcess/ServiceWorkerProcessProxy.h:
* UIProcess/WebPageProxy.cpp:
* UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::isServiceWorkerPageID const):
* UIProcess/WebProcessPool.h:
* UIProcess/WebsiteData/WebsiteDataStoreClient.h:
(WebKit::WebsiteDataStoreClient::didReceiveAuthenticationChallenge):
* WebKit.xcodeproj/project.pbxproj:

Tools:

Implement the new delegate by respecting the value set by testRunner.setAllowsAnySSLCertificate
Accept any server certificate by default.

* WebKitTestRunner/TestController.cpp:
* WebKitTestRunner/cocoa/TestControllerCocoa.mm:
(WTR::TestController::cocoaResetStateToConsistentValues):
(WTR::TestController::setAllowsAnySSLCertificate):
* WebKitTestRunner/cocoa/TestWebsiteDataStoreDelegate.h:
* WebKitTestRunner/cocoa/TestWebsiteDataStoreDelegate.mm:
(-[TestWebsiteDataStoreDelegate didReceiveAuthenticationChallenge:completionHandler:]):
(-[TestWebsiteDataStoreDelegate setAllowAnySSLCertificate:]):

LayoutTests:

Add tests to validate that the delegate decision is respected for beacons and service worker loads.

* http/wpt/beacon/cors/crossorigin-arraybufferview-no-preflight-expected.txt:
* http/wpt/beacon/cors/crossorigin-arraybufferview-no-preflight.html:
* http/wpt/beacon/resources/beacon-preflight.py:
(main):
* http/wpt/service-workers/resources/lengthy-pass.py:
(main):
* http/wpt/service-workers/server-trust-evaluation.https-expected.txt: Added.
* http/wpt/service-workers/server-trust-evaluation.https.html: Added.
* http/wpt/service-workers/server-trust-worker.js: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (249000 => 249001)


--- trunk/LayoutTests/ChangeLog	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/LayoutTests/ChangeLog	2019-08-22 11:05:12 UTC (rev 249001)
@@ -1,3 +1,22 @@
+2019-08-22  Youenn Fablet  <[email protected]>
+
+        Add a WebsiteDataStore delegate to handle AuthenticationChallenge that do not come from pages
+        https://bugs.webkit.org/show_bug.cgi?id=196870
+
+        Reviewed by Alex Christensen.
+
+        Add tests to validate that the delegate decision is respected for beacons and service worker loads.
+
+        * http/wpt/beacon/cors/crossorigin-arraybufferview-no-preflight-expected.txt:
+        * http/wpt/beacon/cors/crossorigin-arraybufferview-no-preflight.html:
+        * http/wpt/beacon/resources/beacon-preflight.py:
+        (main):
+        * http/wpt/service-workers/resources/lengthy-pass.py:
+        (main):
+        * http/wpt/service-workers/server-trust-evaluation.https-expected.txt: Added.
+        * http/wpt/service-workers/server-trust-evaluation.https.html: Added.
+        * http/wpt/service-workers/server-trust-worker.js: Added.
+
 2019-08-21  Ryosuke Niwa  <[email protected]>
 
         Layout Test perf/clone-with-focus.html is a Flaky Failure

Modified: trunk/LayoutTests/http/wpt/beacon/cors/crossorigin-arraybufferview-no-preflight-expected.txt (249000 => 249001)


--- trunk/LayoutTests/http/wpt/beacon/cors/crossorigin-arraybufferview-no-preflight-expected.txt	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/LayoutTests/http/wpt/beacon/cors/crossorigin-arraybufferview-no-preflight-expected.txt	2019-08-22 11:05:12 UTC (rev 249001)
@@ -1,3 +1,4 @@
 
+PASS Beacon load should not be sent if server is not trusted. 
 PASS Should send beacon with no CORS preflight 
 

Modified: trunk/LayoutTests/http/wpt/beacon/cors/crossorigin-arraybufferview-no-preflight.html (249000 => 249001)


--- trunk/LayoutTests/http/wpt/beacon/cors/crossorigin-arraybufferview-no-preflight.html	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/LayoutTests/http/wpt/beacon/cors/crossorigin-arraybufferview-no-preflight.html	2019-08-22 11:05:12 UTC (rev 249001)
@@ -26,12 +26,33 @@
   });
 }
 
-function testCORSPreflightSuccess(what) {
-  var testBase = get_host_info().HTTP_REMOTE_ORIGIN + RESOURCES_DIR;
-  var id = self.token();
-  var testUrl = testBase + "beacon-preflight.py?allowCors=1&cmd=put&id=" + id;
+function testCORSPreflight(what) {
+  var testBase = get_host_info().HTTPS_REMOTE_ORIGIN + RESOURCES_DIR;
 
-  promise_test(function(test) {
+  promise_test(async function(test) {
+    var id = "ca33c073-1cf0-41e5-bbd4-55969fb1a6c7";
+    var testUrl = testBase + "beacon-preflight.py?allowCors=1&cmd=put&id=" + id;
+    if (window.testRunner) {
+      window.testRunner.setAllowsAnySSLCertificate(false);
+      window.testRunner.terminateNetworkProcess();
+      await fetch("").then(() => { }, () => { });
+    }
+
+    assert_true(navigator.sendBeacon(testUrl, what), "sendBeacon succeeded");
+    const result = await pollResult(test, id);
+    assert_equals(result['preflight'], 0, "Did not receive CORS preflight")
+    assert_equals(result['beacon'], 0, "Did not receive beacon")
+  }, "Beacon load should not be sent if server is not trusted.");
+
+  promise_test(async function(test) {
+    var id = self.token();
+    var testUrl = testBase + "beacon-preflight.py?allowCors=1&cmd=put&id=" + id;
+    if (window.testRunner) {
+      window.testRunner.setAllowsAnySSLCertificate(true);
+      window.testRunner.terminateNetworkProcess();
+      await fetch("").then(() => { }, () => { });
+    }
+
     assert_true(navigator.sendBeacon(testUrl, what), "SendBeacon Succeeded");
     return pollResult(test, id) .then(result => {
       assert_equals(result['preflight'], 0, "Did not receive CORS preflight")
@@ -51,7 +72,7 @@
   return view;
 }
 
-testCORSPreflightSuccess(stringToArrayBufferView("123"));
+testCORSPreflight(stringToArrayBufferView("123"));
     </script>
   </body>
 </html>

Modified: trunk/LayoutTests/http/wpt/beacon/resources/beacon-preflight.py (249000 => 249001)


--- trunk/LayoutTests/http/wpt/beacon/resources/beacon-preflight.py	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/LayoutTests/http/wpt/beacon/resources/beacon-preflight.py	2019-08-22 11:05:12 UTC (rev 249001)
@@ -44,11 +44,9 @@
       stashed_data['beacon_origin'] = request.headers.get("Origin", "")
       request.server.stash.put(test_id, stashed_data)
     return [("Content-Type", "text/plain")], ""
-  
+
   if command == "get":
-    if stashed_data is not None:
-      return [("Content-Type", "text/plain")], json.dumps(stashed_data)
-    return [("Content-Type", "text/plain")], ""
+    return [("Content-Type", "text/plain")], json.dumps(stashed_data)
 
   response.set_error(400, "Bad Command")
   return [("Content-Type", "text/plain")], "ERROR: Bad Command!"

Modified: trunk/LayoutTests/http/wpt/service-workers/resources/lengthy-pass.py (249000 => 249001)


--- trunk/LayoutTests/http/wpt/service-workers/resources/lengthy-pass.py	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/LayoutTests/http/wpt/service-workers/resources/lengthy-pass.py	2019-08-22 11:05:12 UTC (rev 249001)
@@ -3,6 +3,7 @@
 def main(request, response):
     delay = 0.05
     response.headers.set("Content-type", "text/_javascript_")
+    response.headers.append("Access-Control-Allow-Origin", "*")
     response.write_status_headers()
     time.sleep(delay);
     response.writer.write_content("document")

Added: trunk/LayoutTests/http/wpt/service-workers/server-trust-evaluation.https-expected.txt (0 => 249001)


--- trunk/LayoutTests/http/wpt/service-workers/server-trust-evaluation.https-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/server-trust-evaluation.https-expected.txt	2019-08-22 11:05:12 UTC (rev 249001)
@@ -0,0 +1,5 @@
+
+PASS Setup worker 
+PASS Service worker load should fail 
+PASS Service worker load should succeed 
+

Added: trunk/LayoutTests/http/wpt/service-workers/server-trust-evaluation.https.html (0 => 249001)


--- trunk/LayoutTests/http/wpt/service-workers/server-trust-evaluation.https.html	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/server-trust-evaluation.https.html	2019-08-22 11:05:12 UTC (rev 249001)
@@ -0,0 +1,53 @@
+<html>
+<head>
+<title>Service Worker triggering server trust evaluation</title>
+<script src=""
+<script src=""
+<script src=""
+</head>
+<body>
+<script>
+var registration;
+var iframe;
+promise_test(async (test) => {
+    if (window.testRunner) {
+        window.testRunner.terminateNetworkProcess();
+        await fetch("").then(() => { }, () => { });
+    }
+
+    registration = await navigator.serviceWorker.getRegistration("resources/");
+    if (registration)
+        await registration.unregister();
+    registration = await navigator.serviceWorker.register("server-trust-worker.js", { scope : "resources/" });
+    activeWorker = registration.active;
+    if (activeWorker)
+        return;
+    activeWorker = registration.installing;
+    await new Promise(resolve => {
+        activeWorker.addEventListener('statechange', () => {
+            if (activeWorker.state === "activated")
+                resolve();
+        });
+    });
+}, "Setup worker");
+
+promise_test(async (test) => {
+    if (window.testRunner)
+        window.testRunner.setAllowsAnySSLCertificate(false);
+
+    iframe = await with_iframe("resources/iframe1.html");
+    assert_true(iframe.contentWindow.document.body.innerHTML.trim().indexOf("Load failed: ") !== -1);
+    iframe.remove();
+}, "Service worker load should fail");
+
+promise_test(async (test) => {
+    if (window.testRunner)
+        window.testRunner.setAllowsAnySSLCertificate(true);
+
+    iframe = await with_iframe("resources/iframe2.html");
+    assert_true(iframe.contentWindow.document.body.innerHTML.trim().indexOf("PASS") !== -1);
+    iframe.remove();
+}, "Service worker load should succeed");
+</script>
+</body>
+</html>

Added: trunk/LayoutTests/http/wpt/service-workers/server-trust-worker.js (0 => 249001)


--- trunk/LayoutTests/http/wpt/service-workers/server-trust-worker.js	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/server-trust-worker.js	2019-08-22 11:05:12 UTC (rev 249001)
@@ -0,0 +1,5 @@
+var remoteUrl = 'https://127.0.0.1:9443/WebKit/service-workers/resources/lengthy-pass.py?';
+var counter = 0;
+self.addEventListener('fetch', (event) => {
+    event.respondWith(fetch(remoteUrl + counter++).then(response => new Response("PASS")).catch(e => new Response("Load failed: " + e)));
+});

Modified: trunk/Source/WebKit/ChangeLog (249000 => 249001)


--- trunk/Source/WebKit/ChangeLog	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/ChangeLog	2019-08-22 11:05:12 UTC (rev 249001)
@@ -1,3 +1,57 @@
+2019-08-22  Youenn Fablet  <[email protected]>
+
+        Add a WebsiteDataStore delegate to handle AuthenticationChallenge that do not come from pages
+        https://bugs.webkit.org/show_bug.cgi?id=196870
+
+        Reviewed by Alex Christensen.
+
+        Make NetworkProcess provide the session ID for any authentication challenge.
+        In case there is no associated page for the authentication challenge or this is related to a service worker,
+        ask the website data store to take a decision.
+        Add website data store delegate to allow applications to make the decision.
+        Restrict using the delegate to server trust evaluation only.
+
+        Make ping loads reuse the same mechanism.
+
+        Covered by service worker tests and updated beacon test.
+
+        * NetworkProcess/NetworkCORSPreflightChecker.cpp:
+        (WebKit::NetworkCORSPreflightChecker::didReceiveChallenge):
+        * NetworkProcess/NetworkDataTask.cpp:
+        (WebKit::NetworkDataTask::sessionID const):
+        * NetworkProcess/NetworkDataTask.h:
+        * NetworkProcess/NetworkLoad.cpp:
+        (WebKit::NetworkLoad::didReceiveChallenge):
+        * NetworkProcess/NetworkLoadChecker.h:
+        (WebKit::NetworkLoadChecker::networkProcess):
+        * NetworkProcess/PingLoad.cpp:
+        (WebKit::PingLoad::didReceiveChallenge):
+        * Shared/Authentication/AuthenticationManager.cpp:
+        (WebKit::AuthenticationManager::didReceiveAuthenticationChallenge):
+        * Shared/Authentication/AuthenticationManager.h:
+        * Shared/Authentication/cocoa/AuthenticationChallengeDispositionCocoa.h: Copied from Tools/WebKitTestRunner/cocoa/TestWebsiteDataStoreDelegate.h.
+        * Shared/Authentication/cocoa/AuthenticationChallengeDispositionCocoa.mm: Copied from Source/WebKit/Shared/Authentication/cocoa/ClientCertificateAuthenticationXPCConstants.h.
+        (WebKit::toAuthenticationChallengeDisposition):
+        * SourcesCocoa.txt:
+        * UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
+        (WebsiteDataStoreClient::WebsiteDataStoreClient):
+        * UIProcess/API/Cocoa/_WKWebsiteDataStoreDelegate.h:
+        * UIProcess/Cocoa/NavigationState.mm:
+        (WebKit::NavigationState::NavigationClient::didReceiveAuthenticationChallenge):
+        * UIProcess/Network/NetworkProcessProxy.cpp:
+        (WebKit::NetworkProcessProxy::didReceiveAuthenticationChallenge):
+        * UIProcess/Network/NetworkProcessProxy.h:
+        * UIProcess/Network/NetworkProcessProxy.messages.in:
+        * UIProcess/ServiceWorkerProcessProxy.cpp:
+        * UIProcess/ServiceWorkerProcessProxy.h:
+        * UIProcess/WebPageProxy.cpp:
+        * UIProcess/WebProcessPool.cpp:
+        (WebKit::WebProcessPool::isServiceWorkerPageID const):
+        * UIProcess/WebProcessPool.h:
+        * UIProcess/WebsiteData/WebsiteDataStoreClient.h:
+        (WebKit::WebsiteDataStoreClient::didReceiveAuthenticationChallenge):
+        * WebKit.xcodeproj/project.pbxproj:
+
 2019-08-22  Claudio Saavedra  <[email protected]>
 
         [SOUP] NetworkProcessSoup does not initialize CacheOptions correctly

Modified: trunk/Source/WebKit/NetworkProcess/NetworkCORSPreflightChecker.cpp (249000 => 249001)


--- trunk/Source/WebKit/NetworkProcess/NetworkCORSPreflightChecker.cpp	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/NetworkProcess/NetworkCORSPreflightChecker.cpp	2019-08-22 11:05:12 UTC (rev 249001)
@@ -101,7 +101,7 @@
         return;
     }
 
-    m_networkProcess->authenticationManager().didReceiveAuthenticationChallenge(m_parameters.pageID, m_parameters.frameID, challenge, WTFMove(completionHandler));
+    m_networkProcess->authenticationManager().didReceiveAuthenticationChallenge(m_parameters.sessionID, m_parameters.pageID, m_parameters.frameID, challenge, WTFMove(completionHandler));
 }
 
 void NetworkCORSPreflightChecker::didReceiveResponse(WebCore::ResourceResponse&& response, ResponseCompletionHandler&& completionHandler)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp (249000 => 249001)


--- trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp	2019-08-22 11:05:12 UTC (rev 249001)
@@ -150,4 +150,9 @@
     return emptyString();
 }
 
+PAL::SessionID NetworkDataTask::sessionID() const
+{
+    return m_session->sessionID();
+}
+
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/NetworkDataTask.h (249000 => 249001)


--- trunk/Source/WebKit/NetworkProcess/NetworkDataTask.h	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/NetworkProcess/NetworkDataTask.h	2019-08-22 11:05:12 UTC (rev 249001)
@@ -34,6 +34,7 @@
 #include <WebCore/ResourceRequest.h>
 #include <WebCore/StoredCredentialsPolicy.h>
 #include <WebCore/Timer.h>
+#include <pal/SessionID.h>
 #include <wtf/CompletionHandler.h>
 #include <wtf/ThreadSafeRefCounted.h>
 #include <wtf/text/WTFString.h>
@@ -130,6 +131,8 @@
 
     virtual String description() const;
 
+    PAL::SessionID sessionID() const;
+
 protected:
     NetworkDataTask(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::StoredCredentialsPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, bool dataTaskIsForMainFrameNavigation);
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkLoad.cpp (249000 => 249001)


--- trunk/Source/WebKit/NetworkProcess/NetworkLoad.cpp	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/NetworkProcess/NetworkLoad.cpp	2019-08-22 11:05:12 UTC (rev 249001)
@@ -201,7 +201,7 @@
     if (auto* pendingDownload = m_task->pendingDownload())
         m_networkProcess->authenticationManager().didReceiveAuthenticationChallenge(*pendingDownload, challenge, WTFMove(completionHandler));
     else
-        m_networkProcess->authenticationManager().didReceiveAuthenticationChallenge(m_parameters.webPageID, m_parameters.webFrameID, challenge, WTFMove(completionHandler));
+        m_networkProcess->authenticationManager().didReceiveAuthenticationChallenge(m_task->sessionID(), m_parameters.webPageID, m_parameters.webFrameID, challenge, WTFMove(completionHandler));
 }
 
 void NetworkLoad::didReceiveResponse(ResourceResponse&& response, ResponseCompletionHandler&& completionHandler)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.h (249000 => 249001)


--- trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.h	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.h	2019-08-22 11:05:12 UTC (rev 249001)
@@ -84,6 +84,8 @@
     }
 #endif
 
+    NetworkProcess& networkProcess() { return m_networkProcess; }
+
     const URL& url() const { return m_url; }
     WebCore::StoredCredentialsPolicy storedCredentialsPolicy() const { return m_storedCredentialsPolicy; }
 

Modified: trunk/Source/WebKit/NetworkProcess/PingLoad.cpp (249000 => 249001)


--- trunk/Source/WebKit/NetworkProcess/PingLoad.cpp	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/NetworkProcess/PingLoad.cpp	2019-08-22 11:05:12 UTC (rev 249001)
@@ -148,7 +148,7 @@
 {
     RELEASE_LOG_IF_ALLOWED("didReceiveChallenge");
     if (challenge.protectionSpace().authenticationScheme() == ProtectionSpaceAuthenticationSchemeServerTrustEvaluationRequested) {
-        completionHandler(AuthenticationChallengeDisposition::PerformDefaultHandling, { });
+        m_networkLoadChecker->networkProcess().authenticationManager().didReceiveAuthenticationChallenge(m_parameters.sessionID, m_parameters.webPageID, m_parameters.webFrameID, challenge, WTFMove(completionHandler));
         return;
     }
     auto weakThis = makeWeakPtr(*this);

Modified: trunk/Source/WebKit/Shared/Authentication/AuthenticationManager.cpp (249000 => 249001)


--- trunk/Source/WebKit/Shared/Authentication/AuthenticationManager.cpp	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/Shared/Authentication/AuthenticationManager.cpp	2019-08-22 11:05:12 UTC (rev 249001)
@@ -108,7 +108,7 @@
     return challengesToCoalesce;
 }
 
-void AuthenticationManager::didReceiveAuthenticationChallenge(PageIdentifier pageID, FrameIdentifier frameID, const AuthenticationChallenge& authenticationChallenge, ChallengeCompletionHandler&& completionHandler)
+void AuthenticationManager::didReceiveAuthenticationChallenge(PAL::SessionID sessionID, PageIdentifier pageID, FrameIdentifier frameID, const AuthenticationChallenge& authenticationChallenge, ChallengeCompletionHandler&& completionHandler)
 {
     ASSERT(pageID);
     ASSERT(frameID);
@@ -119,7 +119,7 @@
     if (shouldCoalesceChallenge(pageID, challengeID, authenticationChallenge))
         return;
     
-    m_process.send(Messages::NetworkProcessProxy::DidReceiveAuthenticationChallenge(pageID, frameID, authenticationChallenge, challengeID));
+    m_process.send(Messages::NetworkProcessProxy::DidReceiveAuthenticationChallenge(sessionID, pageID, frameID, authenticationChallenge, challengeID));
 }
 
 void AuthenticationManager::didReceiveAuthenticationChallenge(IPC::MessageSender& download, const WebCore::AuthenticationChallenge& authenticationChallenge, ChallengeCompletionHandler&& completionHandler)

Modified: trunk/Source/WebKit/Shared/Authentication/AuthenticationManager.h (249000 => 249001)


--- trunk/Source/WebKit/Shared/Authentication/AuthenticationManager.h	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/Shared/Authentication/AuthenticationManager.h	2019-08-22 11:05:12 UTC (rev 249001)
@@ -63,7 +63,7 @@
 
     static const char* supplementName();
 
-    void didReceiveAuthenticationChallenge(WebCore::PageIdentifier, WebCore::FrameIdentifier, const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler&&);
+    void didReceiveAuthenticationChallenge(PAL::SessionID, WebCore::PageIdentifier, WebCore::FrameIdentifier, const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler&&);
     void didReceiveAuthenticationChallenge(IPC::MessageSender& download, const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler&&);
 
     void completeAuthenticationChallenge(uint64_t challengeID, AuthenticationChallengeDisposition, WebCore::Credential&&);

Copied: trunk/Source/WebKit/Shared/Authentication/cocoa/AuthenticationChallengeDispositionCocoa.h (from rev 249000, trunk/Tools/WebKitTestRunner/cocoa/TestWebsiteDataStoreDelegate.h) (0 => 249001)


--- trunk/Source/WebKit/Shared/Authentication/cocoa/AuthenticationChallengeDispositionCocoa.h	                        (rev 0)
+++ trunk/Source/WebKit/Shared/Authentication/cocoa/AuthenticationChallengeDispositionCocoa.h	2019-08-22 11:05:12 UTC (rev 249001)
@@ -0,0 +1,35 @@
+  /*
+ * Copyright (C) 2019 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#import "AuthenticationChallengeDisposition.h"
+#import <Foundation/NSURLSession.h>
+
+namespace WebKit {
+
+AuthenticationChallengeDisposition toAuthenticationChallengeDisposition(NSURLSessionAuthChallengeDisposition);
+
+} // namespace WebKit

Copied: trunk/Source/WebKit/Shared/Authentication/cocoa/AuthenticationChallengeDispositionCocoa.mm (from rev 249000, trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreClient.h) (0 => 249001)


--- trunk/Source/WebKit/Shared/Authentication/cocoa/AuthenticationChallengeDispositionCocoa.mm	                        (rev 0)
+++ trunk/Source/WebKit/Shared/Authentication/cocoa/AuthenticationChallengeDispositionCocoa.mm	2019-08-22 11:05:12 UTC (rev 249001)
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2018-2019 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "AuthenticationChallengeDispositionCocoa.h"
+
+namespace WebKit {
+
+AuthenticationChallengeDisposition toAuthenticationChallengeDisposition(NSURLSessionAuthChallengeDisposition disposition)
+{
+    switch (disposition) {
+    case NSURLSessionAuthChallengeUseCredential:
+        return AuthenticationChallengeDisposition::UseCredential;
+    case NSURLSessionAuthChallengePerformDefaultHandling:
+        return AuthenticationChallengeDisposition::PerformDefaultHandling;
+    case NSURLSessionAuthChallengeCancelAuthenticationChallenge:
+        return AuthenticationChallengeDisposition::Cancel;
+    case NSURLSessionAuthChallengeRejectProtectionSpace:
+        return AuthenticationChallengeDisposition::RejectProtectionSpaceAndContinue;
+    }
+    [NSException raise:NSInvalidArgumentException format:@"Invalid NSURLSessionAuthChallengeDisposition (%ld)", (long)disposition];
+}
+
+} // namespace WebKit

Modified: trunk/Source/WebKit/SourcesCocoa.txt (249000 => 249001)


--- trunk/Source/WebKit/SourcesCocoa.txt	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/SourcesCocoa.txt	2019-08-22 11:05:12 UTC (rev 249001)
@@ -133,6 +133,7 @@
 
 Shared/cg/ShareableBitmapCG.cpp
 
+Shared/Authentication/cocoa/AuthenticationChallengeDispositionCocoa.mm
 Shared/Authentication/cocoa/AuthenticationManagerCocoa.mm
 Shared/Authentication/cocoa/ClientCertificateAuthenticationXPCConstants.cpp
 

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm (249000 => 249001)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2019-08-22 11:05:12 UTC (rev 249001)
@@ -27,9 +27,11 @@
 #import "WKWebsiteDataStoreInternal.h"
 
 #import "APIString.h"
+#import "AuthenticationChallengeDispositionCocoa.h"
 #import "CompletionHandlerCallChecker.h"
 #import "WKHTTPCookieStoreInternal.h"
 #import "WKNSArray.h"
+#import "WKNSURLAuthenticationChallenge.h"
 #import "WKWebViewInternal.h"
 #import "WKWebsiteDataRecordInternal.h"
 #import "WebPageProxy.h"
@@ -38,6 +40,7 @@
 #import "WebsiteDataFetchOption.h"
 #import "_WKWebsiteDataStoreConfiguration.h"
 #import "_WKWebsiteDataStoreDelegate.h"
+#import <WebCore/Credential.h>
 #import <WebKit/ServiceWorkerProcessProxy.h>
 #import <wtf/BlockPtr.h>
 #import <wtf/URL.h>
@@ -48,6 +51,7 @@
     explicit WebsiteDataStoreClient(id <_WKWebsiteDataStoreDelegate> delegate)
         : m_delegate(delegate)
         , m_hasRequestStorageSpaceSelector([m_delegate.get() respondsToSelector:@selector(requestStorageSpace: frameOrigin: quota: currentSize: spaceRequired: decisionHandler:)])
+        , m_hasAuthenticationChallengeSelector([m_delegate.get() respondsToSelector:@selector(didReceiveAuthenticationChallenge: completionHandler:)])
     {
     }
 
@@ -73,8 +77,28 @@
         [m_delegate.getAutoreleased() requestStorageSpace:mainFrameURL frameOrigin:frameURL quota:quota currentSize:currentSize spaceRequired:spaceRequired decisionHandler:decisionHandler.get()];
     }
 
+    void didReceiveAuthenticationChallenge(Ref<WebKit::AuthenticationChallengeProxy>&& challenge) final
+    {
+        if (!m_hasAuthenticationChallengeSelector || !m_delegate) {
+            challenge->listener().completeChallenge(WebKit::AuthenticationChallengeDisposition::PerformDefaultHandling);
+            return;
+        }
+
+        auto nsURLChallenge = wrapper(challenge);
+        auto checker = WebKit::CompletionHandlerCallChecker::create(m_delegate.getAutoreleased(), @selector(didReceiveAuthenticationChallenge: completionHandler:));
+        auto completionHandler = makeBlockPtr([challenge = WTFMove(challenge), checker = WTFMove(checker)](NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential) mutable {
+            if (checker->completionHandlerHasBeenCalled())
+                return;
+            checker->didCallCompletionHandler();
+            challenge->listener().completeChallenge(WebKit::toAuthenticationChallengeDisposition(disposition), WebCore::Credential(credential));
+        });
+
+        [m_delegate.getAutoreleased() didReceiveAuthenticationChallenge:nsURLChallenge completionHandler:completionHandler.get()];
+    }
+
     WeakObjCPtr<id <_WKWebsiteDataStoreDelegate> > m_delegate;
     bool m_hasRequestStorageSpaceSelector { false };
+    bool m_hasAuthenticationChallengeSelector { false };
 };
 
 @implementation WKWebsiteDataStore

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsiteDataStoreDelegate.h (249000 => 249001)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsiteDataStoreDelegate.h	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsiteDataStoreDelegate.h	2019-08-22 11:05:12 UTC (rev 249001)
@@ -34,4 +34,6 @@
 
 - (void)requestStorageSpace:(NSURL *)mainFrameURL frameOrigin:(NSURL *)frameURL quota:(NSUInteger)quota currentSize:(NSUInteger)currentSize spaceRequired:(NSUInteger)spaceRequired decisionHandler:(void (^)(unsigned long long quota))decisionHandler;
 
+- (void)didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler;
+
 @end

Modified: trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm (249000 => 249001)


--- trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm	2019-08-22 11:05:12 UTC (rev 249001)
@@ -35,6 +35,7 @@
 #import "APIURL.h"
 #import "APIWebsiteDataStore.h"
 #import "AuthenticationChallengeDisposition.h"
+#import "AuthenticationChallengeDispositionCocoa.h"
 #import "AuthenticationDecisionListener.h"
 #import "CompletionHandlerCallChecker.h"
 #import "Logging.h"
@@ -959,21 +960,6 @@
         || m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionWithPreferencesUserInfoDecisionHandler;
 }
 
-static AuthenticationChallengeDisposition toAuthenticationChallengeDisposition(NSURLSessionAuthChallengeDisposition disposition)
-{
-    switch (disposition) {
-    case NSURLSessionAuthChallengeUseCredential:
-        return AuthenticationChallengeDisposition::UseCredential;
-    case NSURLSessionAuthChallengePerformDefaultHandling:
-        return AuthenticationChallengeDisposition::PerformDefaultHandling;
-    case NSURLSessionAuthChallengeCancelAuthenticationChallenge:
-        return AuthenticationChallengeDisposition::Cancel;
-    case NSURLSessionAuthChallengeRejectProtectionSpace:
-        return AuthenticationChallengeDisposition::RejectProtectionSpaceAndContinue;
-    }
-    [NSException raise:NSInvalidArgumentException format:@"Invalid NSURLSessionAuthChallengeDisposition (%ld)", (long)disposition];
-}
-    
 void NavigationState::NavigationClient::didReceiveAuthenticationChallenge(WebPageProxy&, AuthenticationChallengeProxy& authenticationChallenge)
 {
     if (!m_navigationState.m_navigationDelegateMethods.webViewDidReceiveAuthenticationChallengeCompletionHandler)
@@ -988,7 +974,7 @@
         if (checker->completionHandlerHasBeenCalled())
             return;
         checker->didCallCompletionHandler();
-        challenge->listener().completeChallenge(toAuthenticationChallengeDisposition(disposition), Credential(credential));
+        challenge->listener().completeChallenge(WebKit::toAuthenticationChallengeDisposition(disposition), Credential(credential));
     }).get()];
 }
 

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (249000 => 249001)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2019-08-22 11:05:12 UTC (rev 249001)
@@ -37,6 +37,9 @@
 #include "NetworkProcessCreationParameters.h"
 #include "NetworkProcessMessages.h"
 #include "SandboxExtension.h"
+#if HAVE(SEC_KEY_PROXY)
+#include "SecKeyProxyStore.h"
+#endif
 #include "ShouldGrandfatherStatistics.h"
 #include "StorageAccessStatus.h"
 #include "WebCompiledContentRuleList.h"
@@ -312,20 +315,36 @@
 #endif
 }
 
-void NetworkProcessProxy::didReceiveAuthenticationChallenge(PageIdentifier pageID, FrameIdentifier frameID, WebCore::AuthenticationChallenge&& coreChallenge, uint64_t challengeID)
+void NetworkProcessProxy::didReceiveAuthenticationChallenge(PAL::SessionID sessionID, PageIdentifier pageID, FrameIdentifier frameID, WebCore::AuthenticationChallenge&& coreChallenge, uint64_t challengeID)
 {
-#if ENABLE(SERVICE_WORKER)
-    if (auto* serviceWorkerProcessProxy = m_processPool.serviceWorkerProcessProxyFromPageID(pageID)) {
-        auto authenticationChallenge = AuthenticationChallengeProxy::create(WTFMove(coreChallenge), challengeID, makeRef(*connection()), nullptr);
-        serviceWorkerProcessProxy->didReceiveAuthenticationChallenge(pageID, frameID, WTFMove(authenticationChallenge));
-        return;
+#if HAVE(SEC_KEY_PROXY)
+    WeakPtr<SecKeyProxyStore> secKeyProxyStore;
+    if (coreChallenge.protectionSpace().authenticationScheme() == ProtectionSpaceAuthenticationSchemeClientCertificateRequested) {
+        if (auto* store = websiteDataStoreFromSessionID(sessionID)) {
+            auto newSecKeyProxyStore = SecKeyProxyStore::create();
+            secKeyProxyStore = makeWeakPtr(newSecKeyProxyStore.get());
+            store->addSecKeyProxyStore(WTFMove(newSecKeyProxyStore));
+        }
     }
+    auto authenticationChallenge = AuthenticationChallengeProxy::create(WTFMove(coreChallenge), challengeID, makeRef(*connection()), WTFMove(secKeyProxyStore));
+#else
+    auto authenticationChallenge = AuthenticationChallengeProxy::create(WTFMove(coreChallenge), challengeID, makeRef(*connection()), nullptr);
 #endif
 
-    WebPageProxy* page = WebProcessProxy::webPage(pageID);
-    MESSAGE_CHECK(page);
+    WebPageProxy* page = nullptr;
+    if (pageID && !m_processPool.isServiceWorkerPageID(pageID))
+        page = WebProcessProxy::webPage(pageID);
 
-    auto authenticationChallenge = AuthenticationChallengeProxy::create(WTFMove(coreChallenge), challengeID, makeRef(*connection()), page->secKeyProxyStore(coreChallenge));
+    if (!page) {
+        auto* store = websiteDataStoreFromSessionID(sessionID);
+        if (!store || coreChallenge.protectionSpace().authenticationScheme() != ProtectionSpaceAuthenticationSchemeServerTrustEvaluationRequested) {
+            authenticationChallenge->listener().completeChallenge(AuthenticationChallengeDisposition::PerformDefaultHandling);
+            return;
+        }
+        store->client().didReceiveAuthenticationChallenge(WTFMove(authenticationChallenge));
+        return;
+    }
+
     page->didReceiveAuthenticationChallengeProxy(frameID, WTFMove(authenticationChallenge));
 }
 

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (249000 => 249001)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2019-08-22 11:05:12 UTC (rev 249001)
@@ -213,7 +213,7 @@
     // Message handlers
     void didReceiveNetworkProcessProxyMessage(IPC::Connection&, IPC::Decoder&);
     void didCreateNetworkConnectionToWebProcess(const IPC::Attachment&);
-    void didReceiveAuthenticationChallenge(WebCore::PageIdentifier, WebCore::FrameIdentifier, WebCore::AuthenticationChallenge&&, uint64_t challengeID);
+    void didReceiveAuthenticationChallenge(PAL::SessionID, WebCore::PageIdentifier, WebCore::FrameIdentifier, WebCore::AuthenticationChallenge&&, uint64_t challengeID);
     void didFetchWebsiteData(uint64_t callbackID, const WebsiteData&);
     void didDeleteWebsiteData(uint64_t callbackID);
     void didDeleteWebsiteDataForOrigins(uint64_t callbackID);

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in (249000 => 249001)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in	2019-08-22 11:05:12 UTC (rev 249001)
@@ -23,7 +23,7 @@
 messages -> NetworkProcessProxy LegacyReceiver {
     DidCreateNetworkConnectionToWebProcess(IPC::Attachment connectionIdentifier)
 
-    DidReceiveAuthenticationChallenge(WebCore::PageIdentifier pageID, WebCore::FrameIdentifier frameID, WebCore::AuthenticationChallenge challenge, uint64_t challengeID)
+    DidReceiveAuthenticationChallenge(PAL::SessionID sessionID, WebCore::PageIdentifier pageID, WebCore::FrameIdentifier frameID, WebCore::AuthenticationChallenge challenge, uint64_t challengeID)
 
     DidFetchWebsiteData(uint64_t callbackID, struct WebKit::WebsiteData websiteData)
     DidDeleteWebsiteData(uint64_t callbackID)

Modified: trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp (249000 => 249001)


--- trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp	2019-08-22 11:05:12 UTC (rev 249001)
@@ -90,22 +90,6 @@
     send(Messages::WebSWContextManagerConnection::UpdatePreferencesStore { store }, 0);
 }
 
-void ServiceWorkerProcessProxy::didReceiveAuthenticationChallenge(PageIdentifier pageID, FrameIdentifier frameID, Ref<AuthenticationChallengeProxy>&& challenge)
-{
-    UNUSED_PARAM(pageID);
-    UNUSED_PARAM(frameID);
-
-    // FIXME: Expose an API to delegate the actual decision to the application layer.
-    auto& protectionSpace = challenge->core().protectionSpace();
-    if (protectionSpace.authenticationScheme() == WebCore::ProtectionSpaceAuthenticationSchemeServerTrustEvaluationRequested && processPool().allowsAnySSLCertificateForServiceWorker()) {
-        auto credential = WebCore::Credential("accept server trust"_s, emptyString(), WebCore::CredentialPersistenceNone);
-        challenge->listener().completeChallenge(AuthenticationChallengeDisposition::UseCredential, credential);
-        return;
-    }
-    notImplemented();
-    challenge->listener().completeChallenge(AuthenticationChallengeDisposition::PerformDefaultHandling);
-}
-
 } // namespace WebKit
 
 #endif // ENABLE(SERVICE_WORKER)

Modified: trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.h (249000 => 249001)


--- trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.h	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.h	2019-08-22 11:05:12 UTC (rev 249001)
@@ -41,8 +41,6 @@
 
     static bool hasRegisteredServiceWorkers(const String& serviceWorkerDirectory);
 
-    void didReceiveAuthenticationChallenge(WebCore::PageIdentifier, WebCore::FrameIdentifier, Ref<AuthenticationChallengeProxy>&&);
-
     void start(const WebPreferencesStore&, Optional<PAL::SessionID> initialSessionID);
     void setUserAgent(const String&);
     void updatePreferencesStore(const WebPreferencesStore&);

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (249000 => 249001)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2019-08-22 11:05:12 UTC (rev 249001)
@@ -7333,19 +7333,6 @@
 
 #endif
 
-WeakPtr<SecKeyProxyStore> WebPageProxy::secKeyProxyStore(const WebCore::AuthenticationChallenge& challenge)
-{
-#if HAVE(SEC_KEY_PROXY)
-    if (challenge.protectionSpace().authenticationScheme() == ProtectionSpaceAuthenticationSchemeClientCertificateRequested) {
-        auto secKeyProxyStore = SecKeyProxyStore::create();
-        auto weakPointer = makeWeakPtr(secKeyProxyStore.get());
-        m_websiteDataStore->addSecKeyProxyStore(WTFMove(secKeyProxyStore));
-        return weakPointer;
-    }
-#endif
-    return nullptr;
-}
-    
 void WebPageProxy::didReceiveAuthenticationChallengeProxy(FrameIdentifier, Ref<AuthenticationChallengeProxy>&& authenticationChallenge)
 {
     m_navigationClient->didReceiveAuthenticationChallenge(*this, authenticationChallenge.get());

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (249000 => 249001)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2019-08-22 11:05:12 UTC (rev 249001)
@@ -2231,17 +2231,17 @@
 #endif
 }
 
+bool WebProcessPool::isServiceWorkerPageID(PageIdentifier pageID) const
+{
 #if ENABLE(SERVICE_WORKER)
-ServiceWorkerProcessProxy* WebProcessPool::serviceWorkerProcessProxyFromPageID(PageIdentifier pageID) const
-{
     // FIXME: This is inefficient.
     for (auto* serviceWorkerProcess : m_serviceWorkerProcesses.values()) {
         if (serviceWorkerProcess->pageID() == pageID)
-            return serviceWorkerProcess;
+            return true;
     }
-    return nullptr;
+#endif
+    return false;
 }
-#endif
 
 void WebProcessPool::addProcessToOriginCacheSet(WebProcessProxy& process, const URL& url)
 {

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (249000 => 249001)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.h	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h	2019-08-22 11:05:12 UTC (rev 249001)
@@ -379,9 +379,9 @@
 
     void getNetworkProcessConnection(WebProcessProxy&, Messages::WebProcessProxy::GetNetworkProcessConnection::DelayedReply&&);
 
+    bool isServiceWorkerPageID(WebCore::PageIdentifier) const;
 #if ENABLE(SERVICE_WORKER)
     void establishWorkerContextConnectionToNetworkProcess(NetworkProcessProxy&, WebCore::RegistrableDomain&&, Optional<PAL::SessionID>);
-    ServiceWorkerProcessProxy* serviceWorkerProcessProxyFromPageID(WebCore::PageIdentifier) const;
     const HashMap<WebCore::RegistrableDomain, ServiceWorkerProcessProxy*>& serviceWorkerProxies() const { return m_serviceWorkerProcesses; }
     void setAllowsAnySSLCertificateForServiceWorker(bool allows) { m_allowsAnySSLCertificateForServiceWorker = allows; }
     bool allowsAnySSLCertificateForServiceWorker() const { return m_allowsAnySSLCertificateForServiceWorker; }

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreClient.h (249000 => 249001)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreClient.h	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreClient.h	2019-08-22 11:05:12 UTC (rev 249001)
@@ -25,6 +25,9 @@
 
 #pragma once
 
+#include "AuthenticationChallengeDisposition.h"
+#include "AuthenticationChallengeProxy.h"
+#include "AuthenticationDecisionListener.h"
 #include <wtf/CompletionHandler.h>
 
 namespace WebCore {
@@ -42,6 +45,11 @@
     {
         completionHandler({ });
     }
+
+    virtual void didReceiveAuthenticationChallenge(Ref<AuthenticationChallengeProxy>&& challenge)
+    {
+        challenge->listener().completeChallenge(AuthenticationChallengeDisposition::PerformDefaultHandling);
+    }
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (249000 => 249001)


--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2019-08-22 11:05:12 UTC (rev 249001)
@@ -3147,6 +3147,8 @@
 		41897ED51F415D850016FA42 /* CacheStorageEngineConnection.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = CacheStorageEngineConnection.messages.in; sourceTree = "<group>"; };
 		41897ED61F415D860016FA42 /* CacheStorageEngine.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CacheStorageEngine.cpp; sourceTree = "<group>"; };
 		419ACF9B1F981D26009F1A83 /* WebServiceWorkerFetchTaskClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebServiceWorkerFetchTaskClient.h; sourceTree = "<group>"; };
+		41A5F7B9226ECF7C00671764 /* AuthenticationChallengeDispositionCocoa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AuthenticationChallengeDispositionCocoa.h; sourceTree = "<group>"; };
+		41A5F7BA226ECF7C00671764 /* AuthenticationChallengeDispositionCocoa.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AuthenticationChallengeDispositionCocoa.mm; sourceTree = "<group>"; };
 		41AC86811E042E5300303074 /* WebRTCResolver.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; lineEnding = 0; name = WebRTCResolver.messages.in; path = Network/webrtc/WebRTCResolver.messages.in; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = "<none>"; };
 		41B28B081F83AD3E00FB52AC /* RTCPacketOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCPacketOptions.h; sourceTree = "<group>"; };
 		41B28B091F83AD3E00FB52AC /* RTCPacketOptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RTCPacketOptions.cpp; sourceTree = "<group>"; };
@@ -7010,6 +7012,8 @@
 		57B4B45C20B5048B00D4AD79 /* cocoa */ = {
 			isa = PBXGroup;
 			children = (
+				41A5F7B9226ECF7C00671764 /* AuthenticationChallengeDispositionCocoa.h */,
+				41A5F7BA226ECF7C00671764 /* AuthenticationChallengeDispositionCocoa.mm */,
 				57B4B45D20B504AB00D4AD79 /* AuthenticationManagerCocoa.mm */,
 				44A481C621F2D27B00F2F919 /* ClientCertificateAuthenticationXPCConstants.cpp */,
 				57B4B45E20B504AB00D4AD79 /* ClientCertificateAuthenticationXPCConstants.h */,

Modified: trunk/Tools/ChangeLog (249000 => 249001)


--- trunk/Tools/ChangeLog	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Tools/ChangeLog	2019-08-22 11:05:12 UTC (rev 249001)
@@ -1,3 +1,22 @@
+2019-08-22  Youenn Fablet  <[email protected]>
+
+        Add a WebsiteDataStore delegate to handle AuthenticationChallenge that do not come from pages
+        https://bugs.webkit.org/show_bug.cgi?id=196870
+
+        Reviewed by Alex Christensen.
+
+        Implement the new delegate by respecting the value set by testRunner.setAllowsAnySSLCertificate
+        Accept any server certificate by default.
+
+        * WebKitTestRunner/TestController.cpp:
+        * WebKitTestRunner/cocoa/TestControllerCocoa.mm:
+        (WTR::TestController::cocoaResetStateToConsistentValues):
+        (WTR::TestController::setAllowsAnySSLCertificate):
+        * WebKitTestRunner/cocoa/TestWebsiteDataStoreDelegate.h:
+        * WebKitTestRunner/cocoa/TestWebsiteDataStoreDelegate.mm:
+        (-[TestWebsiteDataStoreDelegate didReceiveAuthenticationChallenge:completionHandler:]):
+        (-[TestWebsiteDataStoreDelegate setAllowAnySSLCertificate:]):
+
 2019-08-21  Jonathan Bedard  <[email protected]>
 
         results.webkit.org: Fix drawer style

Modified: trunk/Tools/WebKitTestRunner/TestController.cpp (249000 => 249001)


--- trunk/Tools/WebKitTestRunner/TestController.cpp	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Tools/WebKitTestRunner/TestController.cpp	2019-08-22 11:05:12 UTC (rev 249001)
@@ -1032,7 +1032,9 @@
 #if PLATFORM(IOS_FAMILY)
     m_openPanelFileURLsMediaIcon = nullptr;
 #endif
-    
+
+    setAllowsAnySSLCertificate(true);
+
     statisticsResetToConsistentState();
     
     clearAdClickAttribution();
@@ -1192,10 +1194,13 @@
 #endif
 }
 
+#if !PLATFORM(COCOA)
 void TestController::setAllowsAnySSLCertificate(bool allows)
 {
+    m_allowsAnySSLCertificate = allows;
     WKContextSetAllowsAnySSLCertificateForWebSocketTesting(platformContext(), allows);
 }
+#endif
 
 static std::string testPath(WKURLRef url)
 {
@@ -2339,8 +2344,12 @@
 
         m_serverTrustEvaluationCallbackCallsCount++;
 
-        WKRetainPtr<WKCredentialRef> credential = adoptWK(WKCredentialCreate(toWK("accept server trust").get(), toWK("").get(), kWKCredentialPersistenceNone));
-        WKAuthenticationDecisionListenerUseCredential(decisionListener, credential.get());
+        if (m_allowsAnySSLCertificate) {
+            WKRetainPtr<WKCredentialRef> credential = adoptWK(WKCredentialCreate(toWK("accept server trust").get(), toWK("").get(), kWKCredentialPersistenceNone));
+            WKAuthenticationDecisionListenerUseCredential(decisionListener, credential.get());
+            return;
+        }
+        WKAuthenticationDecisionListenerRejectProtectionSpaceAndContinue(decisionListener);
         return;
     }
 

Modified: trunk/Tools/WebKitTestRunner/TestController.h (249000 => 249001)


--- trunk/Tools/WebKitTestRunner/TestController.h	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Tools/WebKitTestRunner/TestController.h	2019-08-22 11:05:12 UTC (rev 249001)
@@ -591,6 +591,7 @@
 
     uint64_t m_serverTrustEvaluationCallbackCallsCount { 0 };
     bool m_shouldDismissJavaScriptAlertsAsynchronously { false };
+    bool m_allowsAnySSLCertificate { true };
 };
 
 struct TestCommand {

Modified: trunk/Tools/WebKitTestRunner/cocoa/TestControllerCocoa.mm (249000 => 249001)


--- trunk/Tools/WebKitTestRunner/cocoa/TestControllerCocoa.mm	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Tools/WebKitTestRunner/cocoa/TestControllerCocoa.mm	2019-08-22 11:05:12 UTC (rev 249001)
@@ -35,6 +35,7 @@
 #import <Foundation/Foundation.h>
 #import <Security/SecItem.h>
 #import <WebKit/WKContextConfigurationRef.h>
+#import <WebKit/WKContextPrivate.h>
 #import <WebKit/WKCookieManager.h>
 #import <WebKit/WKPreferencesRefPrivate.h>
 #import <WebKit/WKProcessPoolPrivate.h>
@@ -397,6 +398,13 @@
     [globalWebsiteDataStoreDelegateClient setAllowRaisingQuota: value];
 }
 
+void TestController::setAllowsAnySSLCertificate(bool allows)
+{
+    m_allowsAnySSLCertificate = allows;
+    WKContextSetAllowsAnySSLCertificateForWebSocketTesting(platformContext(), allows);
+    [globalWebsiteDataStoreDelegateClient setAllowAnySSLCertificate: allows];
+}
+
 bool TestController::canDoServerTrustEvaluationInNetworkProcess() const
 {
 #if HAVE(CFNETWORK_NSURLSESSION_STRICTRUSTEVALUATE)

Modified: trunk/Tools/WebKitTestRunner/cocoa/TestWebsiteDataStoreDelegate.h (249000 => 249001)


--- trunk/Tools/WebKitTestRunner/cocoa/TestWebsiteDataStoreDelegate.h	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Tools/WebKitTestRunner/cocoa/TestWebsiteDataStoreDelegate.h	2019-08-22 11:05:12 UTC (rev 249001)
@@ -30,7 +30,9 @@
 @interface TestWebsiteDataStoreDelegate: NSObject <_WKWebsiteDataStoreDelegate> {
 @private
     BOOL _shouldAllowRaisingQuota;
+    BOOL _shouldAllowAnySSLCertificate;
 }
 - (instancetype)init;
 - (void)setAllowRaisingQuota:(BOOL)shouldAllowRaisingQuota;
+- (void)setAllowAnySSLCertificate:(BOOL)shouldAllowAnySSLCertificate;
 @end

Modified: trunk/Tools/WebKitTestRunner/cocoa/TestWebsiteDataStoreDelegate.mm (249000 => 249001)


--- trunk/Tools/WebKitTestRunner/cocoa/TestWebsiteDataStoreDelegate.mm	2019-08-22 09:41:57 UTC (rev 249000)
+++ trunk/Tools/WebKitTestRunner/cocoa/TestWebsiteDataStoreDelegate.mm	2019-08-22 11:05:12 UTC (rev 249001)
@@ -42,4 +42,23 @@
 {
     _shouldAllowRaisingQuota = shouldAllowRaisingQuota;
 }
+
+- (void)didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler
+{
+    NSString *method = challenge.protectionSpace.authenticationMethod;
+    if ([method isEqualToString:NSURLAuthenticationMethodServerTrust]) {
+        if (_shouldAllowAnySSLCertificate)
+            completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust: challenge.protectionSpace.serverTrust]);
+        else
+            completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
+        return;
+    }
+    completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
+}
+
+- (void)setAllowAnySSLCertificate:(BOOL)shouldAllowAnySSLCertificate
+{
+    _shouldAllowAnySSLCertificate = shouldAllowAnySSLCertificate;
+}
+
 @end
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to