Title: [232312] trunk/Source
Revision
232312
Author
[email protected]
Date
2018-05-30 15:11:54 -0700 (Wed, 30 May 2018)

Log Message

[Cocoa] Add an SPI to suppress connection termination errors from CFNetwork when network interfaces change
https://bugs.webkit.org/show_bug.cgi?id=186107
<rdar://problem/39338957>

Reviewed by Brady Eidson.

Source/WebCore/PAL:

* pal/spi/cf/CFNetworkSPI.h: Declared new SPI.

Source/WebKit:

Added an SPI which configures a process pool's networking process to set the
kCFStreamPropertyAutoErrorOnSystemChange to NO on its NSURLSessionConfigurations.
This instructs CFNetwork to not terminate active connections when the system's
network interfaces change.

* NetworkProcess/NetworkProcess.h:
(WebKit::NetworkProcess::suppressesConnectionTerminationOnSystemChange const):
* NetworkProcess/NetworkProcessCreationParameters.cpp:
(WebKit::NetworkProcessCreationParameters::encode const):
(WebKit::NetworkProcessCreationParameters::decode):
* NetworkProcess/NetworkProcessCreationParameters.h:
* NetworkProcess/cocoa/NetworkProcessCocoa.mm:
(WebKit::NetworkProcess::platformInitializeNetworkProcessCocoa):
* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(WebKit::NetworkSessionCocoa::NetworkSessionCocoa):
* UIProcess/API/APIProcessPoolConfiguration.cpp:
(API::ProcessPoolConfiguration::copy):
* UIProcess/API/APIProcessPoolConfiguration.h:
* UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h:
* UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm:
(-[_WKProcessPoolConfiguration suppressesConnectionTerminationOnSystemChange]):
(-[_WKProcessPoolConfiguration setSuppressesConnectionTerminationOnSystemChange:]):
* UIProcess/Cocoa/WebProcessPoolCocoa.mm:
(WebKit::WebProcessPool::platformInitializeNetworkProcess):

Modified Paths

Diff

Modified: trunk/Source/WebCore/PAL/ChangeLog (232311 => 232312)


--- trunk/Source/WebCore/PAL/ChangeLog	2018-05-30 21:38:06 UTC (rev 232311)
+++ trunk/Source/WebCore/PAL/ChangeLog	2018-05-30 22:11:54 UTC (rev 232312)
@@ -1,3 +1,13 @@
+2018-05-30  Andy Estes  <[email protected]>
+
+        [Cocoa] Add an SPI to suppress connection termination errors from CFNetwork when network interfaces change
+        https://bugs.webkit.org/show_bug.cgi?id=186107
+        <rdar://problem/39338957>
+
+        Reviewed by Brady Eidson.
+
+        * pal/spi/cf/CFNetworkSPI.h: Declared new SPI.
+
 2018-05-27  Dan Bernstein  <[email protected]>
 
         Reverted the changes made for https://webkit.org/b/186016

Modified: trunk/Source/WebCore/PAL/pal/spi/cf/CFNetworkSPI.h (232311 => 232312)


--- trunk/Source/WebCore/PAL/pal/spi/cf/CFNetworkSPI.h	2018-05-30 21:38:06 UTC (rev 232311)
+++ trunk/Source/WebCore/PAL/pal/spi/cf/CFNetworkSPI.h	2018-05-30 22:11:54 UTC (rev 232312)
@@ -140,6 +140,9 @@
 #if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101300) || (PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000)
 @property (nullable, copy) NSSet *_suppressedAutoAddedHTTPHeaders;
 #endif
+#if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101400) || (PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 120000)
+@property (copy) NSDictionary *_socketStreamProperties;
+#endif
 @end
 
 #if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101300) || (PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000)

Modified: trunk/Source/WebKit/ChangeLog (232311 => 232312)


--- trunk/Source/WebKit/ChangeLog	2018-05-30 21:38:06 UTC (rev 232311)
+++ trunk/Source/WebKit/ChangeLog	2018-05-30 22:11:54 UTC (rev 232312)
@@ -1,3 +1,36 @@
+2018-05-30  Andy Estes  <[email protected]>
+
+        [Cocoa] Add an SPI to suppress connection termination errors from CFNetwork when network interfaces change
+        https://bugs.webkit.org/show_bug.cgi?id=186107
+        <rdar://problem/39338957>
+
+        Reviewed by Brady Eidson.
+
+        Added an SPI which configures a process pool's networking process to set the
+        kCFStreamPropertyAutoErrorOnSystemChange to NO on its NSURLSessionConfigurations.
+        This instructs CFNetwork to not terminate active connections when the system's
+        network interfaces change.
+
+        * NetworkProcess/NetworkProcess.h:
+        (WebKit::NetworkProcess::suppressesConnectionTerminationOnSystemChange const):
+        * NetworkProcess/NetworkProcessCreationParameters.cpp:
+        (WebKit::NetworkProcessCreationParameters::encode const):
+        (WebKit::NetworkProcessCreationParameters::decode):
+        * NetworkProcess/NetworkProcessCreationParameters.h:
+        * NetworkProcess/cocoa/NetworkProcessCocoa.mm:
+        (WebKit::NetworkProcess::platformInitializeNetworkProcessCocoa):
+        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+        (WebKit::NetworkSessionCocoa::NetworkSessionCocoa):
+        * UIProcess/API/APIProcessPoolConfiguration.cpp:
+        (API::ProcessPoolConfiguration::copy):
+        * UIProcess/API/APIProcessPoolConfiguration.h:
+        * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h:
+        * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm:
+        (-[_WKProcessPoolConfiguration suppressesConnectionTerminationOnSystemChange]):
+        (-[_WKProcessPoolConfiguration setSuppressesConnectionTerminationOnSystemChange:]):
+        * UIProcess/Cocoa/WebProcessPoolCocoa.mm:
+        (WebKit::WebProcessPool::platformInitializeNetworkProcess):
+
 2018-05-30  Youenn Fablet  <[email protected]>
 
         Rename FromOrigin runtime flag to CrossOriginResourcePolicy and enable it by default

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (232311 => 232312)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2018-05-30 21:38:06 UTC (rev 232311)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2018-05-30 22:11:54 UTC (rev 232312)
@@ -115,6 +115,7 @@
 #if PLATFORM(COCOA)
     RetainPtr<CFDataRef> sourceApplicationAuditData() const;
     void clearHSTSCache(WebCore::NetworkStorageSession&, WallTime modifiedSince);
+    bool suppressesConnectionTerminationOnSystemChange() const { return m_suppressesConnectionTerminationOnSystemChange; }
 #endif
 
     void findPendingDownloadLocation(NetworkDataTask&, ResponseCompletionHandler&&, const WebCore::ResourceResponse&);
@@ -289,6 +290,8 @@
     // multiple requests to clear the cache can come in before previous requests complete, and we need to wait for all of them.
     // In the future using WorkQueue and a counting semaphore would work, as would WorkQueue supporting the libdispatch concept of "work groups".
     dispatch_group_t m_clearCacheDispatchGroup;
+
+    bool m_suppressesConnectionTerminationOnSystemChange { false };
 #endif
 
 #if ENABLE(CONTENT_EXTENSIONS)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp (232311 => 232312)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp	2018-05-30 21:38:06 UTC (rev 232311)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp	2018-05-30 22:11:54 UTC (rev 232312)
@@ -78,11 +78,10 @@
 #endif
     encoder << httpProxy;
     encoder << httpsProxy;
-#if PLATFORM(COCOA)
     IPC::encode(encoder, networkATSContext.get());
-#endif
     encoder << cookieStoragePartitioningEnabled;
     encoder << storageAccessAPIEnabled;
+    encoder << suppressesConnectionTerminationOnSystemChange;
 #endif
 #if USE(SOUP)
     encoder << cookiePersistentStoragePath;
@@ -209,14 +208,14 @@
         return false;
     if (!decoder.decode(result.httpsProxy))
         return false;
-#if PLATFORM(COCOA)
     if (!IPC::decode(decoder, result.networkATSContext))
         return false;
-#endif
     if (!decoder.decode(result.cookieStoragePartitioningEnabled))
         return false;
     if (!decoder.decode(result.storageAccessAPIEnabled))
         return false;
+    if (!decoder.decode(result.suppressesConnectionTerminationOnSystemChange))
+        return false;
 #endif
 
 #if USE(SOUP)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h (232311 => 232312)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h	2018-05-30 21:38:06 UTC (rev 232311)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h	2018-05-30 22:11:54 UTC (rev 232312)
@@ -90,11 +90,10 @@
 #endif
     String httpProxy;
     String httpsProxy;
-#if PLATFORM(COCOA)
     RetainPtr<CFDataRef> networkATSContext;
-#endif
     bool cookieStoragePartitioningEnabled;
     bool storageAccessAPIEnabled;
+    bool suppressesConnectionTerminationOnSystemChange;
 #endif
 
 #if USE(SOUP)

Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm (232311 => 232312)


--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm	2018-05-30 21:38:06 UTC (rev 232311)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm	2018-05-30 22:11:54 UTC (rev 232312)
@@ -101,6 +101,7 @@
 
     WebCore::NetworkStorageSession::setCookieStoragePartitioningEnabled(parameters.cookieStoragePartitioningEnabled);
     WebCore::NetworkStorageSession::setStorageAccessAPIEnabled(parameters.storageAccessAPIEnabled);
+    m_suppressesConnectionTerminationOnSystemChange = parameters.suppressesConnectionTerminationOnSystemChange;
 
     // FIXME: Most of what this function does for cache size gets immediately overridden by setCacheModel().
     // - memory cache size passed from UI process is always ignored;
@@ -140,7 +141,6 @@
     // Disable NSURLCache.
     auto urlCache(adoptNS([[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]));
     [NSURLCache setSharedURLCache:urlCache.get()];
-    return;
 }
 
 RetainPtr<CFDataRef> NetworkProcess::sourceApplicationAuditData() const

Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm (232311 => 232312)


--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm	2018-05-30 21:38:06 UTC (rev 232311)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm	2018-05-30 22:11:54 UTC (rev 232312)
@@ -54,9 +54,10 @@
 
 using namespace WebKit;
 
-#if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101300) || (PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000)
+#if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101400) || (PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 120000)
+// FIXME: Remove this once rdar://problem/40650244 is in a build.
 @interface NSURLSessionConfiguration (WKStaging)
-@property (nullable, copy) NSSet *_suppressedAutoAddedHTTPHeaders;
+@property (copy) NSDictionary *_socketStreamProperties;
 @end
 #endif
 
@@ -701,6 +702,12 @@
     setCollectsTimingData();
 #endif
 
+#if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101400) || (PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 120000)
+    // FIXME: Replace @"kCFStreamPropertyAutoErrorOnSystemChange" with a constant from the SDK once rdar://problem/40650244 is in a build.
+    if (NetworkProcess::singleton().suppressesConnectionTerminationOnSystemChange())
+        configuration._socketStreamProperties = @{ @"kCFStreamPropertyAutoErrorOnSystemChange" : @(NO) };
+#endif
+
     auto* storageSession = WebCore::NetworkStorageSession::storageSession(parameters.sessionID);
     RELEASE_ASSERT(storageSession);
     if (CFHTTPCookieStorageRef storage = storageSession->cookieStorage().get())

Modified: trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp (232311 => 232312)


--- trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp	2018-05-30 21:38:06 UTC (rev 232311)
+++ trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp	2018-05-30 22:11:54 UTC (rev 232312)
@@ -134,6 +134,9 @@
 #if ENABLE(WIFI_ASSERTIONS)
     copy->m_wirelessContextIdentifier = this->m_wirelessContextIdentifier;
 #endif
+#if PLATFORM(COCOA)
+    copy->m_suppressesConnectionTerminationOnSystemChange = this->m_suppressesConnectionTerminationOnSystemChange;
+#endif
 
     return copy;
 }

Modified: trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h (232311 => 232312)


--- trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h	2018-05-30 21:38:06 UTC (rev 232311)
+++ trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h	2018-05-30 22:11:54 UTC (rev 232312)
@@ -152,6 +152,11 @@
     void setWirelessContextIdentifier(unsigned wirelessContextIdentifier) { m_wirelessContextIdentifier = wirelessContextIdentifier; }
 #endif
 
+#if PLATFORM(COCOA)
+    bool suppressesConnectionTerminationOnSystemChange() const { return m_suppressesConnectionTerminationOnSystemChange; }
+    void setSuppressesConnectionTerminationOnSystemChange(bool suppressesConnectionTerminationOnSystemChange) { m_suppressesConnectionTerminationOnSystemChange = suppressesConnectionTerminationOnSystemChange; }
+#endif
+
 private:
     bool m_shouldHaveLegacyDataStore { false };
 
@@ -195,6 +200,10 @@
 #if ENABLE(WIFI_ASSERTIONS)
     unsigned m_wirelessContextIdentifier { 0 };
 #endif
+
+#if PLATFORM(COCOA)
+    bool m_suppressesConnectionTerminationOnSystemChange { false };
+#endif
 };
 
 } // namespace API

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h (232311 => 232312)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h	2018-05-30 21:38:06 UTC (rev 232311)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h	2018-05-30 22:11:54 UTC (rev 232312)
@@ -66,6 +66,7 @@
 @property (nonatomic) BOOL processSwapsOnWindowOpenWithOpener WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 @property (nonatomic) BOOL tracksResourceLoadMilestones WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 @property (nonatomic) BOOL pageCacheEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
+@property (nonatomic) BOOL suppressesConnectionTerminationOnSystemChange WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 
 @end
 

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm (232311 => 232312)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm	2018-05-30 21:38:06 UTC (rev 232311)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm	2018-05-30 22:11:54 UTC (rev 232312)
@@ -292,6 +292,16 @@
         _processPoolConfiguration->setCacheModel(WebKit::CacheModelPrimaryWebBrowser);
 }
 
+- (BOOL)suppressesConnectionTerminationOnSystemChange
+{
+    return _processPoolConfiguration->suppressesConnectionTerminationOnSystemChange();
+}
+
+- (void)setSuppressesConnectionTerminationOnSystemChange:(BOOL)suppressesConnectionTerminationOnSystemChange
+{
+    _processPoolConfiguration->setSuppressesConnectionTerminationOnSystemChange(suppressesConnectionTerminationOnSystemChange);
+}
+
 #if PLATFORM(IOS)
 - (NSString *)CTDataConnectionServiceType
 {

Modified: trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm (232311 => 232312)


--- trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2018-05-30 21:38:06 UTC (rev 232311)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2018-05-30 22:11:54 UTC (rev 232312)
@@ -318,6 +318,7 @@
 
     parameters.cookieStoragePartitioningEnabled = cookieStoragePartitioningEnabled();
     parameters.storageAccessAPIEnabled = storageAccessAPIEnabled();
+    parameters.suppressesConnectionTerminationOnSystemChange = m_configuration->suppressesConnectionTerminationOnSystemChange();
 
 #if HAVE(CFNETWORK_STORAGE_PARTITIONING) && !RELEASE_LOG_DISABLED
     parameters.logCookieInformation = [defaults boolForKey:WebKitLogCookieInformationDefaultsKey];
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to