WebKit Bugzilla
Attachment 338768 Details for
Bug 184838
: Add facility for tracking times and results of page and resource loading
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-184838-20180425120847.patch (text/plain), 70.27 KB, created by
Keith Rollin
on 2018-04-25 12:09:15 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Keith Rollin
Created:
2018-04-25 12:09:15 PDT
Size:
70.27 KB
patch
obsolete
>Subversion Revision: 231007 >diff --git a/Source/WTF/ChangeLog b/Source/WTF/ChangeLog >index 34d6827d443005a444b7776ab3b9c9a90e337774..50dd4e048883678a3437df73abf05b5d09227c02 100644 >--- a/Source/WTF/ChangeLog >+++ b/Source/WTF/ChangeLog >@@ -1,3 +1,17 @@ >+2018-04-24 Keith Rollin <krollin@apple.com> >+ >+ Add facility for tracking times and results of page and resource loading >+ https://bugs.webkit.org/show_bug.cgi?id=184838 >+ rdar://problem/36548974 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Define USE_NETWORK_ACTIVITY to enable/disable the >+ NetworkActivityTracker facility. Define HAVE_NW_ACTIVITY to enable a >+ particular implementation of NetworkActivityTracker. >+ >+ * wtf/Platform.h: >+ > 2018-04-25 Dean Jackson <dino@apple.com> > > Make a better flag for system preview, and disable it where necessary >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index e9fa25b4c4234576a38122d30758a2290e4068bb..a282e6b31ae3a75ae1654f4386c92d1898f1be95 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,27 @@ >+2018-04-24 Keith Rollin <krollin@apple.com> >+ >+ Add facility for tracking times and results of page and resource loading >+ https://bugs.webkit.org/show_bug.cgi?id=184838 >+ rdar://problem/36548974 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Update FrameProgressTracker to send the necessary page load start/stop >+ signals so that we can track the entire page load at a network level. >+ Add an empty override of the pure virtual >+ LoaderStrategy::pageLoadCompleted method. >+ >+ No new tests. There is no testable effect from these changes. On >+ Cocoa, measurable changes take place in another (non-WebKit) process. >+ On non-Cocoa systems, this facility is currently disabled. >+ >+ * loader/FrameLoader.cpp: >+ (WebCore::FrameLoader::FrameProgressTracker::FrameProgressTracker): >+ (WebCore::FrameLoader::FrameProgressTracker::progressCompleted): >+ (WebCore::FrameLoader::init): >+ (WebCore::FrameLoader::initForSynthesizedDocument): >+ * loader/LoaderStrategy.h: >+ > 2018-04-25 Youenn Fablet <youenn@apple.com> > > CachedRawResource is not handling incremental data computation correctly >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 71271e8690ea0fe06a7e83325352449970c19051..408cbd92dfed904c0fe7d6c87f2ed5e5e850cc5b 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,90 @@ >+2018-04-24 Keith Rollin <krollin@apple.com> >+ >+ Add facility for tracking times and results of page and resource loading >+ https://bugs.webkit.org/show_bug.cgi?id=184838 >+ rdar://problem/36548974 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add NetworkActivityTracker. The idea behind this facility is to create >+ and destroy them around networking activity that we want to track for >+ the purpose of measuring overall network health. They can be created >+ around the loading of pages or individual resources, and can be >+ arranged in a parent/child hierarchy to indicate what pages the >+ resources are part of. The NetworkActivity tracker tracks load times >+ and results. On Cocoa, it can be integrated with CFNetwork in order to >+ associate WebKit activity with low-level networking activity. >+ >+ * CMakeLists.txt: >+ * Configurations/WebKit.xcconfig: >+ * NetworkProcess/NetworkActivityTracker.cpp: Added. >+ (WebKit::NetworkActivityTracker::NetworkActivityTracker): >+ (WebKit::NetworkActivityTracker::~NetworkActivityTracker): >+ (WebKit::NetworkActivityTracker::setParent): >+ (WebKit::NetworkActivityTracker::start): >+ (WebKit::NetworkActivityTracker::complete): >+ * NetworkProcess/NetworkActivityTracker.h: Added. >+ (WebKit::NetworkActivityTracker::get): >+ * NetworkProcess/NetworkConnectionToWebProcess.cpp: >+ (WebKit::NetworkConnectionToWebProcess::didClose): >+ (WebKit::NetworkConnectionToWebProcess::pageLoadCompleted): >+ (WebKit::networkActivityTrackingEnabled): >+ (WebKit::NetworkConnectionToWebProcess::startTrackingResourceLoad): >+ (WebKit::NetworkConnectionToWebProcess::stopTrackingResourceLoad): >+ (WebKit::NetworkConnectionToWebProcess::stopAllNetworkActivityTracking): >+ (WebKit::NetworkConnectionToWebProcess::stopAllNetworkActivityTrackingForPage): >+ (WebKit::NetworkConnectionToWebProcess::findRootNetworkActivity): >+ (WebKit::NetworkConnectionToWebProcess::findNetworkActivityTracker): >+ * NetworkProcess/NetworkConnectionToWebProcess.h: >+ (WebKit::NetworkConnectionToWebProcess::ResourceNetworkActivityTracker::ResourceNetworkActivityTracker): >+ * NetworkProcess/NetworkConnectionToWebProcess.messages.in: >+ * NetworkProcess/NetworkDataTask.cpp: >+ (WebKit::NetworkDataTask::create): >+ * NetworkProcess/NetworkLoadParameters.h: >+ * NetworkProcess/NetworkProcess.cpp: >+ (WebKit::NetworkProcess::initializeNetworkProcess): >+ * NetworkProcess/NetworkProcess.h: >+ (WebKit::NetworkProcess::trackNetworkActivity const): >+ * NetworkProcess/NetworkProcessCreationParameters.cpp: >+ (WebKit::NetworkProcessCreationParameters::encode const): >+ (WebKit::NetworkProcessCreationParameters::decode): >+ * NetworkProcess/NetworkProcessCreationParameters.h: >+ * NetworkProcess/NetworkResourceLoader.cpp: >+ (WebKit::NetworkResourceLoader::start): >+ (WebKit::NetworkResourceLoader::cleanup): >+ (WebKit::NetworkResourceLoader::abort): >+ (WebKit::NetworkResourceLoader::didFinishLoading): >+ (WebKit::NetworkResourceLoader::didFailLoading): >+ (WebKit::NetworkResourceLoader::didRetrieveCacheEntry): >+ (WebKit::NetworkResourceLoader::continueProcessingCachedEntryAfterDidReceiveResponse): >+ * NetworkProcess/NetworkResourceLoader.h: >+ * NetworkProcess/cocoa/NetworkActivityTrackerCocoa.mm: Added. >+ (WebKit::NetworkActivityTracker::NetworkActivityTracker): >+ (WebKit::NetworkActivityTracker::~NetworkActivityTracker): >+ (WebKit::NetworkActivityTracker::setParent): >+ (WebKit::NetworkActivityTracker::start): >+ (WebKit::NetworkActivityTracker::complete): >+ * NetworkProcess/cocoa/NetworkDataTaskCocoa.h: >+ * NetworkProcess/cocoa/NetworkDataTaskCocoa.mm: >+ (WebKit::NetworkDataTaskCocoa::NetworkDataTaskCocoa): >+ * UIProcess/API/APIProcessPoolConfiguration.cpp: >+ (API::ProcessPoolConfiguration::copy): >+ * UIProcess/API/APIProcessPoolConfiguration.h: >+ * UIProcess/API/C/WKContextConfigurationRef.cpp: >+ (WKContextConfigurationTrackNetworkActivity): >+ (WKContextConfigurationSetTrackNetworkActivity): >+ * UIProcess/API/C/WKContextConfigurationRef.h: >+ * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h: >+ * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm: >+ (-[_WKProcessPoolConfiguration trackNetworkActivity]): >+ (-[_WKProcessPoolConfiguration setTrackNetworkActivity:]): >+ * UIProcess/WebProcessPool.cpp: >+ (WebKit::WebProcessPool::ensureNetworkProcess): >+ * WebKit.xcodeproj/project.pbxproj: >+ * WebProcess/Network/WebLoaderStrategy.cpp: >+ (WebKit::WebLoaderStrategy::pageLoadCompleted): >+ * WebProcess/Network/WebLoaderStrategy.h: >+ > 2018-04-25 Youenn Fablet <youenn@apple.com> > > Ensure DNT is set for redirections handled in NetworkProcess >diff --git a/Source/WebKitLegacy/ChangeLog b/Source/WebKitLegacy/ChangeLog >index 688b84e012d977c903d3490fb86e2420d8570f5c..442648c8be10cf4931f4f23fc478140fac17d45c 100644 >--- a/Source/WebKitLegacy/ChangeLog >+++ b/Source/WebKitLegacy/ChangeLog >@@ -1,3 +1,18 @@ >+2018-04-24 Keith Rollin <krollin@apple.com> >+ >+ Add facility for tracking times and results of page and resource loading >+ https://bugs.webkit.org/show_bug.cgi?id=184838 >+ rdar://problem/36548974 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add an empty override of the pure virtual >+ LoaderStrategy::pageLoadCompleted method. >+ >+ * WebCoreSupport/WebResourceLoadScheduler.cpp: >+ (WebResourceLoadScheduler::pageLoadCompleted): >+ * WebCoreSupport/WebResourceLoadScheduler.h: >+ > 2018-04-16 Youenn Fablet <youenn@apple.com> > > Use NetworkLoadChecker to handle synchronous HTTP loads >diff --git a/Source/WTF/wtf/Platform.h b/Source/WTF/wtf/Platform.h >index d9ba17666cff89c344e5ae967c340e0bf1aab2ee..9e9715debaf312dfff6936826a17f548642cc5e1 100644 >--- a/Source/WTF/wtf/Platform.h >+++ b/Source/WTF/wtf/Platform.h >@@ -1271,6 +1271,14 @@ > #endif > #endif > >+#if USE(APPLE_INTERNAL_SDK) && __has_include(<nw/activity.h>) >+#define HAVE_NW_ACTIVITY 1 >+#endif >+ >+#if HAVE(NW_ACTIVITY) >+#define USE_NETWORK_ACTIVITY 1 >+#endif >+ > #if PLATFORM(COCOA) > #define HAVE_SEC_TRUST_SERIALIZATION 1 > #endif >diff --git a/Source/WebCore/loader/FrameLoader.cpp b/Source/WebCore/loader/FrameLoader.cpp >index 97cf0b68e114f17a56f041aa7ab084f35002f0d5..07cfbf4411724cc9e974e1ba56ff6650c66e42c5 100644 >--- a/Source/WebCore/loader/FrameLoader.cpp >+++ b/Source/WebCore/loader/FrameLoader.cpp >@@ -226,8 +226,9 @@ struct ForbidPromptsScope { > class FrameLoader::FrameProgressTracker { > WTF_MAKE_FAST_ALLOCATED; > public: >- explicit FrameProgressTracker(Frame& frame) >+ explicit FrameProgressTracker(Frame& frame, FrameLoaderClient& client) > : m_frame(frame) >+ , m_client(client) > , m_inProgress(false) > { > } >@@ -252,10 +253,14 @@ public: > ASSERT(m_frame.page()); > m_inProgress = false; > m_frame.page()->progress().progressCompleted(m_frame); >+ >+ if (m_client.pageID()) >+ platformStrategies()->loaderStrategy()->pageLoadCompleted(m_client.pageID().value()); > } > > private: > Frame& m_frame; >+ FrameLoaderClient& m_client; > bool m_inProgress; > }; > >@@ -313,7 +318,7 @@ void FrameLoader::init() > m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocument); > > m_networkingContext = m_client.createNetworkingContext(); >- m_progressTracker = std::make_unique<FrameProgressTracker>(m_frame); >+ m_progressTracker = std::make_unique<FrameProgressTracker>(m_frame, m_client); > } > > void FrameLoader::initForSynthesizedDocument(const URL&) >@@ -338,7 +343,7 @@ void FrameLoader::initForSynthesizedDocument(const URL&) > m_needsClear = true; > > m_networkingContext = m_client.createNetworkingContext(); >- m_progressTracker = std::make_unique<FrameProgressTracker>(m_frame); >+ m_progressTracker = std::make_unique<FrameProgressTracker>(m_frame, m_client); > } > > void FrameLoader::setDefersLoading(bool defers) >diff --git a/Source/WebCore/loader/LoaderStrategy.h b/Source/WebCore/loader/LoaderStrategy.h >index 67d30cf11f6abfa7598e8c4cb8c9a881a277b345..2f5efeb6b86b8a0669e341eb5e46915911038044 100644 >--- a/Source/WebCore/loader/LoaderStrategy.h >+++ b/Source/WebCore/loader/LoaderStrategy.h >@@ -58,6 +58,7 @@ class WEBCORE_EXPORT LoaderStrategy { > public: > virtual void loadResource(Frame&, CachedResource&, ResourceRequest&&, const ResourceLoaderOptions&, CompletionHandler<void(RefPtr<SubresourceLoader>&&)>&&) = 0; > virtual void loadResourceSynchronously(FrameLoader&, unsigned long identifier, const ResourceRequest&, ClientCredentialPolicy, const FetchOptions&, const HTTPHeaderMap&, ResourceError&, ResourceResponse&, Vector<char>& data) = 0; >+ virtual void pageLoadCompleted(uint64_t webPageID) = 0; > > virtual void remove(ResourceLoader*) = 0; > virtual void setDefersLoading(ResourceLoader*, bool) = 0; >diff --git a/Source/WebKit/CMakeLists.txt b/Source/WebKit/CMakeLists.txt >index b9398200c69e86f14dc596fbea52a054770495cd..f1d03e4736be24b72c68939a9fe859859a5b883b 100644 >--- a/Source/WebKit/CMakeLists.txt >+++ b/Source/WebKit/CMakeLists.txt >@@ -97,14 +97,7 @@ set(WebKit_SYSTEM_INCLUDE_DIRECTORIES > ) > > set(WebKit_SOURCES >- NetworkProcess/Cookies/WebCookieManager.cpp >- >- NetworkProcess/Downloads/Download.cpp >- NetworkProcess/Downloads/DownloadManager.cpp >- NetworkProcess/Downloads/PendingDownload.cpp >- >- NetworkProcess/FileAPI/NetworkBlobRegistry.cpp >- >+ NetworkProcess/NetworkActivityTracker.cpp > NetworkProcess/NetworkCORSPreflightChecker.cpp > NetworkProcess/NetworkConnectionToWebProcess.cpp > NetworkProcess/NetworkContentRuleListManager.cpp >@@ -122,6 +115,14 @@ set(WebKit_SOURCES > NetworkProcess/PingLoad.cpp > NetworkProcess/PreconnectTask.cpp > >+ NetworkProcess/Cookies/WebCookieManager.cpp >+ >+ NetworkProcess/Downloads/Download.cpp >+ NetworkProcess/Downloads/DownloadManager.cpp >+ NetworkProcess/Downloads/PendingDownload.cpp >+ >+ NetworkProcess/FileAPI/NetworkBlobRegistry.cpp >+ > NetworkProcess/cache/CacheStorageEngine.cpp > NetworkProcess/cache/CacheStorageEngineCache.cpp > NetworkProcess/cache/CacheStorageEngineCaches.cpp >diff --git a/Source/WebKit/Configurations/WebKit.xcconfig b/Source/WebKit/Configurations/WebKit.xcconfig >index c379a17e97cb42637e7cf43a4dd7d98d31a91c90..96ec4acd1f7d09741498f1ef3fcb401126a182be 100644 >--- a/Source/WebKit/Configurations/WebKit.xcconfig >+++ b/Source/WebKit/Configurations/WebKit.xcconfig >@@ -112,7 +112,7 @@ WK_SAFE_BROWSING_LDFLAGS_MACOS_SINCE_1013 = -weak_framework SafariSafeBrowsing; > WK_UIKIT_LDFLAGS = $(WK_UIKIT_LDFLAGS_$(WK_COCOA_TOUCH)); > WK_UIKIT_LDFLAGS_cocoatouch = -framework UIKit; > >-FRAMEWORK_AND_LIBRARY_LDFLAGS = -lobjc -framework CFNetwork -framework CoreAudio -framework CoreFoundation -framework CoreGraphics -framework CoreText -framework Foundation -framework ImageIO -framework IOKit -framework WebKitLegacy $(WK_ACCESSIBILITY_LDFLAGS) $(WK_APPKIT_LDFLAGS) $(WK_ASSERTION_SERVICES_LDFLAGS) $(WK_CARBON_LDFLAGS) $(WK_CORE_PDF_LDFLAGS) $(WK_CORE_PREDICTION_LDFLAGS) $(WK_CORE_SERVICES_LDFLAGS) $(WK_GRAPHICS_SERVICES_LDFLAGS) $(WK_IOSURFACE_LDFLAGS) $(WK_LIBWEBRTC_LDFLAGS) $(WK_MOBILE_CORE_SERVICES_LDFLAGS) $(WK_MOBILE_GESTALT_LDFLAGS) $(WK_OPENGL_LDFLAGS) $(WK_PDFKIT_LDFLAGS) $(WK_SAFE_BROWSING_LDFLAGS) $(WK_UIKIT_LDFLAGS); >+FRAMEWORK_AND_LIBRARY_LDFLAGS = -lobjc -framework CFNetwork -framework CoreAudio -framework CoreFoundation -framework CoreGraphics -framework CoreText -framework Foundation -framework ImageIO -framework IOKit -framework WebKitLegacy -lnetwork $(WK_ACCESSIBILITY_LDFLAGS) $(WK_APPKIT_LDFLAGS) $(WK_ASSERTION_SERVICES_LDFLAGS) $(WK_CARBON_LDFLAGS) $(WK_CORE_PDF_LDFLAGS) $(WK_CORE_PREDICTION_LDFLAGS) $(WK_CORE_SERVICES_LDFLAGS) $(WK_GRAPHICS_SERVICES_LDFLAGS) $(WK_IOSURFACE_LDFLAGS) $(WK_LIBWEBRTC_LDFLAGS) $(WK_MOBILE_CORE_SERVICES_LDFLAGS) $(WK_MOBILE_GESTALT_LDFLAGS) $(WK_OPENGL_LDFLAGS) $(WK_PDFKIT_LDFLAGS) $(WK_SAFE_BROWSING_LDFLAGS) $(WK_UIKIT_LDFLAGS); > > // Prevent C++ standard library operator new, delete and their related exception types from being exported as weak symbols. > UNEXPORTED_SYMBOL_LDFLAGS = -Wl,-unexported_symbol -Wl,__ZTISt9bad_alloc -Wl,-unexported_symbol -Wl,__ZTISt9exception -Wl,-unexported_symbol -Wl,__ZTSSt9bad_alloc -Wl,-unexported_symbol -Wl,__ZTSSt9exception -Wl,-unexported_symbol -Wl,__ZdlPvS_ -Wl,-unexported_symbol -Wl,__ZnwmPv -Wl,-unexported_symbol -Wl,__Znwm -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEEC2EOS4_ -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEEC1EOS4_ -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEEaSEDn -Wl,-unexported_symbol, -Wl,__ZNKSt3__18functionIFvN7WebCore12PolicyActionEEEclES2_ -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEE4swapERS4_ -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEEC1ERKS4_ -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEEC2ERKS4_ -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEED1Ev -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEED2Ev -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEEaSERKS4_ -Wl,-unexported_symbol, -Wl,__ZTVNSt3__117bad_function_callE; >diff --git a/Source/WebKit/NetworkProcess/NetworkActivityTracker.cpp b/Source/WebKit/NetworkProcess/NetworkActivityTracker.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..36fbe9d050a33298d0f9b9de8f4aab1f44e7d3f9 >--- /dev/null >+++ b/Source/WebKit/NetworkProcess/NetworkActivityTracker.cpp >@@ -0,0 +1,55 @@ >+/* >+ * Copyright (C) 22018 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "NetworkActivityTracker.h" >+ >+#if !HAVE(NW_ACTIVITY) >+ >+namespace WebKit { >+ >+NetworkActivityTracker::NetworkActivityTracker(Label, Domain) >+{ >+} >+ >+NetworkActivityTracker::~NetworkActivityTracker() >+{ >+} >+ >+void NetworkActivityTracker::setParent(NetworkActivityTracker&) >+{ >+} >+ >+void NetworkActivityTracker::start() >+{ >+} >+ >+void NetworkActivityTracker::complete(CompletionCode) >+{ >+} >+ >+} // namespace WebKit >+ >+#endif // USE(NETWORK_ACTIVITY) && !HAVE(NW_ACTIVITY) >diff --git a/Source/WebKit/NetworkProcess/NetworkActivityTracker.h b/Source/WebKit/NetworkProcess/NetworkActivityTracker.h >new file mode 100644 >index 0000000000000000000000000000000000000000..ab0065c81927af405c2d85f7c1893f4a10d80f6e >--- /dev/null >+++ b/Source/WebKit/NetworkProcess/NetworkActivityTracker.h >@@ -0,0 +1,85 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#pragma once >+ >+#include <wtf/Platform.h> >+ >+#if HAVE(NW_ACTIVITY) >+#include <nw/private.h> >+#include <wtf/RetainPtr.h> >+#endif >+ >+namespace WebKit { >+ >+class NetworkActivityTracker { >+public: >+ enum class Domain { >+ // These are defined to match analogous values used in the Darwin implementation. >+ // If they are renumbered, platform-specific code will need to be added to map >+ // them to the Darwin-specific values. >+ >+ Invalid = 0, >+ WebKit = 16, >+ }; >+ >+ enum class Label { >+ // These are ours to define, but once defined, they shouldn't change. They can >+ // be obsolesced and replaced with other codes, but previously-defined codes >+ // should not be renumbered. Previously assigned values should not be re-used. >+ >+ Invalid = 0, >+ LoadPage = 1, >+ LoadResource = 2, >+ }; >+ >+ enum class CompletionCode { >+ Undefined, >+ None, >+ Success, >+ Failure, >+ }; >+ >+ NetworkActivityTracker(Label, Domain = Domain::WebKit); >+ ~NetworkActivityTracker(); >+ >+ void setParent(NetworkActivityTracker&); >+ void start(); >+ void complete(CompletionCode); >+ >+#if HAVE(NW_ACTIVITY) >+ nw_activity_t get() { return m_networkActivity.get(); } >+#endif >+ >+private: >+#if HAVE(NW_ACTIVITY) >+ Domain m_domain; >+ Label m_label; >+ bool m_isCompleted { false }; >+ RetainPtr<nw_activity_t> m_networkActivity; >+#endif >+}; >+ >+} // namespace WebKit >diff --git a/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp b/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp >index 179c24f1dd33a913d2167876f102f681c5893ff0..69fdeb63554629fd606315da804d3e371ba14b35 100644 >--- a/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp >@@ -29,6 +29,7 @@ > #include "BlobDataFileReferenceWithSandboxExtension.h" > #include "CacheStorageEngineConnectionMessages.h" > #include "DataReference.h" >+#include "Logging.h" > #include "NetworkBlobRegistry.h" > #include "NetworkCache.h" > #include "NetworkConnectionToWebProcessMessages.h" >@@ -61,6 +62,9 @@ > > using namespace WebCore; > >+#define RELEASE_LOG_IF_ALLOWED(fmt, ...) RELEASE_LOG_IF(true, Network, "%p - NetworkConnectionToWebProcess::" fmt, this, ##__VA_ARGS__) >+#define RELEASE_LOG_ERROR_IF_ALLOWED(fmt, ...) RELEASE_LOG_ERROR_IF(true, Network, "%p - NetworkConnectionToWebProcess::" fmt, this, ##__VA_ARGS__) >+ > namespace WebKit { > > Ref<NetworkConnectionToWebProcess> NetworkConnectionToWebProcess::create(IPC::Connection::Identifier connectionIdentifier) >@@ -180,6 +184,11 @@ void NetworkConnectionToWebProcess::didClose(IPC::Connection&) > loader->abort(); > ASSERT(m_networkResourceLoaders.isEmpty()); > >+ // All trackers of resources that were in the middle of being loaded were >+ // stopped with the abort() calls above, but we still need to sweep up the >+ // root activity trackers. >+ stopAllNetworkActivityTracking(); >+ > NetworkBlobRegistry::singleton().connectionToWebProcessDidClose(this); > NetworkProcess::singleton().removeNetworkConnectionToWebProcess(this); > >@@ -287,6 +296,11 @@ void NetworkConnectionToWebProcess::removeLoadIdentifier(ResourceLoadIdentifier > ASSERT(!m_networkResourceLoaders.contains(identifier)); > } > >+void NetworkConnectionToWebProcess::pageLoadCompleted(uint64_t webPageID) >+{ >+ stopAllNetworkActivityTrackingForPage(webPageID); >+} >+ > void NetworkConnectionToWebProcess::setDefersLoading(ResourceLoadIdentifier identifier, bool defers) > { > RefPtr<NetworkResourceLoader> loader = m_networkResourceLoaders.get(identifier); >@@ -532,4 +546,124 @@ void NetworkConnectionToWebProcess::resetOriginAccessWhitelists() > SecurityPolicy::resetOriginAccessWhitelists(); > } > >+static bool networkActivityTrackingEnabled() >+{ >+#if USE(NETWORK_ACTIVITY) >+ return NetworkProcess::singleton().trackNetworkActivity(); >+#else >+ return false; >+#endif >+} >+ >+std::optional<NetworkActivityTracker> NetworkConnectionToWebProcess::startTrackingResourceLoad(uint64_t pageID, ResourceLoadIdentifier resourceID, bool isMainResource) >+{ >+ if (!networkActivityTrackingEnabled()) >+ return std::nullopt; >+ >+ // Either get the existing root activity tracker for this page or create a >+ // new one if this is the main resource. >+ >+ size_t rootActivityIndex; >+ if (isMainResource) { >+ // If we're loading a page from the top, make sure any tracking of >+ // previous activity for this page is stopped. >+ >+ stopAllNetworkActivityTrackingForPage(pageID); >+ >+ rootActivityIndex = m_networkActivityTrackers.size(); >+ m_networkActivityTrackers.constructAndAppend(pageID); >+ m_networkActivityTrackers[rootActivityIndex].m_networkActivity.start(); >+ >+#if HAVE(NW_ACTIVITY) >+ ASSERT(m_networkActivityTrackers[rootActivityIndex].m_networkActivity.get()); >+#endif >+ } else { >+ rootActivityIndex = findRootNetworkActivity(pageID); >+ >+ // This could happen if the Networking process crashes, taking its >+ // previous state with it. >+ if (rootActivityIndex == notFound) >+ return std::nullopt; >+ >+#if HAVE(NW_ACTIVITY) >+ ASSERT(m_networkActivityTrackers[rootActivityIndex].m_networkActivity.get()); >+#endif >+ } >+ >+ // Create a tracker for the loading of the new resource, setting the root >+ // activity tracker as its parent. >+ >+ size_t newActivityIndex = m_networkActivityTrackers.size(); >+ m_networkActivityTrackers.constructAndAppend(pageID, resourceID); >+#if HAVE(NW_ACTIVITY) >+ ASSERT(m_networkActivityTrackers[newActivityIndex].m_networkActivity.get()); >+#endif >+ >+ auto& newActivityTracker = m_networkActivityTrackers[newActivityIndex]; >+ newActivityTracker.m_networkActivity.setParent(m_networkActivityTrackers[rootActivityIndex].m_networkActivity); >+ newActivityTracker.m_networkActivity.start(); >+ >+ return newActivityTracker.m_networkActivity; >+} >+ >+void NetworkConnectionToWebProcess::stopTrackingResourceLoad(ResourceLoadIdentifier resourceID, NetworkActivityTracker::CompletionCode code) >+{ >+ if (!networkActivityTrackingEnabled()) >+ return; >+ >+ auto itemIndex = findNetworkActivityTracker(resourceID); >+ if (itemIndex == notFound) { >+ RELEASE_LOG_ERROR(Network, "stopTrackingResourceLoad: Unable to find network activity for resource: %d", static_cast<int>(resourceID)); >+ return; >+ } >+ >+ m_networkActivityTrackers[itemIndex].m_networkActivity.complete(code); >+ m_networkActivityTrackers.remove(itemIndex); >+} >+ >+void NetworkConnectionToWebProcess::stopAllNetworkActivityTracking() >+{ >+ if (!networkActivityTrackingEnabled()) >+ return; >+ >+ for (size_t itemIndex = 0; itemIndex < m_networkActivityTrackers.size(); ++itemIndex) >+ m_networkActivityTrackers[itemIndex].m_networkActivity.complete(NetworkActivityTracker::CompletionCode::None); >+ m_networkActivityTrackers.clear(); >+} >+ >+void NetworkConnectionToWebProcess::stopAllNetworkActivityTrackingForPage(uint64_t pageID) >+{ >+ if (!networkActivityTrackingEnabled()) >+ return; >+ >+ size_t itemIndex = m_networkActivityTrackers.size(); >+ while (itemIndex > 0) { >+ --itemIndex; >+ if (m_networkActivityTrackers[itemIndex].m_pageID == pageID) { >+ m_networkActivityTrackers[itemIndex].m_networkActivity.complete(NetworkActivityTracker::CompletionCode::None); >+ m_networkActivityTrackers.remove(itemIndex); >+ } >+ } >+} >+ >+size_t NetworkConnectionToWebProcess::findRootNetworkActivity(uint64_t pageID) >+{ >+ for (size_t itemIndex = 0; itemIndex < m_networkActivityTrackers.size(); ++itemIndex) { >+ if (m_networkActivityTrackers[itemIndex].m_isRootActivity && m_networkActivityTrackers[itemIndex].m_pageID == pageID) >+ return itemIndex; >+ } >+ >+ return notFound; >+} >+ >+size_t NetworkConnectionToWebProcess::findNetworkActivityTracker(ResourceLoadIdentifier resourceID) >+{ >+ for (size_t itemIndex = 0; itemIndex < m_networkActivityTrackers.size(); ++itemIndex) { >+ if (m_networkActivityTrackers[itemIndex].m_resourceID == resourceID) >+ return itemIndex; >+ } >+ >+ return notFound; >+} >+ > } // namespace WebKit >diff --git a/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h b/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h >index 4cea2c6d4fa988cb3c8e4d4bc46f63b754f02ef1..d07421884126cceb4e09301d0a94ef7a85b64d58 100644 >--- a/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h >+++ b/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h >@@ -29,6 +29,7 @@ > #include "CacheStorageEngineConnection.h" > #include "Connection.h" > #include "DownloadID.h" >+#include "NetworkActivityTracker.h" > #include "NetworkConnectionToWebProcessMessages.h" > #include "NetworkMDNSRegister.h" > #include "NetworkRTCProvider.h" >@@ -111,6 +112,9 @@ public: > m_networkLoadInformationByID.remove(identifier); > } > >+ std::optional<NetworkActivityTracker> startTrackingResourceLoad(uint64_t pageID, ResourceLoadIdentifier resourceID, bool isMainResource); >+ void stopTrackingResourceLoad(ResourceLoadIdentifier resourceID, NetworkActivityTracker::CompletionCode); >+ > private: > NetworkConnectionToWebProcess(IPC::Connection::Identifier); > >@@ -133,6 +137,7 @@ private: > void preconnectTo(uint64_t preconnectionIdentifier, NetworkLoadParameters&&); > > void removeLoadIdentifier(ResourceLoadIdentifier); >+ void pageLoadCompleted(uint64_t webPageID); > void setDefersLoading(ResourceLoadIdentifier, bool); > void crossOriginRedirectReceived(ResourceLoadIdentifier, const WebCore::URL& redirectURL); > void startDownload(PAL::SessionID, DownloadID, const WebCore::ResourceRequest&, const String& suggestedName = { }); >@@ -180,11 +185,43 @@ private: > void removeOriginAccessWhitelistEntry(const String& sourceOrigin, const String& destinationProtocol, const String& destinationHost, bool allowDestinationSubdomains); > void resetOriginAccessWhitelists(); > >+ struct ResourceNetworkActivityTracker { >+ ResourceNetworkActivityTracker() = default; >+ ResourceNetworkActivityTracker(const ResourceNetworkActivityTracker&) = default; >+ ResourceNetworkActivityTracker(ResourceNetworkActivityTracker&&) = default; >+ ResourceNetworkActivityTracker(uint64_t pageID) >+ : m_pageID(pageID) >+ , m_resourceID(0) >+ , m_isRootActivity(true) >+ , m_networkActivity(NetworkActivityTracker::Label::LoadPage) >+ { >+ } >+ >+ ResourceNetworkActivityTracker(uint64_t pageID, ResourceLoadIdentifier resourceID) >+ : m_pageID(pageID) >+ , m_resourceID(resourceID) >+ , m_isRootActivity(false) >+ , m_networkActivity(NetworkActivityTracker::Label::LoadResource) >+ { >+ } >+ >+ uint64_t m_pageID; >+ ResourceLoadIdentifier m_resourceID; >+ bool m_isRootActivity; >+ NetworkActivityTracker m_networkActivity; >+ }; >+ >+ void stopAllNetworkActivityTracking(); >+ void stopAllNetworkActivityTrackingForPage(uint64_t pageID); >+ size_t findRootNetworkActivity(uint64_t pageID); >+ size_t findNetworkActivityTracker(ResourceLoadIdentifier resourceID); >+ > Ref<IPC::Connection> m_connection; > > HashMap<uint64_t, RefPtr<NetworkSocketStream>> m_networkSocketStreams; > HashMap<ResourceLoadIdentifier, RefPtr<NetworkResourceLoader>> m_networkResourceLoaders; > HashMap<String, RefPtr<WebCore::BlobDataFileReference>> m_blobDataFileReferences; >+ Vector<ResourceNetworkActivityTracker> m_networkActivityTrackers; > > HashMap<ResourceLoadIdentifier, NetworkLoadInformation> m_networkLoadInformationByID; > >diff --git a/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in b/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in >index 9a5a4f21560da67e8a7f0be61e55b6c7d1716c47..f4ec63311f77a3be67187b896d52a0178baf7154 100644 >--- a/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in >+++ b/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in >@@ -26,6 +26,7 @@ messages -> NetworkConnectionToWebProcess LegacyReceiver { > PerformSynchronousLoad(WebKit::NetworkResourceLoadParameters resourceLoadParameters) -> (WebCore::ResourceError error, WebCore::ResourceResponse response, Vector<char> data) Delayed > LoadPing(WebKit::NetworkResourceLoadParameters resourceLoadParameters) > RemoveLoadIdentifier(uint64_t resourceLoadIdentifier) >+ PageLoadCompleted(uint64_t webPageID) > SetDefersLoading(uint64_t resourceLoadIdentifier, bool defers) > PrefetchDNS(String hostname) > PreconnectTo(uint64_t preconnectionIdentifier, WebKit::NetworkResourceLoadParameters loadParameters); >diff --git a/Source/WebKit/NetworkProcess/NetworkDataTask.cpp b/Source/WebKit/NetworkProcess/NetworkDataTask.cpp >index 55dcb05097b82636e2bf7fab86ce2bb9263486c5..2d354ad9c704923858b78aedc50b50e301d9a53e 100644 >--- a/Source/WebKit/NetworkProcess/NetworkDataTask.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkDataTask.cpp >@@ -54,7 +54,7 @@ Ref<NetworkDataTask> NetworkDataTask::create(NetworkSession& session, NetworkDat > return NetworkDataTaskBlob::create(session, client, parameters.request, parameters.contentSniffingPolicy, parameters.blobFileReferences); > > #if PLATFORM(COCOA) >- return NetworkDataTaskCocoa::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.shouldPreconnectOnly); >+ return NetworkDataTaskCocoa::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.shouldPreconnectOnly, parameters.networkActivityTracker); > #endif > #if USE(SOUP) > return NetworkDataTaskSoup::create(session, client, parameters.request, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect); >diff --git a/Source/WebKit/NetworkProcess/NetworkLoadParameters.h b/Source/WebKit/NetworkProcess/NetworkLoadParameters.h >index 53c47f8d623a7402b2090235dddbb7377fa8f6a9..fd0a6a99d6ea0f4558d0bd62878e9c4a48cfbe55 100644 >--- a/Source/WebKit/NetworkProcess/NetworkLoadParameters.h >+++ b/Source/WebKit/NetworkProcess/NetworkLoadParameters.h >@@ -25,6 +25,7 @@ > > #pragma once > >+#include "NetworkActivityTracker.h" > #include <WebCore/BlobDataFileReference.h> > #include <WebCore/ResourceLoaderOptions.h> > #include <WebCore/ResourceRequest.h> >@@ -50,6 +51,7 @@ public: > bool needsCertificateInfo { false }; > Vector<RefPtr<WebCore::BlobDataFileReference>> blobFileReferences; > PreconnectOnly shouldPreconnectOnly { PreconnectOnly::No }; >+ std::optional<NetworkActivityTracker> networkActivityTracker; > }; > > } // namespace WebKit >diff --git a/Source/WebKit/NetworkProcess/NetworkProcess.cpp b/Source/WebKit/NetworkProcess/NetworkProcess.cpp >index 3b0ff20185115445ba81e870b4295057d536db90..077bd73b043c80c1146c341be49135a595c828cb 100644 >--- a/Source/WebKit/NetworkProcess/NetworkProcess.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkProcess.cpp >@@ -298,6 +298,8 @@ void NetworkProcess::initializeNetworkProcess(NetworkProcessCreationParameters&& > for (auto& scheme : parameters.urlSchemesRegisteredAsCanDisplayOnlyIfCanRequest) > registerURLSchemeAsCanDisplayOnlyIfCanRequest(scheme); > >+ m_trackNetworkActivity = parameters.trackNetworkActivity; >+ > RELEASE_LOG(Process, "%p - NetworkProcess::initializeNetworkProcess: Presenting process = %d", this, WebCore::presentingApplicationPID()); > } > >diff --git a/Source/WebKit/NetworkProcess/NetworkProcess.h b/Source/WebKit/NetworkProcess/NetworkProcess.h >index ce412b459286b369df12cd08f33385ad8c9ddde9..b961abcb009fd212be159666b3a140a44280f31a 100644 >--- a/Source/WebKit/NetworkProcess/NetworkProcess.h >+++ b/Source/WebKit/NetworkProcess/NetworkProcess.h >@@ -162,6 +162,8 @@ public: > NetworkContentRuleListManager& networkContentRuleListManager() { return m_NetworkContentRuleListManager; } > #endif > >+ bool trackNetworkActivity() const { return m_trackNetworkActivity; } >+ > private: > NetworkProcess(); > ~NetworkProcess(); >@@ -300,6 +302,8 @@ private: > #if ENABLE(CONTENT_EXTENSIONS) > NetworkContentRuleListManager m_NetworkContentRuleListManager; > #endif >+ >+ bool m_trackNetworkActivity { false }; > }; > > } // namespace WebKit >diff --git a/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp b/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp >index a84e498cffc495a09ef6d9fe980eae1c6c719f7c..3d24d23a4f5323e287022a1784dc3eecf1828341 100644 >--- a/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp >@@ -115,6 +115,8 @@ void NetworkProcessCreationParameters::encode(IPC::Encoder& encoder) const > encoder << urlSchemesRegisteredAsDisplayIsolated; > encoder << urlSchemesRegisteredAsCORSEnabled; > encoder << urlSchemesRegisteredAsCanDisplayOnlyIfCanRequest; >+ >+ encoder << trackNetworkActivity; > } > > bool NetworkProcessCreationParameters::decode(IPC::Decoder& decoder, NetworkProcessCreationParameters& result) >@@ -275,6 +277,9 @@ bool NetworkProcessCreationParameters::decode(IPC::Decoder& decoder, NetworkProc > if (!decoder.decode(result.urlSchemesRegisteredAsCanDisplayOnlyIfCanRequest)) > return false; > >+ if (!decoder.decode(result.trackNetworkActivity)) >+ return false; >+ > return true; > } > >diff --git a/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h b/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h >index c2b680b025304c57f7f404bcc2a19dac3b857114..d147533ba21ea987a7e989da018cee7d9977a518 100644 >--- a/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h >+++ b/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h >@@ -132,6 +132,8 @@ struct NetworkProcessCreationParameters { > Vector<String> urlSchemesRegisteredAsDisplayIsolated; > Vector<String> urlSchemesRegisteredAsCanDisplayOnlyIfCanRequest; > Vector<String> urlSchemesRegisteredAsCORSEnabled; >+ >+ bool trackNetworkActivity { false }; > }; > > } // namespace WebKit >diff --git a/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp b/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp >index c23eca442a81591200d12e377baa42b3a67246e0..aa73f4484f258b1049e40e983606825365cf3a90 100644 >--- a/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp >@@ -184,6 +184,8 @@ void NetworkResourceLoader::start() > { > ASSERT(RunLoop::isMain()); > >+ m_parameters.networkActivityTracker = m_connection->startTrackingResourceLoad(m_parameters.webPageID, m_parameters.identifier, isMainResource()); >+ > if (m_defersLoading) { > RELEASE_LOG_IF_ALLOWED("start: Loading is deferred (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ", isMainResource = %d, isSynchronous = %d)", m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier, isMainResource(), isSynchronous()); > return; >@@ -323,10 +325,15 @@ void NetworkResourceLoader::setDefersLoading(bool defers) > RELEASE_LOG_IF_ALLOWED("setDefersLoading: defers = %d, but nothing to do (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ")", m_defersLoading, m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier); > } > >-void NetworkResourceLoader::cleanup() >+void NetworkResourceLoader::cleanup(LoadResult result) > { > ASSERT(RunLoop::isMain()); > >+ m_connection->stopTrackingResourceLoad(m_parameters.identifier, >+ result == LoadResult::Success ? NetworkActivityTracker::CompletionCode::Success : >+ result == LoadResult::Failure ? NetworkActivityTracker::CompletionCode::Failure : >+ NetworkActivityTracker::CompletionCode::None); >+ > m_bufferingTimer.stop(); > > invalidateSandboxExtensions(); >@@ -359,7 +366,7 @@ void NetworkResourceLoader::abort() > m_networkLoad->cancel(); > } > >- cleanup(); >+ cleanup(LoadResult::Cancel); > } > > static bool areFrameAncestorsSameSite(const ResourceResponse& response, const Vector<RefPtr<SecurityOrigin>>& frameAncestorOrigins) >@@ -531,7 +538,7 @@ void NetworkResourceLoader::didFinishLoading(const NetworkLoadMetrics& networkLo > > tryStoreAsCacheEntry(); > >- cleanup(); >+ cleanup(LoadResult::Success); > } > > void NetworkResourceLoader::didFailLoading(const ResourceError& error) >@@ -551,7 +558,7 @@ void NetworkResourceLoader::didFailLoading(const ResourceError& error) > } else if (auto* connection = messageSenderConnection()) > connection->send(Messages::WebResourceLoader::DidFailResourceLoad(error), messageSenderDestinationID()); > >- cleanup(); >+ cleanup(LoadResult::Failure); > } > > void NetworkResourceLoader::didBlockAuthenticationChallenge() >@@ -746,7 +753,7 @@ void NetworkResourceLoader::didRetrieveCacheEntry(std::unique_ptr<NetworkCache:: > if (isSynchronous()) { > m_synchronousLoadData->response = WTFMove(response); > sendReplyToSynchronousRequest(*m_synchronousLoadData, entry->buffer()); >- cleanup(); >+ cleanup(LoadResult::Success); > return; > } > >@@ -780,7 +787,7 @@ void NetworkResourceLoader::continueProcessingCachedEntryAfterDidReceiveResponse > } > if (retrievedAll) { > loader->sendResultForCacheEntry(WTFMove(entry)); >- loader->cleanup(); >+ loader->cleanup(LoadResult::Success); > } > }); > } >@@ -789,7 +796,7 @@ void NetworkResourceLoader::continueProcessingCachedEntryAfterDidReceiveResponse > > sendResultForCacheEntry(WTFMove(entry)); > >- cleanup(); >+ cleanup(LoadResult::Success); > } > > void NetworkResourceLoader::sendResultForCacheEntry(std::unique_ptr<NetworkCache::Entry> entry) >diff --git a/Source/WebKit/NetworkProcess/NetworkResourceLoader.h b/Source/WebKit/NetworkProcess/NetworkResourceLoader.h >index 8769708c0a200dd261bf16ff92669e8a2364548a..009ff9b002e06575a05561412a4cfbbf31a119bb 100644 >--- a/Source/WebKit/NetworkProcess/NetworkResourceLoader.h >+++ b/Source/WebKit/NetworkProcess/NetworkResourceLoader.h >@@ -134,7 +134,13 @@ private: > void startNetworkLoad(WebCore::ResourceRequest&&, FirstLoad); > void continueDidReceiveResponse(); > >- void cleanup(); >+ enum class LoadResult { >+ Unknown, >+ Success, >+ Failure, >+ Cancel >+ }; >+ void cleanup(LoadResult); > > void platformDidReceiveResponse(const WebCore::ResourceResponse&); > >@@ -153,7 +159,7 @@ private: > > WebCore::ResourceResponse sanitizeResponseIfPossible(WebCore::ResourceResponse&&, WebCore::ResourceResponse::SanitizationType); > >- const NetworkResourceLoadParameters m_parameters; >+ NetworkResourceLoadParameters m_parameters; > > Ref<NetworkConnectionToWebProcess> m_connection; > >diff --git a/Source/WebKit/NetworkProcess/cocoa/NetworkActivityTrackerCocoa.mm b/Source/WebKit/NetworkProcess/cocoa/NetworkActivityTrackerCocoa.mm >new file mode 100644 >index 0000000000000000000000000000000000000000..345836d5e1511e43187444bc421700b505613a76 >--- /dev/null >+++ b/Source/WebKit/NetworkProcess/cocoa/NetworkActivityTrackerCocoa.mm >@@ -0,0 +1,76 @@ >+/* >+ * Copyright (C) 22018 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "NetworkActivityTracker.h" >+ >+#if HAVE(NW_ACTIVITY) >+ >+namespace WebKit { >+ >+NetworkActivityTracker::NetworkActivityTracker(Label label, Domain domain) >+ : m_domain(domain) >+ , m_label(label) >+ , m_networkActivity(adoptNS(nw_activity_create(static_cast<uint32_t>(m_domain), static_cast<uint32_t>(m_label)))) >+{ >+} >+ >+NetworkActivityTracker::~NetworkActivityTracker() >+{ >+} >+ >+void NetworkActivityTracker::setParent(NetworkActivityTracker& parent) >+{ >+ ASSERT(m_networkActivity.get()); >+ ASSERT(parent.m_networkActivity.get()); >+ nw_activity_set_parent_activity(m_networkActivity.get(), parent.m_networkActivity.get()); >+} >+ >+void NetworkActivityTracker::start() >+{ >+ ASSERT(m_networkActivity.get()); >+ nw_activity_activate(m_networkActivity.get()); >+} >+ >+void NetworkActivityTracker::complete(CompletionCode code) >+{ >+ if (m_isCompleted) >+ return; >+ >+ m_isCompleted = true; >+ >+ ASSERT(m_networkActivity.get()); >+ auto reason = >+ code == CompletionCode::None ? nw_activity_completion_reason_none : >+ code == CompletionCode::Success ? nw_activity_completion_reason_success : >+ code == CompletionCode::Failure ? nw_activity_completion_reason_failure : >+ nw_activity_completion_reason_invalid; >+ nw_activity_complete_with_reason(m_networkActivity.get(), reason); >+ m_networkActivity.clear(); >+} >+ >+} // namespace WebKit >+ >+#endif // HAVE(NW_ACTIVITY) >diff --git a/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h b/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h >index c35c3af5f75192e296ed23230e760522cddd6432..a5b7cff93ad94ced5224537aa88cdb3d4b121701 100644 >--- a/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h >+++ b/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h >@@ -25,6 +25,7 @@ > > #pragma once > >+#include "NetworkActivityTracker.h" > #include "NetworkDataTask.h" > #include "NetworkLoadParameters.h" > #include "WiFiAssertionHolder.h" >@@ -41,9 +42,9 @@ class NetworkSessionCocoa; > class NetworkDataTaskCocoa final : public NetworkDataTask { > friend class NetworkSessionCocoa; > public: >- static Ref<NetworkDataTask> create(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly) >+ static Ref<NetworkDataTask> create(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, std::optional<NetworkActivityTracker> networkActivityTracker) > { >- return adoptRef(*new NetworkDataTaskCocoa(session, client, request, frameID, pageID, storedCredentialsPolicy, shouldContentSniff, shouldContentEncodingSniff, shouldClearReferrerOnHTTPSToHTTPRedirect, shouldPreconnectOnly)); >+ return adoptRef(*new NetworkDataTaskCocoa(session, client, request, frameID, pageID, storedCredentialsPolicy, shouldContentSniff, shouldContentEncodingSniff, shouldClearReferrerOnHTTPSToHTTPRedirect, shouldPreconnectOnly, networkActivityTracker)); > } > > ~NetworkDataTaskCocoa(); >@@ -81,7 +82,7 @@ public: > #endif > > private: >- NetworkDataTaskCocoa(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly); >+ NetworkDataTaskCocoa(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly, std::optional<NetworkActivityTracker>); > > bool tryPasswordBasedAuthentication(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler&); > void applySniffingPoliciesAndBindRequestToInferfaceIfNeeded(NSURLRequest*&, bool shouldContentSniff, bool shouldContentEncodingSniff); >diff --git a/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm b/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm >index 4b941a5be23bb1aa06f8e9981ce138226df64241..8cbf48db35f876694cd7cedc40894e9ca00aa7d5 100644 >--- a/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm >+++ b/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm >@@ -55,6 +55,10 @@ @property (readwrite) BOOL _isTopLevelNavigation; > @end > #endif > >+#if HAVE(NW_ACTIVITY) >+#import <CFNetwork/CFNSURLConnection.h> >+#endif >+ > namespace WebKit { > > #if USE(CREDENTIAL_STORAGE_WITH_NETWORK_SESSION) >@@ -175,7 +179,7 @@ static void updateTaskWithFirstPartyForSameSiteCookies(NSURLSessionDataTask* tas > #endif > } > >-NetworkDataTaskCocoa::NetworkDataTaskCocoa(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& requestWithCredentials, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly) >+NetworkDataTaskCocoa::NetworkDataTaskCocoa(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& requestWithCredentials, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, std::optional<NetworkActivityTracker> networkActivityTracker) > : NetworkDataTask(session, client, requestWithCredentials, storedCredentialsPolicy, shouldClearReferrerOnHTTPSToHTTPRedirect) > , m_frameID(frameID) > , m_pageID(pageID) >@@ -267,6 +271,11 @@ NetworkDataTaskCocoa::NetworkDataTaskCocoa(NetworkSession& session, NetworkDataT > m_task.get().priority = toNSURLSessionTaskPriority(request.priority()); > > updateTaskWithFirstPartyForSameSiteCookies(m_task.get(), request); >+ >+#if HAVE(NW_ACTIVITY) >+ if (networkActivityTracker) >+ m_task.get()._nw_activity = networkActivityTracker.value().get(); >+#endif > } > > NetworkDataTaskCocoa::~NetworkDataTaskCocoa() >diff --git a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp >index bacffa7ad1626607e232e8dd9f92dfaeabed65e0..6d88a0f7338269b423e97fc32928e9c45919393d 100644 >--- a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp >+++ b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp >@@ -129,6 +129,7 @@ Ref<ProcessPoolConfiguration> ProcessPoolConfiguration::copy() > copy->m_presentingApplicationPID = this->m_presentingApplicationPID; > copy->m_processSwapsOnNavigation = this->m_processSwapsOnNavigation; > copy->m_processSwapsOnWindowOpenWithOpener = this->m_processSwapsOnWindowOpenWithOpener; >+ copy->m_trackNetworkActivity = this->m_trackNetworkActivity; > > return copy; > } >diff --git a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h >index 3dc2b182bfb099ae0f6a3b779dfe038351e699ce..91105d3f14e66ea75fc2a4cb2c25e0996ba9218e 100644 >--- a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h >+++ b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h >@@ -141,6 +141,9 @@ public: > bool processSwapsOnWindowOpenWithOpener() const { return m_processSwapsOnWindowOpenWithOpener; } > void setProcessSwapsOnWindowOpenWithOpener(bool swaps) { m_processSwapsOnWindowOpenWithOpener = swaps; } > >+ bool trackNetworkActivity() const { return m_trackNetworkActivity; } >+ void setTrackNetworkActivity(bool track) { m_trackNetworkActivity = track; } >+ > private: > bool m_shouldHaveLegacyDataStore { false }; > >@@ -174,6 +177,7 @@ private: > ProcessID m_presentingApplicationPID { getCurrentProcessID() }; > bool m_processSwapsOnNavigation { false }; > bool m_processSwapsOnWindowOpenWithOpener { false }; >+ bool m_trackNetworkActivity { false }; > > #if PLATFORM(IOS) > WTF::String m_ctDataConnectionServiceType; >diff --git a/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.cpp b/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.cpp >index f7896ce515ec6e3ed4a3db865ff326a4968ec11e..2cacc05c42112ef863e8fcb69a8f08abfe915760 100644 >--- a/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.cpp >+++ b/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.cpp >@@ -177,3 +177,13 @@ void WKContextConfigurationSetProcessSwapsOnWindowOpenWithOpener(WKContextConfig > { > toImpl(configuration)->setProcessSwapsOnWindowOpenWithOpener(swaps); > } >+ >+bool WKContextConfigurationTrackNetworkActivity(WKContextConfigurationRef configuration) >+{ >+ return toImpl(configuration)->trackNetworkActivity(); >+} >+ >+void WKContextConfigurationSetTrackNetworkActivity(WKContextConfigurationRef configuration, bool track) >+{ >+ toImpl(configuration)->setTrackNetworkActivity(track); >+} >diff --git a/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.h b/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.h >index 77ae17137e5720fca15485a5c0e5d43cc54a86d1..f512c55dd864e47e796f8b8c3d3762920500022b 100644 >--- a/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.h >+++ b/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.h >@@ -74,6 +74,9 @@ WK_EXPORT void WKContextConfigurationSetProcessSwapsOnNavigation(WKContextConfig > WK_EXPORT bool WKContextConfigurationProcessSwapsOnWindowOpenWithOpener(WKContextConfigurationRef configuration); > WK_EXPORT void WKContextConfigurationSetProcessSwapsOnWindowOpenWithOpener(WKContextConfigurationRef configuration, bool swaps); > >+WK_EXPORT bool WKContextConfigurationTrackNetworkActivity(WKContextConfigurationRef configuration); >+WK_EXPORT void WKContextConfigurationSetTrackNetworkActivity(WKContextConfigurationRef configuration, bool track); >+ > #ifdef __cplusplus > } > #endif >diff --git a/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h b/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h >index 2a13728bb9c2e5058bd07a9db0cd6769ceff03a8..3075cf1f9d8b1974ada5cc210681761608378a15 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h >+++ b/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h >@@ -59,6 +59,7 @@ WK_CLASS_AVAILABLE(macosx(10.10), ios(8.0)) > @property (nonatomic) pid_t presentingApplicationPID WK_API_AVAILABLE(macosx(10.13), ios(11.0)); > @property (nonatomic) BOOL processSwapsOnNavigation WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); > @property (nonatomic) BOOL processSwapsOnWindowOpenWithOpener WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); >+@property (nonatomic) BOOL trackNetworkActivity 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 cd29da86302d95435dcaf2dcdcc2764e5959ad17..1e3bd797aeb4e793c992d45cc93ea3dd115adf2c 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm >+++ b/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm >@@ -247,6 +247,16 @@ - (BOOL)processSwapsOnWindowOpenWithOpener > return _processPoolConfiguration->processSwapsOnWindowOpenWithOpener(); > } > >+- (BOOL)trackNetworkActivity >+{ >+ return _processPoolConfiguration->trackNetworkActivity(); >+} >+ >+- (void)setTrackNetworkActivity:(BOOL)track >+{ >+ _processPoolConfiguration->setTrackNetworkActivity(track); >+} >+ > #if PLATFORM(IOS) > - (NSString *)CTDataConnectionServiceType > { >diff --git a/Source/WebKit/UIProcess/WebProcessPool.cpp b/Source/WebKit/UIProcess/WebProcessPool.cpp >index 2ba440a93212798be0951a4e03dc73c89b29ba6f..3fe86c11a6c8e901b84617fd2b1a916184abe31c 100644 >--- a/Source/WebKit/UIProcess/WebProcessPool.cpp >+++ b/Source/WebKit/UIProcess/WebProcessPool.cpp >@@ -494,6 +494,8 @@ NetworkProcessProxy& WebProcessPool::ensureNetworkProcess(WebsiteDataStore* with > parameters.urlSchemesRegisteredAsCORSEnabled = copyToVector(m_schemesToRegisterAsCORSEnabled); > parameters.urlSchemesRegisteredAsCanDisplayOnlyIfCanRequest = copyToVector(m_schemesToRegisterAsCanDisplayOnlyIfCanRequest); > >+ parameters.trackNetworkActivity = m_configuration->trackNetworkActivity(); >+ > // Add any platform specific parameters > platformInitializeNetworkProcess(parameters); > >diff --git a/Source/WebKit/WebKit.xcodeproj/project.pbxproj b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >index 882bb8aadb2dc01184c4c3fb77fb7f36e5ff9ab4..2d64afbc2e6d1430c8a830223fb1aff0191305d7 100644 >--- a/Source/WebKit/WebKit.xcodeproj/project.pbxproj >+++ b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >@@ -1211,10 +1211,13 @@ > 530258451DCBBD2200DA89C2 /* NetworkCaptureReplayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 530258381DCBBD1D00DA89C2 /* NetworkCaptureReplayer.h */; }; > 530258461DCBBD2200DA89C2 /* NetworkDataTaskReplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 530258391DCBBD1D00DA89C2 /* NetworkDataTaskReplay.cpp */; }; > 530258471DCBBD2200DA89C2 /* NetworkDataTaskReplay.h in Headers */ = {isa = PBXBuildFile; fileRef = 5302583A1DCBBD1D00DA89C2 /* NetworkDataTaskReplay.h */; }; >+ 5315876C2076B762004BF9F3 /* NetworkActivityTrackerCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5315876B2076B713004BF9F3 /* NetworkActivityTrackerCocoa.mm */; }; > 532159531DBAE7180054AA3C /* NetworkSession.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 532159521DBAE6FC0054AA3C /* NetworkSession.cpp */; }; > 532159541DBAE71D0054AA3C /* NetworkDataTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 532159511DBAE6FC0054AA3C /* NetworkDataTask.cpp */; }; > 532159551DBAE7290054AA3C /* NetworkSessionCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 532159501DBAE6D70054AA3C /* NetworkSessionCocoa.h */; }; > 532159561DBAE72D0054AA3C /* NetworkDataTaskCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 5321594F1DBAE6D70054AA3C /* NetworkDataTaskCocoa.h */; }; >+ 535BCB922069C49C00CCCE02 /* NetworkActivityTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 535BCB902069C49C00CCCE02 /* NetworkActivityTracker.h */; }; >+ 5379DB72207E9470007D8C33 /* NetworkActivityTracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 53F3CAA5206C443E0086490E /* NetworkActivityTracker.cpp */; }; > 53BA47D01DC2EF5E004DF4AD /* NetworkDataTaskBlob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 539EB5461DC2EE40009D48CF /* NetworkDataTaskBlob.cpp */; }; > 53BA47D11DC2EF5E004DF4AD /* NetworkDataTaskBlob.h in Headers */ = {isa = PBXBuildFile; fileRef = 539EB5471DC2EE40009D48CF /* NetworkDataTaskBlob.h */; }; > 53DEA3661DDE423100E82648 /* json.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 53DEA3651DDE422E00E82648 /* json.hpp */; }; >@@ -3659,13 +3662,16 @@ > 530258381DCBBD1D00DA89C2 /* NetworkCaptureReplayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkCaptureReplayer.h; path = NetworkProcess/capture/NetworkCaptureReplayer.h; sourceTree = "<group>"; }; > 530258391DCBBD1D00DA89C2 /* NetworkDataTaskReplay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkDataTaskReplay.cpp; path = NetworkProcess/capture/NetworkDataTaskReplay.cpp; sourceTree = "<group>"; }; > 5302583A1DCBBD1D00DA89C2 /* NetworkDataTaskReplay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkDataTaskReplay.h; path = NetworkProcess/capture/NetworkDataTaskReplay.h; sourceTree = "<group>"; }; >+ 5315876B2076B713004BF9F3 /* NetworkActivityTrackerCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = NetworkActivityTrackerCocoa.mm; path = NetworkProcess/cocoa/NetworkActivityTrackerCocoa.mm; sourceTree = "<group>"; }; > 5321594F1DBAE6D70054AA3C /* NetworkDataTaskCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkDataTaskCocoa.h; path = NetworkProcess/cocoa/NetworkDataTaskCocoa.h; sourceTree = "<group>"; }; > 532159501DBAE6D70054AA3C /* NetworkSessionCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkSessionCocoa.h; path = NetworkProcess/cocoa/NetworkSessionCocoa.h; sourceTree = "<group>"; }; > 532159511DBAE6FC0054AA3C /* NetworkDataTask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkDataTask.cpp; path = NetworkProcess/NetworkDataTask.cpp; sourceTree = "<group>"; }; > 532159521DBAE6FC0054AA3C /* NetworkSession.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkSession.cpp; path = NetworkProcess/NetworkSession.cpp; sourceTree = "<group>"; }; >+ 535BCB902069C49C00CCCE02 /* NetworkActivityTracker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = NetworkActivityTracker.h; path = NetworkProcess/NetworkActivityTracker.h; sourceTree = "<group>"; }; > 539EB5461DC2EE40009D48CF /* NetworkDataTaskBlob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkDataTaskBlob.cpp; path = NetworkProcess/NetworkDataTaskBlob.cpp; sourceTree = "<group>"; }; > 539EB5471DC2EE40009D48CF /* NetworkDataTaskBlob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkDataTaskBlob.h; path = NetworkProcess/NetworkDataTaskBlob.h; sourceTree = "<group>"; }; > 53DEA3651DDE422E00E82648 /* json.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = json.hpp; path = NetworkProcess/capture/json.hpp; sourceTree = "<group>"; }; >+ 53F3CAA5206C443E0086490E /* NetworkActivityTracker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkActivityTracker.cpp; path = NetworkProcess/NetworkActivityTracker.cpp; sourceTree = "<group>"; }; > 5750F32A2032D4E500389347 /* LocalAuthentication.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LocalAuthentication.framework; path = System/Library/Frameworks/LocalAuthentication.framework; sourceTree = SDKROOT; }; > 5760828B2029854200116678 /* WebCredentialsMessenger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebCredentialsMessenger.h; sourceTree = "<group>"; }; > 5760828C2029854200116678 /* WebCredentialsMessenger.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WebCredentialsMessenger.cpp; sourceTree = "<group>"; }; >@@ -6400,6 +6406,8 @@ > 2DA944BB188511DD00ED86DB /* ios */, > 510CC7DC16138E2900D03ED3 /* mac */, > 413075971DE84ED70039EC69 /* webrtc */, >+ 53F3CAA5206C443E0086490E /* NetworkActivityTracker.cpp */, >+ 535BCB902069C49C00CCCE02 /* NetworkActivityTracker.h */, > 513A16491630A9BF005D7D22 /* NetworkConnectionToWebProcess.cpp */, > 513A164A1630A9BF005D7D22 /* NetworkConnectionToWebProcess.h */, > 513A164B1630A9BF005D7D22 /* NetworkConnectionToWebProcess.messages.in */, >@@ -6926,6 +6934,7 @@ > 7EC4F0F818E4A922008056AF /* cocoa */ = { > isa = PBXGroup; > children = ( >+ 5315876B2076B713004BF9F3 /* NetworkActivityTrackerCocoa.mm */, > 5321594F1DBAE6D70054AA3C /* NetworkDataTaskCocoa.h */, > 5CBC9B8B1C65257300A8FDCF /* NetworkDataTaskCocoa.mm */, > 7EC4F0F918E4A945008056AF /* NetworkProcessCocoa.mm */, >@@ -9015,6 +9024,7 @@ > 1A6FBD2811E69BC200DB1371 /* NetscapePlugin.h in Headers */, > 1A4A9C5612B816CF008FE984 /* NetscapePluginModule.h in Headers */, > 1AA5889211EE70400061B882 /* NetscapePluginStream.h in Headers */, >+ 535BCB922069C49C00CCCE02 /* NetworkActivityTracker.h in Headers */, > E1798C7A16E6818800240139 /* NetworkBlobRegistry.h in Headers */, > E4436ECC1A0D040B00EAD204 /* NetworkCache.h in Headers */, > E49D40D71AD3FB170066B7B9 /* NetworkCacheBlobStorage.h in Headers */, >@@ -10682,6 +10692,7 @@ > 2D50365E1BCC793F00E20BB3 /* NativeWebGestureEventMac.mm in Sources */, > 2DA9449E1884E4F000ED86DB /* NativeWebKeyboardEventIOS.mm in Sources */, > C02BFF1E1251502E009CCBEA /* NativeWebKeyboardEventMac.mm in Sources */, >+ 1C9EBA5C2087E74F00054429 /* NativeWebMouseEventIOS.mm in Sources */, > 31EA25D2134F78C0005B1452 /* NativeWebMouseEventMac.mm in Sources */, > 2DA9449F1884E4F000ED86DB /* NativeWebTouchEventIOS.mm in Sources */, > DF58C6361371ACA000F9A37C /* NativeWebWheelEventMac.mm in Sources */, >@@ -10693,6 +10704,8 @@ > 1A4A9C5512B816CF008FE984 /* NetscapePluginModule.cpp in Sources */, > 1A4A9C9A12B821CD008FE984 /* NetscapePluginModuleMac.mm in Sources */, > 1AA5889311EE70400061B882 /* NetscapePluginStream.cpp in Sources */, >+ 5379DB72207E9470007D8C33 /* NetworkActivityTracker.cpp in Sources */, >+ 5315876C2076B762004BF9F3 /* NetworkActivityTrackerCocoa.mm in Sources */, > E1798C7916E6818800240139 /* NetworkBlobRegistry.cpp in Sources */, > E4436ECA1A0D03FA00EAD204 /* NetworkCache.cpp in Sources */, > E49D40D91AD3FB210066B7B9 /* NetworkCacheBlobStorage.cpp in Sources */, >@@ -10708,7 +10721,6 @@ > 832AE2531BE2E8CD00FAAE10 /* NetworkCacheSpeculativeLoadManager.cpp in Sources */, > 83BDCCB91AC5FDB6003F6441 /* NetworkCacheStatistics.cpp in Sources */, > E4436ED01A0D040B00EAD204 /* NetworkCacheStorage.cpp in Sources */, >- 1C9EBA5C2087E74F00054429 /* NativeWebMouseEventIOS.mm in Sources */, > 8310428C1BD6B66F00A715E4 /* NetworkCacheSubresourcesEntry.cpp in Sources */, > 5302583D1DCBBD2200DA89C2 /* NetworkCaptureEvent.cpp in Sources */, > 530258401DCBBD2200DA89C2 /* NetworkCaptureManager.cpp in Sources */, >diff --git a/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp b/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp >index 86b9509f44290ccae2ff33a9ef985686902557df..8ba060efd2194c406460a212cafff052077a4f0b 100644 >--- a/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp >+++ b/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp >@@ -522,6 +522,11 @@ void WebLoaderStrategy::loadResourceSynchronously(FrameLoader& frameLoader, unsi > } > } > >+void WebLoaderStrategy::pageLoadCompleted(uint64_t webPageID) >+{ >+ WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::PageLoadCompleted(webPageID), 0); >+} >+ > static uint64_t generateLoadIdentifier() > { > static uint64_t identifier = 0; >diff --git a/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h b/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h >index 65786330c2a8bcce174ae499488522df8e3e9524..96925bc05816b90bd3cbde6a68149a5ed9003cd3 100644 >--- a/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h >+++ b/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h >@@ -49,6 +49,7 @@ public: > > void loadResource(WebCore::Frame&, WebCore::CachedResource&, WebCore::ResourceRequest&&, const WebCore::ResourceLoaderOptions&, CompletionHandler<void(RefPtr<WebCore::SubresourceLoader>&&)>&&) final; > void loadResourceSynchronously(WebCore::FrameLoader&, unsigned long resourceLoadIdentifier, const WebCore::ResourceRequest&, WebCore::ClientCredentialPolicy, const WebCore::FetchOptions&, const WebCore::HTTPHeaderMap&, WebCore::ResourceError&, WebCore::ResourceResponse&, Vector<char>& data) final; >+ void pageLoadCompleted(uint64_t webPageID) final; > > void remove(WebCore::ResourceLoader*) final; > void setDefersLoading(WebCore::ResourceLoader*, bool) final; >diff --git a/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp b/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp >index c60b2e45335c3a046c4e277cb7e4be6768c7ccc9..641e67c36ebf486c77d400c614a0065cc44d5d4c 100644 >--- a/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp >+++ b/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp >@@ -111,6 +111,10 @@ void WebResourceLoadScheduler::loadResourceSynchronously(FrameLoader& frameLoade > ResourceHandle::loadResourceSynchronously(frameLoader.networkingContext(), request, options.credentials == FetchOptions::Credentials::Omit ? StoredCredentialsPolicy::DoNotUse : StoredCredentialsPolicy::Use, error, response, data); > } > >+void WebResourceLoadScheduler::pageLoadCompleted(uint64_t /*webPageID*/) >+{ >+} >+ > void WebResourceLoadScheduler::schedulePluginStreamLoad(Frame& frame, NetscapePlugInStreamLoaderClient& client, ResourceRequest&& request, CompletionHandler<void(RefPtr<WebCore::NetscapePlugInStreamLoader>&&)>&& completionHandler) > { > NetscapePlugInStreamLoader::create(frame, client, WTFMove(request), [this, completionHandler = WTFMove(completionHandler)] (RefPtr<WebCore::NetscapePlugInStreamLoader>&& loader) mutable { >diff --git a/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h b/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h >index 8828b5498aced368c56ab8a855739373245f0adb..770d63efc6ac989170de46ea7c3855a20ac65821 100644 >--- a/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h >+++ b/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h >@@ -51,6 +51,8 @@ public: > > void loadResource(WebCore::Frame&, WebCore::CachedResource&, WebCore::ResourceRequest&&, const WebCore::ResourceLoaderOptions&, CompletionHandler<void(RefPtr<WebCore::SubresourceLoader>&&)>&&) final; > void loadResourceSynchronously(WebCore::FrameLoader&, unsigned long, const WebCore::ResourceRequest&, WebCore::ClientCredentialPolicy, const WebCore::FetchOptions&, const WebCore::HTTPHeaderMap&, WebCore::ResourceError&, WebCore::ResourceResponse&, Vector<char>&) final; >+ void pageLoadCompleted(uint64_t webPageID) final; >+ > void remove(WebCore::ResourceLoader*) final; > void setDefersLoading(WebCore::ResourceLoader*, bool) final; > void crossOriginRedirectReceived(WebCore::ResourceLoader*, const WebCore::URL& redirectURL) final;
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 184838
:
338673
|
338681
|
338768
|
338814
|
339164
|
339351