https://bugs.webkit.org/show_bug.cgi?id=170525
Patch by Joseph Pecoraro <pecoraro@apple.com> on 2017-04-06
Reviewed by Youenn Fablet.
Source/WebCore:
Covered by existing tests that when Web Inspector is open we enable collecting the extra data.
* inspector/InspectorInstrumentation.cpp:
(WebCore::InspectorInstrumentation::firstFrontendCreated):
(WebCore::InspectorInstrumentation::lastFrontendDeleted):
* inspector/InspectorInstrumentation.h:
(WebCore::InspectorInstrumentation::frontendCreated):
(WebCore::InspectorInstrumentation::frontendDeleted):
When the first frontend is created enable a new loader strategy to
collect extra network load metrics. When the last frontend is closed
disable the extra metrics.
* loader/LoaderStrategy.h:
* platform/PlatformStrategies.h:
New load strategy to enable/disable new metrics.
Source/WebKit:
* WebCoreSupport/WebResourceLoadScheduler.h:
Source/WebKit2:
* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(-[WKNetworkSessionDelegate URLSession:task:didFinishCollectingMetrics:]):
Only collect extra metrics if the WebProcess this load is for has enabled
collecting extra metrics.
* WebProcess/Network/WebLoaderStrategy.cpp:
(WebKit::WebLoaderStrategy::setCaptureExtraNetworkLoadMetricsEnabled):
* WebProcess/Network/WebLoaderStrategy.h:
* NetworkProcess/NetworkConnectionToWebProcess.cpp:
(WebKit::NetworkConnectionToWebProcess::setCaptureExtraNetworkLoadMetricsEnabled):
* NetworkProcess/NetworkConnectionToWebProcess.h:
(WebKit::NetworkConnectionToWebProcess::captureExtraNetworkLoadMetricsEnabled):
* NetworkProcess/NetworkConnectionToWebProcess.messages.in:
New bool state toggled through the loader policy.
* NetworkProcess/NetworkDataTask.cpp:
(WebKit::NetworkDataTask::shouldCaptureExtraNetworkLoadMetrics):
* NetworkProcess/NetworkDataTask.h:
(WebKit::NetworkDataTaskClient::shouldCaptureExtraNetworkLoadMetrics):
* NetworkProcess/NetworkLoad.cpp:
(WebKit::NetworkLoad::shouldCaptureExtraNetworkLoadMetrics):
* NetworkProcess/NetworkLoad.h:
* NetworkProcess/NetworkLoadClient.h:
(WebKit::NetworkLoadClient::shouldCaptureExtraNetworkLoadMetrics):
* NetworkProcess/NetworkResourceLoader.cpp:
(WebKit::NetworkResourceLoader::shouldCaptureExtraNetworkLoadMetrics):
* NetworkProcess/NetworkResourceLoader.h:
* NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp:
(WebKit::NetworkCache::SpeculativeLoad::shouldCaptureExtraNetworkLoadMetrics):
* NetworkProcess/cache/NetworkCacheSpeculativeLoad.h:
Default handling for network loads is to not include extra data. Thread
client messages back from the NetworkLoads / SpeculativeLoads to check
the NetworkConnectionToWebProcess state on whether or not we should collect
extra metrics.
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@215065
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
2017-04-06 Joseph Pecoraro <pecoraro@apple.com>
+ Web Inspector: Only Capture Extra Network Load Metrics when there is a Web Inspector Frontend
+ https://bugs.webkit.org/show_bug.cgi?id=170525
+
+ Reviewed by Youenn Fablet.
+
+ Covered by existing tests that when Web Inspector is open we enable collecting the extra data.
+
+ * inspector/InspectorInstrumentation.cpp:
+ (WebCore::InspectorInstrumentation::firstFrontendCreated):
+ (WebCore::InspectorInstrumentation::lastFrontendDeleted):
+ * inspector/InspectorInstrumentation.h:
+ (WebCore::InspectorInstrumentation::frontendCreated):
+ (WebCore::InspectorInstrumentation::frontendDeleted):
+ When the first frontend is created enable a new loader strategy to
+ collect extra network load metrics. When the last frontend is closed
+ disable the extra metrics.
+
+ * loader/LoaderStrategy.h:
+ * platform/PlatformStrategies.h:
+ New load strategy to enable/disable new metrics.
+
+2017-04-06 Joseph Pecoraro <pecoraro@apple.com>
+
Web Inspector: Show all headers in the Request Headers section of the Resource details sidebar
https://bugs.webkit.org/show_bug.cgi?id=16531
<rdar://problem/5712895>
#include "InspectorTimelineAgent.h"
#include "InspectorWorkerAgent.h"
#include "InstrumentingAgents.h"
+#include "LoaderStrategy.h"
#include "MainFrame.h"
#include "PageDebuggerAgent.h"
#include "PageHeapAgent.h"
#include "PageRuntimeAgent.h"
+#include "PlatformStrategies.h"
#include "RenderObject.h"
#include "RenderView.h"
#include "ScriptController.h"
int InspectorInstrumentation::s_frontendCounter = 0;
+void InspectorInstrumentation::firstFrontendCreated()
+{
+ platformStrategies()->loaderStrategy()->setCaptureExtraNetworkLoadMetricsEnabled(true);
+}
+
+void InspectorInstrumentation::lastFrontendDeleted()
+{
+ platformStrategies()->loaderStrategy()->setCaptureExtraNetworkLoadMetricsEnabled(false);
+}
+
static void didScheduleAsyncCall(InstrumentingAgents& instrumentingAgents, AsyncCallType type, int callbackId, ScriptExecutionContext& context, bool singleShot)
{
if (InspectorDebuggerAgent* debuggerAgent = instrumentingAgents.inspectorDebuggerAgent()) {
static void layerTreeDidChange(Page*);
static void renderLayerDestroyed(Page*, const RenderLayer&);
- static void frontendCreated() { s_frontendCounter += 1; }
- static void frontendDeleted() { s_frontendCounter -= 1; }
+ static void frontendCreated();
+ static void frontendDeleted();
static bool hasFrontends() { return s_frontendCounter; }
+
+ static void firstFrontendCreated();
+ static void lastFrontendDeleted();
+
static bool consoleAgentEnabled(ScriptExecutionContext*);
static bool timelineAgentEnabled(ScriptExecutionContext*);
static bool replayAgentEnabled(ScriptExecutionContext*);
return workerGlobalScope.inspectorController().m_instrumentingAgents;
}
+inline void InspectorInstrumentation::frontendCreated()
+{
+ s_frontendCounter++;
+
+ if (s_frontendCounter == 1)
+ InspectorInstrumentation::firstFrontendCreated();
+}
+
+inline void InspectorInstrumentation::frontendDeleted()
+{
+ s_frontendCounter--;
+
+ if (!s_frontendCounter)
+ InspectorInstrumentation::lastFrontendDeleted();
+}
+
} // namespace WebCore
virtual void storeDerivedDataToCache(const SHA1::Digest& bodyKey, const String& type, const String& partition, WebCore::SharedBuffer&) = 0;
+ virtual void setCaptureExtraNetworkLoadMetricsEnabled(bool) = 0;
+
protected:
virtual ~LoaderStrategy();
};
* THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef PlatformStrategies_h
-#define PlatformStrategies_h
+#pragma once
namespace WebCore {
WEBCORE_EXPORT void setPlatformStrategies(PlatformStrategies*);
} // namespace WebCore
-
-#endif // PlatformStrategies_h
+2017-04-06 Joseph Pecoraro <pecoraro@apple.com>
+
+ Web Inspector: Only Capture Extra Network Load Metrics when there is a Web Inspector Frontend
+ https://bugs.webkit.org/show_bug.cgi?id=170525
+
+ Reviewed by Youenn Fablet.
+
+ * WebCoreSupport/WebResourceLoadScheduler.h:
+
2017-04-05 Fujii Hironori <Hironori.Fujii@sony.com>
[WinCairo] Invalid address specified to RtlValidateHeap at std::ctype<char>::_Tidy() when finishing MiniBrowser
void storeDerivedDataToCache(const SHA1::Digest&, const String&, const String&, WebCore::SharedBuffer&) override { }
+ void setCaptureExtraNetworkLoadMetricsEnabled(bool) override { }
+
bool isSerialLoadingEnabled() const { return m_isSerialLoadingEnabled; }
void setSerialLoadingEnabled(bool b) { m_isSerialLoadingEnabled = b; }
2017-04-06 Joseph Pecoraro <pecoraro@apple.com>
+ Web Inspector: Only Capture Extra Network Load Metrics when there is a Web Inspector Frontend
+ https://bugs.webkit.org/show_bug.cgi?id=170525
+
+ Reviewed by Youenn Fablet.
+
+ * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+ (-[WKNetworkSessionDelegate URLSession:task:didFinishCollectingMetrics:]):
+ Only collect extra metrics if the WebProcess this load is for has enabled
+ collecting extra metrics.
+
+ * WebProcess/Network/WebLoaderStrategy.cpp:
+ (WebKit::WebLoaderStrategy::setCaptureExtraNetworkLoadMetricsEnabled):
+ * WebProcess/Network/WebLoaderStrategy.h:
+ * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+ (WebKit::NetworkConnectionToWebProcess::setCaptureExtraNetworkLoadMetricsEnabled):
+ * NetworkProcess/NetworkConnectionToWebProcess.h:
+ (WebKit::NetworkConnectionToWebProcess::captureExtraNetworkLoadMetricsEnabled):
+ * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
+ New bool state toggled through the loader policy.
+
+ * NetworkProcess/NetworkDataTask.cpp:
+ (WebKit::NetworkDataTask::shouldCaptureExtraNetworkLoadMetrics):
+ * NetworkProcess/NetworkDataTask.h:
+ (WebKit::NetworkDataTaskClient::shouldCaptureExtraNetworkLoadMetrics):
+ * NetworkProcess/NetworkLoad.cpp:
+ (WebKit::NetworkLoad::shouldCaptureExtraNetworkLoadMetrics):
+ * NetworkProcess/NetworkLoad.h:
+ * NetworkProcess/NetworkLoadClient.h:
+ (WebKit::NetworkLoadClient::shouldCaptureExtraNetworkLoadMetrics):
+ * NetworkProcess/NetworkResourceLoader.cpp:
+ (WebKit::NetworkResourceLoader::shouldCaptureExtraNetworkLoadMetrics):
+ * NetworkProcess/NetworkResourceLoader.h:
+ * NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp:
+ (WebKit::NetworkCache::SpeculativeLoad::shouldCaptureExtraNetworkLoadMetrics):
+ * NetworkProcess/cache/NetworkCacheSpeculativeLoad.h:
+ Default handling for network loads is to not include extra data. Thread
+ client messages back from the NetworkLoads / SpeculativeLoads to check
+ the NetworkConnectionToWebProcess state on whether or not we should collect
+ extra metrics.
+
+2017-04-06 Joseph Pecoraro <pecoraro@apple.com>
+
Web Inspector: Show all headers in the Request Headers section of the Resource details sidebar
https://bugs.webkit.org/show_bug.cgi?id=16531
<rdar://problem/5712895>
NetworkCache::singleton().storeData(dataKey, data.data(), data.size());
}
+void NetworkConnectionToWebProcess::setCaptureExtraNetworkLoadMetricsEnabled(bool enabled)
+{
+ m_captureExtraNetworkLoadMetricsEnabled = enabled;
+}
+
void NetworkConnectionToWebProcess::ensureLegacyPrivateBrowsingSession()
{
NetworkProcess::singleton().ensurePrivateBrowsingSession(SessionID::legacyPrivateSessionID());
void didCleanupResourceLoader(NetworkResourceLoader&);
+ bool captureExtraNetworkLoadMetricsEnabled() const { return m_captureExtraNetworkLoadMetricsEnabled; }
+
RefPtr<WebCore::BlobDataFileReference> getBlobDataFileReferenceForPath(const String& path);
private:
void storeDerivedDataToCache(const WebKit::NetworkCache::DataKey&, const IPC::DataReference&);
+ void setCaptureExtraNetworkLoadMetricsEnabled(bool);
+
void createSocketStream(WebCore::URL&&, WebCore::SessionID, String cachePartition, uint64_t);
void destroySocketStream(uint64_t);
#if USE(LIBWEBRTC)
RefPtr<NetworkRTCProvider> m_rtcProvider;
#endif
+
+ bool m_captureExtraNetworkLoadMetricsEnabled { false };
};
} // namespace WebKit
StoreDerivedDataToCache(WebKit::NetworkCache::DataKey key, IPC::DataReference data)
+ SetCaptureExtraNetworkLoadMetricsEnabled(bool enabled)
+
CreateSocketStream(WebCore::URL url, WebCore::SessionID sessionID, String cachePartition, uint64_t identifier)
EnsureLegacyPrivateBrowsingSession()
m_client->didReceiveResponseNetworkSession(WTFMove(response), WTFMove(completionHandler));
}
+bool NetworkDataTask::shouldCaptureExtraNetworkLoadMetrics() const
+{
+ return m_client->shouldCaptureExtraNetworkLoadMetrics();
+}
+
void NetworkDataTask::failureTimerFired()
{
RefPtr<NetworkDataTask> protectedThis(this);
virtual void wasBlocked() = 0;
virtual void cannotShowURL() = 0;
+ virtual bool shouldCaptureExtraNetworkLoadMetrics() const { return false; }
+
void didCompleteWithError(const WebCore::ResourceError& error)
{
WebCore::NetworkLoadMetrics emptyMetrics;
virtual void invalidateAndCancel() = 0;
void didReceiveResponse(WebCore::ResourceResponse&&, ResponseCompletionHandler&&);
+ bool shouldCaptureExtraNetworkLoadMetrics() const;
enum class State {
Running,
#endif
}
+#if USE(NETWORK_SESSION)
+bool NetworkLoad::shouldCaptureExtraNetworkLoadMetrics() const
+{
+ return m_client.get().shouldCaptureExtraNetworkLoadMetrics();
+}
+#endif
+
NetworkLoadClient::ShouldContinueDidReceiveResponse NetworkLoad::sharedDidReceiveResponse(ResourceResponse&& response)
{
response.setSource(ResourceResponse::Source::Network);
void setSuggestedFilename(const String&);
void setPendingDownload(PendingDownload&);
DownloadID pendingDownloadID() { return m_task->pendingDownloadID(); }
+
+ bool shouldCaptureExtraNetworkLoadMetrics() const final;
#else
WebCore::ResourceHandle* handle() const { return m_handle.get(); }
virtual void didReceiveBuffer(Ref<WebCore::SharedBuffer>&&, int reportedEncodedDataLength) = 0;
virtual void didFinishLoading(const WebCore::NetworkLoadMetrics&) = 0;
virtual void didFailLoading(const WebCore::ResourceError&) = 0;
+ virtual bool shouldCaptureExtraNetworkLoadMetrics() const { return false; }
};
} // namespace WebKit
return sessionID().isAlwaysOnLoggingAllowed();
}
+bool NetworkResourceLoader::shouldCaptureExtraNetworkLoadMetrics() const
+{
+ return m_connection->captureExtraNetworkLoadMetricsEnabled();
+}
+
} // namespace WebKit
void didReceiveBuffer(Ref<WebCore::SharedBuffer>&&, int reportedEncodedDataLength) override;
void didFinishLoading(const WebCore::NetworkLoadMetrics&) override;
void didFailLoading(const WebCore::ResourceError&) override;
+ bool shouldCaptureExtraNetworkLoadMetrics() const override;
void convertToDownload(DownloadID, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&);
m_completionHandler(WTFMove(m_cacheEntry));
}
+#if USE(NETWORK_SESSION)
+bool SpeculativeLoad::shouldCaptureExtraNetworkLoadMetrics() const
+{
+ return m_networkLoad->shouldCaptureExtraNetworkLoadMetrics();
+}
+#endif
+
} // namespace NetworkCache
} // namespace WebKit
void didFinishLoading(const WebCore::NetworkLoadMetrics&) override;
void didFailLoading(const WebCore::ResourceError&) override;
+#if USE(NETWORK_SESSION)
+ bool shouldCaptureExtraNetworkLoadMetrics() const override;
+#endif
+
void didComplete();
GlobalFrameID m_frameID;
networkLoadMetrics.responseStart = Seconds(responseStartInterval);
networkLoadMetrics.responseEnd = Seconds(responseEndInterval);
networkLoadMetrics.markComplete();
-
networkLoadMetrics.protocol = String(m.networkProtocolName);
- networkLoadMetrics.priority = toNetworkLoadPriority(task.priority);
+
+ if (networkDataTask->shouldCaptureExtraNetworkLoadMetrics()) {
+ networkLoadMetrics.priority = toNetworkLoadPriority(task.priority);
+
#if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101300) || (PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000)
- networkLoadMetrics.remoteAddress = String(m._remoteAddressAndPort);
- if ([m respondsToSelector:@selector(_connectionIdentifier)])
- networkLoadMetrics.connectionIdentifier = String([m._connectionIdentifier UUIDString]);
+ networkLoadMetrics.remoteAddress = String(m._remoteAddressAndPort);
+ if ([m respondsToSelector:@selector(_connectionIdentifier)])
+ networkLoadMetrics.connectionIdentifier = String([m._connectionIdentifier UUIDString]);
#endif
- __block WebCore::HTTPHeaderMap requestHeaders;
- [m.request.allHTTPHeaderFields enumerateKeysAndObjectsUsingBlock:^(NSString *name, NSString *value, BOOL *) {
- requestHeaders.set(String(name), String(value));
- }];
- networkLoadMetrics.requestHeaders = WTFMove(requestHeaders);
+ __block WebCore::HTTPHeaderMap requestHeaders;
+ [m.request.allHTTPHeaderFields enumerateKeysAndObjectsUsingBlock:^(NSString *name, NSString *value, BOOL *) {
+ requestHeaders.set(String(name), String(value));
+ }];
+ networkLoadMetrics.requestHeaders = WTFMove(requestHeaders);
+ }
}
}
WebProcess::singleton().networkConnection().connection().send(Messages::NetworkConnectionToWebProcess::StoreDerivedDataToCache(key, dataReference), 0);
}
+void WebLoaderStrategy::setCaptureExtraNetworkLoadMetricsEnabled(bool enabled)
+{
+ WebProcess::singleton().networkConnection().connection().send(Messages::NetworkConnectionToWebProcess::SetCaptureExtraNetworkLoadMetricsEnabled(enabled), 0);
+}
+
} // namespace WebKit
void storeDerivedDataToCache(const SHA1::Digest& bodyHash, const String& type, const String& partition, WebCore::SharedBuffer&) override;
+ void setCaptureExtraNetworkLoadMetricsEnabled(bool) override;
+
WebResourceLoader* webResourceLoaderForIdentifier(ResourceLoadIdentifier identifier) const { return m_webResourceLoaders.get(identifier); }
RefPtr<WebCore::NetscapePlugInStreamLoader> schedulePluginStreamLoad(WebCore::Frame&, WebCore::NetscapePlugInStreamLoaderClient&, const WebCore::ResourceRequest&);