Title: [265525] trunk
Revision
265525
Author
beid...@apple.com
Date
2020-08-11 15:20:16 -0700 (Tue, 11 Aug 2020)

Log Message

Add a "use stored credentials" setting to WKWebView.
<rdar://problem/63308019> and https://bugs.webkit.org/show_bug.cgi?id=215388

Reviewed by Geoff Garen.

Source/WebCore:

Covered by Preconnect API tests.

This setting is to allow apps to explicitly deny using the credential storage
for network operations. (e.g. to make sure the Keychain UI doesn't pop up
for an offscreen load)

* loader/ResourceLoader.cpp:
(WebCore::ResourceLoader::shouldUseCredentialStorage):

* page/Page.h:
(WebCore::Page::setCanUseCredentialStorage):
(WebCore::Page::canUseCredentialStorage const):

Source/WebKit:

* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::preconnectTo):

* Shared/WebPageCreationParameters.cpp:
(WebKit::WebPageCreationParameters::encode const):
(WebKit::WebPageCreationParameters::decode):
* Shared/WebPageCreationParameters.h:

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _canUseCredentialStorage]):
(-[WKWebView _setCanUseCredentialStorage:]):
* UIProcess/API/Cocoa/WKWebViewPrivate.h:

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::preconnectTo):
(WebKit::WebPageProxy::setCanUseCredentialStorage):
(WebKit::WebPageProxy::creationParameters):
* UIProcess/WebPageProxy.h:
(WebKit::WebPageProxy::canUseCredentialStorage):

* WebProcess/Network/WebLoaderStrategy.cpp:
(WebKit::WebLoaderStrategy::scheduleLoadFromNetworkProcess):

* WebProcess/WebPage/WebPage.cpp:
(WebKit::m_limitsNavigationsToAppBoundDomains):
(WebKit::WebPage::setCanUseCredentialStorage):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/Preconnect.mm:
(TestWebKitAPI::TEST):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (265524 => 265525)


--- trunk/Source/WebCore/ChangeLog	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebCore/ChangeLog	2020-08-11 22:20:16 UTC (rev 265525)
@@ -1,3 +1,23 @@
+2020-08-11  Brady Eidson  <beid...@apple.com>
+
+        Add a "use stored credentials" setting to WKWebView.
+        <rdar://problem/63308019> and https://bugs.webkit.org/show_bug.cgi?id=215388
+
+        Reviewed by Geoff Garen.
+
+        Covered by Preconnect API tests.
+        
+        This setting is to allow apps to explicitly deny using the credential storage
+        for network operations. (e.g. to make sure the Keychain UI doesn't pop up
+        for an offscreen load)
+
+        * loader/ResourceLoader.cpp:
+        (WebCore::ResourceLoader::shouldUseCredentialStorage):
+
+        * page/Page.h:
+        (WebCore::Page::setCanUseCredentialStorage):
+        (WebCore::Page::canUseCredentialStorage const):
+
 2020-08-11  Commit Queue  <commit-qu...@webkit.org>
 
         Unreviewed, reverting r265502.

Modified: trunk/Source/WebCore/loader/ResourceLoader.cpp (265524 => 265525)


--- trunk/Source/WebCore/loader/ResourceLoader.cpp	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebCore/loader/ResourceLoader.cpp	2020-08-11 22:20:16 UTC (rev 265525)
@@ -741,6 +741,11 @@
     if (m_options.storedCredentialsPolicy != StoredCredentialsPolicy::Use)
         return false;
 
+    if (auto* page = m_frame->page()) {
+        if (!page->canUseCredentialStorage())
+            return false;
+    }
+
     Ref<ResourceLoader> protectedThis(*this);
     return frameLoader()->client().shouldUseCredentialStorage(documentLoader(), identifier());
 }

Modified: trunk/Source/WebCore/page/Page.h (265524 => 265525)


--- trunk/Source/WebCore/page/Page.h	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebCore/page/Page.h	2020-08-11 22:20:16 UTC (rev 265525)
@@ -657,6 +657,9 @@
     void setHasResourceLoadClient(bool has) { m_hasResourceLoadClient = has; }
     bool hasResourceLoadClient() const { return m_hasResourceLoadClient; }
 
+    void setCanUseCredentialStorage(bool canUse) { m_canUseCredentialStorage = canUse; }
+    bool canUseCredentialStorage() const { return m_canUseCredentialStorage; }
+
 #if ENABLE(MEDIA_SESSION)
     WEBCORE_EXPORT void handleMediaEvent(MediaEventType);
     WEBCORE_EXPORT void setVolumeOfMediaElement(double, uint64_t);
@@ -1067,6 +1070,7 @@
     bool m_shouldFireEvents { true };
     bool m_loadsSubresources { true };
     bool m_loadsFromNetwork { true };
+    bool m_canUseCredentialStorage { true };
     ShouldRelaxThirdPartyCookieBlocking m_shouldRelaxThirdPartyCookieBlocking { ShouldRelaxThirdPartyCookieBlocking::No };
     bool m_hasBeenNotifiedToInjectUserScripts { false };
 };

Modified: trunk/Source/WebKit/ChangeLog (265524 => 265525)


--- trunk/Source/WebKit/ChangeLog	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebKit/ChangeLog	2020-08-11 22:20:16 UTC (rev 265525)
@@ -1,3 +1,39 @@
+2020-08-11  Brady Eidson  <beid...@apple.com>
+
+        Add a "use stored credentials" setting to WKWebView.
+        <rdar://problem/63308019> and https://bugs.webkit.org/show_bug.cgi?id=215388
+
+        Reviewed by Geoff Garen.
+
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::preconnectTo):
+
+        * Shared/WebPageCreationParameters.cpp:
+        (WebKit::WebPageCreationParameters::encode const):
+        (WebKit::WebPageCreationParameters::decode):
+        * Shared/WebPageCreationParameters.h:
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _canUseCredentialStorage]):
+        (-[WKWebView _setCanUseCredentialStorage:]):
+        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::preconnectTo):
+        (WebKit::WebPageProxy::setCanUseCredentialStorage):
+        (WebKit::WebPageProxy::creationParameters):
+        * UIProcess/WebPageProxy.h:
+        (WebKit::WebPageProxy::canUseCredentialStorage):
+
+        * WebProcess/Network/WebLoaderStrategy.cpp:
+        (WebKit::WebLoaderStrategy::scheduleLoadFromNetworkProcess):
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::m_limitsNavigationsToAppBoundDomains):
+        (WebKit::WebPage::setCanUseCredentialStorage):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+
 2020-08-11  Per Arne Vollan  <pvol...@apple.com>
 
         [macOS] Deny access to directory for compiled WebKit sandboxes

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (265524 => 265525)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-08-11 22:20:16 UTC (rev 265525)
@@ -1415,6 +1415,8 @@
 
 void NetworkProcess::preconnectTo(PAL::SessionID sessionID, WebPageProxyIdentifier webPageProxyID, WebCore::PageIdentifier webPageID, const URL& url, const String& userAgent, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, Optional<NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain)
 {
+    LOG(Network, "(NetworkProcess) Preconnecting to URL %s (storedCredentialsPolicy %i)", url.string().utf8().data(), (int)storedCredentialsPolicy);
+
 #if ENABLE(SERVER_PRECONNECT)
 #if ENABLE(LEGACY_CUSTOM_PROTOCOL_MANAGER)
     if (supplement<LegacyCustomProtocolManager>()->supportsScheme(url.protocol().toString()))

Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp (265524 => 265525)


--- trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp	2020-08-11 22:20:16 UTC (rev 265525)
@@ -157,6 +157,7 @@
     encoder << needsInAppBrowserPrivacyQuirks;
     encoder << limitsNavigationsToAppBoundDomains;
     encoder << shouldRelaxThirdPartyCookieBlocking;
+    encoder << canUseCredentialStorage;
 
 #if PLATFORM(GTK)
     encoder << themeName;
@@ -503,7 +504,10 @@
     
     if (!decoder.decode(parameters.shouldRelaxThirdPartyCookieBlocking))
         return WTF::nullopt;
-    
+
+    if (!decoder.decode(parameters.canUseCredentialStorage))
+        return WTF::nullopt;
+
 #if PLATFORM(GTK)
     if (!decoder.decode(parameters.themeName))
         return WTF::nullopt;

Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.h (265524 => 265525)


--- trunk/Source/WebKit/Shared/WebPageCreationParameters.h	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.h	2020-08-11 22:20:16 UTC (rev 265525)
@@ -229,6 +229,8 @@
     bool shouldEnableVP9Decoder { false };
     bool needsInAppBrowserPrivacyQuirks { false };
     bool limitsNavigationsToAppBoundDomains { false };
+    bool canUseCredentialStorage { true };
+
     WebCore::ShouldRelaxThirdPartyCookieBlocking shouldRelaxThirdPartyCookieBlocking { WebCore::ShouldRelaxThirdPartyCookieBlocking::No };
 
 #if PLATFORM(GTK)

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (265524 => 265525)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2020-08-11 22:20:16 UTC (rev 265525)
@@ -2674,6 +2674,16 @@
     _page->preconnectTo(url);
 }
 
+- (BOOL)_canUseCredentialStorage
+{
+    return _page->canUseCredentialStorage();
+}
+
+- (void)_setCanUseCredentialStorage:(BOOL)canUseCredentialStorage
+{
+    _page->setCanUseCredentialStorage(canUseCredentialStorage);
+}
+
 - (id <_WKInputDelegate>)_inputDelegate
 {
     return _inputDelegate.getAutoreleased();

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h (265524 => 265525)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h	2020-08-11 22:20:16 UTC (rev 265525)
@@ -352,6 +352,8 @@
 
 - (void)_preconnectToServer:(NSURL *)serverURL WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
 
+@property (nonatomic, setter=_setCanUseCredentialStorage:) BOOL _canUseCredentialStorage WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
+
 @end
 
 #if TARGET_OS_IPHONE

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (265524 => 265525)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2020-08-11 22:20:16 UTC (rev 265525)
@@ -4402,9 +4402,16 @@
     if (!m_websiteDataStore->configuration().allowsServerPreconnect())
         return;
 
-    m_process->processPool().ensureNetworkProcess().preconnectTo(sessionID(), identifier(), webPageID(), url, userAgent(), WebCore::StoredCredentialsPolicy::Use, m_isNavigatingToAppBoundDomain);
+    auto storedCredentialsPolicy = m_canUseCredentialStorage ? WebCore::StoredCredentialsPolicy::Use : WebCore::StoredCredentialsPolicy::DoNotUse;
+    m_process->processPool().ensureNetworkProcess().preconnectTo(sessionID(), identifier(), webPageID(), url, userAgent(), storedCredentialsPolicy, m_isNavigatingToAppBoundDomain);
 }
 
+void WebPageProxy::setCanUseCredentialStorage(bool canUseCredentialStorage)
+{
+    m_canUseCredentialStorage = canUseCredentialStorage;
+    send(Messages::WebPage::SetCanUseCredentialStorage(canUseCredentialStorage));
+}
+
 void WebPageProxy::didDestroyNavigation(uint64_t navigationID)
 {
     PageClientProtector protector(pageClient());
@@ -7865,6 +7872,7 @@
     parameters.shouldCaptureDisplayInUIProcess = m_process->processPool().configuration().shouldCaptureDisplayInUIProcess();
     parameters.limitsNavigationsToAppBoundDomains = m_limitsNavigationsToAppBoundDomains;
     parameters.shouldRelaxThirdPartyCookieBlocking = m_configuration->shouldRelaxThirdPartyCookieBlocking();
+    parameters.canUseCredentialStorage = m_canUseCredentialStorage;
 
 #if PLATFORM(GTK)
     parameters.themeName = pageClient().themeName();

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (265524 => 265525)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2020-08-11 22:20:16 UTC (rev 265525)
@@ -1793,6 +1793,9 @@
 
     void preconnectTo(const URL&);
 
+    bool canUseCredentialStorage() { return m_canUseCredentialStorage; }
+    void setCanUseCredentialStorage(bool);
+
 private:
     WebPageProxy(PageClient&, WebProcessProxy&, Ref<API::PageConfiguration>&&);
     void platformInitialize();
@@ -2850,6 +2853,7 @@
     bool m_userScriptsNotified { false };
     bool m_limitsNavigationsToAppBoundDomains { false };
     bool m_hasExecutedAppBoundBehaviorBeforeNavigation { false };
+    bool m_canUseCredentialStorage { true };
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (265524 => 265525)


--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2020-08-11 22:20:16 UTC (rev 265525)
@@ -290,12 +290,12 @@
     ResourceLoadIdentifier identifier = resourceLoader.identifier();
     ASSERT(identifier);
 
-    LOG(NetworkScheduling, "(WebProcess) WebLoaderStrategy::scheduleLoad, url '%s' will be scheduled with the NetworkProcess with priority %d", resourceLoader.url().string().latin1().data(), static_cast<int>(resourceLoader.request().priority()));
-
     ContentSniffingPolicy contentSniffingPolicy = resourceLoader.shouldSniffContent() ? ContentSniffingPolicy::SniffContent : ContentSniffingPolicy::DoNotSniffContent;
     ContentEncodingSniffingPolicy contentEncodingSniffingPolicy = resourceLoader.shouldSniffContentEncoding() ? ContentEncodingSniffingPolicy::Sniff : ContentEncodingSniffingPolicy::DoNotSniff;
     StoredCredentialsPolicy storedCredentialsPolicy = resourceLoader.shouldUseCredentialStorage() ? StoredCredentialsPolicy::Use : StoredCredentialsPolicy::DoNotUse;
 
+    LOG(NetworkScheduling, "(WebProcess) WebLoaderStrategy::scheduleLoad, url '%s' will be scheduled with the NetworkProcess with priority %d, storedCredentialsPolicy %i", resourceLoader.url().string().latin1().data(), static_cast<int>(resourceLoader.request().priority()), (int)storedCredentialsPolicy);
+
     auto* frame = resourceLoader.frame();
 
     NetworkResourceLoadParameters loadParameters;

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (265524 => 265525)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2020-08-11 22:20:16 UTC (rev 265525)
@@ -780,6 +780,8 @@
     if (parameters.shouldEnableVP9Decoder)
         WebProcess::singleton().enableVP9Decoder();
 
+    m_page->setCanUseCredentialStorage(parameters.canUseCredentialStorage);
+
     updateThrottleState();
 }
 
@@ -1229,6 +1231,12 @@
         m_page->setHasResourceLoadClient(has);
 }
 
+void WebPage::setCanUseCredentialStorage(bool has)
+{
+    if (m_page)
+        m_page->setCanUseCredentialStorage(has);
+}
+
 void WebPage::setTracksRepaints(bool trackRepaints)
 {
     if (FrameView* view = mainFrameView())

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (265524 => 265525)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2020-08-11 22:20:16 UTC (rev 265525)
@@ -1646,6 +1646,7 @@
     void platformDidSelectAll();
     
     void setHasResourceLoadClient(bool);
+    void setCanUseCredentialStorage(bool);
 
 #if ENABLE(CONTEXT_MENUS)
     void didSelectItemFromActiveContextMenu(const WebContextMenuItemData&);
@@ -2136,6 +2137,8 @@
     
     bool m_limitsNavigationsToAppBoundDomains { false };
     bool m_navigationHasOccured { false };
+    bool m_canUseCredentialStorage { true };
+
     Vector<String> m_corsDisablingPatterns;
 };
 

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (265524 => 265525)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2020-08-11 22:20:16 UTC (rev 265525)
@@ -609,4 +609,5 @@
     SetNeedsDOMWindowResizeEvent()
 
     SetHasResourceLoadClient(bool has)
+    SetCanUseCredentialStorage(bool canUse)
 }

Modified: trunk/Tools/ChangeLog (265524 => 265525)


--- trunk/Tools/ChangeLog	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Tools/ChangeLog	2020-08-11 22:20:16 UTC (rev 265525)
@@ -1,3 +1,13 @@
+2020-08-11  Brady Eidson  <beid...@apple.com>
+
+        Add a "use stored credentials" setting to WKWebView.
+        <rdar://problem/63308019> and https://bugs.webkit.org/show_bug.cgi?id=215388
+
+        Reviewed by Geoff Garen.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/Preconnect.mm:
+        (TestWebKitAPI::TEST):
+
 2020-08-11  Kenneth Russell  <k...@chromium.org>
 
         Update contributors.json with reinstated reviewer status

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Preconnect.mm (265524 => 265525)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Preconnect.mm	2020-08-11 22:08:00 UTC (rev 265524)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Preconnect.mm	2020-08-11 22:20:16 UTC (rev 265525)
@@ -53,9 +53,11 @@
 
 TEST(Preconnect, HTTP)
 {
+    size_t connectionCount = 0;
     bool connected = false;
     bool requested = false;
     HTTPServer server([&] (Connection connection) {
+        ++connectionCount;
         connected = true;
         connection.receiveHTTPRequest([&](Vector<char>&&) {
             requested = true;
@@ -68,8 +70,40 @@
     EXPECT_FALSE(requested);
     [webView loadRequest:server.request()];
     Util::run(&requested);
+
+    EXPECT_EQ(connectionCount, 1u);
 }
 
+TEST(Preconnect, ConnectionCount)
+{
+    size_t connectionCount = 0;
+    bool anyConnections = false;
+    bool requested = false;
+    HTTPServer server([&] (Connection connection) {
+        ++connectionCount;
+        anyConnections = true;
+        connection.receiveHTTPRequest([&](Vector<char>&&) {
+            requested = true;
+        });
+    });
+    auto webView = adoptNS([WKWebView new]);
+
+    // The preconnect to the server will use the default setting of "use the credential store",
+    // and therefore use the credential-store-blessed NSURLSession.
+    [webView _preconnectToServer:server.request().URL];
+    Util::run(&anyConnections);
+    Util::spinRunLoop(10);
+    EXPECT_FALSE(requested);
+
+    // Then this request will *not* use the credential store, therefore using a different NSURLSession
+    // that doesn't know about the above preconnect, triggering a second connection to the server.
+    webView.get()._canUseCredentialStorage = NO;
+    [webView loadRequest:server.request()];
+    Util::run(&requested);
+
+    EXPECT_EQ(connectionCount, 2u);
+}
+
 // Mojave CFNetwork _preconnect SPI seems to have a bug causing this to time out.
 // That's no problem, because this is a test for SPI only to be used on later OS versions.
 #if !PLATFORM(MAC) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101500
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to