WebKit Bugzilla
Attachment 341600 Details for
Bug 186107
: [Cocoa] Add an SPI to suppress connection termination errors from CFNetwork when network interfaces change
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-186107-20180530140443.patch (text/plain), 14.71 KB, created by
Andy Estes
on 2018-05-30 14:04:44 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Andy Estes
Created:
2018-05-30 14:04:44 PDT
Size:
14.71 KB
patch
obsolete
>Subversion Revision: 232293 >diff --git a/Source/WebCore/PAL/ChangeLog b/Source/WebCore/PAL/ChangeLog >index cc191dea8f4e981f9832947f357703c7f5e593bb..1c4732237913c5e848d96f24ed7c53261fbac7cc 100644 >--- a/Source/WebCore/PAL/ChangeLog >+++ b/Source/WebCore/PAL/ChangeLog >@@ -1,3 +1,13 @@ >+2018-05-30 Andy Estes <aestes@apple.com> >+ >+ [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 NOBODY (OOPS!). >+ >+ * pal/spi/cf/CFNetworkSPI.h: Declared new SPI. >+ > 2018-05-27 Dan Bernstein <mitz@apple.com> > > Reverted the changes made for https://webkit.org/b/186016 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 4f7edf0a844bd35c5f9c428be8e5819816c2e6bb..ac9fc5a97b8e057bd00da0fa7e7f463cfaf2ca1e 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,36 @@ >+2018-05-30 Andy Estes <aestes@apple.com> >+ >+ [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 NOBODY (OOPS!). >+ >+ 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-29 Tim Horton <timothy_horton@apple.com> > > Fix the build >diff --git a/Source/WebCore/PAL/pal/spi/cf/CFNetworkSPI.h b/Source/WebCore/PAL/pal/spi/cf/CFNetworkSPI.h >index e827987bb672c490a3ad7540789aa3843f8c850c..b07a0a5c5a6a2d521704d7ab1186081c936270e8 100644 >--- a/Source/WebCore/PAL/pal/spi/cf/CFNetworkSPI.h >+++ b/Source/WebCore/PAL/pal/spi/cf/CFNetworkSPI.h >@@ -140,6 +140,9 @@ typedef void (^CFCachedURLResponseCallBackBlock)(CFCachedURLResponseRef); > #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) >diff --git a/Source/WebKit/NetworkProcess/NetworkProcess.h b/Source/WebKit/NetworkProcess/NetworkProcess.h >index 7713fe412de1b1f2778aa18ff8c95d28c9733aa6..83ea2401b0ca16f78dffe56fe5db90fc6281ac6d 100644 >--- a/Source/WebKit/NetworkProcess/NetworkProcess.h >+++ b/Source/WebKit/NetworkProcess/NetworkProcess.h >@@ -115,6 +115,7 @@ public: > #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 @@ private: > // 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) >diff --git a/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp b/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp >index 129c1700eceef4b1707458810f5699c9067d2853..fc2255440582398a0b6c22ccbbcee2acc7f2d852 100644 >--- a/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp >@@ -78,11 +78,10 @@ void NetworkProcessCreationParameters::encode(IPC::Encoder& encoder) const > #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 @@ bool NetworkProcessCreationParameters::decode(IPC::Decoder& decoder, NetworkProc > 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) >diff --git a/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h b/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h >index d57425c589708ef71d8c9d4bdf1cd37ec0ed962b..06f4d40050ff1a3e28b8612bcdd0085fa874eec1 100644 >--- a/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h >+++ b/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h >@@ -90,11 +90,10 @@ struct NetworkProcessCreationParameters { > #endif > String httpProxy; > String httpsProxy; >-#if PLATFORM(COCOA) > RetainPtr<CFDataRef> networkATSContext; >-#endif > bool cookieStoragePartitioningEnabled; > bool storageAccessAPIEnabled; >+ bool suppressesConnectionTerminationOnSystemChange; > #endif > > #if USE(SOUP) >diff --git a/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm b/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm >index cb6ce107b935046f735d8c4a988bad9b30744c49..7e48cf8f37f37bc5d225f41f8e3e95206a01d7f2 100644 >--- a/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm >+++ b/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm >@@ -101,6 +101,7 @@ void NetworkProcess::platformInitializeNetworkProcessCocoa(const NetworkProcessC > > 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 @@ void NetworkProcess::platformInitializeNetworkProcessCocoa(const NetworkProcessC > // Disable NSURLCache. > auto urlCache(adoptNS([[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil])); > [NSURLCache setSharedURLCache:urlCache.get()]; >- return; > } > > RetainPtr<CFDataRef> NetworkProcess::sourceApplicationAuditData() const >diff --git a/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm b/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm >index 3de95bcce15f88fd3325a959f62f38aa670288b8..2810931e265570750595b9af1d6a7c69e6ea8c18 100644 >--- a/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm >+++ b/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm >@@ -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 @@ NetworkSessionCocoa::NetworkSessionCocoa(NetworkSessionCreationParameters&& para > 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()) >diff --git a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp >index 5bb28ad6c38f0d7f70b26f8f601dce28d31144ab..a3d8b639a638bae1f7c3dbf90570c9a35f8b80f7 100644 >--- a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp >+++ b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp >@@ -134,6 +134,9 @@ Ref<ProcessPoolConfiguration> ProcessPoolConfiguration::copy() > #if ENABLE(WIFI_ASSERTIONS) > copy->m_wirelessContextIdentifier = this->m_wirelessContextIdentifier; > #endif >+#if PLATFORM(COCOA) >+ copy->m_suppressesConnectionTerminationOnSystemChange = this->m_suppressesConnectionTerminationOnSystemChange; >+#endif > > return copy; > } >diff --git a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h >index 37320ca5e450750c371651d30da7da62fd944c9f..72f369c2548f696bdab40cac0f3f102938aec6b7 100644 >--- a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h >+++ b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h >@@ -152,6 +152,11 @@ public: > 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 @@ private: > #if ENABLE(WIFI_ASSERTIONS) > unsigned m_wirelessContextIdentifier { 0 }; > #endif >+ >+#if PLATFORM(COCOA) >+ bool m_suppressesConnectionTerminationOnSystemChange { false }; >+#endif > }; > > } // namespace API >diff --git a/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h b/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h >index 20877a96677572a2c44e2452e5984ed60498bea7..9fbbc4f7870740db50ca515d6fe7bcccebf9da44 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h >+++ b/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h >@@ -66,6 +66,7 @@ WK_CLASS_AVAILABLE(macosx(10.10), ios(8.0)) > @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 > >diff --git a/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm b/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm >index a8abb69b95311b3a947f86c21175ae0d09451086..61438884e87dacb155db2fe1fbfd9837dff8cd8f 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm >+++ b/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm >@@ -292,6 +292,16 @@ - (void)setPageCacheEnabled:(BOOL)enabled > _processPoolConfiguration->setCacheModel(WebKit::CacheModelPrimaryWebBrowser); > } > >+- (BOOL)suppressesConnectionTerminationOnSystemChange >+{ >+ return _processPoolConfiguration->suppressesConnectionTerminationOnSystemChange(); >+} >+ >+- (void)setSuppressesConnectionTerminationOnSystemChange:(BOOL)suppressesConnectionTerminationOnSystemChange >+{ >+ _processPoolConfiguration->setSuppressesConnectionTerminationOnSystemChange(suppressesConnectionTerminationOnSystemChange); >+} >+ > #if PLATFORM(IOS) > - (NSString *)CTDataConnectionServiceType > { >diff --git a/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm b/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm >index e63d1d7dcaa852b14d7b563e3ae85431417eb959..3d18f62d96ce4a6c964ad0ca861befa46d1b4a26 100644 >--- a/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm >+++ b/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm >@@ -318,6 +318,7 @@ void WebProcessPool::platformInitializeNetworkProcess(NetworkProcessCreationPara > > parameters.cookieStoragePartitioningEnabled = cookieStoragePartitioningEnabled(); > parameters.storageAccessAPIEnabled = storageAccessAPIEnabled(); >+ parameters.suppressesConnectionTerminationOnSystemChange = m_configuration->suppressesConnectionTerminationOnSystemChange(); > > #if HAVE(CFNETWORK_STORAGE_PARTITIONING) && !RELEASE_LOG_DISABLED > parameters.logCookieInformation = [defaults boolForKey:WebKitLogCookieInformationDefaultsKey];
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 186107
: 341600