Title: [251340] branches/safari-608-branch
Revision
251340
Author
bshaf...@apple.com
Date
2019-10-20 10:33:02 -0700 (Sun, 20 Oct 2019)

Log Message

Cherry-pick r250729. rdar://problem/56280731

    [WebAuthn] Implement _WKWebAuthenticationPanel SPI
    https://bugs.webkit.org/show_bug.cgi?id=202559
    <rdar://problem/55932094>

    Reviewed by Brent Fulgham.

    Source/WebKit:

    This patch implements _WKWebAuthenticationPanel SPI. Here is the structure:
    1) API::WebAuthenticationPanel is the APIObject of _WKWebAuthenticationPanel. It is owned by AuthenticatorManager.
    The lifetime of _WKWebAuthenticationPanel on the other hand is managed by clients. This binding is the surface
    where clients could interact with WebKit's WebAuthentication implementation.
    2) API::WebAuthenticationPanelClient is a base class representing _WKWebAuthenticationPanelDelegate. Its subclass
    WebKit::WebAuthenticationPanelClient implements bridges to _WKWebAuthenticationPanelDelegate methods. It is owned by
    API::WebAuthenticationPanel. A weak pointer of WebKit::WebAuthenticationPanelClient is kept in _WKWebAuthenticationPanel
    to get the _WKWebAuthenticationPanelDelegate set by clients or nil otherwise. This binding is the surface where WebKit
    interacts with clients.
    3) WebAuthenticationPanelFlags is the mirror of enums within _WKWebAuthenticationPanel.

    Implementation wise, this patch implements:
    1) -[WKUIDelegatePrivate webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:], this is bridged from
    the regular UIDelegate route. Noted, WKFrameInfo is nil for now, a follow up on Bug 202563 will take care of it. This
    will be called from AuthenticatorManager::runPanel() which gates the start of discovery on the callback. For clients
    that don't implement the delegate, the callback will always be called with _WKWebAuthenticationPanelResultUnavailable
    to allow WebKit run on non-UI mode. A specific C API hack is added to always return _WKWebAuthenticationPanelResultPresented
    in WebKitTestRunner for layout tests.
    2) -[_WKWebAuthenticationPanelDelegate panel:updateWebAuthenticationPanel:] will be implemented in Bug 200932.
    3) -[_WKWebAuthenticationPanelDelegate panel:dismissWebAuthenticationPanelWithResult:], this is bridged from
    API::WebAuthenticationPanel/API::WebAuthenticationPanelClient. This will be called whenever AuthenticatorManager::m_pendingCompletionHandler
    is invoked. Depending on the respond, _WKWebAuthenticationResult will be returned accordingly. To facilitate that,
    invokePendingCompletionHandler is crafted to bundle those two operations.
    4) -[_WKWebAuthenticationPanel cancel] will be implemented in Bug 191523.

    Besides the above, this patch also silents the NFC action sheet.

    * Platform/spi/Cocoa/NearFieldSPI.h:
    * Shared/API/APIObject.h:
    * Shared/Cocoa/APIObject.mm:
    (API::Object::newObject):
    * Sources.txt:
    * SourcesCocoa.txt:
    * UIProcess/API/APIUIClient.h:
    (API::UIClient::runWebAuthenticationPanel):
    * UIProcess/API/APIWebAuthenticationPanel.cpp: Copied from Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanel.mm.
    (API::WebAuthenticationPanel::create):
    (API::WebAuthenticationPanel::WebAuthenticationPanel):
    (API::WebAuthenticationPanel::setClient):
    * UIProcess/API/APIWebAuthenticationPanel.h: Copied from Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h.
    * UIProcess/API/APIWebAuthenticationPanelClient.h: Copied from Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h.
    (API::WebAuthenticationPanelClient::dismissPanel const):
    * UIProcess/API/C/WKPage.cpp:
    (WKPageSetPageUIClient):
    * UIProcess/API/C/WKPageUIClient.h:
    * UIProcess/API/Cocoa/_WKWebAuthenticationPanel.mm:
    (-[_WKWebAuthenticationPanel dealloc]):
    (-[_WKWebAuthenticationPanel relyingPartyID]):
    (-[_WKWebAuthenticationPanel delegate]):
    (-[_WKWebAuthenticationPanel setDelegate:]):
    (-[_WKWebAuthenticationPanel _apiObject]):
    (-[_WKWebAuthenticationPanel _initWithRelayingPartyID:]): Deleted.
    * UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h:
    * UIProcess/Cocoa/UIDelegate.h:
    * UIProcess/Cocoa/UIDelegate.mm:
    (WebKit::UIDelegate::setDelegate):
    (WebKit::webAuthenticationPanelResult):
    (WebKit::UIDelegate::UIClient::runWebAuthenticationPanel):
    * UIProcess/WebAuthentication/AuthenticatorManager.cpp:
    (WebKit::WebCore::isFeatureEnabled):
    (WebKit::WebCore::getRpId):
    (WebKit::AuthenticatorManager::handleRequest):
    (WebKit::AuthenticatorManager::respondReceived):
    (WebKit::AuthenticatorManager::startDiscovery):
    (WebKit::AuthenticatorManager::initTimeOutTimer):
    (WebKit::AuthenticatorManager::timeOutTimerFired):
    (WebKit::AuthenticatorManager::runPanel):
    (WebKit::AuthenticatorManager::startRequest):
    (WebKit::AuthenticatorManager::invokePendingCompletionHandler):
    (WebKit::AuthenticatorManagerInternal::collectTransports): Deleted.
    (WebKit::AuthenticatorManagerInternal::processGoogleLegacyAppIdSupportExtension): Deleted.
    * UIProcess/WebAuthentication/AuthenticatorManager.h:
    (WebKit::AuthenticatorManager::pendingCompletionHandler): Deleted.
    * UIProcess/WebAuthentication/Cocoa/NfcConnection.mm:
    (WebKit::NfcConnection::NfcConnection):
    * UIProcess/WebAuthentication/Cocoa/NfcService.mm:
    (WebKit::NfcService::platformStartDiscovery):
    * UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.h: Copied from Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h.
    * UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.mm: Copied from Source/WebKit/UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.cpp.
    (WebKit::WebAuthenticationPanelClient::WebAuthenticationPanelClient):
    (WebKit::wkWebAuthenticationResult):
    (WebKit::WebAuthenticationPanelClient::dismissPanel const):
    * UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.cpp:
    (WebKit::MockAuthenticatorManager::respondReceivedInternal):
    * UIProcess/WebAuthentication/WebAuthenticationPanelFlags.h: Copied from Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h.
    * UIProcess/WebAuthentication/WebAuthenticationRequestData.h:
    * UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp:
    (WebKit::WebAuthenticatorCoordinatorProxy::makeCredential):
    (WebKit::WebAuthenticatorCoordinatorProxy::getAssertion):
    * WebKit.xcodeproj/project.pbxproj:

    Tools:

    This patch adds a very limited test case to _WKWebAuthenticationPanel.
    Bug 202560 and Bug 202565 will follow up to write more tests.

    * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
    * TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm: Added.
    (-[TestWebAuthenticationPanelDelegate panel:dismissWebAuthenticationPanelWithResult:]):
    (-[TestWebAuthenticationPanelUIDelegate webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:]):
    (TestWebKitAPI::TEST):
    * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion.html: Added.
    * WebKitTestRunner/TestController.cpp:
    (WTR::runWebAuthenticationPanel):
    (WTR::TestController::createWebViewWithOptions):

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250729 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Added Paths

Diff

Modified: branches/safari-608-branch/Source/WebKit/ChangeLog (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/ChangeLog	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/ChangeLog	2019-10-20 17:33:02 UTC (rev 251340)
@@ -1,5 +1,224 @@
 2019-10-15  Kocsen Chung  <kocsen_ch...@apple.com>
 
+        Cherry-pick r250729. rdar://problem/56280731
+
+    [WebAuthn] Implement _WKWebAuthenticationPanel SPI
+    https://bugs.webkit.org/show_bug.cgi?id=202559
+    <rdar://problem/55932094>
+    
+    Reviewed by Brent Fulgham.
+    
+    Source/WebKit:
+    
+    This patch implements _WKWebAuthenticationPanel SPI. Here is the structure:
+    1) API::WebAuthenticationPanel is the APIObject of _WKWebAuthenticationPanel. It is owned by AuthenticatorManager.
+    The lifetime of _WKWebAuthenticationPanel on the other hand is managed by clients. This binding is the surface
+    where clients could interact with WebKit's WebAuthentication implementation.
+    2) API::WebAuthenticationPanelClient is a base class representing _WKWebAuthenticationPanelDelegate. Its subclass
+    WebKit::WebAuthenticationPanelClient implements bridges to _WKWebAuthenticationPanelDelegate methods. It is owned by
+    API::WebAuthenticationPanel. A weak pointer of WebKit::WebAuthenticationPanelClient is kept in _WKWebAuthenticationPanel
+    to get the _WKWebAuthenticationPanelDelegate set by clients or nil otherwise. This binding is the surface where WebKit
+    interacts with clients.
+    3) WebAuthenticationPanelFlags is the mirror of enums within _WKWebAuthenticationPanel.
+    
+    Implementation wise, this patch implements:
+    1) -[WKUIDelegatePrivate webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:], this is bridged from
+    the regular UIDelegate route. Noted, WKFrameInfo is nil for now, a follow up on Bug 202563 will take care of it. This
+    will be called from AuthenticatorManager::runPanel() which gates the start of discovery on the callback. For clients
+    that don't implement the delegate, the callback will always be called with _WKWebAuthenticationPanelResultUnavailable
+    to allow WebKit run on non-UI mode. A specific C API hack is added to always return _WKWebAuthenticationPanelResultPresented
+    in WebKitTestRunner for layout tests.
+    2) -[_WKWebAuthenticationPanelDelegate panel:updateWebAuthenticationPanel:] will be implemented in Bug 200932.
+    3) -[_WKWebAuthenticationPanelDelegate panel:dismissWebAuthenticationPanelWithResult:], this is bridged from
+    API::WebAuthenticationPanel/API::WebAuthenticationPanelClient. This will be called whenever AuthenticatorManager::m_pendingCompletionHandler
+    is invoked. Depending on the respond, _WKWebAuthenticationResult will be returned accordingly. To facilitate that,
+    invokePendingCompletionHandler is crafted to bundle those two operations.
+    4) -[_WKWebAuthenticationPanel cancel] will be implemented in Bug 191523.
+    
+    Besides the above, this patch also silents the NFC action sheet.
+    
+    * Platform/spi/Cocoa/NearFieldSPI.h:
+    * Shared/API/APIObject.h:
+    * Shared/Cocoa/APIObject.mm:
+    (API::Object::newObject):
+    * Sources.txt:
+    * SourcesCocoa.txt:
+    * UIProcess/API/APIUIClient.h:
+    (API::UIClient::runWebAuthenticationPanel):
+    * UIProcess/API/APIWebAuthenticationPanel.cpp: Copied from Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanel.mm.
+    (API::WebAuthenticationPanel::create):
+    (API::WebAuthenticationPanel::WebAuthenticationPanel):
+    (API::WebAuthenticationPanel::setClient):
+    * UIProcess/API/APIWebAuthenticationPanel.h: Copied from Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h.
+    * UIProcess/API/APIWebAuthenticationPanelClient.h: Copied from Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h.
+    (API::WebAuthenticationPanelClient::dismissPanel const):
+    * UIProcess/API/C/WKPage.cpp:
+    (WKPageSetPageUIClient):
+    * UIProcess/API/C/WKPageUIClient.h:
+    * UIProcess/API/Cocoa/_WKWebAuthenticationPanel.mm:
+    (-[_WKWebAuthenticationPanel dealloc]):
+    (-[_WKWebAuthenticationPanel relyingPartyID]):
+    (-[_WKWebAuthenticationPanel delegate]):
+    (-[_WKWebAuthenticationPanel setDelegate:]):
+    (-[_WKWebAuthenticationPanel _apiObject]):
+    (-[_WKWebAuthenticationPanel _initWithRelayingPartyID:]): Deleted.
+    * UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h:
+    * UIProcess/Cocoa/UIDelegate.h:
+    * UIProcess/Cocoa/UIDelegate.mm:
+    (WebKit::UIDelegate::setDelegate):
+    (WebKit::webAuthenticationPanelResult):
+    (WebKit::UIDelegate::UIClient::runWebAuthenticationPanel):
+    * UIProcess/WebAuthentication/AuthenticatorManager.cpp:
+    (WebKit::WebCore::isFeatureEnabled):
+    (WebKit::WebCore::getRpId):
+    (WebKit::AuthenticatorManager::handleRequest):
+    (WebKit::AuthenticatorManager::respondReceived):
+    (WebKit::AuthenticatorManager::startDiscovery):
+    (WebKit::AuthenticatorManager::initTimeOutTimer):
+    (WebKit::AuthenticatorManager::timeOutTimerFired):
+    (WebKit::AuthenticatorManager::runPanel):
+    (WebKit::AuthenticatorManager::startRequest):
+    (WebKit::AuthenticatorManager::invokePendingCompletionHandler):
+    (WebKit::AuthenticatorManagerInternal::collectTransports): Deleted.
+    (WebKit::AuthenticatorManagerInternal::processGoogleLegacyAppIdSupportExtension): Deleted.
+    * UIProcess/WebAuthentication/AuthenticatorManager.h:
+    (WebKit::AuthenticatorManager::pendingCompletionHandler): Deleted.
+    * UIProcess/WebAuthentication/Cocoa/NfcConnection.mm:
+    (WebKit::NfcConnection::NfcConnection):
+    * UIProcess/WebAuthentication/Cocoa/NfcService.mm:
+    (WebKit::NfcService::platformStartDiscovery):
+    * UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.h: Copied from Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h.
+    * UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.mm: Copied from Source/WebKit/UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.cpp.
+    (WebKit::WebAuthenticationPanelClient::WebAuthenticationPanelClient):
+    (WebKit::wkWebAuthenticationResult):
+    (WebKit::WebAuthenticationPanelClient::dismissPanel const):
+    * UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.cpp:
+    (WebKit::MockAuthenticatorManager::respondReceivedInternal):
+    * UIProcess/WebAuthentication/WebAuthenticationPanelFlags.h: Copied from Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h.
+    * UIProcess/WebAuthentication/WebAuthenticationRequestData.h:
+    * UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp:
+    (WebKit::WebAuthenticatorCoordinatorProxy::makeCredential):
+    (WebKit::WebAuthenticatorCoordinatorProxy::getAssertion):
+    * WebKit.xcodeproj/project.pbxproj:
+    
+    Tools:
+    
+    This patch adds a very limited test case to _WKWebAuthenticationPanel.
+    Bug 202560 and Bug 202565 will follow up to write more tests.
+    
+    * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+    * TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm: Added.
+    (-[TestWebAuthenticationPanelDelegate panel:dismissWebAuthenticationPanelWithResult:]):
+    (-[TestWebAuthenticationPanelUIDelegate webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:]):
+    (TestWebKitAPI::TEST):
+    * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion.html: Added.
+    * WebKitTestRunner/TestController.cpp:
+    (WTR::runWebAuthenticationPanel):
+    (WTR::TestController::createWebViewWithOptions):
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250729 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2019-10-04  Jiewen Tan  <jiewen_...@apple.com>
+
+            [WebAuthn] Implement _WKWebAuthenticationPanel SPI
+            https://bugs.webkit.org/show_bug.cgi?id=202559
+            <rdar://problem/55932094>
+
+            Reviewed by Brent Fulgham.
+
+            This patch implements _WKWebAuthenticationPanel SPI. Here is the structure:
+            1) API::WebAuthenticationPanel is the APIObject of _WKWebAuthenticationPanel. It is owned by AuthenticatorManager.
+            The lifetime of _WKWebAuthenticationPanel on the other hand is managed by clients. This binding is the surface
+            where clients could interact with WebKit's WebAuthentication implementation.
+            2) API::WebAuthenticationPanelClient is a base class representing _WKWebAuthenticationPanelDelegate. Its subclass
+            WebKit::WebAuthenticationPanelClient implements bridges to _WKWebAuthenticationPanelDelegate methods. It is owned by
+            API::WebAuthenticationPanel. A weak pointer of WebKit::WebAuthenticationPanelClient is kept in _WKWebAuthenticationPanel
+            to get the _WKWebAuthenticationPanelDelegate set by clients or nil otherwise. This binding is the surface where WebKit
+            interacts with clients.
+            3) WebAuthenticationPanelFlags is the mirror of enums within _WKWebAuthenticationPanel.
+
+            Implementation wise, this patch implements:
+            1) -[WKUIDelegatePrivate webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:], this is bridged from
+            the regular UIDelegate route. Noted, WKFrameInfo is nil for now, a follow up on Bug 202563 will take care of it. This
+            will be called from AuthenticatorManager::runPanel() which gates the start of discovery on the callback. For clients
+            that don't implement the delegate, the callback will always be called with _WKWebAuthenticationPanelResultUnavailable
+            to allow WebKit run on non-UI mode. A specific C API hack is added to always return _WKWebAuthenticationPanelResultPresented
+            in WebKitTestRunner for layout tests.
+            2) -[_WKWebAuthenticationPanelDelegate panel:updateWebAuthenticationPanel:] will be implemented in Bug 200932.
+            3) -[_WKWebAuthenticationPanelDelegate panel:dismissWebAuthenticationPanelWithResult:], this is bridged from
+            API::WebAuthenticationPanel/API::WebAuthenticationPanelClient. This will be called whenever AuthenticatorManager::m_pendingCompletionHandler
+            is invoked. Depending on the respond, _WKWebAuthenticationResult will be returned accordingly. To facilitate that,
+            invokePendingCompletionHandler is crafted to bundle those two operations.
+            4) -[_WKWebAuthenticationPanel cancel] will be implemented in Bug 191523.
+
+            Besides the above, this patch also silents the NFC action sheet.
+
+            * Platform/spi/Cocoa/NearFieldSPI.h:
+            * Shared/API/APIObject.h:
+            * Shared/Cocoa/APIObject.mm:
+            (API::Object::newObject):
+            * Sources.txt:
+            * SourcesCocoa.txt:
+            * UIProcess/API/APIUIClient.h:
+            (API::UIClient::runWebAuthenticationPanel):
+            * UIProcess/API/APIWebAuthenticationPanel.cpp: Copied from Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanel.mm.
+            (API::WebAuthenticationPanel::create):
+            (API::WebAuthenticationPanel::WebAuthenticationPanel):
+            (API::WebAuthenticationPanel::setClient):
+            * UIProcess/API/APIWebAuthenticationPanel.h: Copied from Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h.
+            * UIProcess/API/APIWebAuthenticationPanelClient.h: Copied from Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h.
+            (API::WebAuthenticationPanelClient::dismissPanel const):
+            * UIProcess/API/C/WKPage.cpp:
+            (WKPageSetPageUIClient):
+            * UIProcess/API/C/WKPageUIClient.h:
+            * UIProcess/API/Cocoa/_WKWebAuthenticationPanel.mm:
+            (-[_WKWebAuthenticationPanel dealloc]):
+            (-[_WKWebAuthenticationPanel relyingPartyID]):
+            (-[_WKWebAuthenticationPanel delegate]):
+            (-[_WKWebAuthenticationPanel setDelegate:]):
+            (-[_WKWebAuthenticationPanel _apiObject]):
+            (-[_WKWebAuthenticationPanel _initWithRelayingPartyID:]): Deleted.
+            * UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h:
+            * UIProcess/Cocoa/UIDelegate.h:
+            * UIProcess/Cocoa/UIDelegate.mm:
+            (WebKit::UIDelegate::setDelegate):
+            (WebKit::webAuthenticationPanelResult):
+            (WebKit::UIDelegate::UIClient::runWebAuthenticationPanel):
+            * UIProcess/WebAuthentication/AuthenticatorManager.cpp:
+            (WebKit::WebCore::isFeatureEnabled):
+            (WebKit::WebCore::getRpId):
+            (WebKit::AuthenticatorManager::handleRequest):
+            (WebKit::AuthenticatorManager::respondReceived):
+            (WebKit::AuthenticatorManager::startDiscovery):
+            (WebKit::AuthenticatorManager::initTimeOutTimer):
+            (WebKit::AuthenticatorManager::timeOutTimerFired):
+            (WebKit::AuthenticatorManager::runPanel):
+            (WebKit::AuthenticatorManager::startRequest):
+            (WebKit::AuthenticatorManager::invokePendingCompletionHandler):
+            (WebKit::AuthenticatorManagerInternal::collectTransports): Deleted.
+            (WebKit::AuthenticatorManagerInternal::processGoogleLegacyAppIdSupportExtension): Deleted.
+            * UIProcess/WebAuthentication/AuthenticatorManager.h:
+            (WebKit::AuthenticatorManager::pendingCompletionHandler): Deleted.
+            * UIProcess/WebAuthentication/Cocoa/NfcConnection.mm:
+            (WebKit::NfcConnection::NfcConnection):
+            * UIProcess/WebAuthentication/Cocoa/NfcService.mm:
+            (WebKit::NfcService::platformStartDiscovery):
+            * UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.h: Copied from Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h.
+            * UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.mm: Copied from Source/WebKit/UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.cpp.
+            (WebKit::WebAuthenticationPanelClient::WebAuthenticationPanelClient):
+            (WebKit::wkWebAuthenticationResult):
+            (WebKit::WebAuthenticationPanelClient::dismissPanel const):
+            * UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.cpp:
+            (WebKit::MockAuthenticatorManager::respondReceivedInternal):
+            * UIProcess/WebAuthentication/WebAuthenticationPanelFlags.h: Copied from Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h.
+            * UIProcess/WebAuthentication/WebAuthenticationRequestData.h:
+            * UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp:
+            (WebKit::WebAuthenticatorCoordinatorProxy::makeCredential):
+            (WebKit::WebAuthenticatorCoordinatorProxy::getAssertion):
+            * WebKit.xcodeproj/project.pbxproj:
+
+2019-10-15  Kocsen Chung  <kocsen_ch...@apple.com>
+
         Cherry-pick r250642. rdar://problem/56280704
 
     [iOS] When hit testing for a context menu interaction, do not consider whether the element is contenteditable

Modified: branches/safari-608-branch/Source/WebKit/Platform/spi/Cocoa/NearFieldSPI.h (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/Platform/spi/Cocoa/NearFieldSPI.h	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/Platform/spi/Cocoa/NearFieldSPI.h	2019-10-20 17:33:02 UTC (rev 251340)
@@ -108,7 +108,7 @@
 
 @interface NFHardwareManager : NSObject
 + (instancetype)sharedHardwareManager;
-- (NSObject<NFSession> *)startReaderSessionWithActionSheetUI:(void(^)(NFReaderSession *session, NSError *error))theStartCallback;
+- (NSObject<NFSession> *)startReaderSession:(void(^)(NFReaderSession *session, NSError *error))theStartCallback;
 - (BOOL)areFeaturesSupported:(NFFeature)featureMask outError:(NSError**)outError;
 @end
 

Modified: branches/safari-608-branch/Source/WebKit/Shared/API/APIObject.h (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/Shared/API/APIObject.h	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/Shared/API/APIObject.h	2019-10-20 17:33:02 UTC (rev 251340)
@@ -178,6 +178,10 @@
         MediaSessionMetadata,
 #endif
 
+#if ENABLE(WEB_AUTHN)
+        WebAuthenticationPanel,
+#endif
+
         // Bundle types
         Bundle,
         BundleBackForwardList,

Modified: branches/safari-608-branch/Source/WebKit/Shared/Cocoa/APIObject.mm (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/Shared/Cocoa/APIObject.mm	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/Shared/Cocoa/APIObject.mm	2019-10-20 17:33:02 UTC (rev 251340)
@@ -84,6 +84,7 @@
 #import "_WKUserInitiatedActionInternal.h"
 #import "_WKUserStyleSheetInternal.h"
 #import "_WKVisitedLinkStoreInternal.h"
+#import "_WKWebAuthenticationPanelInternal.h"
 #import "_WKWebsiteDataStoreConfigurationInternal.h"
 
 #if ENABLE(APPLICATION_MANIFEST)
@@ -364,6 +365,12 @@
         wrapper = [WKWindowFeatures alloc];
         break;
 
+#if ENABLE(WEB_AUTHN)
+    case Type::WebAuthenticationPanel:
+        wrapper = [_WKWebAuthenticationPanel alloc];
+        break;
+#endif
+
     case Type::BundleFrame:
         wrapper = [WKWebProcessPlugInFrame alloc];
         break;

Modified: branches/safari-608-branch/Source/WebKit/Sources.txt (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/Sources.txt	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/Sources.txt	2019-10-20 17:33:02 UTC (rev 251340)
@@ -315,6 +315,7 @@
 UIProcess/API/APIUserContentWorld.cpp
 UIProcess/API/APIUserScript.cpp
 UIProcess/API/APIUserStyleSheet.cpp
+UIProcess/API/APIWebAuthenticationPanel.cpp
 UIProcess/API/APIWebsiteDataStore.cpp
 UIProcess/API/APIWebsitePolicies.cpp
 UIProcess/API/APIWindowFeatures.cpp

Modified: branches/safari-608-branch/Source/WebKit/SourcesCocoa.txt (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/SourcesCocoa.txt	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/SourcesCocoa.txt	2019-10-20 17:33:02 UTC (rev 251340)
@@ -503,6 +503,7 @@
 UIProcess/WebAuthentication/Cocoa/NfcConnection.mm
 UIProcess/WebAuthentication/Cocoa/NfcService.mm
 UIProcess/WebAuthentication/Cocoa/WKNFReaderSessionDelegate.mm
+UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.mm
 
 UIProcess/WebAuthentication/Mock/MockLocalConnection.mm
 UIProcess/WebAuthentication/Mock/MockLocalService.mm

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/API/APIUIClient.h (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/API/APIUIClient.h	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/API/APIUIClient.h	2019-10-20 17:33:02 UTC (rev 251340)
@@ -38,6 +38,10 @@
 OBJC_CLASS UIViewController;
 #endif
 
+#if ENABLE(WEB_AUTHN)
+#include "WebAuthenticationPanelFlags.h"
+#endif
+
 namespace WebCore {
 class RegistrableDomain;
 class ResourceRequest;
@@ -69,6 +73,9 @@
 class Object;
 class OpenPanelParameters;
 class SecurityOrigin;
+#if ENABLE(WEB_AUTHN)
+class WebAuthenticationPanel;
+#endif
 
 class UIClient {
 public:
@@ -187,6 +194,10 @@
     virtual void didExceedBackgroundResourceLimitWhileInForeground(WebKit::WebPageProxy&, WKResourceLimit) { }
     
     virtual void didShowSafeBrowsingWarning() { }
+
+#if ENABLE(WEB_AUTHN)
+    virtual void runWebAuthenticationPanel(WebKit::WebPageProxy&, WebAuthenticationPanel&, CompletionHandler<void(WebKit::WebAuthenticationPanelResult)>&& completionHandler) { completionHandler(WebKit::WebAuthenticationPanelResult::Unavailable); }
+#endif
 };
 
 } // namespace API

Copied: branches/safari-608-branch/Source/WebKit/UIProcess/API/APIWebAuthenticationPanel.cpp (from rev 251339, branches/safari-608-branch/Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanel.mm) (0 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/API/APIWebAuthenticationPanel.cpp	                        (rev 0)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/API/APIWebAuthenticationPanel.cpp	2019-10-20 17:33:02 UTC (rev 251340)
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ */
+
+#include "config.h"
+#include "APIWebAuthenticationPanel.h"
+
+#if ENABLE(WEB_AUTHN)
+
+#include "APIWebAuthenticationPanelClient.h"
+
+namespace API {
+
+Ref<WebAuthenticationPanel> WebAuthenticationPanel::create(const String& rpId)
+{
+    return adoptRef(*new WebAuthenticationPanel(rpId));
+}
+
+WebAuthenticationPanel::WebAuthenticationPanel(const String& rpId)
+    : m_rpId(rpId)
+    , m_client(WTF::makeUniqueRef<WebAuthenticationPanelClient>())
+{
+}
+
+WebAuthenticationPanel::~WebAuthenticationPanel() = default;
+
+void WebAuthenticationPanel::setClient(UniqueRef<WebAuthenticationPanelClient>&& client)
+{
+    m_client = WTFMove(client);
+}
+
+} // namespace API
+
+#endif // ENABLE(WEB_AUTHN)

Copied: branches/safari-608-branch/Source/WebKit/UIProcess/API/APIWebAuthenticationPanel.h (from rev 251339, branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h) (0 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/API/APIWebAuthenticationPanel.h	                        (rev 0)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/API/APIWebAuthenticationPanel.h	2019-10-20 17:33:02 UTC (rev 251340)
@@ -0,0 +1,58 @@
+/*
+ * 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
+
+#if ENABLE(WEB_AUTHN)
+
+#include "APIObject.h"
+#include <wtf/UniqueRef.h>
+#include <wtf/WeakPtr.h>
+#include <wtf/text/WTFString.h>
+
+namespace API {
+
+class WebAuthenticationPanelClient;
+
+class WebAuthenticationPanel final : public ObjectImpl<Object::Type::WebAuthenticationPanel>, public CanMakeWeakPtr<WebAuthenticationPanel> {
+public:
+    static Ref<WebAuthenticationPanel> create(const String& rpId);
+    ~WebAuthenticationPanel();
+
+    WTF::String rpId() const { return m_rpId; }
+
+    const WebAuthenticationPanelClient& client() const { return m_client.get(); }
+    void setClient(UniqueRef<WebAuthenticationPanelClient>&&);
+
+private:
+    WebAuthenticationPanel(const String& rpId);
+
+    WTF::String m_rpId;
+    UniqueRef<WebAuthenticationPanelClient> m_client;
+};
+
+} // namespace API
+
+#endif // ENABLE(WEB_AUTHN)

Copied: branches/safari-608-branch/Source/WebKit/UIProcess/API/APIWebAuthenticationPanelClient.h (from rev 251339, branches/safari-608-branch/Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h) (0 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/API/APIWebAuthenticationPanelClient.h	                        (rev 0)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/API/APIWebAuthenticationPanelClient.h	2019-10-20 17:33:02 UTC (rev 251340)
@@ -0,0 +1,46 @@
+/*
+ * 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
+
+#if ENABLE(WEB_AUTHN)
+
+namespace WebKit {
+enum class WebAuthenticationResult : bool;
+}
+
+namespace API {
+
+class WebAuthenticationPanelClient {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    virtual ~WebAuthenticationPanelClient() = default;
+
+    virtual void dismissPanel(WebKit::WebAuthenticationResult) const { }
+};
+
+} // namespace API
+
+#endif // ENABLE(WEB_AUTHN)

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/API/C/WKPage.cpp (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/API/C/WKPage.cpp	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/API/C/WKPage.cpp	2019-10-20 17:33:02 UTC (rev 251340)
@@ -116,7 +116,7 @@
 };
 
 template<> struct ClientTraits<WKPageUIClientBase> {
-    typedef std::tuple<WKPageUIClientV0, WKPageUIClientV1, WKPageUIClientV2, WKPageUIClientV3, WKPageUIClientV4, WKPageUIClientV5, WKPageUIClientV6, WKPageUIClientV7, WKPageUIClientV8, WKPageUIClientV9, WKPageUIClientV10, WKPageUIClientV11, WKPageUIClientV12, WKPageUIClientV13> Versions;
+    typedef std::tuple<WKPageUIClientV0, WKPageUIClientV1, WKPageUIClientV2, WKPageUIClientV3, WKPageUIClientV4, WKPageUIClientV5, WKPageUIClientV6, WKPageUIClientV7, WKPageUIClientV8, WKPageUIClientV9, WKPageUIClientV10, WKPageUIClientV11, WKPageUIClientV12, WKPageUIClientV13, WKPageUIClientV14> Versions;
 };
 
 #if ENABLE(CONTEXT_MENUS)
@@ -2069,6 +2069,18 @@
 
             m_client.handleAutoplayEvent(toAPI(&page), toWKAutoplayEvent(event), toWKAutoplayEventFlags(flags), m_client.base.clientInfo);
         }
+
+#if ENABLE(WEB_AUTHN)
+        // The current method is specialized for WebKitTestRunner.
+        void runWebAuthenticationPanel(WebPageProxy&, API::WebAuthenticationPanel&, CompletionHandler<void(WebKit::WebAuthenticationPanelResult)>&& completionHandler) final
+        {
+            if (!m_client.runWebAuthenticationPanel) {
+                completionHandler(WebKit::WebAuthenticationPanelResult::Unavailable);
+                return;
+            }
+            completionHandler(WebKit::WebAuthenticationPanelResult::Presented);
+        }
+#endif
     };
 
     toImpl(pageRef)->setUIClient(std::make_unique<UIClient>(wkClient));

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/API/C/WKPageUIClient.h (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/API/C/WKPageUIClient.h	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/API/C/WKPageUIClient.h	2019-10-20 17:33:02 UTC (rev 251340)
@@ -136,6 +136,8 @@
 typedef void (*WKPageDidResignInputElementStrongPasswordAppearanceCallback)(WKPageRef page, WKTypeRef userData, const void *clientInfo);
 typedef bool (*WKPageShouldAllowDeviceOrientationAndMotionAccessCallback)(WKPageRef page, WKSecurityOriginRef securityOrigin, const void *clientInfo);
 
+typedef void (*WKPageRunWebAuthenticationPanelCallback)();
+
 // Deprecated
 typedef WKPageRef (*WKPageCreateNewPageCallback_deprecatedForUseWithV0)(WKPageRef page, WKDictionaryRef features, WKEventModifiers modifiers, WKEventMouseButton mouseButton, const void *clientInfo);
 typedef void      (*WKPageMouseDidMoveOverElementCallback_deprecatedForUseWithV0)(WKPageRef page, WKEventModifiers modifiers, WKTypeRef userData, const void *clientInfo);
@@ -1245,6 +1247,113 @@
     WKPageShouldAllowDeviceOrientationAndMotionAccessCallback           shouldAllowDeviceOrientationAndMotionAccess;
 } WKPageUIClientV13;
 
+typedef struct WKPageUIClientV14 {
+    WKPageUIClientBase                                                  base;
+
+    // Version 0.
+    WKPageCreateNewPageCallback_deprecatedForUseWithV0                  createNewPage_deprecatedForUseWithV0;
+    WKPageUIClientCallback                                              showPage;
+    WKPageUIClientCallback                                              close;
+    WKPageTakeFocusCallback                                             takeFocus;
+    WKPageFocusCallback                                                 focus;
+    WKPageUnfocusCallback                                               unfocus;
+    WKPageRunJavaScriptAlertCallback_deprecatedForUseWithV0             runJavaScriptAlert_deprecatedForUseWithV0;
+    WKPageRunJavaScriptConfirmCallback_deprecatedForUseWithV0           runJavaScriptConfirm_deprecatedForUseWithV0;
+    WKPageRunJavaScriptPromptCallback_deprecatedForUseWithV0            runJavaScriptPrompt_deprecatedForUseWithV0;
+    WKPageSetStatusTextCallback                                         setStatusText;
+    WKPageMouseDidMoveOverElementCallback_deprecatedForUseWithV0        mouseDidMoveOverElement_deprecatedForUseWithV0;
+    WKPageMissingPluginButtonClickedCallback_deprecatedForUseWithV0     missingPluginButtonClicked_deprecatedForUseWithV0;
+    WKPageDidNotHandleKeyEventCallback                                  didNotHandleKeyEvent;
+    WKPageDidNotHandleWheelEventCallback                                didNotHandleWheelEvent;
+    WKPageGetToolbarsAreVisibleCallback                                 toolbarsAreVisible;
+    WKPageSetToolbarsAreVisibleCallback                                 setToolbarsAreVisible;
+    WKPageGetMenuBarIsVisibleCallback                                   menuBarIsVisible;
+    WKPageSetMenuBarIsVisibleCallback                                   setMenuBarIsVisible;
+    WKPageGetStatusBarIsVisibleCallback                                 statusBarIsVisible;
+    WKPageSetStatusBarIsVisibleCallback                                 setStatusBarIsVisible;
+    WKPageGetIsResizableCallback                                        isResizable;
+    WKPageSetIsResizableCallback                                        setIsResizable;
+    WKPageGetWindowFrameCallback                                        getWindowFrame;
+    WKPageSetWindowFrameCallback                                        setWindowFrame;
+    WKPageRunBeforeUnloadConfirmPanelCallback_deprecatedForUseWithV6    runBeforeUnloadConfirmPanel_deprecatedForUseWithV6;
+    WKPageUIClientCallback                                              didDraw;
+    WKPageUIClientCallback                                              pageDidScroll;
+    WKPageExceededDatabaseQuotaCallback                                 exceededDatabaseQuota;
+    WKPageRunOpenPanelCallback                                          runOpenPanel;
+    WKPageDecidePolicyForGeolocationPermissionRequestCallback           decidePolicyForGeolocationPermissionRequest;
+    WKPageHeaderHeightCallback                                          headerHeight;
+    WKPageFooterHeightCallback                                          footerHeight;
+    WKPageDrawHeaderCallback                                            drawHeader;
+    WKPageDrawFooterCallback                                            drawFooter;
+    WKPagePrintFrameCallback                                            printFrame;
+    WKPageUIClientCallback                                              runModal;
+    void*                                                               unused1; // Used to be didCompleteRubberBandForMainFrame
+    WKPageSaveDataToFileInDownloadsFolderCallback                       saveDataToFileInDownloadsFolder;
+    void*                                                               shouldInterruptJavaScript_unavailable;
+
+    // Version 1.
+    WKPageCreateNewPageCallback_deprecatedForUseWithV1                  createNewPage_deprecatedForUseWithV1;
+    WKPageMouseDidMoveOverElementCallback                               mouseDidMoveOverElement;
+    WKPageDecidePolicyForNotificationPermissionRequestCallback          decidePolicyForNotificationPermissionRequest;
+    WKPageUnavailablePluginButtonClickedCallback_deprecatedForUseWithV1 unavailablePluginButtonClicked_deprecatedForUseWithV1;
+
+    // Version 2.
+    WKPageShowColorPickerCallback                                       showColorPicker;
+    WKPageHideColorPickerCallback                                       hideColorPicker;
+    WKPageUnavailablePluginButtonClickedCallback                        unavailablePluginButtonClicked;
+
+    // Version 3.
+    WKPagePinnedStateDidChangeCallback                                  pinnedStateDidChange;
+
+    // Version 4.
+    void*                                                               unused2; // Used to be didBeginTrackingPotentialLongMousePress.
+    void*                                                               unused3; // Used to be didRecognizeLongMousePress.
+    void*                                                               unused4; // Used to be didCancelTrackingPotentialLongMousePress.
+    WKPageIsPlayingAudioDidChangeCallback                               isPlayingAudioDidChange;
+
+    // Version 5.
+    WKPageDecidePolicyForUserMediaPermissionRequestCallback             decidePolicyForUserMediaPermissionRequest;
+    WKPageDidClickAutoFillButtonCallback                                didClickAutoFillButton;
+    WKPageRunJavaScriptAlertCallback_deprecatedForUseWithV5             runJavaScriptAlert_deprecatedForUseWithV5;
+    WKPageRunJavaScriptConfirmCallback_deprecatedForUseWithV5           runJavaScriptConfirm_deprecatedForUseWithV5;
+    WKPageRunJavaScriptPromptCallback_deprecatedForUseWithV5            runJavaScriptPrompt_deprecatedForUseWithV5;
+    WKPageMediaSessionMetadataDidChangeCallback                         mediaSessionMetadataDidChange;
+
+    // Version 6.
+    WKPageCreateNewPageCallback                                         createNewPage;
+    WKPageRunJavaScriptAlertCallback                                    runJavaScriptAlert;
+    WKPageRunJavaScriptConfirmCallback                                  runJavaScriptConfirm;
+    WKPageRunJavaScriptPromptCallback                                   runJavaScriptPrompt;
+    WKCheckUserMediaPermissionCallback                                  checkUserMediaPermissionForOrigin;
+
+    // Version 7.
+    WKPageRunBeforeUnloadConfirmPanelCallback                           runBeforeUnloadConfirmPanel;
+    WKFullscreenMayReturnToInlineCallback                               fullscreenMayReturnToInline;
+
+    // Version 8.
+    WKRequestPointerLockCallback                                        requestPointerLock;
+    WKDidLosePointerLockCallback                                        didLosePointerLock;
+
+    // Version 9.
+    WKHandleAutoplayEventCallback                                       handleAutoplayEvent;
+
+    // Version 10.
+    WKHasVideoInPictureInPictureDidChangeCallback                       hasVideoInPictureInPictureDidChange;
+    WKDidExceedBackgroundResourceLimitWhileInForegroundCallback         didExceedBackgroundResourceLimitWhileInForeground;
+
+    // Version 11.
+    WKPageDidResignInputElementStrongPasswordAppearanceCallback         didResignInputElementStrongPasswordAppearance;
+
+    // Version 12.
+    WKPageRequestStorageAccessConfirmCallback                           requestStorageAccessConfirm;
+
+    // Version 13.
+    WKPageShouldAllowDeviceOrientationAndMotionAccessCallback           shouldAllowDeviceOrientationAndMotionAccess;
+
+    // Version 14.
+    WKPageRunWebAuthenticationPanelCallback                             runWebAuthenticationPanel;
+} WKPageUIClientV14;
+
 #ifdef __cplusplus
 }
 #endif

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanel.mm (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanel.mm	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanel.mm	2019-10-20 17:33:02 UTC (rev 251340)
@@ -24,29 +24,50 @@
  */
 
 #import "config.h"
+#import "WebAuthenticationPanelClient.h"
 #import "_WKWebAuthenticationPanelInternal.h"
 
 #import <wtf/RetainPtr.h>
 
-@implementation _WKWebAuthenticationPanel  {
-    RetainPtr<NSString> _relyingPartyID;
+@implementation _WKWebAuthenticationPanel {
+    WeakPtr<WebKit::WebAuthenticationPanelClient> _client;
 }
 
-- (instancetype)_initWithRelayingPartyID:(NSString *)relayingPartyID
+- (void)dealloc
 {
-    if (!(self = [super init]))
-        return nil;
-    _relyingPartyID = relayingPartyID;
-    return self;
+    _panel->~WebAuthenticationPanel();
+
+    [super dealloc];
 }
 
 - (NSString *)relyingPartyID
 {
-    return _relyingPartyID.get();
+    return _panel->rpId();
 }
 
+- (id <_WKWebAuthenticationPanelDelegate>)delegate
+{
+    if (!_client)
+        return nil;
+    return _client->delegate().autorelease();
+}
+
+- (void)setDelegate:(id<_WKWebAuthenticationPanelDelegate>)delegate
+{
+    auto client = WTF::makeUniqueRef<WebKit::WebAuthenticationPanelClient>(self, delegate);
+    _client = makeWeakPtr(client.get());
+    _panel->setClient(WTFMove(client));
+}
+
 - (void)cancel
 {
 }
 
+#pragma mark WKObject protocol implementation
+
+- (API::Object&)_apiObject
+{
+    return *_panel;
+}
+
 @end

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h	2019-10-20 17:33:02 UTC (rev 251340)
@@ -27,8 +27,19 @@
 
 #import "_WKWebAuthenticationPanel.h"
 
-@interface _WKWebAuthenticationPanel ()
+#import "APIWebAuthenticationPanel.h"
+#import "WKObject.h"
 
-- (instancetype)_initWithRelayingPartyID:(NSString *)relayingPartyID;
+namespace WebKit {
 
+template<> struct WrapperTraits<API::WebAuthenticationPanel> {
+    using WrapperClass = _WKWebAuthenticationPanel;
+};
+
+}
+
+@interface _WKWebAuthenticationPanel () <WKObject> {
+@package
+    API::ObjectStorage<API::WebAuthenticationPanel> _panel;
+}
 @end

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/Cocoa/UIDelegate.h (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/Cocoa/UIDelegate.h	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/Cocoa/UIDelegate.h	2019-10-20 17:33:02 UTC (rev 251340)
@@ -154,6 +154,9 @@
 
         void imageOrMediaDocumentSizeChanged(const WebCore::IntSize&) final;
         void didShowSafeBrowsingWarning() final;
+#if ENABLE(WEB_AUTHN)
+        void runWebAuthenticationPanel(WebPageProxy&, API::WebAuthenticationPanel&, CompletionHandler<void(WebAuthenticationPanelResult)>&&) final;
+#endif
 
         UIDelegate& m_uiDelegate;
     };
@@ -234,6 +237,9 @@
 #endif
         bool webViewHasVideoInPictureInPictureDidChange : 1;
         bool webViewDidShowSafeBrowsingWarning : 1;
+#if ENABLE(WEB_AUTHN)
+        bool webViewRunWebAuthenticationPanelInitiatedByFrameCompletionHandler : 1;
+#endif
     } m_delegateMethods;
 };
 

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm	2019-10-20 17:33:02 UTC (rev 251340)
@@ -52,6 +52,7 @@
 #import "_WKContextMenuElementInfo.h"
 #import "_WKFrameHandleInternal.h"
 #import "_WKHitTestResultInternal.h"
+#import "_WKWebAuthenticationPanelInternal.h"
 #import <WebCore/FontAttributes.h>
 #import <WebCore/SecurityOriginData.h>
 #import <wtf/BlockPtr.h>
@@ -172,6 +173,9 @@
     
     m_delegateMethods.webViewHasVideoInPictureInPictureDidChange = [delegate respondsToSelector:@selector(_webView:hasVideoInPictureInPictureDidChange:)];
     m_delegateMethods.webViewDidShowSafeBrowsingWarning = [delegate respondsToSelector:@selector(_webViewDidShowSafeBrowsingWarning:)];
+#if ENABLE(WEB_AUTHN)
+    m_delegateMethods.webViewRunWebAuthenticationPanelInitiatedByFrameCompletionHandler = [delegate respondsToSelector:@selector(webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:)];
+#endif
 }
 
 #if ENABLE(CONTEXT_MENUS)
@@ -1261,6 +1265,46 @@
     [static_cast<id <WKUIDelegatePrivate>>(delegate) _webViewDidShowSafeBrowsingWarning:m_uiDelegate.m_webView];
 }
 
+#if ENABLE(WEB_AUTHN)
+
+static WebAuthenticationPanelResult webAuthenticationPanelResult(_WKWebAuthenticationPanelResult result)
+{
+    switch (result) {
+    case _WKWebAuthenticationPanelResultUnavailable:
+        return WebAuthenticationPanelResult::Unavailable;
+    case _WKWebAuthenticationPanelResultPresented:
+        return WebAuthenticationPanelResult::Presented;
+    case _WKWebAuthenticationPanelResultDidNotPresent:
+        return WebAuthenticationPanelResult::DidNotPresent;
+    }
+    ASSERT_NOT_REACHED();
+    return WebAuthenticationPanelResult::Unavailable;
+}
+
+void UIDelegate::UIClient::runWebAuthenticationPanel(WebPageProxy&, API::WebAuthenticationPanel& panel, CompletionHandler<void(WebAuthenticationPanelResult)>&& completionHandler)
+{
+    if (!m_uiDelegate.m_delegateMethods.webViewRunWebAuthenticationPanelInitiatedByFrameCompletionHandler) {
+        completionHandler(WebAuthenticationPanelResult::Unavailable);
+        return;
+    }
+
+    auto delegate = m_uiDelegate.m_delegate.get();
+    if (!delegate) {
+        completionHandler(WebAuthenticationPanelResult::Unavailable);
+        return;
+    }
+
+    auto checker = CompletionHandlerCallChecker::create(delegate.get(), @selector(webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:));
+    [(id <WKUIDelegatePrivate>)delegate webView:m_uiDelegate.m_webView runWebAuthenticationPanel:wrapper(panel) initiatedByFrame:nil completionHandler:makeBlockPtr([completionHandler = WTFMove(completionHandler), checker = WTFMove(checker)] (_WKWebAuthenticationPanelResult result) mutable {
+        if (checker->completionHandlerHasBeenCalled())
+            return;
+        checker->didCallCompletionHandler();
+        completionHandler(webAuthenticationPanelResult(result));
+    }).get()];
+}
+
+#endif // ENABLE(WEB_AUTHN)
+
 void UIDelegate::UIClient::hasVideoInPictureInPictureDidChange(WebPageProxy*, bool hasVideoInPictureInPicture)
 {
     if (!m_uiDelegate.m_delegateMethods.webViewHasVideoInPictureInPictureDidChange)

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/AuthenticatorManager.cpp (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/AuthenticatorManager.cpp	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/AuthenticatorManager.cpp	2019-10-20 17:33:02 UTC (rev 251340)
@@ -28,6 +28,10 @@
 
 #if ENABLE(WEB_AUTHN)
 
+#include "APIUIClient.h"
+#include "APIWebAuthenticationPanel.h"
+#include "APIWebAuthenticationPanelClient.h"
+#include "WebPageProxy.h"
 #include "WebPreferencesKeys.h"
 #include <WebCore/AuthenticatorTransport.h>
 #include <WebCore/PublicKeyCredentialCreationOptions.h>
@@ -36,7 +40,7 @@
 namespace WebKit {
 using namespace WebCore;
 
-namespace AuthenticatorManagerInternal {
+namespace {
 
 const size_t maxTransportNumber = 3;
 
@@ -123,8 +127,22 @@
     transports.remove(AuthenticatorTransport::Internal);
 }
 
-} // namespace AuthenticatorManagerInternal
+static bool isFeatureEnabled(WebPageProxy* page, const String& featureKey)
+{
+    if (!page)
+        return false;
+    return page->preferences().store().getBoolValueForKey(featureKey);
+}
 
+static String getRpId(const Variant<PublicKeyCredentialCreationOptions, PublicKeyCredentialRequestOptions>& options)
+{
+    if (WTF::holds_alternative<PublicKeyCredentialCreationOptions>(options))
+        return WTF::get<PublicKeyCredentialCreationOptions>(options).rp.id;
+    return WTF::get<PublicKeyCredentialRequestOptions>(options).rpId;
+}
+
+} // namespace
+
 AuthenticatorManager::AuthenticatorManager()
     : m_requestTimeOutTimer(RunLoop::main(), this, &AuthenticatorManager::timeOutTimerFired)
 {
@@ -132,10 +150,8 @@
 
 void AuthenticatorManager::handleRequest(WebAuthenticationRequestData&& data, Callback&& callback)
 {
-    using namespace AuthenticatorManagerInternal;
-
     if (m_pendingCompletionHandler) {
-        m_pendingCompletionHandler(ExceptionData { NotAllowedError, "This request has been cancelled by a new request."_s });
+        invokePendingCompletionHandler(ExceptionData { NotAllowedError, "This request has been cancelled by a new request."_s });
         m_requestTimeOutTimer.stop();
     }
     clearState();
@@ -144,17 +160,8 @@
     m_pendingRequestData = WTFMove(data);
     m_pendingCompletionHandler = WTFMove(callback);
 
-    // 2. Get available transports and start discovering authenticators on them.
-    WTF::switchOn(m_pendingRequestData.options, [&](const PublicKeyCredentialCreationOptions& options) {
-        initTimeOutTimer(options.timeout);
-
-        auto transports = collectTransports(options.authenticatorSelection);
-        processGoogleLegacyAppIdSupportExtension(options.extensions, transports);
-        startDiscovery(WTFMove(transports));
-    }, [&](const  PublicKeyCredentialRequestOptions& options) {
-        initTimeOutTimer(options.timeout);
-        startDiscovery(collectTransports(options.allowCredentials));
-    });
+    // 2. Ask clients to show appropriate UI if any and then start the request.
+    runPanel();
 }
 
 void AuthenticatorManager::clearStateAsync()
@@ -195,7 +202,7 @@
     if (!shouldComplete)
         shouldComplete = WTF::get<ExceptionData>(respond).code == InvalidStateError;
     if (shouldComplete) {
-        m_pendingCompletionHandler(WTFMove(respond));
+        invokePendingCompletionHandler(WTFMove(respond));
         clearStateAsync();
         m_requestTimeOutTimer.stop();
         return;
@@ -225,12 +232,13 @@
 
 void AuthenticatorManager::startDiscovery(const TransportSet& transports)
 {
-    using namespace AuthenticatorManagerInternal;
-
-    ASSERT(m_services.isEmpty() && transports.size() <= maxTransportNumber && m_pendingRequestData.preferences);
+    ASSERT(m_services.isEmpty() && transports.size() <= maxTransportNumber);
     for (auto& transport : transports) {
-        if (transport == AuthenticatorTransport::Internal && !m_pendingRequestData.preferences->store().getBoolValueForKey(WebPreferencesKey::webAuthenticationLocalAuthenticatorEnabledKey()))
+        if (transport == AuthenticatorTransport::Internal && !isFeatureEnabled(m_pendingRequestData.page.get(), WebPreferencesKey::webAuthenticationLocalAuthenticatorEnabledKey()))
             continue;
+        // Only allow USB authenticators when clients don't have dedicated UI.
+        if (transport != AuthenticatorTransport::Usb && (m_pendingRequestData.panelResult == WebAuthenticationPanelResult::Unavailable))
+            continue;
         auto service = createService(transport, *this);
         service->startDiscovery();
         m_services.append(WTFMove(service));
@@ -239,8 +247,6 @@
 
 void AuthenticatorManager::initTimeOutTimer(const Optional<unsigned>& timeOutInMs)
 {
-    using namespace AuthenticatorManagerInternal;
-
     unsigned timeOutInMsValue = std::min(maxTimeOutValue, timeOutInMs.valueOr(maxTimeOutValue));
     m_requestTimeOutTimer.startOneShot(Seconds::fromMilliseconds(timeOutInMsValue));
 }
@@ -248,10 +254,57 @@
 void AuthenticatorManager::timeOutTimerFired()
 {
     ASSERT(m_requestTimeOutTimer.isActive());
-    m_pendingCompletionHandler((ExceptionData { NotAllowedError, "Operation timed out."_s }));
+    invokePendingCompletionHandler((ExceptionData { NotAllowedError, "Operation timed out."_s }));
     clearState();
 }
 
+void AuthenticatorManager::runPanel()
+{
+    auto* page = m_pendingRequestData.page.get();
+    if (!page)
+        return;
+
+    m_pendingRequestData.panel = API::WebAuthenticationPanel::create(getRpId(m_pendingRequestData.options));
+    auto& panel = *m_pendingRequestData.panel;
+    page->uiClient().runWebAuthenticationPanel(*page, panel, [weakPanel = makeWeakPtr(panel), weakThis = makeWeakPtr(*this), this] (WebAuthenticationPanelResult result) {
+        // The panel address is used to determine if the current pending request is still the same.
+        if (!weakThis || !weakPanel
+            || (result == WebAuthenticationPanelResult::DidNotPresent)
+            || (weakPanel.get() != m_pendingRequestData.panel.get()))
+            return;
+        m_pendingRequestData.panelResult = result;
+        startRequest();
+    });
+}
+
+void AuthenticatorManager::startRequest()
+{
+    ASSERT(RunLoop::isMain());
+    // Get available transports and start discovering authenticators on them.
+    WTF::switchOn(m_pendingRequestData.options, [&](const PublicKeyCredentialCreationOptions& options) {
+        initTimeOutTimer(options.timeout);
+
+        auto transports = collectTransports(options.authenticatorSelection);
+        processGoogleLegacyAppIdSupportExtension(options.extensions, transports);
+        startDiscovery(collectTransports(options.authenticatorSelection));
+    }, [&](const  PublicKeyCredentialRequestOptions& options) {
+        initTimeOutTimer(options.timeout);
+        startDiscovery(collectTransports(options.allowCredentials));
+    });
+}
+
+void AuthenticatorManager::invokePendingCompletionHandler(Respond&& respond)
+{
+    if (auto *panel = m_pendingRequestData.panel.get()) {
+        WTF::switchOn(respond, [&](const WebCore::PublicKeyCredentialData&) {
+            panel->client().dismissPanel(WebAuthenticationResult::Succeeded);
+        }, [&](const  WebCore::ExceptionData&) {
+            panel->client().dismissPanel(WebAuthenticationResult::Failed);
+        });
+    }
+    m_pendingCompletionHandler(WTFMove(respond));
+}
+
 } // namespace WebKit
 
 #endif // ENABLE(WEB_AUTHN)

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/AuthenticatorManager.h (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/AuthenticatorManager.h	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/AuthenticatorManager.h	2019-10-20 17:33:02 UTC (rev 251340)
@@ -59,10 +59,10 @@
     virtual bool isMock() const { return false; }
 
 protected:
-    Callback& pendingCompletionHandler() { return m_pendingCompletionHandler; }
     RunLoop::Timer<AuthenticatorManager>& requestTimeOutTimer() { return m_requestTimeOutTimer; }
     void clearStateAsync(); // To void cyclic dependence.
     void clearState();
+    void invokePendingCompletionHandler(Respond&&);
 
 private:
     // AuthenticatorTransportService::Observer
@@ -80,10 +80,12 @@
     void startDiscovery(const TransportSet&);
     void initTimeOutTimer(const Optional<unsigned>& timeOutInMs);
     void timeOutTimerFired();
+    void runPanel();
+    void startRequest();
 
     // Request: We only allow one request per time. A new request will cancel any pending ones.
     WebAuthenticationRequestData m_pendingRequestData;
-    Callback m_pendingCompletionHandler;
+    Callback m_pendingCompletionHandler; // Should be invoked directly, use invokePendingCompletionHandler.
     RunLoop::Timer<AuthenticatorManager> m_requestTimeOutTimer;
 
     Vector<UniqueRef<AuthenticatorTransportService>> m_services;

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Cocoa/NfcConnection.mm (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Cocoa/NfcConnection.mm	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Cocoa/NfcConnection.mm	2019-10-20 17:33:02 UTC (rev 251340)
@@ -51,8 +51,6 @@
     , m_service(makeWeakPtr(service))
 {
     [m_session setDelegate:m_delegate.get()];
-    // FIXME(200933)
-    [m_session updateUIAlertMessage:@"Insert your security key or hold the key against the top of your device."];
     [m_session startPolling];
 }
 

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Cocoa/NfcService.mm (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Cocoa/NfcService.mm	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Cocoa/NfcService.mm	2019-10-20 17:33:02 UTC (rev 251340)
@@ -91,7 +91,7 @@
             m_driver = std::make_unique<CtapNfcDriver>(makeUniqueRef<NfcConnection>(WTFMove(session), *this));
         });
     });
-    [[getNFHardwareManagerClass() sharedHardwareManager] startReaderSessionWithActionSheetUI:callback.get()];
+    [[getNFHardwareManagerClass() sharedHardwareManager] startReaderSession:callback.get()];
 #endif // HAVE(NEAR_FIELD)
 }
 

Copied: branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.h (from rev 251339, branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h) (0 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.h	                        (rev 0)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.h	2019-10-20 17:33:02 UTC (rev 251340)
@@ -0,0 +1,62 @@
+/*
+ * 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
+
+#if ENABLE(WEB_AUTHN)
+
+#import "WKFoundation.h"
+
+#import "APIWebAuthenticationPanelClient.h"
+#import <wtf/RetainPtr.h>
+#import <wtf/WeakObjCPtr.h>
+#import <wtf/WeakPtr.h>
+
+@class _WKWebAuthenticationPanel;
+@protocol _WKWebAuthenticationPanelDelegate;
+
+namespace WebKit {
+
+class WebAuthenticationPanelClient : public API::WebAuthenticationPanelClient, public CanMakeWeakPtr<WebAuthenticationPanelClient> {
+public:
+    WebAuthenticationPanelClient(_WKWebAuthenticationPanel *, id <_WKWebAuthenticationPanelDelegate>);
+
+    RetainPtr<id <_WKWebAuthenticationPanelDelegate> > delegate();
+
+private:
+    // API::WebAuthenticationPanelClient
+    void dismissPanel(WebAuthenticationResult) const final;
+
+    _WKWebAuthenticationPanel *m_panel;
+    WeakObjCPtr<id <_WKWebAuthenticationPanelDelegate> > m_delegate;
+
+    struct {
+        bool panelDismissWebAuthenticationPanelWithResult : 1;
+    } m_delegateMethods;
+};
+
+} // namespace WebKit
+
+#endif // ENABLE(WEB_AUTHN)

Copied: branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.mm (from rev 251339, branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.cpp) (0 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.mm	                        (rev 0)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.mm	2019-10-20 17:33:02 UTC (rev 251340)
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ */
+
+#import "config.h"
+#import "WebAuthenticationPanelClient.h"
+
+#if ENABLE(WEB_AUTHN)
+
+#import "WebAuthenticationPanelFlags.h"
+#import "_WKWebAuthenticationPanel.h"
+
+namespace WebKit {
+
+WebAuthenticationPanelClient::WebAuthenticationPanelClient(_WKWebAuthenticationPanel *panel, id <_WKWebAuthenticationPanelDelegate> delegate)
+    : m_panel(panel)
+    , m_delegate(delegate)
+{
+    m_delegateMethods.panelDismissWebAuthenticationPanelWithResult = [delegate respondsToSelector:@selector(panel:dismissWebAuthenticationPanelWithResult:)];
+}
+
+RetainPtr<id <_WKWebAuthenticationPanelDelegate> > WebAuthenticationPanelClient::delegate()
+{
+    return m_delegate.get();
+}
+
+static _WKWebAuthenticationResult wkWebAuthenticationResult(WebAuthenticationResult result)
+{
+    switch (result) {
+    case WebAuthenticationResult::Succeeded:
+        return _WKWebAuthenticationResultSucceeded;
+    case WebAuthenticationResult::Failed:
+        return _WKWebAuthenticationResultFailed;
+    }
+    ASSERT_NOT_REACHED();
+    return _WKWebAuthenticationResultFailed;
+}
+
+void WebAuthenticationPanelClient::dismissPanel(WebAuthenticationResult result) const
+{
+    if (!m_delegateMethods.panelDismissWebAuthenticationPanelWithResult)
+        return;
+
+    auto delegate = m_delegate.get();
+    if (!delegate)
+        return;
+
+    [delegate panel:m_panel dismissWebAuthenticationPanelWithResult:wkWebAuthenticationResult(result)];
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(WEB_AUTHN)

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.cpp (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.cpp	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.cpp	2019-10-20 17:33:02 UTC (rev 251340)
@@ -45,7 +45,7 @@
     if (m_testConfiguration.silentFailure)
         return;
 
-    pendingCompletionHandler()(WTFMove(respond));
+    invokePendingCompletionHandler(WTFMove(respond));
     clearStateAsync();
     requestTimeOutTimer().stop();
 }

Copied: branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationPanelFlags.h (from rev 251339, branches/safari-608-branch/Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h) (0 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationPanelFlags.h	                        (rev 0)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationPanelFlags.h	2019-10-20 17:33:02 UTC (rev 251340)
@@ -0,0 +1,45 @@
+/*
+ * 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
+
+#if ENABLE(WEB_AUTHN)
+
+namespace WebKit {
+
+enum class WebAuthenticationPanelResult : uint8_t {
+    Unavailable,
+    Presented,
+    DidNotPresent
+};
+
+enum class WebAuthenticationResult : bool {
+    Succeeded,
+    Failed
+};
+
+} // namespace WebKit
+
+#endif // ENABLE(WEB_AUTHN)

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h	2019-10-20 17:33:02 UTC (rev 251340)
@@ -27,18 +27,24 @@
 
 #if ENABLE(WEB_AUTHN)
 
-#include "WebPreferences.h"
+#include "APIWebAuthenticationPanel.h"
+#include "WebAuthenticationPanelFlags.h"
 #include <WebCore/PublicKeyCredentialCreationOptions.h>
 #include <WebCore/PublicKeyCredentialRequestOptions.h>
 #include <wtf/Variant.h>
 #include <wtf/Vector.h>
+#include <wtf/WeakPtr.h>
 
 namespace WebKit {
 
+class WebPageProxy;
+
 struct WebAuthenticationRequestData {
     Vector<uint8_t> hash;
     Variant<WebCore::PublicKeyCredentialCreationOptions, WebCore::PublicKeyCredentialRequestOptions> options;
-    RefPtr<WebPreferences> preferences;
+    WeakPtr<WebPageProxy> page;
+    WebAuthenticationPanelResult panelResult { WebAuthenticationPanelResult::Unavailable };
+    RefPtr<API::WebAuthenticationPanel> panel;
 };
 
 } // namespace WebKit

Modified: branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp	2019-10-20 17:33:02 UTC (rev 251340)
@@ -30,6 +30,7 @@
 
 #include "AuthenticatorManager.h"
 #include "LocalService.h"
+#include "WebAuthenticationPanelFlags.h"
 #include "WebAuthenticatorCoordinatorMessages.h"
 #include "WebAuthenticatorCoordinatorProxyMessages.h"
 #include "WebPageProxy.h"
@@ -55,12 +56,12 @@
 
 void WebAuthenticatorCoordinatorProxy::makeCredential(uint64_t messageId, const Vector<uint8_t>& hash, const WebCore::PublicKeyCredentialCreationOptions& options)
 {
-    handleRequest(messageId, { hash, options, m_webPageProxy.preferences().copy() });
+    handleRequest(messageId, { hash, options, makeWeakPtr(m_webPageProxy), WebAuthenticationPanelResult::Unavailable, nullptr });
 }
 
 void WebAuthenticatorCoordinatorProxy::getAssertion(uint64_t messageId, const Vector<uint8_t>& hash, const WebCore::PublicKeyCredentialRequestOptions& options)
 {
-    handleRequest(messageId, { hash, options, m_webPageProxy.preferences().copy() });
+    handleRequest(messageId, { hash, options, makeWeakPtr(m_webPageProxy), WebAuthenticationPanelResult::Unavailable, nullptr });
 }
 
 void WebAuthenticatorCoordinatorProxy::handleRequest(uint64_t messageId, WebAuthenticationRequestData&& data)

Modified: branches/safari-608-branch/Source/WebKit/WebKit.xcodeproj/project.pbxproj (251339 => 251340)


--- branches/safari-608-branch/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2019-10-20 17:33:02 UTC (rev 251340)
@@ -1042,6 +1042,8 @@
 		57597EBD218184900037F924 /* CtapAuthenticator.h in Headers */ = {isa = PBXBuildFile; fileRef = 57597EBB2181848F0037F924 /* CtapAuthenticator.h */; };
 		576CA9D722B862180030143C /* SOAuthorizationNSURLExtras.h in Headers */ = {isa = PBXBuildFile; fileRef = 57FD317322B35148008D0E8B /* SOAuthorizationNSURLExtras.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		5772F206217DBD6A0056BF2C /* HidService.h in Headers */ = {isa = PBXBuildFile; fileRef = 5772F204217DBD6A0056BF2C /* HidService.h */; };
+		577FF7822346E81C004EDFB9 /* APIWebAuthenticationPanelClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 577FF7812346E81C004EDFB9 /* APIWebAuthenticationPanelClient.h */; };
+		577FF7852346ECAA004EDFB9 /* WebAuthenticationPanelClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 577FF7832346ECAA004EDFB9 /* WebAuthenticationPanelClient.h */; };
 		578DC2982155A0020074E815 /* LocalAuthenticationSoftLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 578DC2972155A0010074E815 /* LocalAuthenticationSoftLink.h */; };
 		57AC8F50217FEED90055438C /* HidConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 57AC8F4E217FEED90055438C /* HidConnection.h */; };
 		57B4B46020B504AC00D4AD79 /* ClientCertificateAuthenticationXPCConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B4B45E20B504AB00D4AD79 /* ClientCertificateAuthenticationXPCConstants.h */; };
@@ -1051,6 +1053,7 @@
 		57B8264823050C5100B72EB0 /* FidoService.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B8264623050C5100B72EB0 /* FidoService.h */; };
 		57B8264C230603C100B72EB0 /* MockNfcService.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B8264A230603C100B72EB0 /* MockNfcService.h */; };
 		57BBEA6D22BC0BFE00273995 /* SOAuthorizationLoadPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 57BBEA6C22BC0BFE00273995 /* SOAuthorizationLoadPolicy.h */; };
+		57C6244B234679A400383FE7 /* WebAuthenticationPanelFlags.h in Headers */ = {isa = PBXBuildFile; fileRef = 57C6244A234679A400383FE7 /* WebAuthenticationPanelFlags.h */; };
 		57DCED6E2142EE5E0016B847 /* WebAuthenticatorCoordinatorMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 57DCED6B2142EAE20016B847 /* WebAuthenticatorCoordinatorMessageReceiver.cpp */; };
 		57DCED6F2142EE630016B847 /* WebAuthenticatorCoordinatorMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 57DCED6A2142EAE20016B847 /* WebAuthenticatorCoordinatorMessages.h */; };
 		57DCED702142EE680016B847 /* WebAuthenticatorCoordinatorProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 57DCED6C2142EAF90016B847 /* WebAuthenticatorCoordinatorProxyMessageReceiver.cpp */; };
@@ -1069,6 +1072,7 @@
 		57DCEDC7214F18300016B847 /* MockLocalConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 57DCEDC5214F18300016B847 /* MockLocalConnection.h */; };
 		57DCEDCB214F4E420016B847 /* MockAuthenticatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 57DCEDC9214F4E420016B847 /* MockAuthenticatorManager.h */; };
 		57EB2E3A21E1983E00B89CDF /* U2fAuthenticator.h in Headers */ = {isa = PBXBuildFile; fileRef = 57EB2E3821E1983E00B89CDF /* U2fAuthenticator.h */; };
+		57EBE26A234676C5008D8AF9 /* APIWebAuthenticationPanel.h in Headers */ = {isa = PBXBuildFile; fileRef = 57EBE268234676C5008D8AF9 /* APIWebAuthenticationPanel.h */; };
 		57FD318022B35158008D0E8B /* NavigationSOAuthorizationSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 57FD317822B35149008D0E8B /* NavigationSOAuthorizationSession.h */; };
 		57FD318122B3515B008D0E8B /* PopUpSOAuthorizationSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 57FD317022B35148008D0E8B /* PopUpSOAuthorizationSession.h */; };
 		57FD318222B3515E008D0E8B /* RedirectSOAuthorizationSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 57FD317422B35149008D0E8B /* RedirectSOAuthorizationSession.h */; };
@@ -3498,6 +3502,9 @@
 		57608299202BDAE200116678 /* WebAuthenticatorCoordinatorProxy.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = WebAuthenticatorCoordinatorProxy.messages.in; sourceTree = "<group>"; };
 		5772F204217DBD6A0056BF2C /* HidService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HidService.h; sourceTree = "<group>"; };
 		5772F205217DBD6A0056BF2C /* HidService.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = HidService.mm; sourceTree = "<group>"; };
+		577FF7812346E81C004EDFB9 /* APIWebAuthenticationPanelClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = APIWebAuthenticationPanelClient.h; sourceTree = "<group>"; };
+		577FF7832346ECAA004EDFB9 /* WebAuthenticationPanelClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebAuthenticationPanelClient.h; sourceTree = "<group>"; };
+		577FF7842346ECAA004EDFB9 /* WebAuthenticationPanelClient.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = WebAuthenticationPanelClient.mm; sourceTree = "<group>"; };
 		578DC2972155A0010074E815 /* LocalAuthenticationSoftLink.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LocalAuthenticationSoftLink.h; sourceTree = "<group>"; };
 		57AC8F4E217FEED90055438C /* HidConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HidConnection.h; sourceTree = "<group>"; };
 		57AC8F4F217FEED90055438C /* HidConnection.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = HidConnection.mm; sourceTree = "<group>"; };
@@ -3511,6 +3518,7 @@
 		57B8264A230603C100B72EB0 /* MockNfcService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockNfcService.h; sourceTree = "<group>"; };
 		57B8264B230603C100B72EB0 /* MockNfcService.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MockNfcService.mm; sourceTree = "<group>"; };
 		57BBEA6C22BC0BFE00273995 /* SOAuthorizationLoadPolicy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SOAuthorizationLoadPolicy.h; sourceTree = "<group>"; };
+		57C6244A234679A400383FE7 /* WebAuthenticationPanelFlags.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebAuthenticationPanelFlags.h; sourceTree = "<group>"; };
 		57DCED6A2142EAE20016B847 /* WebAuthenticatorCoordinatorMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebAuthenticatorCoordinatorMessages.h; path = DerivedSources/WebKit2/WebAuthenticatorCoordinatorMessages.h; sourceTree = BUILT_PRODUCTS_DIR; };
 		57DCED6B2142EAE20016B847 /* WebAuthenticatorCoordinatorMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebAuthenticatorCoordinatorMessageReceiver.cpp; path = DerivedSources/WebKit2/WebAuthenticatorCoordinatorMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; };
 		57DCED6C2142EAF90016B847 /* WebAuthenticatorCoordinatorProxyMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebAuthenticatorCoordinatorProxyMessageReceiver.cpp; path = DerivedSources/WebKit2/WebAuthenticatorCoordinatorProxyMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -3538,6 +3546,8 @@
 		57DCEDCD214F51680016B847 /* MockAuthenticatorManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MockAuthenticatorManager.cpp; sourceTree = "<group>"; };
 		57EB2E3821E1983E00B89CDF /* U2fAuthenticator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = U2fAuthenticator.h; sourceTree = "<group>"; };
 		57EB2E3921E1983E00B89CDF /* U2fAuthenticator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = U2fAuthenticator.cpp; sourceTree = "<group>"; };
+		57EBE268234676C5008D8AF9 /* APIWebAuthenticationPanel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = APIWebAuthenticationPanel.h; sourceTree = "<group>"; };
+		57EBE269234676C5008D8AF9 /* APIWebAuthenticationPanel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = APIWebAuthenticationPanel.cpp; sourceTree = "<group>"; };
 		57FD317022B35148008D0E8B /* PopUpSOAuthorizationSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PopUpSOAuthorizationSession.h; sourceTree = "<group>"; };
 		57FD317122B35148008D0E8B /* WKSOAuthorizationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKSOAuthorizationDelegate.h; sourceTree = "<group>"; };
 		57FD317222B35148008D0E8B /* SOAuthorizationCoordinator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SOAuthorizationCoordinator.h; sourceTree = "<group>"; };
@@ -7026,6 +7036,7 @@
 				57DCED842147363A0016B847 /* AuthenticatorManager.h */,
 				57DCED9921489F4D0016B847 /* AuthenticatorTransportService.cpp */,
 				57DCED8A214853130016B847 /* AuthenticatorTransportService.h */,
+				57C6244A234679A400383FE7 /* WebAuthenticationPanelFlags.h */,
 				57DCEDA62149F9DA0016B847 /* WebAuthenticationRequestData.h */,
 				57608296202BD8BA00116678 /* WebAuthenticatorCoordinatorProxy.cpp */,
 				57608295202BD8BA00116678 /* WebAuthenticatorCoordinatorProxy.h */,
@@ -7065,6 +7076,8 @@
 				570DAAC12303730300E8FC04 /* NfcConnection.mm */,
 				570DAAAC23026F5C00E8FC04 /* NfcService.h */,
 				570DAAAD23026F5C00E8FC04 /* NfcService.mm */,
+				577FF7832346ECAA004EDFB9 /* WebAuthenticationPanelClient.h */,
+				577FF7842346ECAA004EDFB9 /* WebAuthenticationPanelClient.mm */,
 				570DAAC423037F7E00E8FC04 /* WKNFReaderSessionDelegate.h */,
 				570DAAC523037F7E00E8FC04 /* WKNFReaderSessionDelegate.mm */,
 			);
@@ -7927,6 +7940,9 @@
 				7C89D2921A67122F003A5FDE /* APIUserScript.h */,
 				2D8786211BDB58FF00D02ABB /* APIUserStyleSheet.cpp */,
 				2D8786221BDB58FF00D02ABB /* APIUserStyleSheet.h */,
+				57EBE269234676C5008D8AF9 /* APIWebAuthenticationPanel.cpp */,
+				57EBE268234676C5008D8AF9 /* APIWebAuthenticationPanel.h */,
+				577FF7812346E81C004EDFB9 /* APIWebAuthenticationPanelClient.h */,
 				1AE286811C7F93860069AC4F /* APIWebsiteDataRecord.cpp */,
 				1AE286821C7F93860069AC4F /* APIWebsiteDataRecord.h */,
 				1A3635A71A3144A300ED6197 /* APIWebsiteDataStore.cpp */,
@@ -9337,6 +9353,8 @@
 				2D8786241BDB58FF00D02ABB /* APIUserStyleSheet.h in Headers */,
 				C5E1AFED16B21017006CC1F2 /* APIWebArchive.h in Headers */,
 				C5E1AFEF16B21029006CC1F2 /* APIWebArchiveResource.h in Headers */,
+				57EBE26A234676C5008D8AF9 /* APIWebAuthenticationPanel.h in Headers */,
+				577FF7822346E81C004EDFB9 /* APIWebAuthenticationPanelClient.h in Headers */,
 				1AE286841C7F93860069AC4F /* APIWebsiteDataRecord.h in Headers */,
 				1A3635AA1A3144A300ED6197 /* APIWebsiteDataStore.h in Headers */,
 				1A6563E51B7A8C50009CF787 /* APIWindowFeatures.h in Headers */,
@@ -9770,6 +9788,8 @@
 				1AF4CEF018BC481800BC2D34 /* VisitedLinkTableController.h in Headers */,
 				1A8E7D3D18C15149005A702A /* VisitedLinkTableControllerMessages.h in Headers */,
 				CEDA12E3152CD1B300D9E08D /* WebAlternativeTextClient.h in Headers */,
+				577FF7852346ECAA004EDFB9 /* WebAuthenticationPanelClient.h in Headers */,
+				57C6244B234679A400383FE7 /* WebAuthenticationPanelFlags.h in Headers */,
 				57DCEDB2214C604C0016B847 /* WebAuthenticationRequestData.h in Headers */,
 				57DCED6F2142EE630016B847 /* WebAuthenticatorCoordinatorMessages.h in Headers */,
 				57DCEDB3214C60530016B847 /* WebAuthenticatorCoordinatorProxy.h in Headers */,

Modified: branches/safari-608-branch/Tools/ChangeLog (251339 => 251340)


--- branches/safari-608-branch/Tools/ChangeLog	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Tools/ChangeLog	2019-10-20 17:33:02 UTC (rev 251340)
@@ -1,5 +1,146 @@
 2019-10-15  Kocsen Chung  <kocsen_ch...@apple.com>
 
+        Cherry-pick r250729. rdar://problem/56280731
+
+    [WebAuthn] Implement _WKWebAuthenticationPanel SPI
+    https://bugs.webkit.org/show_bug.cgi?id=202559
+    <rdar://problem/55932094>
+    
+    Reviewed by Brent Fulgham.
+    
+    Source/WebKit:
+    
+    This patch implements _WKWebAuthenticationPanel SPI. Here is the structure:
+    1) API::WebAuthenticationPanel is the APIObject of _WKWebAuthenticationPanel. It is owned by AuthenticatorManager.
+    The lifetime of _WKWebAuthenticationPanel on the other hand is managed by clients. This binding is the surface
+    where clients could interact with WebKit's WebAuthentication implementation.
+    2) API::WebAuthenticationPanelClient is a base class representing _WKWebAuthenticationPanelDelegate. Its subclass
+    WebKit::WebAuthenticationPanelClient implements bridges to _WKWebAuthenticationPanelDelegate methods. It is owned by
+    API::WebAuthenticationPanel. A weak pointer of WebKit::WebAuthenticationPanelClient is kept in _WKWebAuthenticationPanel
+    to get the _WKWebAuthenticationPanelDelegate set by clients or nil otherwise. This binding is the surface where WebKit
+    interacts with clients.
+    3) WebAuthenticationPanelFlags is the mirror of enums within _WKWebAuthenticationPanel.
+    
+    Implementation wise, this patch implements:
+    1) -[WKUIDelegatePrivate webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:], this is bridged from
+    the regular UIDelegate route. Noted, WKFrameInfo is nil for now, a follow up on Bug 202563 will take care of it. This
+    will be called from AuthenticatorManager::runPanel() which gates the start of discovery on the callback. For clients
+    that don't implement the delegate, the callback will always be called with _WKWebAuthenticationPanelResultUnavailable
+    to allow WebKit run on non-UI mode. A specific C API hack is added to always return _WKWebAuthenticationPanelResultPresented
+    in WebKitTestRunner for layout tests.
+    2) -[_WKWebAuthenticationPanelDelegate panel:updateWebAuthenticationPanel:] will be implemented in Bug 200932.
+    3) -[_WKWebAuthenticationPanelDelegate panel:dismissWebAuthenticationPanelWithResult:], this is bridged from
+    API::WebAuthenticationPanel/API::WebAuthenticationPanelClient. This will be called whenever AuthenticatorManager::m_pendingCompletionHandler
+    is invoked. Depending on the respond, _WKWebAuthenticationResult will be returned accordingly. To facilitate that,
+    invokePendingCompletionHandler is crafted to bundle those two operations.
+    4) -[_WKWebAuthenticationPanel cancel] will be implemented in Bug 191523.
+    
+    Besides the above, this patch also silents the NFC action sheet.
+    
+    * Platform/spi/Cocoa/NearFieldSPI.h:
+    * Shared/API/APIObject.h:
+    * Shared/Cocoa/APIObject.mm:
+    (API::Object::newObject):
+    * Sources.txt:
+    * SourcesCocoa.txt:
+    * UIProcess/API/APIUIClient.h:
+    (API::UIClient::runWebAuthenticationPanel):
+    * UIProcess/API/APIWebAuthenticationPanel.cpp: Copied from Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanel.mm.
+    (API::WebAuthenticationPanel::create):
+    (API::WebAuthenticationPanel::WebAuthenticationPanel):
+    (API::WebAuthenticationPanel::setClient):
+    * UIProcess/API/APIWebAuthenticationPanel.h: Copied from Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h.
+    * UIProcess/API/APIWebAuthenticationPanelClient.h: Copied from Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h.
+    (API::WebAuthenticationPanelClient::dismissPanel const):
+    * UIProcess/API/C/WKPage.cpp:
+    (WKPageSetPageUIClient):
+    * UIProcess/API/C/WKPageUIClient.h:
+    * UIProcess/API/Cocoa/_WKWebAuthenticationPanel.mm:
+    (-[_WKWebAuthenticationPanel dealloc]):
+    (-[_WKWebAuthenticationPanel relyingPartyID]):
+    (-[_WKWebAuthenticationPanel delegate]):
+    (-[_WKWebAuthenticationPanel setDelegate:]):
+    (-[_WKWebAuthenticationPanel _apiObject]):
+    (-[_WKWebAuthenticationPanel _initWithRelayingPartyID:]): Deleted.
+    * UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h:
+    * UIProcess/Cocoa/UIDelegate.h:
+    * UIProcess/Cocoa/UIDelegate.mm:
+    (WebKit::UIDelegate::setDelegate):
+    (WebKit::webAuthenticationPanelResult):
+    (WebKit::UIDelegate::UIClient::runWebAuthenticationPanel):
+    * UIProcess/WebAuthentication/AuthenticatorManager.cpp:
+    (WebKit::WebCore::isFeatureEnabled):
+    (WebKit::WebCore::getRpId):
+    (WebKit::AuthenticatorManager::handleRequest):
+    (WebKit::AuthenticatorManager::respondReceived):
+    (WebKit::AuthenticatorManager::startDiscovery):
+    (WebKit::AuthenticatorManager::initTimeOutTimer):
+    (WebKit::AuthenticatorManager::timeOutTimerFired):
+    (WebKit::AuthenticatorManager::runPanel):
+    (WebKit::AuthenticatorManager::startRequest):
+    (WebKit::AuthenticatorManager::invokePendingCompletionHandler):
+    (WebKit::AuthenticatorManagerInternal::collectTransports): Deleted.
+    (WebKit::AuthenticatorManagerInternal::processGoogleLegacyAppIdSupportExtension): Deleted.
+    * UIProcess/WebAuthentication/AuthenticatorManager.h:
+    (WebKit::AuthenticatorManager::pendingCompletionHandler): Deleted.
+    * UIProcess/WebAuthentication/Cocoa/NfcConnection.mm:
+    (WebKit::NfcConnection::NfcConnection):
+    * UIProcess/WebAuthentication/Cocoa/NfcService.mm:
+    (WebKit::NfcService::platformStartDiscovery):
+    * UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.h: Copied from Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h.
+    * UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.mm: Copied from Source/WebKit/UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.cpp.
+    (WebKit::WebAuthenticationPanelClient::WebAuthenticationPanelClient):
+    (WebKit::wkWebAuthenticationResult):
+    (WebKit::WebAuthenticationPanelClient::dismissPanel const):
+    * UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.cpp:
+    (WebKit::MockAuthenticatorManager::respondReceivedInternal):
+    * UIProcess/WebAuthentication/WebAuthenticationPanelFlags.h: Copied from Source/WebKit/UIProcess/API/Cocoa/_WKWebAuthenticationPanelInternal.h.
+    * UIProcess/WebAuthentication/WebAuthenticationRequestData.h:
+    * UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp:
+    (WebKit::WebAuthenticatorCoordinatorProxy::makeCredential):
+    (WebKit::WebAuthenticatorCoordinatorProxy::getAssertion):
+    * WebKit.xcodeproj/project.pbxproj:
+    
+    Tools:
+    
+    This patch adds a very limited test case to _WKWebAuthenticationPanel.
+    Bug 202560 and Bug 202565 will follow up to write more tests.
+    
+    * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+    * TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm: Added.
+    (-[TestWebAuthenticationPanelDelegate panel:dismissWebAuthenticationPanelWithResult:]):
+    (-[TestWebAuthenticationPanelUIDelegate webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:]):
+    (TestWebKitAPI::TEST):
+    * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion.html: Added.
+    * WebKitTestRunner/TestController.cpp:
+    (WTR::runWebAuthenticationPanel):
+    (WTR::TestController::createWebViewWithOptions):
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250729 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2019-10-04  Jiewen Tan  <jiewen_...@apple.com>
+
+            [WebAuthn] Implement _WKWebAuthenticationPanel SPI
+            https://bugs.webkit.org/show_bug.cgi?id=202559
+            <rdar://problem/55932094>
+
+            Reviewed by Brent Fulgham.
+
+            This patch adds a very limited test case to _WKWebAuthenticationPanel.
+            Bug 202560 and Bug 202565 will follow up to write more tests.
+
+            * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+            * TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm: Added.
+            (-[TestWebAuthenticationPanelDelegate panel:dismissWebAuthenticationPanelWithResult:]):
+            (-[TestWebAuthenticationPanelUIDelegate webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:]):
+            (TestWebKitAPI::TEST):
+            * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion.html: Added.
+            * WebKitTestRunner/TestController.cpp:
+            (WTR::runWebAuthenticationPanel):
+            (WTR::TestController::createWebViewWithOptions):
+
+2019-10-15  Kocsen Chung  <kocsen_ch...@apple.com>
+
         Cherry-pick r250416. rdar://problem/55954224
 
     SubFrameSOAuthorizationSession should ensure messages are posted in the right order to the parent frame

Modified: branches/safari-608-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (251339 => 251340)


--- branches/safari-608-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2019-10-20 17:33:02 UTC (rev 251340)
@@ -327,6 +327,8 @@
 		5797FE331EB15AB100B2F4A0 /* navigation-client-default-crypto.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 5797FE321EB15A8900B2F4A0 /* navigation-client-default-crypto.html */; };
 		57A79857224AB34E00A7F6F1 /* WebCryptoMasterKey.mm in Sources */ = {isa = PBXBuildFile; fileRef = 57A79856224AB34E00A7F6F1 /* WebCryptoMasterKey.mm */; };
 		57C3FA661F7C248F009D4B80 /* WeakPtr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1CB9BC371A67482300FE5678 /* WeakPtr.cpp */; };
+		57C6244E2346BCFA00383FE7 /* _WKWebAuthenticationPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = 57C6244D2346BCFA00383FE7 /* _WKWebAuthenticationPanel.mm */; };
+		57C624502346C21E00383FE7 /* web-authentication-get-assertion.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 57C6244F2346C1EC00383FE7 /* web-authentication-get-assertion.html */; };
 		57F4AAA0208FAEF000A68E9E /* SSLKeyGenerator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 57F4AA9F208FA83D00A68E9E /* SSLKeyGenerator.mm */; };
 		57F56A5C1C7F8CC100F31D7E /* IsNavigationActionTrusted.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 57F56A5B1C7F8A4000F31D7E /* IsNavigationActionTrusted.html */; };
 		5C0160C121A132460077FA32 /* JITEnabled.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C0160C021A132320077FA32 /* JITEnabled.mm */; };
@@ -1411,6 +1413,7 @@
 				CDC8E4971BC6F10800594FEC /* video-without-audio.mp4 in Copy Resources */,
 				2EBD9D0A2134730D002DA758 /* video.html in Copy Resources */,
 				CD577799211CE0E4001B371E /* web-audio-only.html in Copy Resources */,
+				57C624502346C21E00383FE7 /* web-authentication-get-assertion.html in Copy Resources */,
 				1C2B81861C89259D00A5529F /* webfont.html in Copy Resources */,
 				51714EB41CF8C78C004723C4 /* WebProcessKillIDBCleanup-1.html in Copy Resources */,
 				51714EB51CF8C78C004723C4 /* WebProcessKillIDBCleanup-2.html in Copy Resources */,
@@ -1829,6 +1832,8 @@
 		5797FE321EB15A8900B2F4A0 /* navigation-client-default-crypto.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "navigation-client-default-crypto.html"; sourceTree = "<group>"; };
 		5798E2AF1CAF5C2800C5CBA0 /* ProvisionalURLNotChange.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ProvisionalURLNotChange.mm; sourceTree = "<group>"; };
 		57A79856224AB34E00A7F6F1 /* WebCryptoMasterKey.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = WebCryptoMasterKey.mm; sourceTree = "<group>"; };
+		57C6244D2346BCFA00383FE7 /* _WKWebAuthenticationPanel.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKWebAuthenticationPanel.mm; sourceTree = "<group>"; };
+		57C6244F2346C1EC00383FE7 /* web-authentication-get-assertion.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "web-authentication-get-assertion.html"; sourceTree = "<group>"; };
 		57D1D75E21DCB7A80093E86A /* U2fCommandConstructorTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = U2fCommandConstructorTest.cpp; sourceTree = "<group>"; };
 		57F10D921C7E7B3800ECDF30 /* IsNavigationActionTrusted.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IsNavigationActionTrusted.mm; sourceTree = "<group>"; };
 		57F4AA9F208FA83D00A68E9E /* SSLKeyGenerator.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = SSLKeyGenerator.mm; sourceTree = "<group>"; };
@@ -2690,6 +2695,7 @@
 				A16F66B81C40E9E100BD4D24 /* Resources */,
 				5CEAB5DF1FA937CB00A77FAA /* _WKInputDelegate.mm */,
 				7CEFA9641AC0B9E200B910FD /* _WKUserContentExtensionStore.mm */,
+				57C6244D2346BCFA00383FE7 /* _WKWebAuthenticationPanel.mm */,
 				0746645822FF630500E3451A /* AccessibilityTestPlugin.mm */,
 				0746645722FF62D000E3451A /* AccessibilityTestSupportProtocol.h */,
 				37E7DD631EA06FF2009B396D /* AdditionalReadAccessAllowedURLs.mm */,
@@ -3323,6 +3329,7 @@
 				F4451C751EB8FD7C0020C5DA /* two-paragraph-contenteditable.html */,
 				CD57779B211CE6CE001B371E /* video-with-audio-and-web-audio.html */,
 				CD577798211CDE8F001B371E /* web-audio-only.html */,
+				57C6244F2346C1EC00383FE7 /* web-authentication-get-assertion.html */,
 				51714EB21CF8C761004723C4 /* WebProcessKillIDBCleanup-1.html */,
 				51714EB31CF8C761004723C4 /* WebProcessKillIDBCleanup-2.html */,
 				5120C83B1E674E350025B250 /* WebsiteDataStoreCustomPaths.html */,
@@ -4307,6 +4314,7 @@
 			files = (
 				5CEAB5E11FA939F400A77FAA /* _WKInputDelegate.mm in Sources */,
 				7CEFA9661AC0B9E200B910FD /* _WKUserContentExtensionStore.mm in Sources */,
+				57C6244E2346BCFA00383FE7 /* _WKWebAuthenticationPanel.mm in Sources */,
 				7CCE7EE41A411AE600447C4C /* AboutBlankLoad.cpp in Sources */,
 				7CCE7EB31A411A7E00447C4C /* AcceptsFirstMouse.mm in Sources */,
 				2E205BA41F527746005952DD /* AccessibilityTestsIOS.mm in Sources */,

Added: branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm (0 => 251340)


--- branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm	                        (rev 0)
+++ branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm	2019-10-20 17:33:02 UTC (rev 251340)
@@ -0,0 +1,124 @@
+/*
+ * 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.
+ */
+
+#import "config.h"
+#import "Test.h"
+
+#if ENABLE(WEB_AUTHN)
+
+#import "PlatformUtilities.h"
+#import "TestWKWebView.h"
+#import <WebKit/WKPreferencesPrivate.h>
+#import <WebKit/WKUIDelegatePrivate.h>
+#import <WebKit/_WKExperimentalFeature.h>
+#import <WebKit/_WKWebAuthenticationPanel.h>
+
+static bool webAuthenticationPanelRan = false;
+static bool webAuthenticationPanelDimissed = false;
+
+@interface TestWebAuthenticationPanelDelegate : NSObject <_WKWebAuthenticationPanelDelegate>
+@end
+
+@implementation TestWebAuthenticationPanelDelegate
+
+- (void)panel:(_WKWebAuthenticationPanel *)panel dismissWebAuthenticationPanelWithResult:(_WKWebAuthenticationResult)result
+{
+    ASSERT_NE(panel, nil);
+    EXPECT_EQ(result, _WKWebAuthenticationResultFailed);
+    webAuthenticationPanelDimissed = true;
+}
+
+@end
+
+@interface TestWebAuthenticationPanelUIDelegate : NSObject <WKUIDelegatePrivate>
+@end
+
+@implementation TestWebAuthenticationPanelUIDelegate {
+    RetainPtr<_WKWebAuthenticationPanel> _panel;
+    RetainPtr<TestWebAuthenticationPanelDelegate> _delegate;
+}
+
+- (void)webView:(WKWebView *)webView runWebAuthenticationPanel:(_WKWebAuthenticationPanel *)panel initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(_WKWebAuthenticationPanelResult))completionHandler
+{
+    webAuthenticationPanelRan = true;
+
+    _delegate = adoptNS([[TestWebAuthenticationPanelDelegate alloc] init]);
+    ASSERT_NE(panel, nil);
+    _panel = panel;
+    [_panel setDelegate:_delegate.get()];
+
+    EXPECT_WK_STREQ([_panel relyingPartyID], "");
+
+    completionHandler(_WKWebAuthenticationPanelResultPresented);
+}
+
+@end
+
+namespace TestWebKitAPI {
+
+namespace {
+_WKExperimentalFeature *webAuthenticationExperimentalFeature()
+{
+    static RetainPtr<_WKExperimentalFeature> theFeature;
+    if (theFeature)
+        return theFeature.get();
+
+    NSArray *features = [WKPreferences _experimentalFeatures];
+    for (_WKExperimentalFeature *feature in features) {
+        if ([feature.key isEqual:@"WebAuthenticationEnabled"]) {
+            theFeature = feature;
+            break;
+        }
+    }
+    return theFeature.get();
+}
+}
+
+TEST(WebAuthenticationPanel, BasicTimeout)
+{
+    RetainPtr<NSURL> testURL = [[NSBundle mainBundle] URLForResource:@"web-authentication-get-assertion" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"];
+
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    [[configuration preferences] _setEnabled:YES forExperimentalFeature:webAuthenticationExperimentalFeature()];
+
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSZeroRect configuration:configuration.get()]);
+    auto delegate = adoptNS([[TestWebAuthenticationPanelUIDelegate alloc] init]);
+    [webView setUIDelegate:delegate.get()];
+
+    // Only focused documents can trigger WebAuthn.
+#if PLATFORM(MAC)
+    [[webView hostWindow] makeFirstResponder:webView.get()];
+#elif PLATFORM(IOS)
+    [webView becomeFirstResponder];
+#endif
+
+    [webView loadRequest:[NSURLRequest requestWithURL:testURL.get()]];
+    Util::run(&webAuthenticationPanelRan);
+    Util::run(&webAuthenticationPanelDimissed);
+}
+
+} // namespace TestWebKitAPI
+
+#endif // ENABLE(WEB_AUTHN)

Added: branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion.html (0 => 251340)


--- branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion.html	                        (rev 0)
+++ branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion.html	2019-10-20 17:33:02 UTC (rev 251340)
@@ -0,0 +1,10 @@
+<script>
+    const options = {
+        publicKey: {
+            challenge: new Uint8Array(16),
+            timeout: 1
+        }
+    };
+
+    navigator.credentials.get(options);
+</script>

Modified: branches/safari-608-branch/Tools/WebKitTestRunner/TestController.cpp (251339 => 251340)


--- branches/safari-608-branch/Tools/WebKitTestRunner/TestController.cpp	2019-10-20 17:32:54 UTC (rev 251339)
+++ branches/safari-608-branch/Tools/WebKitTestRunner/TestController.cpp	2019-10-20 17:33:02 UTC (rev 251340)
@@ -292,6 +292,11 @@
     return TestController::singleton().handleDeviceOrientationAndMotionAccessRequest(origin);
 }
 
+// A placeholder to tell WebKit the client is WebKitTestRunner.
+static void runWebAuthenticationPanel()
+{
+}
+
 WKPageRef TestController::createOtherPage(WKPageRef, WKPageConfigurationRef configuration, WKNavigationActionRef navigationAction, WKWindowFeaturesRef windowFeatures, const void *clientInfo)
 {
     PlatformWebView* parentView = static_cast<PlatformWebView*>(const_cast<void*>(clientInfo));
@@ -596,8 +601,8 @@
     resetPreferencesToConsistentValues(options);
 
     platformCreateWebView(configuration.get(), options);
-    WKPageUIClientV13 pageUIClient = {
-        { 13, m_mainWebView.get() },
+    WKPageUIClientV14 pageUIClient = {
+        { 14, m_mainWebView.get() },
         0, // createNewPage_deprecatedForUseWithV0
         0, // showPage
         0, // close
@@ -669,7 +674,8 @@
         0, // didExceedBackgroundResourceLimitWhileInForeground
         0, // didResignInputElementStrongPasswordAppearance
         0, // requestStorageAccessConfirm
-        shouldAllowDeviceOrientationAndMotionAccess
+        shouldAllowDeviceOrientationAndMotionAccess,
+        runWebAuthenticationPanel
     };
     WKPageSetPageUIClient(m_mainWebView->page(), &pageUIClient.base);
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to