Changeset 207812 in webkit
- Timestamp:
- Oct 25, 2016, 1:22:19 AM (8 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r207807 r207812 1 2016-10-25 Antti Koivisto <antti@apple.com> 2 3 Add support for introducing simulated latency in network process 4 https://bugs.webkit.org/show_bug.cgi?id=163902 5 6 Reviewed by Alex Christensen. 7 8 For testing purposes it is useful to have a mechanism for simulating high latency. 9 This patch adds a basic mechanism that introduces a delay to each response in network 10 process. In Safari it can be used with 11 12 defaults write com.apple.Safari WebKitNetworkLoadThrottleLatencyMilliseconds 200 13 14 Setting the delay to 0 disables the feature. 15 16 * NetworkProcess/NetworkLoad.cpp: 17 (WebKit::NetworkLoad::Throttle::Throttle): 18 (WebKit::NetworkLoad::didReceiveResponseNetworkSession): 19 (WebKit::NetworkLoad::notifyDidReceiveResponse): 20 (WebKit::NetworkLoad::didReceiveData): 21 (WebKit::NetworkLoad::didCompleteWithError): 22 (WebKit::NetworkLoad::throttleDelayCompleted): 23 * NetworkProcess/NetworkLoad.h: 24 * NetworkProcess/NetworkProcess.cpp: 25 (WebKit::NetworkProcess::initializeNetworkProcess): 26 * NetworkProcess/NetworkProcess.h: 27 (WebKit::NetworkProcess::loadThrottleLatency): 28 * NetworkProcess/NetworkProcessCreationParameters.cpp: 29 (WebKit::NetworkProcessCreationParameters::encode): 30 (WebKit::NetworkProcessCreationParameters::decode): 31 * NetworkProcess/NetworkProcessCreationParameters.h: 32 * UIProcess/Cocoa/WebProcessPoolCocoa.mm: 33 (WebKit::WebProcessPool::platformInitializeNetworkProcess): 34 1 35 2016-10-24 Dan Bernstein <mitz@apple.com> 2 36 -
trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp
r207586 r207812 46 46 #if USE(NETWORK_SESSION) 47 47 48 struct NetworkLoad::Throttle { 49 Throttle(NetworkLoad& load, std::chrono::milliseconds delay, ResourceResponse&& response, ResponseCompletionHandler&& handler) 50 : timer(load, &NetworkLoad::throttleDelayCompleted) 51 , response(WTFMove(response)) 52 , responseCompletionHandler(WTFMove(handler)) 53 { 54 timer.startOneShot(delay); 55 } 56 Timer timer; 57 ResourceResponse response; 58 ResponseCompletionHandler responseCompletionHandler; 59 }; 60 48 61 NetworkLoad::NetworkLoad(NetworkLoadClient& client, NetworkLoadParameters&& parameters, NetworkSession& networkSession) 49 62 : m_client(client) … … 272 285 { 273 286 ASSERT(isMainThread()); 274 if (m_task && m_task->isDownload()) 287 ASSERT(!m_throttle); 288 289 if (m_task && m_task->isDownload()) { 275 290 NetworkProcess::singleton().findPendingDownloadLocation(*m_task.get(), WTFMove(completionHandler), response); 276 else if (sharedDidReceiveResponse(WTFMove(response)) == NetworkLoadClient::ShouldContinueDidReceiveResponse::Yes) 277 completionHandler(PolicyUse); 278 else 291 return; 292 } 293 294 auto delay = NetworkProcess::singleton().loadThrottleLatency(); 295 if (delay > 0ms) { 296 m_throttle = std::make_unique<Throttle>(*this, delay, WTFMove(response), WTFMove(completionHandler)); 297 return; 298 } 299 300 notifyDidReceiveResponse(WTFMove(response), WTFMove(completionHandler)); 301 } 302 303 void NetworkLoad::notifyDidReceiveResponse(ResourceResponse&& response, ResponseCompletionHandler&& completionHandler) 304 { 305 ASSERT(isMainThread()); 306 307 if (sharedDidReceiveResponse(WTFMove(response)) == NetworkLoadClient::ShouldContinueDidReceiveResponse::No) { 279 308 m_responseCompletionHandler = WTFMove(completionHandler); 309 return; 310 } 311 completionHandler(PolicyUse); 280 312 } 281 313 282 314 void NetworkLoad::didReceiveData(Ref<SharedBuffer>&& buffer) 283 315 { 316 ASSERT(!m_throttle); 317 284 318 // FIXME: This should be the encoded data length, not the decoded data length. 285 319 auto size = buffer->size(); … … 289 323 void NetworkLoad::didCompleteWithError(const ResourceError& error) 290 324 { 325 ASSERT(!m_throttle); 326 291 327 if (error.isNull()) 292 328 m_client.didFinishLoading(WTF::monotonicallyIncreasingTime()); 293 329 else 294 330 m_client.didFailLoading(error); 331 } 332 333 void NetworkLoad::throttleDelayCompleted() 334 { 335 ASSERT(m_throttle); 336 337 auto throttle = WTFMove(m_throttle); 338 339 notifyDidReceiveResponse(WTFMove(throttle->response), WTFMove(throttle->responseCompletionHandler)); 295 340 } 296 341 -
trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h
r207585 r207812 125 125 void cannotShowURL() final; 126 126 127 void notifyDidReceiveResponse(WebCore::ResourceResponse&&, ResponseCompletionHandler&&); 128 void throttleDelayCompleted(); 129 127 130 void completeAuthenticationChallenge(ChallengeCompletionHandler&&); 128 131 #endif … … 138 141 ResponseCompletionHandler m_responseCompletionHandler; 139 142 RedirectCompletionHandler m_redirectCompletionHandler; 143 144 struct Throttle; 145 std::unique_ptr<Throttle> m_throttle; 140 146 #else 141 147 bool m_waitingForContinueCanAuthenticateAgainstProtectionSpace { false }; -
trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp
r207648 r207812 206 206 207 207 m_suppressMemoryPressureHandler = parameters.shouldSuppressMemoryPressureHandler; 208 m_loadThrottleLatency = parameters.loadThrottleLatency; 208 209 if (!m_suppressMemoryPressureHandler) { 209 210 auto& memoryPressureHandler = MemoryPressureHandler::singleton(); -
trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h
r207648 r207812 121 121 void grantSandboxExtensionsToDatabaseProcessForBlobs(const Vector<String>& filenames, Function<void ()>&& completionHandler); 122 122 123 std::chrono::milliseconds loadThrottleLatency() const { return m_loadThrottleLatency; } 124 123 125 private: 124 126 NetworkProcess(); … … 211 213 bool m_diskCacheIsDisabledForTesting; 212 214 bool m_canHandleHTTPSServerTrustEvaluation; 215 std::chrono::milliseconds m_loadThrottleLatency; 213 216 214 217 typedef HashMap<const char*, std::unique_ptr<NetworkProcessSupplement>, PtrHash<const char*>> NetworkProcessSupplementMap; -
trunk/Source/WebKit2/NetworkProcess/NetworkProcessCreationParameters.cpp
r206604 r207812 65 65 encoder << shouldUseTestingNetworkSession; 66 66 encoder << urlParserEnabled; 67 encoder << loadThrottleLatency; 67 68 encoder << urlSchemesRegisteredForCustomProtocols; 68 69 #if PLATFORM(COCOA) … … 137 138 if (!decoder.decode(result.urlParserEnabled)) 138 139 return false; 140 if (!decoder.decode(result.loadThrottleLatency)) 141 return false; 139 142 if (!decoder.decode(result.urlSchemesRegisteredForCustomProtocols)) 140 143 return false; -
trunk/Source/WebKit2/NetworkProcess/NetworkProcessCreationParameters.h
r206604 r207812 74 74 bool shouldUseTestingNetworkSession; 75 75 bool urlParserEnabled { false }; 76 std::chrono::milliseconds loadThrottleLatency; 76 77 77 78 Vector<String> urlSchemesRegisteredForCustomProtocols; -
trunk/Source/WebKit2/UIProcess/Cocoa/WebProcessPoolCocoa.mm
r206705 r207812 84 84 85 85 static NSString * const WebKitSuppressMemoryPressureHandlerDefaultsKey = @"WebKitSuppressMemoryPressureHandler"; 86 static NSString * const WebKitNetworkLoadThrottleLatencyMillisecondsDefaultsKey = @"WebKitNetworkLoadThrottleLatencyMilliseconds"; 86 87 87 88 static NSString * const WebKitVariationFontsEnabledDefaultsKey = @"ExperimentalVariationFontsEnabled"; … … 253 254 254 255 parameters.shouldSuppressMemoryPressureHandler = [defaults boolForKey:WebKitSuppressMemoryPressureHandlerDefaultsKey]; 256 parameters.loadThrottleLatency = std::chrono::milliseconds([defaults integerForKey:WebKitNetworkLoadThrottleLatencyMillisecondsDefaultsKey]); 255 257 256 258 #if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
Note:
See TracChangeset
for help on using the changeset viewer.