Changeset 275047 in webkit
- Timestamp:
- Mar 25, 2021, 10:36:00 AM (5 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 8 edited
-
ChangeLog (modified) (1 diff)
-
NetworkProcess/NetworkProcess.cpp (modified) (2 diffs)
-
NetworkProcess/NetworkProcessCreationParameters.cpp (modified) (4 diffs)
-
NetworkProcess/NetworkProcessCreationParameters.h (modified) (2 diffs)
-
UIProcess/Network/NetworkProcessProxy.cpp (modified) (2 diffs)
-
UIProcess/Network/NetworkProcessProxy.h (modified) (1 diff)
-
UIProcess/WebsiteData/WebsiteDataStore.cpp (modified) (2 diffs)
-
UIProcess/WebsiteData/WebsiteDataStore.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r275046 r275047 1 2021-03-25 Alex Christensen <achristensen@webkit.org> 2 3 REGRESSION (r272376): [iOS] ASSERTION FAILED: sessionID.isEphemeral() || !path.isEmpty() in WebKit::NetworkProcess::swServerForSession 4 https://bugs.webkit.org/show_bug.cgi?id=222713 5 6 Reviewed by Geoff Garen. 7 8 Because NetworkProcess::CreateNetworkConnectionToWebProcess is sent with SendOption::DispatchMessageEvenWhenWaitingForSyncReply, it is possible 9 for two messages of type NetworkProcess::AddWebsiteDataStore and two messages of type NetworkProcess::CreateNetworkConnectionToWebProcess to be in the queue, 10 but the second NetworkProcess::CreateNetworkConnectionToWebProcess jumps to the front of the line while the UI process is waiting for the reply to the first. 11 Then, when calling NetworkProcess::swServerForSession we expect the session's parameters to have been initialized in the network process already, but we cut 12 ahead of the parameter initialization message. This is a realistically rare condition that can only be hit when using SPI, but it is hit in the 13 ResourceLoadStatistics.StoreSuspension API test. To fix this, we send the WebsiteDataStoreParameters from each WebsiteDataStore in the NetworkProcessCreationParameters. 14 To avoid doing extra work, we introduce an early return in NetworkProcessProxy::addSession if we have already added parameters from this session to the network process. 15 16 * NetworkProcess/NetworkProcess.cpp: 17 (WebKit::NetworkProcess::initializeNetworkProcess): 18 (WebKit::NetworkProcess::addSessionStorageQuotaManager): 19 * NetworkProcess/NetworkProcessCreationParameters.cpp: 20 (WebKit::NetworkProcessCreationParameters::encode const): 21 (WebKit::NetworkProcessCreationParameters::decode): 22 * NetworkProcess/NetworkProcessCreationParameters.h: 23 * UIProcess/Network/NetworkProcessProxy.cpp: 24 (WebKit::NetworkProcessProxy::sendCreationParametersToNewProcess): 25 (WebKit::NetworkProcessProxy::addSession): 26 * UIProcess/Network/NetworkProcessProxy.h: 27 * UIProcess/WebsiteData/WebsiteDataStore.cpp: 28 (WebKit::WebsiteDataStore::parametersFromEachWebsiteDataStore): 29 * UIProcess/WebsiteData/WebsiteDataStore.h: 30 1 31 2021-03-25 John Wilander <wilander@apple.com> 2 32 -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r275046 r275047 354 354 registerURLSchemeAsNoAccess(scheme); 355 355 356 for (auto&& websiteDataStoreParameters : WTFMove(parameters.websiteDataStoreParameters)) 357 addWebsiteDataStore(WTFMove(websiteDataStoreParameters)); 358 356 359 RELEASE_LOG(Process, "%p - NetworkProcess::initializeNetworkProcess: Presenting processPID=%d", this, WebCore::presentingApplicationPID()); 357 360 } … … 431 434 if (isNewEntry) 432 435 SandboxExtension::consumePermanently(cacheRootPathHandle); 436 else 437 ASSERT_NOT_REACHED(); 433 438 } 434 439 -
trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp
r275013 r275047 29 29 #include "ArgumentCoders.h" 30 30 #include "WebCoreArgumentCoders.h" 31 #include "WebsiteDataStoreParameters.h" 31 32 32 33 #if PLATFORM(COCOA) … … 37 38 38 39 NetworkProcessCreationParameters::NetworkProcessCreationParameters() = default; 40 NetworkProcessCreationParameters::~NetworkProcessCreationParameters() = default; 41 NetworkProcessCreationParameters::NetworkProcessCreationParameters(NetworkProcessCreationParameters&&) = default; 42 NetworkProcessCreationParameters& NetworkProcessCreationParameters::operator=(NetworkProcessCreationParameters&&) = default; 39 43 40 44 void NetworkProcessCreationParameters::encode(IPC::Encoder& encoder) const … … 68 72 encoder << enablePrivateClickMeasurement; 69 73 encoder << enablePrivateClickMeasurementDebugMode; 74 encoder << websiteDataStoreParameters; 70 75 } 71 76 … … 136 141 return false; 137 142 143 Optional<Vector<WebsiteDataStoreParameters>> websiteDataStoreParameters; 144 decoder >> websiteDataStoreParameters; 145 if (!websiteDataStoreParameters) 146 return false; 147 result.websiteDataStoreParameters = WTFMove(*websiteDataStoreParameters); 148 138 149 return true; 139 150 } -
trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h
r275013 r275047 44 44 namespace WebKit { 45 45 46 struct WebsiteDataStoreParameters; 47 46 48 struct NetworkProcessCreationParameters { 47 49 NetworkProcessCreationParameters(); 50 NetworkProcessCreationParameters(NetworkProcessCreationParameters&&); 51 ~NetworkProcessCreationParameters(); 52 NetworkProcessCreationParameters& operator=(NetworkProcessCreationParameters&&); 48 53 49 54 void encode(IPC::Encoder&) const; … … 82 87 bool enablePrivateClickMeasurement { true }; 83 88 bool enablePrivateClickMeasurementDebugMode { false }; 89 90 Vector<WebsiteDataStoreParameters> websiteDataStoreParameters; 84 91 }; 85 92 -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp
r274323 r275047 159 159 SandboxExtension::createHandleForTemporaryFile(emptyString(), SandboxExtension::Type::ReadWrite, parameters.tempDirectoryExtensionHandle); 160 160 #endif 161 162 #if !PLATFORM(GTK) && !PLATFORM(WPE) // GTK and WPE don't use defaultNetworkProcess 163 parameters.websiteDataStoreParameters = WebsiteDataStore::parametersFromEachWebsiteDataStore(); 164 WebsiteDataStore::forEachWebsiteDataStore([this](auto& websiteDataStore) { 165 addSession(websiteDataStore, SendParametersToNetworkProcess::No); 166 }); 167 #endif 168 161 169 WebProcessPool::platformInitializeNetworkProcess(parameters); 162 170 send(Messages::NetworkProcess::InitializeNetworkProcess(parameters), 0); … … 1328 1336 } 1329 1337 1330 void NetworkProcessProxy::addSession(WebsiteDataStore& store) 1331 { 1332 m_websiteDataStores.add(store); 1333 1334 if (canSendMessage()) 1338 void NetworkProcessProxy::addSession(WebsiteDataStore& store, SendParametersToNetworkProcess sendParametersToNetworkProcess) 1339 { 1340 auto addResult = m_websiteDataStores.add(store); 1341 if (!addResult.isNewEntry) 1342 return; 1343 1344 if (canSendMessage() && sendParametersToNetworkProcess == SendParametersToNetworkProcess::Yes) 1335 1345 send(Messages::NetworkProcess::AddWebsiteDataStore { store.parameters() }, 0); 1336 1346 auto sessionID = store.sessionID(); -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h
r274323 r275047 222 222 #endif 223 223 224 void addSession(WebsiteDataStore&); 224 enum class SendParametersToNetworkProcess : bool { No, Yes }; 225 void addSession(WebsiteDataStore&, SendParametersToNetworkProcess); 225 226 void removeSession(WebsiteDataStore&); 226 227 -
trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp
r274683 r275047 209 209 if (!m_networkProcess) { 210 210 m_networkProcess = networkProcessForSession(m_sessionID); 211 m_networkProcess->addSession(*this );211 m_networkProcess->addSession(*this, NetworkProcessProxy::SendParametersToNetworkProcess::Yes); 212 212 } 213 213 … … 1907 1907 } 1908 1908 1909 Vector<WebsiteDataStoreParameters> WebsiteDataStore::parametersFromEachWebsiteDataStore() 1910 { 1911 Vector<WebsiteDataStoreParameters> parameters; 1912 parameters.reserveInitialCapacity(allDataStores().size()); 1913 for (auto* dataStore : allDataStores().values()) 1914 parameters.uncheckedAppend(dataStore->parameters()); 1915 return parameters; 1916 } 1917 1909 1918 WebsiteDataStoreParameters WebsiteDataStore::parameters() 1910 1919 { -
trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h
r274323 r275047 259 259 260 260 WebsiteDataStoreParameters parameters(); 261 static Vector<WebsiteDataStoreParameters> parametersFromEachWebsiteDataStore(); 261 262 262 263 void flushCookies(CompletionHandler<void()>&&);
Note:
See TracChangeset
for help on using the changeset viewer.