Changeset 207812 in webkit


Ignore:
Timestamp:
Oct 25, 2016 1:22:19 AM (7 years ago)
Author:
Antti Koivisto
Message:

Add support for introducing simulated latency in network process
https://bugs.webkit.org/show_bug.cgi?id=163902

Reviewed by Alex Christensen.

For testing purposes it is useful to have a mechanism for simulating high latency.
This patch adds a basic mechanism that introduces a delay to each response in network
process. In Safari it can be used with

defaults write com.apple.Safari WebKitNetworkLoadThrottleLatencyMilliseconds 200

Setting the delay to 0 disables the feature.

  • NetworkProcess/NetworkLoad.cpp:

(WebKit::NetworkLoad::Throttle::Throttle):
(WebKit::NetworkLoad::didReceiveResponseNetworkSession):
(WebKit::NetworkLoad::notifyDidReceiveResponse):
(WebKit::NetworkLoad::didReceiveData):
(WebKit::NetworkLoad::didCompleteWithError):
(WebKit::NetworkLoad::throttleDelayCompleted):

  • NetworkProcess/NetworkLoad.h:
  • NetworkProcess/NetworkProcess.cpp:

(WebKit::NetworkProcess::initializeNetworkProcess):

  • NetworkProcess/NetworkProcess.h:

(WebKit::NetworkProcess::loadThrottleLatency):

  • NetworkProcess/NetworkProcessCreationParameters.cpp:

(WebKit::NetworkProcessCreationParameters::encode):
(WebKit::NetworkProcessCreationParameters::decode):

  • NetworkProcess/NetworkProcessCreationParameters.h:
  • UIProcess/Cocoa/WebProcessPoolCocoa.mm:

(WebKit::WebProcessPool::platformInitializeNetworkProcess):

Location:
trunk/Source/WebKit2
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r207807 r207812  
     12016-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
    1352016-10-24  Dan Bernstein  <mitz@apple.com>
    236
  • trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp

    r207586 r207812  
    4646#if USE(NETWORK_SESSION)
    4747
     48struct 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
    4861NetworkLoad::NetworkLoad(NetworkLoadClient& client, NetworkLoadParameters&& parameters, NetworkSession& networkSession)
    4962    : m_client(client)
     
    272285{
    273286    ASSERT(isMainThread());
    274     if (m_task && m_task->isDownload())
     287    ASSERT(!m_throttle);
     288
     289    if (m_task && m_task->isDownload()) {
    275290        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
     303void NetworkLoad::notifyDidReceiveResponse(ResourceResponse&& response, ResponseCompletionHandler&& completionHandler)
     304{
     305    ASSERT(isMainThread());
     306
     307    if (sharedDidReceiveResponse(WTFMove(response)) == NetworkLoadClient::ShouldContinueDidReceiveResponse::No) {
    279308        m_responseCompletionHandler = WTFMove(completionHandler);
     309        return;
     310    }
     311    completionHandler(PolicyUse);
    280312}
    281313
    282314void NetworkLoad::didReceiveData(Ref<SharedBuffer>&& buffer)
    283315{
     316    ASSERT(!m_throttle);
     317
    284318    // FIXME: This should be the encoded data length, not the decoded data length.
    285319    auto size = buffer->size();
     
    289323void NetworkLoad::didCompleteWithError(const ResourceError& error)
    290324{
     325    ASSERT(!m_throttle);
     326
    291327    if (error.isNull())
    292328        m_client.didFinishLoading(WTF::monotonicallyIncreasingTime());
    293329    else
    294330        m_client.didFailLoading(error);
     331}
     332
     333void NetworkLoad::throttleDelayCompleted()
     334{
     335    ASSERT(m_throttle);
     336
     337    auto throttle = WTFMove(m_throttle);
     338
     339    notifyDidReceiveResponse(WTFMove(throttle->response), WTFMove(throttle->responseCompletionHandler));
    295340}
    296341
  • trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h

    r207585 r207812  
    125125    void cannotShowURL() final;
    126126
     127    void notifyDidReceiveResponse(WebCore::ResourceResponse&&, ResponseCompletionHandler&&);
     128    void throttleDelayCompleted();
     129
    127130    void completeAuthenticationChallenge(ChallengeCompletionHandler&&);
    128131#endif
     
    138141    ResponseCompletionHandler m_responseCompletionHandler;
    139142    RedirectCompletionHandler m_redirectCompletionHandler;
     143   
     144    struct Throttle;
     145    std::unique_ptr<Throttle> m_throttle;
    140146#else
    141147    bool m_waitingForContinueCanAuthenticateAgainstProtectionSpace { false };
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp

    r207648 r207812  
    206206
    207207    m_suppressMemoryPressureHandler = parameters.shouldSuppressMemoryPressureHandler;
     208    m_loadThrottleLatency = parameters.loadThrottleLatency;
    208209    if (!m_suppressMemoryPressureHandler) {
    209210        auto& memoryPressureHandler = MemoryPressureHandler::singleton();
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h

    r207648 r207812  
    121121    void grantSandboxExtensionsToDatabaseProcessForBlobs(const Vector<String>& filenames, Function<void ()>&& completionHandler);
    122122
     123    std::chrono::milliseconds loadThrottleLatency() const { return m_loadThrottleLatency; }
     124
    123125private:
    124126    NetworkProcess();
     
    211213    bool m_diskCacheIsDisabledForTesting;
    212214    bool m_canHandleHTTPSServerTrustEvaluation;
     215    std::chrono::milliseconds m_loadThrottleLatency;
    213216
    214217    typedef HashMap<const char*, std::unique_ptr<NetworkProcessSupplement>, PtrHash<const char*>> NetworkProcessSupplementMap;
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcessCreationParameters.cpp

    r206604 r207812  
    6565    encoder << shouldUseTestingNetworkSession;
    6666    encoder << urlParserEnabled;
     67    encoder << loadThrottleLatency;
    6768    encoder << urlSchemesRegisteredForCustomProtocols;
    6869#if PLATFORM(COCOA)
     
    137138    if (!decoder.decode(result.urlParserEnabled))
    138139        return false;
     140    if (!decoder.decode(result.loadThrottleLatency))
     141        return false;
    139142    if (!decoder.decode(result.urlSchemesRegisteredForCustomProtocols))
    140143        return false;
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcessCreationParameters.h

    r206604 r207812  
    7474    bool shouldUseTestingNetworkSession;
    7575    bool urlParserEnabled { false };
     76    std::chrono::milliseconds loadThrottleLatency;
    7677
    7778    Vector<String> urlSchemesRegisteredForCustomProtocols;
  • trunk/Source/WebKit2/UIProcess/Cocoa/WebProcessPoolCocoa.mm

    r206705 r207812  
    8484
    8585static NSString * const WebKitSuppressMemoryPressureHandlerDefaultsKey = @"WebKitSuppressMemoryPressureHandler";
     86static NSString * const WebKitNetworkLoadThrottleLatencyMillisecondsDefaultsKey = @"WebKitNetworkLoadThrottleLatencyMilliseconds";
    8687
    8788static NSString * const WebKitVariationFontsEnabledDefaultsKey = @"ExperimentalVariationFontsEnabled";
     
    253254
    254255    parameters.shouldSuppressMemoryPressureHandler = [defaults boolForKey:WebKitSuppressMemoryPressureHandlerDefaultsKey];
     256    parameters.loadThrottleLatency = std::chrono::milliseconds([defaults integerForKey:WebKitNetworkLoadThrottleLatencyMillisecondsDefaultsKey]);
    255257
    256258#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
Note: See TracChangeset for help on using the changeset viewer.