Title: [231282] trunk/Source
Revision
231282
Author
[email protected]
Date
2018-05-02 17:31:50 -0700 (Wed, 02 May 2018)

Log Message

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 Brent Fulgham.

Source/WebCore:

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::progressCompleted):
* loader/LoaderStrategy.h:

Source/WebKit:

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: Copied from Source/WebKit/NetworkProcess/NetworkLoadParameters.h.
(WebKit::NetworkActivityTracker::NetworkActivityTracker):
(WebKit::NetworkActivityTracker::~NetworkActivityTracker):
(WebKit::NetworkActivityTracker::setParent):
(WebKit::NetworkActivityTracker::start):
(WebKit::NetworkActivityTracker::complete):
* NetworkProcess/NetworkActivityTracker.h: Added.
(WebKit::NetworkActivityTracker::getPlatformObject):
* 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:

Source/WebKitLegacy:

Add an empty override of the pure virtual
LoaderStrategy::pageLoadCompleted method.

* WebCoreSupport/WebResourceLoadScheduler.cpp:
(WebResourceLoadScheduler::pageLoadCompleted):
* WebCoreSupport/WebResourceLoadScheduler.h:

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (231281 => 231282)


--- trunk/Source/WebCore/ChangeLog	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebCore/ChangeLog	2018-05-03 00:31:50 UTC (rev 231282)
@@ -1,3 +1,24 @@
+2018-05-02  Keith Rollin  <[email protected]>
+
+        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 Brent Fulgham.
+
+        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::progressCompleted):
+        * loader/LoaderStrategy.h:
+
 2018-05-02  Aditya Keerthi  <[email protected]>
 
         Can't copy and paste URLs that have no title into Mail (macOS)

Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (231281 => 231282)


--- trunk/Source/WebCore/loader/FrameLoader.cpp	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp	2018-05-03 00:31:50 UTC (rev 231282)
@@ -252,6 +252,9 @@
         ASSERT(m_frame.page());
         m_inProgress = false;
         m_frame.page()->progress().progressCompleted(m_frame);
+
+        if (auto pageID = m_frame.loader().client().pageID())
+            platformStrategies()->loaderStrategy()->pageLoadCompleted(pageID.value());
     }
 
 private:

Modified: trunk/Source/WebCore/loader/LoaderStrategy.h (231281 => 231282)


--- trunk/Source/WebCore/loader/LoaderStrategy.h	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebCore/loader/LoaderStrategy.h	2018-05-03 00:31:50 UTC (rev 231282)
@@ -58,6 +58,7 @@
 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;

Modified: trunk/Source/WebKit/CMakeLists.txt (231281 => 231282)


--- trunk/Source/WebKit/CMakeLists.txt	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/CMakeLists.txt	2018-05-03 00:31:50 UTC (rev 231282)
@@ -97,14 +97,7 @@
 )
 
 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 @@
     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

Modified: trunk/Source/WebKit/ChangeLog (231281 => 231282)


--- trunk/Source/WebKit/ChangeLog	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/ChangeLog	2018-05-03 00:31:50 UTC (rev 231282)
@@ -1,3 +1,90 @@
+2018-05-02  Keith Rollin  <[email protected]>
+
+        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 Brent Fulgham.
+
+        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: Copied from Source/WebKit/NetworkProcess/NetworkLoadParameters.h.
+        (WebKit::NetworkActivityTracker::NetworkActivityTracker):
+        (WebKit::NetworkActivityTracker::~NetworkActivityTracker):
+        (WebKit::NetworkActivityTracker::setParent):
+        (WebKit::NetworkActivityTracker::start):
+        (WebKit::NetworkActivityTracker::complete):
+        * NetworkProcess/NetworkActivityTracker.h: Added.
+        (WebKit::NetworkActivityTracker::getPlatformObject):
+        * 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-05-02  Jer Noble  <[email protected]>
 
         Open audio/video sandbox services for minimal simulator

Modified: trunk/Source/WebKit/Configurations/WebKit.xcconfig (231281 => 231282)


--- trunk/Source/WebKit/Configurations/WebKit.xcconfig	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/Configurations/WebKit.xcconfig	2018-05-03 00:31:50 UTC (rev 231282)
@@ -109,7 +109,7 @@
 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__18functionIFvN7WebCore12Policy
 ActionEEED1Ev -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEED2Ev -Wl,-unexported_symbol, -Wl,__ZNSt3__18functionIFvN7WebCore12PolicyActionEEEaSERKS4_ -Wl,-unexported_symbol, -Wl,__ZTVNSt3__117bad_function_callE;

Copied: trunk/Source/WebKit/NetworkProcess/NetworkActivityTracker.cpp (from rev 231281, trunk/Source/WebKit/NetworkProcess/NetworkLoadParameters.h) (0 => 231282)


--- trunk/Source/WebKit/NetworkProcess/NetworkActivityTracker.cpp	                        (rev 0)
+++ trunk/Source/WebKit/NetworkProcess/NetworkActivityTracker.cpp	2018-05-03 00:31:50 UTC (rev 231282)
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ */
+
+#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 // !HAVE(NW_ACTIVITY)

Added: trunk/Source/WebKit/NetworkProcess/NetworkActivityTracker.h (0 => 231282)


--- trunk/Source/WebKit/NetworkProcess/NetworkActivityTracker.h	                        (rev 0)
+++ trunk/Source/WebKit/NetworkProcess/NetworkActivityTracker.h	2018-05-03 00:31:50 UTC (rev 231282)
@@ -0,0 +1,87 @@
+/*
+ * 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
+
+#if USE(APPLE_INTERNAL_SDK) && __has_include(<nw/activity.h>)
+#define HAVE_NW_ACTIVITY 1
+#endif
+
+#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 getPlatformObject() { 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

Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (231281 => 231282)


--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp	2018-05-03 00:31:50 UTC (rev 231282)
@@ -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 @@
         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 @@
     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,115 @@
     SecurityPolicy::resetOriginAccessWhitelists();
 }
 
+static bool networkActivityTrackingEnabled()
+{
+    return NetworkProcess::singleton().trackNetworkActivity();
+}
+
+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].networkActivity.start();
+
+#if HAVE(NW_ACTIVITY)
+        ASSERT(m_networkActivityTrackers[rootActivityIndex].networkActivity.getPlatformObject());
+#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].networkActivity.getPlatformObject());
+#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].networkActivity.getPlatformObject());
+#endif
+
+    auto& newActivityTracker = m_networkActivityTrackers[newActivityIndex];
+    newActivityTracker.networkActivity.setParent(m_networkActivityTrackers[rootActivityIndex].networkActivity);
+    newActivityTracker.networkActivity.start();
+
+    return newActivityTracker.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].networkActivity.complete(code);
+    m_networkActivityTrackers.remove(itemIndex);
+}
+
+void NetworkConnectionToWebProcess::stopAllNetworkActivityTracking()
+{
+    if (!networkActivityTrackingEnabled())
+        return;
+
+    for (auto& activityTracker : m_networkActivityTrackers)
+        activityTracker.networkActivity.complete(NetworkActivityTracker::CompletionCode::None);
+
+    m_networkActivityTrackers.clear();
+}
+
+void NetworkConnectionToWebProcess::stopAllNetworkActivityTrackingForPage(uint64_t pageID)
+{
+    if (!networkActivityTrackingEnabled())
+        return;
+
+    for (auto& activityTracker : m_networkActivityTrackers) {
+        if (activityTracker.pageID == pageID)
+            activityTracker.networkActivity.complete(NetworkActivityTracker::CompletionCode::None);
+    }
+
+    m_networkActivityTrackers.removeAllMatching([&](const auto& activityTracker) {
+        return activityTracker.pageID == pageID;
+    });
+}
+
+size_t NetworkConnectionToWebProcess::findRootNetworkActivity(uint64_t pageID)
+{
+    return m_networkActivityTrackers.findMatching([&](const auto& item) {
+        return item.isRootActivity && item.pageID == pageID;
+    });
+}
+
+size_t NetworkConnectionToWebProcess::findNetworkActivityTracker(ResourceLoadIdentifier resourceID)
+{
+    return m_networkActivityTrackers.findMatching([&](const auto& item) {
+        return item.resourceID == resourceID;
+    });
+}
+
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (231281 => 231282)


--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h	2018-05-03 00:31:50 UTC (rev 231282)
@@ -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 @@
         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 @@
     void preconnectTo(uint64_t preconnectionIdentifier, NetworkResourceLoadParameters&&);
 
     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,41 @@
     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)
+            : pageID { pageID }
+            , isRootActivity { true }
+            , networkActivity { NetworkActivityTracker::Label::LoadPage }
+        {
+        }
+
+        ResourceNetworkActivityTracker(uint64_t pageID, ResourceLoadIdentifier resourceID)
+            : pageID { pageID }
+            , resourceID { resourceID }
+            , networkActivity { NetworkActivityTracker::Label::LoadResource }
+        {
+        }
+
+        uint64_t pageID { 0 };
+        ResourceLoadIdentifier resourceID { 0 };
+        bool isRootActivity { false };
+        NetworkActivityTracker 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;
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in (231281 => 231282)


--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in	2018-05-03 00:31:50 UTC (rev 231282)
@@ -26,6 +26,7 @@
     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);

Modified: trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp (231281 => 231282)


--- trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp	2018-05-03 00:31:50 UTC (rev 231282)
@@ -54,7 +54,7 @@
         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, parameters.isMainFrameNavigation);
+    return NetworkDataTaskCocoa::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.shouldPreconnectOnly, parameters.isMainFrameNavigation, parameters.networkActivityTracker);
 #endif
 #if USE(SOUP)
     return NetworkDataTaskSoup::create(session, client, parameters.request, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.isMainFrameNavigation);

Modified: trunk/Source/WebKit/NetworkProcess/NetworkLoadParameters.h (231281 => 231282)


--- trunk/Source/WebKit/NetworkProcess/NetworkLoadParameters.h	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/NetworkProcess/NetworkLoadParameters.h	2018-05-03 00:31:50 UTC (rev 231282)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "NetworkActivityTracker.h"
 #include <WebCore/BlobDataFileReference.h>
 #include <WebCore/ResourceLoaderOptions.h>
 #include <WebCore/ResourceRequest.h>
@@ -51,6 +52,7 @@
     bool isMainFrameNavigation { false };
     Vector<RefPtr<WebCore::BlobDataFileReference>> blobFileReferences;
     PreconnectOnly shouldPreconnectOnly { PreconnectOnly::No };
+    std::optional<NetworkActivityTracker> networkActivityTracker;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (231281 => 231282)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2018-05-03 00:31:50 UTC (rev 231282)
@@ -298,6 +298,8 @@
     for (auto& scheme : parameters.urlSchemesRegisteredAsCanDisplayOnlyIfCanRequest)
         registerURLSchemeAsCanDisplayOnlyIfCanRequest(scheme);
 
+    m_trackNetworkActivity = parameters.trackNetworkActivity;
+
     RELEASE_LOG(Process, "%p - NetworkProcess::initializeNetworkProcess: Presenting process = %d", this, WebCore::presentingApplicationPID());
 }
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (231281 => 231282)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2018-05-03 00:31:50 UTC (rev 231282)
@@ -162,6 +162,8 @@
     NetworkContentRuleListManager& networkContentRuleListManager() { return m_NetworkContentRuleListManager; }
 #endif
 
+    bool trackNetworkActivity() const { return m_trackNetworkActivity; }
+
 private:
     NetworkProcess();
     ~NetworkProcess();
@@ -300,6 +302,8 @@
 #if ENABLE(CONTENT_EXTENSIONS)
     NetworkContentRuleListManager m_NetworkContentRuleListManager;
 #endif
+
+    bool m_trackNetworkActivity { false };
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp (231281 => 231282)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp	2018-05-03 00:31:50 UTC (rev 231282)
@@ -115,6 +115,8 @@
     encoder << urlSchemesRegisteredAsDisplayIsolated;
     encoder << urlSchemesRegisteredAsCORSEnabled;
     encoder << urlSchemesRegisteredAsCanDisplayOnlyIfCanRequest;
+
+    encoder << trackNetworkActivity;
 }
 
 bool NetworkProcessCreationParameters::decode(IPC::Decoder& decoder, NetworkProcessCreationParameters& result)
@@ -275,6 +277,9 @@
     if (!decoder.decode(result.urlSchemesRegisteredAsCanDisplayOnlyIfCanRequest))
         return false;
 
+    if (!decoder.decode(result.trackNetworkActivity))
+        return false;
+
     return true;
 }
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h (231281 => 231282)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h	2018-05-03 00:31:50 UTC (rev 231282)
@@ -132,6 +132,8 @@
     Vector<String> urlSchemesRegisteredAsDisplayIsolated;
     Vector<String> urlSchemesRegisteredAsCanDisplayOnlyIfCanRequest;
     Vector<String> urlSchemesRegisteredAsCORSEnabled;
+
+    bool trackNetworkActivity { false };
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (231281 => 231282)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2018-05-03 00:31:50 UTC (rev 231282)
@@ -165,6 +165,8 @@
 {
     ASSERT(RunLoop::isMain());
 
+    m_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;
@@ -254,6 +256,7 @@
 
     NetworkLoadParameters parameters = m_parameters;
     parameters.defersLoading = m_defersLoading;
+    parameters.networkActivityTracker = m_networkActivityTracker;
     if (m_networkLoadChecker)
         parameters.storedCredentialsPolicy = m_networkLoadChecker->storedCredentialsPolicy();
 
@@ -306,10 +309,15 @@
         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();
@@ -342,7 +350,7 @@
         m_networkLoad->cancel();
     }
 
-    cleanup();
+    cleanup(LoadResult::Cancel);
 }
 
 static bool areFrameAncestorsSameSite(const ResourceResponse& response, const Vector<RefPtr<SecurityOrigin>>& frameAncestorOrigins)
@@ -507,7 +515,7 @@
 
     tryStoreAsCacheEntry();
 
-    cleanup();
+    cleanup(LoadResult::Success);
 }
 
 void NetworkResourceLoader::didFailLoading(const ResourceError& error)
@@ -527,7 +535,7 @@
     } else if (auto* connection = messageSenderConnection())
         connection->send(Messages::WebResourceLoader::DidFailResourceLoad(error), messageSenderDestinationID());
 
-    cleanup();
+    cleanup(LoadResult::Failure);
 }
 
 void NetworkResourceLoader::didBlockAuthenticationChallenge()
@@ -731,7 +739,7 @@
     if (isSynchronous()) {
         m_synchronousLoadData->response = WTFMove(response);
         sendReplyToSynchronousRequest(*m_synchronousLoadData, entry->buffer());
-        cleanup();
+        cleanup(LoadResult::Success);
         return;
     }
 
@@ -765,7 +773,7 @@
                 }
                 if (retrievedAll) {
                     loader->sendResultForCacheEntry(WTFMove(entry));
-                    loader->cleanup();
+                    loader->cleanup(LoadResult::Success);
                 }
             });
         }
@@ -774,7 +782,7 @@
 
     sendResultForCacheEntry(WTFMove(entry));
 
-    cleanup();
+    cleanup(LoadResult::Success);
 }
 
 void NetworkResourceLoader::sendResultForCacheEntry(std::unique_ptr<NetworkCache::Entry> entry)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h (231281 => 231282)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h	2018-05-03 00:31:50 UTC (rev 231282)
@@ -134,7 +134,13 @@
     void startNetworkLoad(WebCore::ResourceRequest&&, FirstLoad);
     void continueDidReceiveResponse();
 
-    void cleanup();
+    enum class LoadResult {
+        Unknown,
+        Success,
+        Failure,
+        Cancel
+    };
+    void cleanup(LoadResult);
     
     void platformDidReceiveResponse(const WebCore::ResourceResponse&);
 
@@ -184,6 +190,8 @@
     bool m_isWaitingContinueWillSendRequestForCachedRedirect { false };
     std::unique_ptr<NetworkCache::Entry> m_cacheEntryWaitingForContinueDidReceiveResponse;
     RefPtr<NetworkLoadChecker> m_networkLoadChecker;
+
+    std::optional<NetworkActivityTracker> m_networkActivityTracker;
 };
 
 } // namespace WebKit

Added: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkActivityTrackerCocoa.mm (0 => 231282)


--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkActivityTrackerCocoa.mm	                        (rev 0)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkActivityTrackerCocoa.mm	2018-05-03 00:31:50 UTC (rev 231282)
@@ -0,0 +1,76 @@
+/*
+ * 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.
+ */
+
+#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)

Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h (231281 => 231282)


--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h	2018-05-03 00:31:50 UTC (rev 231282)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "NetworkActivityTracker.h"
 #include "NetworkDataTask.h"
 #include "NetworkLoadParameters.h"
 #include "WiFiAssertionHolder.h"
@@ -41,9 +42,9 @@
 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, bool dataTaskIsForMainFrameNavigation)
+    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, bool dataTaskIsForMainFrameNavigation, std::optional<NetworkActivityTracker> networkActivityTracker)
     {
-        return adoptRef(*new NetworkDataTaskCocoa(session, client, request, frameID, pageID, storedCredentialsPolicy, shouldContentSniff, shouldContentEncodingSniff, shouldClearReferrerOnHTTPSToHTTPRedirect, shouldPreconnectOnly, dataTaskIsForMainFrameNavigation));
+        return adoptRef(*new NetworkDataTaskCocoa(session, client, request, frameID, pageID, storedCredentialsPolicy, shouldContentSniff, shouldContentEncodingSniff, shouldClearReferrerOnHTTPSToHTTPRedirect, shouldPreconnectOnly, dataTaskIsForMainFrameNavigation, networkActivityTracker));
     }
 
     ~NetworkDataTaskCocoa();
@@ -83,7 +84,7 @@
     String description() const override;
 
 private:
-    NetworkDataTaskCocoa(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly, bool dataTaskIsForMainFrameNavigation);
+    NetworkDataTaskCocoa(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, uint64_t frameID, uint64_t pageID, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly, bool dataTaskIsForMainFrameNavigation, std::optional<NetworkActivityTracker>);
 
     bool tryPasswordBasedAuthentication(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler&);
     void applySniffingPoliciesAndBindRequestToInferfaceIfNeeded(NSURLRequest*&, bool shouldContentSniff, bool shouldContentEncodingSniff);

Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm (231281 => 231282)


--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm	2018-05-03 00:31:50 UTC (rev 231282)
@@ -55,6 +55,10 @@
 @end
 #endif
 
+#if HAVE(NW_ACTIVITY)
+#import <CFNetwork/CFNSURLConnection.h>
+#endif
+
 namespace WebKit {
 
 #if USE(CREDENTIAL_STORAGE_WITH_NETWORK_SESSION)
@@ -181,7 +185,7 @@
 #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, bool dataTaskIsForMainFrameNavigation)
+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, bool dataTaskIsForMainFrameNavigation, std::optional<NetworkActivityTracker> networkActivityTracker)
     : NetworkDataTask(session, client, requestWithCredentials, storedCredentialsPolicy, shouldClearReferrerOnHTTPSToHTTPRedirect, dataTaskIsForMainFrameNavigation)
     , m_frameID(frameID)
     , m_pageID(pageID)
@@ -273,6 +277,11 @@
         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().getPlatformObject();
+#endif
 }
 
 NetworkDataTaskCocoa::~NetworkDataTaskCocoa()

Modified: trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp (231281 => 231282)


--- trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp	2018-05-03 00:31:50 UTC (rev 231282)
@@ -130,6 +130,7 @@
     copy->m_processSwapsOnNavigation = this->m_processSwapsOnNavigation;
     copy->m_alwaysKeepAndReuseSwappedProcesses = this->m_alwaysKeepAndReuseSwappedProcesses;
     copy->m_processSwapsOnWindowOpenWithOpener = this->m_processSwapsOnWindowOpenWithOpener;
+    copy->m_trackNetworkActivity = this->m_trackNetworkActivity;
 
     return copy;
 }

Modified: trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h (231281 => 231282)


--- trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h	2018-05-03 00:31:50 UTC (rev 231282)
@@ -144,6 +144,9 @@
     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 };
 
@@ -178,6 +181,7 @@
     bool m_processSwapsOnNavigation { false };
     bool m_alwaysKeepAndReuseSwappedProcesses { false };
     bool m_processSwapsOnWindowOpenWithOpener { false };
+    bool m_trackNetworkActivity { false };
 
 #if PLATFORM(IOS)
     WTF::String m_ctDataConnectionServiceType;

Modified: trunk/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.cpp (231281 => 231282)


--- trunk/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.cpp	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.cpp	2018-05-03 00:31:50 UTC (rev 231282)
@@ -187,3 +187,13 @@
 {
     toImpl(configuration)->setProcessSwapsOnWindowOpenWithOpener(swaps);
 }
+
+bool WKContextConfigurationTrackNetworkActivity(WKContextConfigurationRef configuration)
+{
+    return toImpl(configuration)->trackNetworkActivity();
+}
+
+void WKContextConfigurationSetTrackNetworkActivity(WKContextConfigurationRef configuration, bool track)
+{
+    toImpl(configuration)->setTrackNetworkActivity(track);
+}

Modified: trunk/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.h (231281 => 231282)


--- trunk/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.h	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.h	2018-05-03 00:31:50 UTC (rev 231282)
@@ -77,6 +77,9 @@
 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

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h (231281 => 231282)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h	2018-05-03 00:31:50 UTC (rev 231282)
@@ -60,6 +60,7 @@
 @property (nonatomic) BOOL processSwapsOnNavigation WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 @property (nonatomic) BOOL alwaysKeepAndReuseSwappedProcesses 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
 

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm (231281 => 231282)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm	2018-05-03 00:31:50 UTC (rev 231282)
@@ -257,6 +257,16 @@
     return _processPoolConfiguration->processSwapsOnWindowOpenWithOpener();
 }
 
+- (BOOL)trackNetworkActivity
+{
+    return _processPoolConfiguration->trackNetworkActivity();
+}
+
+- (void)setTrackNetworkActivity:(BOOL)track
+{
+    _processPoolConfiguration->setTrackNetworkActivity(track);
+}
+
 #if PLATFORM(IOS)
 - (NSString *)CTDataConnectionServiceType
 {

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (231281 => 231282)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2018-05-03 00:31:50 UTC (rev 231282)
@@ -494,6 +494,8 @@
     parameters.urlSchemesRegisteredAsCORSEnabled = copyToVector(m_schemesToRegisterAsCORSEnabled);
     parameters.urlSchemesRegisteredAsCanDisplayOnlyIfCanRequest = copyToVector(m_schemesToRegisterAsCanDisplayOnlyIfCanRequest);
 
+    parameters.trackNetworkActivity = m_configuration->trackNetworkActivity();
+
     // Add any platform specific parameters
     platformInitializeNetworkProcess(parameters);
 

Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (231281 => 231282)


--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2018-05-03 00:31:50 UTC (rev 231282)
@@ -1210,10 +1210,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 */; };
@@ -3648,13 +3651,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>"; };
@@ -6379,6 +6385,8 @@
 				2DA944BB188511DD00ED86DB /* ios */,
 				510CC7DC16138E2900D03ED3 /* mac */,
 				413075971DE84ED70039EC69 /* webrtc */,
+				53F3CAA5206C443E0086490E /* NetworkActivityTracker.cpp */,
+				535BCB902069C49C00CCCE02 /* NetworkActivityTracker.h */,
 				513A16491630A9BF005D7D22 /* NetworkConnectionToWebProcess.cpp */,
 				513A164A1630A9BF005D7D22 /* NetworkConnectionToWebProcess.h */,
 				513A164B1630A9BF005D7D22 /* NetworkConnectionToWebProcess.messages.in */,
@@ -6905,6 +6913,7 @@
 		7EC4F0F818E4A922008056AF /* cocoa */ = {
 			isa = PBXGroup;
 			children = (
+				5315876B2076B713004BF9F3 /* NetworkActivityTrackerCocoa.mm */,
 				5321594F1DBAE6D70054AA3C /* NetworkDataTaskCocoa.h */,
 				5CBC9B8B1C65257300A8FDCF /* NetworkDataTaskCocoa.mm */,
 				7EC4F0F918E4A945008056AF /* NetworkProcessCocoa.mm */,
@@ -8991,6 +9000,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 */,
@@ -10632,6 +10642,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 */,
@@ -10643,6 +10654,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 */,
@@ -10658,7 +10671,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 */,

Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (231281 => 231282)


--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2018-05-03 00:31:50 UTC (rev 231282)
@@ -521,6 +521,11 @@
     }
 }
 
+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;

Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h (231281 => 231282)


--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h	2018-05-03 00:31:50 UTC (rev 231282)
@@ -49,6 +49,7 @@
     
     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;

Modified: trunk/Source/WebKitLegacy/ChangeLog (231281 => 231282)


--- trunk/Source/WebKitLegacy/ChangeLog	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKitLegacy/ChangeLog	2018-05-03 00:31:50 UTC (rev 231282)
@@ -1,3 +1,18 @@
+2018-05-02  Keith Rollin  <[email protected]>
+
+        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 Brent Fulgham.
+
+        Add an empty override of the pure virtual
+        LoaderStrategy::pageLoadCompleted method.
+
+        * WebCoreSupport/WebResourceLoadScheduler.cpp:
+        (WebResourceLoadScheduler::pageLoadCompleted):
+        * WebCoreSupport/WebResourceLoadScheduler.h:
+
 2018-05-01  Eric Carlson  <[email protected]>
 
         [MediaStream] remove WK1 support

Modified: trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp (231281 => 231282)


--- trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp	2018-05-03 00:31:50 UTC (rev 231282)
@@ -111,6 +111,10 @@
     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 {

Modified: trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h (231281 => 231282)


--- trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h	2018-05-03 00:28:27 UTC (rev 231281)
+++ trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h	2018-05-03 00:31:50 UTC (rev 231282)
@@ -51,6 +51,8 @@
 
     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;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to