Changeset 242891 in webkit


Ignore:
Timestamp:
Mar 13, 2019 10:57:57 AM (5 years ago)
Author:
beidson@apple.com
Message:

Take UnboundedNetworking assertion when a file upload is in progress.
https://bugs.webkit.org/show_bug.cgi?id=195497

Reviewed by Geoff Garen.

Source/WebCore:

  • platform/network/ResourceRequestBase.cpp:

(WebCore::ResourceRequestBase::hasUpload const):

  • platform/network/ResourceRequestBase.h:

Source/WebKit:

This patch implements whole bunch of bookkeeping in both the Networking and UI processes.

The TLDR of that bookkeeping is:

  • Whenever any uploads are in progress, take an assertion for both Networking and UI processes.
  • Whenever a particular WebProcess has an upload in progress, take an assertion for it.
  • NetworkProcess/NetworkConnectionToWebProcess.cpp:

(WebKit::NetworkConnectionToWebProcess::NetworkConnectionToWebProcess):
(WebKit::NetworkConnectionToWebProcess::setProcessIdentifier):
(WebKit::NetworkConnectionToWebProcess::setConnectionHasUploads):
(WebKit::NetworkConnectionToWebProcess::clearConnectionHasUploads):

  • NetworkProcess/NetworkConnectionToWebProcess.h:
  • NetworkProcess/NetworkConnectionToWebProcess.messages.in:
  • NetworkProcess/NetworkResourceLoadMap.cpp: Added.

(WebKit::NetworkResourceLoadMap::add):
(WebKit::NetworkResourceLoadMap::remove):
(WebKit::NetworkResourceLoadMap::get const):

  • NetworkProcess/NetworkResourceLoadMap.h: Added.

(WebKit::NetworkResourceLoadMap::NetworkResourceLoadMap):
(WebKit::NetworkResourceLoadMap::isEmpty const):
(WebKit::NetworkResourceLoadMap::contains const):
(WebKit::NetworkResourceLoadMap::begin):
(WebKit::NetworkResourceLoadMap::values):

  • NetworkProcess/NetworkSession.cpp:
  • Scripts/webkit/messages.py:
  • Sources.txt:
  • UIProcess/Network/NetworkProcessProxy.cpp:

(WebKit::NetworkProcessProxy::takeUploadAssertion):
(WebKit::NetworkProcessProxy::clearUploadAssertion):

  • UIProcess/Network/NetworkProcessProxy.h:
  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::setWebProcessHasUploads):
(WebKit::WebProcessPool::clearWebProcessHasUploads):

  • UIProcess/WebProcessPool.h:
  • UIProcess/WebProcessPool.messages.in:
  • WebKit.xcodeproj/project.pbxproj:
  • WebProcess/WebProcess.cpp:

(WebKit::WebProcess::ensureNetworkProcessConnection):

Location:
trunk/Source
Files:
2 added
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r242886 r242891  
     12019-03-12  Brady Eidson  <beidson@apple.com>
     2
     3        Take UnboundedNetworking assertion when a file upload is in progress.
     4        https://bugs.webkit.org/show_bug.cgi?id=195497
     5
     6        Reviewed by Geoff Garen.
     7
     8        * platform/network/ResourceRequestBase.cpp:
     9        (WebCore::ResourceRequestBase::hasUpload const):
     10        * platform/network/ResourceRequestBase.h:
     11
    1122019-03-13  Youenn Fablet  <youenn@apple.com>
    213
  • trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp

    r241918 r242891  
    489489}
    490490
     491bool ResourceRequestBase::hasUpload() const
     492{
     493    if (auto* body = httpBody()) {
     494        for (auto& element : body->elements()) {
     495            if (WTF::holds_alternative<WebCore::FormDataElement::EncodedFileData>(element.data) || WTF::holds_alternative<WebCore::FormDataElement::EncodedBlobData>(element.data))
     496                return true;
     497        }
     498    }
     499   
     500    return false;
     501}
     502
    491503void ResourceRequestBase::setHTTPBody(RefPtr<FormData>&& httpBody)
    492504{
  • trunk/Source/WebCore/platform/network/ResourceRequestBase.h

    r240805 r242891  
    145145
    146146    WEBCORE_EXPORT FormData* httpBody() const;
     147    WEBCORE_EXPORT bool hasUpload() const;
    147148    WEBCORE_EXPORT void setHTTPBody(RefPtr<FormData>&&);
    148149
  • trunk/Source/WebKit/ChangeLog

    r242889 r242891  
     12019-03-12  Brady Eidson  <beidson@apple.com>
     2
     3        Take UnboundedNetworking assertion when a file upload is in progress.
     4        https://bugs.webkit.org/show_bug.cgi?id=195497
     5
     6        Reviewed by Geoff Garen.
     7
     8        This patch implements whole bunch of bookkeeping in both the Networking and UI processes.
     9
     10        The TLDR of that bookkeeping is:
     11        - Whenever any uploads are in progress, take an assertion for both Networking and UI processes.
     12        - Whenever a particular WebProcess has an upload in progress, take an assertion for it.
     13
     14        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
     15        (WebKit::NetworkConnectionToWebProcess::NetworkConnectionToWebProcess):
     16        (WebKit::NetworkConnectionToWebProcess::setProcessIdentifier):
     17        (WebKit::NetworkConnectionToWebProcess::setConnectionHasUploads):
     18        (WebKit::NetworkConnectionToWebProcess::clearConnectionHasUploads):
     19        * NetworkProcess/NetworkConnectionToWebProcess.h:
     20        * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
     21
     22        * NetworkProcess/NetworkResourceLoadMap.cpp: Added.
     23        (WebKit::NetworkResourceLoadMap::add):
     24        (WebKit::NetworkResourceLoadMap::remove):
     25        (WebKit::NetworkResourceLoadMap::get const):
     26        * NetworkProcess/NetworkResourceLoadMap.h: Added.
     27        (WebKit::NetworkResourceLoadMap::NetworkResourceLoadMap):
     28        (WebKit::NetworkResourceLoadMap::isEmpty const):
     29        (WebKit::NetworkResourceLoadMap::contains const):
     30        (WebKit::NetworkResourceLoadMap::begin):
     31        (WebKit::NetworkResourceLoadMap::values):
     32
     33        * NetworkProcess/NetworkSession.cpp:
     34 
     35       * Scripts/webkit/messages.py:
     36
     37        * Sources.txt:
     38
     39        * UIProcess/Network/NetworkProcessProxy.cpp:
     40        (WebKit::NetworkProcessProxy::takeUploadAssertion):
     41        (WebKit::NetworkProcessProxy::clearUploadAssertion):
     42        * UIProcess/Network/NetworkProcessProxy.h:
     43
     44        * UIProcess/WebProcessPool.cpp:
     45        (WebKit::WebProcessPool::setWebProcessHasUploads):
     46        (WebKit::WebProcessPool::clearWebProcessHasUploads):
     47        * UIProcess/WebProcessPool.h:
     48        * UIProcess/WebProcessPool.messages.in:
     49 
     50       * WebKit.xcodeproj/project.pbxproj:
     51
     52        * WebProcess/WebProcess.cpp:
     53        (WebKit::WebProcess::ensureNetworkProcessConnection):
     54
    1552019-03-13  Chris Dumez  <cdumez@apple.com>
    256
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp

    r242748 r242891  
    5151#include "WebIDBConnectionToClient.h"
    5252#include "WebIDBConnectionToClientMessages.h"
     53#include "WebProcessPoolMessages.h"
    5354#include "WebResourceLoadStatisticsStore.h"
    5455#include "WebSWServerConnection.h"
     
    7879    : m_connection(IPC::Connection::createServerConnection(connectionIdentifier, *this))
    7980    , m_networkProcess(networkProcess)
     81    , m_networkResourceLoaders(*this)
    8082#if ENABLE(WEB_RTC)
    8183    , m_mdnsRegister(*this)
     
    822824#endif
    823825
     826void NetworkConnectionToWebProcess::setWebProcessIdentifier(ProcessIdentifier webProcessIdentifier)
     827{
     828    m_webProcessIdentifier = webProcessIdentifier;
     829}
     830
     831void NetworkConnectionToWebProcess::setConnectionHasUploads()
     832{
     833    ASSERT(!m_connectionHasUploads);
     834    m_connectionHasUploads = true;
     835    m_networkProcess->parentProcessConnection()->send(Messages::WebProcessPool::SetWebProcessHasUploads(m_webProcessIdentifier), 0);
     836}
     837
     838void NetworkConnectionToWebProcess::clearConnectionHasUploads()
     839{
     840    ASSERT(m_connectionHasUploads);
     841    m_connectionHasUploads = false;
     842    m_networkProcess->parentProcessConnection()->send(Messages::WebProcessPool::ClearWebProcessHasUploads(m_webProcessIdentifier), 0);
     843}
     844
    824845} // namespace WebKit
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h

    r242748 r242891  
    3333#include "NetworkMDNSRegister.h"
    3434#include "NetworkRTCProvider.h"
     35#include "NetworkResourceLoadMap.h"
    3536#include "WebPaymentCoordinatorProxy.h"
    3637#include <WebCore/NetworkLoadInformation.h>
     38#include <WebCore/ProcessIdentifier.h>
    3739#include <WebCore/RegistrableDomain.h>
    3840#include <wtf/RefCounted.h>
     
    135137    Vector<RefPtr<WebCore::BlobDataFileReference>> filesInBlob(const URL&);
    136138    Vector<RefPtr<WebCore::BlobDataFileReference>> resolveBlobReferences(const NetworkResourceLoadParameters&);
     139
     140    void setWebProcessIdentifier(WebCore::ProcessIdentifier);
     141    void setConnectionHasUploads();
     142    void clearConnectionHasUploads();
    137143
    138144private:
     
    269275
    270276    HashMap<uint64_t, RefPtr<NetworkSocketStream>> m_networkSocketStreams;
    271     HashMap<ResourceLoadIdentifier, Ref<NetworkResourceLoader>> m_networkResourceLoaders;
     277    NetworkResourceLoadMap m_networkResourceLoaders;
    272278    HashMap<String, RefPtr<WebCore::BlobDataFileReference>> m_blobDataFileReferences;
    273279    Vector<ResourceNetworkActivityTracker> m_networkActivityTrackers;
     
    298304    std::unique_ptr<WebPaymentCoordinatorProxy> m_paymentCoordinator;
    299305#endif
     306
     307    WebCore::ProcessIdentifier m_webProcessIdentifier;
     308    bool m_connectionHasUploads { false };
    300309};
    301310
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in

    r242738 r242891  
    8484    EstablishSWServerConnection(PAL::SessionID sessionID) -> (WebCore::SWServerConnectionIdentifier serverConnectionIdentifier) LegacySync
    8585#endif
     86
     87    SetWebProcessIdentifier(WebCore::ProcessIdentifier processIdentifier)
    8688}
  • trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp

    r242764 r242891  
    3030#include "NetworkProcess.h"
    3131#include "NetworkProcessProxyMessages.h"
     32#include "WebPageProxy.h"
     33#include "WebPageProxyMessages.h"
    3234#include "WebProcessProxy.h"
    3335#include <WebCore/AdClickAttribution.h>
  • trunk/Source/WebKit/Scripts/webkit/messages.py

    r242696 r242891  
    199199        'WebCore::FetchIdentifier',
    200200        'WebCore::PointerID',
     201        'WebCore::ProcessIdentifier',
    201202        'WebCore::ServiceWorkerIdentifier',
    202203        'WebCore::ServiceWorkerJobIdentifier',
     
    425426        'WebCore::PolicyAction': ['<WebCore/FrameLoaderTypes.h>'],
    426427        'WebCore::PolicyCheckIdentifier': ['<WebCore/FrameLoaderTypes.h>'],
     428        'WebCore::ProcessIdentifier': ['<WebCore/ProcessIdentifier.h>'],
    427429        'WebCore::RecentSearch': ['<WebCore/SearchPopupMenu.h>'],
    428430        'WebCore::RouteSharingPolicy': ['<WebCore/AudioSession.h>'],
  • trunk/Source/WebKit/Sources.txt

    r242696 r242891  
    3636NetworkProcess/NetworkProcessPlatformStrategies.cpp
    3737NetworkProcess/NetworkResourceLoadParameters.cpp
     38NetworkProcess/NetworkResourceLoadMap.cpp
    3839NetworkProcess/NetworkResourceLoader.cpp
    3940NetworkProcess/NetworkSession.cpp
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp

    r242738 r242891  
    12021202}
    12031203
     1204void NetworkProcessProxy::takeUploadAssertion()
     1205{
     1206    ASSERT(!m_uploadAssertion);
     1207    m_uploadAssertion = std::make_unique<ProcessAssertion>(processIdentifier(), "WebKit uploads"_s, AssertionState::UnboundedNetworking);
     1208}
     1209
     1210void NetworkProcessProxy::clearUploadAssertion()
     1211{
     1212    ASSERT(m_uploadAssertion);
     1213    m_uploadAssertion = nullptr;
     1214}
     1215
    12041216} // namespace WebKit
    12051217
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h

    r242738 r242891  
    174174    void addSession(Ref<WebsiteDataStore>&&);
    175175    void removeSession(PAL::SessionID);
     176   
     177    void takeUploadAssertion();
     178    void clearUploadAssertion();
    176179
    177180private:
     
    262265
    263266    HashMap<PAL::SessionID, RefPtr<WebsiteDataStore>> m_websiteDataStores;
     267   
     268    std::unique_ptr<ProcessAssertion> m_uploadAssertion;
    264269};
    265270
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r242889 r242891  
    25122512}
    25132513
     2514void WebProcessPool::setWebProcessHasUploads(ProcessIdentifier processID)
     2515{
     2516    auto* process = WebProcessProxy::processForIdentifier(processID);
     2517    ASSERT(process);
     2518
     2519    RELEASE_LOG(ProcessSuspension, "Web process pid %u now has uploads in progress", (unsigned)process->processIdentifier());
     2520
     2521    if (m_processesWithUploads.isEmpty()) {
     2522        RELEASE_LOG(ProcessSuspension, "The number of uploads in progress is now one. Taking Networking and UI process assertions.");
     2523
     2524        ASSERT(m_networkProcess);
     2525        m_networkProcess->takeUploadAssertion();
     2526       
     2527        ASSERT(!m_uiProcessUploadAssertion);
     2528        m_uiProcessUploadAssertion = std::make_unique<ProcessAssertion>(getCurrentProcessID(), "WebKit uploads"_s, AssertionState::UnboundedNetworking);
     2529    }
     2530   
     2531    auto result = m_processesWithUploads.add(processID, nullptr);
     2532    ASSERT(result.isNewEntry);
     2533    result.iterator->value = std::make_unique<ProcessAssertion>(process->processIdentifier(), "WebKit uploads"_s, AssertionState::UnboundedNetworking);
     2534}
     2535
     2536void WebProcessPool::clearWebProcessHasUploads(ProcessIdentifier processID)
     2537{
     2538    auto result = m_processesWithUploads.take(processID);
     2539    ASSERT_UNUSED(result, result);
     2540
     2541    auto* process = WebProcessProxy::processForIdentifier(processID);
     2542    ASSERT(process);
     2543    RELEASE_LOG(ProcessSuspension, "Web process pid %u no longer has uploads in progress", (unsigned)process->processIdentifier());
     2544
     2545    if (m_processesWithUploads.isEmpty()) {
     2546        RELEASE_LOG(ProcessSuspension, "The number of uploads in progress is now zero. Releasing Networking and UI process assertions.");
     2547
     2548        if (m_networkProcess)
     2549            m_networkProcess->clearUploadAssertion();
     2550       
     2551        ASSERT(m_uiProcessUploadAssertion);
     2552        m_uiProcessUploadAssertion = nullptr;
     2553    }
     2554   
     2555}
     2556
    25142557} // namespace WebKit
  • trunk/Source/WebKit/UIProcess/WebProcessPool.h

    r242889 r242891  
    4545#include "WebContextConnectionClient.h"
    4646#include "WebProcessProxy.h"
     47#include <WebCore/ProcessIdentifier.h>
    4748#include <WebCore/RegistrableDomain.h>
    4849#include <WebCore/SecurityOriginHash.h>
     
    5354#include <wtf/HashSet.h>
    5455#include <wtf/MemoryPressureHandler.h>
    55 #include <wtf/ProcessID.h>
    5656#include <wtf/RefCounter.h>
    5757#include <wtf/RefPtr.h>
     
    496496    bool sandboxEnabled() const { return m_sandboxEnabled; };
    497497#endif
     498   
     499    void setWebProcessHasUploads(WebCore::ProcessIdentifier);
     500    void clearWebProcessHasUploads(WebCore::ProcessIdentifier);
    498501
    499502private:
     
    769772    HashMap<CString, SandboxPermission> m_extraSandboxPaths;
    770773#endif
     774
     775    HashMap<WebCore::ProcessIdentifier, std::unique_ptr<ProcessAssertion>> m_processesWithUploads;
     776    std::unique_ptr<ProcessAssertion> m_uiProcessUploadAssertion;
    771777};
    772778
  • trunk/Source/WebKit/UIProcess/WebProcessPool.messages.in

    r241778 r242891  
    3838    ReportWebContentCPUTime(Seconds cpuTime, uint64_t activityState)
    3939
     40    SetWebProcessHasUploads(WebCore::ProcessIdentifier processID)
     41    ClearWebProcessHasUploads(WebCore::ProcessIdentifier processID)
     42
    4043#if ENABLE(SERVICE_WORKER)
    4144    PostMessageToServiceWorkerClient(struct WebCore::ServiceWorkerClientIdentifier destinationIdentifier, struct WebCore::MessageWithMessagePorts message, WebCore::ServiceWorkerIdentifier sourceIdentifier, String sourceOrigin)
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r242764 r242891  
    925925                5123CF1C133D260A0056F800 /* WKIconDatabaseCG.h in Headers */ = {isa = PBXBuildFile; fileRef = 5123CF1A133D260A0056F800 /* WKIconDatabaseCG.h */; settings = {ATTRIBUTES = (Private, ); }; };
    926926                51240EBA220A08D2005CFC63 /* DownloadMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 51240EB8220A08CA005CFC63 /* DownloadMap.h */; };
     927                51240EC0220B694C005CFC63 /* NetworkResourceLoadMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 51240EBE220B6947005CFC63 /* NetworkResourceLoadMap.h */; };
    927928                512935D81288D19400A4B695 /* WebContextMenuItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 512935D61288D19400A4B695 /* WebContextMenuItem.h */; };
    928929                512935E41288D97800A4B695 /* InjectedBundlePageContextMenuClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 512935E21288D97800A4B695 /* InjectedBundlePageContextMenuClient.h */; };
     
    31703171                51240EB8220A08CA005CFC63 /* DownloadMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DownloadMap.h; sourceTree = "<group>"; };
    31713172                51240EB9220A08CA005CFC63 /* DownloadMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DownloadMap.cpp; sourceTree = "<group>"; };
     3173                51240EBE220B6947005CFC63 /* NetworkResourceLoadMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkResourceLoadMap.h; sourceTree = "<group>"; };
     3174                51240EBF220B6948005CFC63 /* NetworkResourceLoadMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkResourceLoadMap.cpp; sourceTree = "<group>"; };
    31723175                512935D51288D19400A4B695 /* WebContextMenuItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebContextMenuItem.cpp; sourceTree = "<group>"; };
    31733176                512935D61288D19400A4B695 /* WebContextMenuItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebContextMenuItem.h; sourceTree = "<group>"; };
     
    65136516                                51FD18B41651FBAD00DBE1CE /* NetworkResourceLoader.h */,
    65146517                                E1525517170109FB003D7ADB /* NetworkResourceLoader.messages.in */,
     6518                                51240EBF220B6948005CFC63 /* NetworkResourceLoadMap.cpp */,
     6519                                51240EBE220B6947005CFC63 /* NetworkResourceLoadMap.h */,
    65156520                                5C1426E51C23F80500D41183 /* NetworkResourceLoadParameters.cpp */,
    65166521                                5C1426E61C23F80500D41183 /* NetworkResourceLoadParameters.h */,
     
    92639268                                51FD18B61651FBAD00DBE1CE /* NetworkResourceLoader.h in Headers */,
    92649269                                E152551B17011819003D7ADB /* NetworkResourceLoaderMessages.h in Headers */,
     9270                                51240EC0220B694C005CFC63 /* NetworkResourceLoadMap.h in Headers */,
    92659271                                5C1426F01C23F80900D41183 /* NetworkResourceLoadParameters.h in Headers */,
    92669272                                413075AC1DE85F370039EC69 /* NetworkRTCMonitor.h in Headers */,
  • trunk/Source/WebKit/WebProcess/WebProcess.cpp

    r242889 r242891  
    12311231
    12321232        m_networkProcessConnection = NetworkProcessConnection::create(connectionIdentifier);
     1233        m_networkProcessConnection->connection().send(Messages::NetworkConnectionToWebProcess::SetWebProcessIdentifier(Process::identifier()), 0);
    12331234    }
    12341235   
Note: See TracChangeset for help on using the changeset viewer.