Diff
Modified: trunk/Source/WebCore/ChangeLog (224595 => 224596)
--- trunk/Source/WebCore/ChangeLog 2017-11-08 21:48:13 UTC (rev 224595)
+++ trunk/Source/WebCore/ChangeLog 2017-11-08 22:01:15 UTC (rev 224596)
@@ -1,3 +1,35 @@
+2017-11-08 Joseph Pecoraro <[email protected]>
+
+ Web Inspector: Eliminate unnecessary hash lookups with NetworkResourceData
+ https://bugs.webkit.org/show_bug.cgi?id=179361
+
+ Reviewed by Brian Burg.
+
+ * inspector/NetworkResourcesData.h:
+ (WebCore::NetworkResourcesData::ResourceData::setURL):
+ (WebCore::NetworkResourcesData::ResourceData::setUrl): Deleted.
+ Drive-by fix the name `setUrl` to `setURL`.
+
+ * inspector/NetworkResourcesData.h:
+ Store unique_ptrs in the HashMap.
+
+ * inspector/NetworkResourcesData.cpp:
+ (WebCore::NetworkResourcesData::resourceCreated):
+ (WebCore::NetworkResourcesData::responseReceived):
+ Create new versions of methods that combine two operations.
+
+ (WebCore::NetworkResourcesData::removeCachedResource):
+ (WebCore::NetworkResourcesData::clear):
+ (WebCore::NetworkResourcesData::ensureNoDataForRequestId):
+ Handle unique_ptrs in the HashMap.
+
+ * inspector/agents/InspectorNetworkAgent.cpp:
+ (WebCore::InspectorNetworkAgent::frameIdentifier):
+ (WebCore::InspectorNetworkAgent::willSendRequest):
+ (WebCore::InspectorNetworkAgent::didReceiveResponse):
+ (WebCore::InspectorNetworkAgent::didFailLoading):
+ Use the new version of operations to avoid multiple lookups.
+
2017-11-08 Wenson Hsieh <[email protected]>
[Attachment Support] Implement delegate hooks for attachment element insertion and removal
Modified: trunk/Source/WebCore/inspector/NetworkResourcesData.cpp (224595 => 224596)
--- trunk/Source/WebCore/inspector/NetworkResourcesData.cpp 2017-11-08 21:48:13 UTC (rev 224595)
+++ trunk/Source/WebCore/inspector/NetworkResourcesData.cpp 2017-11-08 22:01:15 UTC (rev 224596)
@@ -34,8 +34,8 @@
#include "SharedBuffer.h"
#include "TextResourceDecoder.h"
+namespace WebCore {
-namespace WebCore {
using namespace Inspector;
static const size_t maximumResourcesContentSize = 100 * 1000 * 1000; // 100MB
@@ -111,8 +111,7 @@
}
NetworkResourcesData::NetworkResourcesData()
- : m_contentSize(0)
- , m_maximumResourcesContentSize(maximumResourcesContentSize)
+ : m_maximumResourcesContentSize(maximumResourcesContentSize)
, m_maximumSingleResourceContentSize(maximumSingleResourceContentSize)
{
}
@@ -122,21 +121,34 @@
clear();
}
-void NetworkResourcesData::resourceCreated(const String& requestId, const String& loaderId)
+void NetworkResourcesData::resourceCreated(const String& requestId, const String& loaderId, InspectorPageAgent::ResourceType type)
{
ensureNoDataForRequestId(requestId);
- m_requestIdToResourceDataMap.set(requestId, new ResourceData(requestId, loaderId));
+
+ auto resourceData = std::make_unique<ResourceData>(requestId, loaderId);
+ resourceData->setType(type);
+ m_requestIdToResourceDataMap.set(requestId, WTFMove(resourceData));
}
-void NetworkResourcesData::responseReceived(const String& requestId, const String& frameId, const ResourceResponse& response)
+void NetworkResourcesData::resourceCreated(const String& requestId, const String& loaderId, CachedResource& cachedResource)
{
+ ensureNoDataForRequestId(requestId);
+
+ auto resourceData = std::make_unique<ResourceData>(requestId, loaderId);
+ resourceData->setCachedResource(&cachedResource);
+ m_requestIdToResourceDataMap.set(requestId, WTFMove(resourceData));
+}
+
+void NetworkResourcesData::responseReceived(const String& requestId, const String& frameId, const ResourceResponse& response, InspectorPageAgent::ResourceType type)
+{
ResourceData* resourceData = resourceDataForRequestId(requestId);
if (!resourceData)
return;
resourceData->setFrameId(frameId);
- resourceData->setUrl(response.url());
+ resourceData->setURL(response.url());
resourceData->setDecoder(InspectorPageAgent::createTextDecoder(response.mimeType(), response.textEncodingName()));
resourceData->setHTTPStatusCode(response.httpStatusCode());
+ resourceData->setType(type);
}
void NetworkResourcesData::setResourceType(const String& requestId, InspectorPageAgent::ResourceType type)
@@ -232,7 +244,7 @@
{
Vector<String> result;
for (auto& entry : m_requestIdToResourceDataMap) {
- ResourceData* resourceData = entry.value;
+ ResourceData* resourceData = entry.value.get();
if (resourceData->cachedResource() == cachedResource) {
resourceData->setCachedResource(nullptr);
result.append(entry.key);
@@ -242,27 +254,23 @@
return result;
}
-void NetworkResourcesData::clear(const String& preservedLoaderId)
+void NetworkResourcesData::clear(std::optional<String> preservedLoaderId)
{
m_requestIdsDeque.clear();
m_contentSize = 0;
- ResourceDataMap preservedMap;
-
- for (auto& entry : m_requestIdToResourceDataMap) {
- ResourceData* resourceData = entry.value;
- ASSERT(resourceData);
- if (!preservedLoaderId.isNull() && resourceData->loaderId() == preservedLoaderId)
- preservedMap.set(entry.key, entry.value);
- else
- delete resourceData;
+ if (!preservedLoaderId)
+ m_requestIdToResourceDataMap.clear();
+ else {
+ m_requestIdToResourceDataMap.removeIf([loaderId = *preservedLoaderId] (auto& entry) {
+ return entry.value->loaderId() != loaderId;
+ });
}
- m_requestIdToResourceDataMap.swap(preservedMap);
}
Vector<NetworkResourcesData::ResourceData*> NetworkResourcesData::resources()
{
- return copyToVector(m_requestIdToResourceDataMap.values());
+ return WTF::map(m_requestIdToResourceDataMap.values(), [] (const auto& v) { return v.get(); });
}
NetworkResourcesData::ResourceData* NetworkResourcesData::resourceDataForRequestId(const String& requestId)
@@ -274,13 +282,13 @@
void NetworkResourcesData::ensureNoDataForRequestId(const String& requestId)
{
- ResourceData* resourceData = resourceDataForRequestId(requestId);
- if (!resourceData)
+ auto result = m_requestIdToResourceDataMap.take(requestId);
+ if (!result)
return;
+
+ ResourceData* resourceData = result.get();
if (resourceData->hasContent() || resourceData->hasData())
m_contentSize -= resourceData->evictContent();
- delete resourceData;
- m_requestIdToResourceDataMap.remove(requestId);
}
bool NetworkResourcesData::ensureFreeSpace(size_t size)
Modified: trunk/Source/WebCore/inspector/NetworkResourcesData.h (224595 => 224596)
--- trunk/Source/WebCore/inspector/NetworkResourcesData.h 2017-11-08 21:48:13 UTC (rev 224595)
+++ trunk/Source/WebCore/inspector/NetworkResourcesData.h 2017-11-08 22:01:15 UTC (rev 224596)
@@ -56,7 +56,7 @@
void setFrameId(const String& frameId) { m_frameId = frameId; }
String url() const { return m_url; }
- void setUrl(const String& url) { m_url = url; }
+ void setURL(const String& url) { m_url = url; }
bool hasContent() const { return !m_content.isNull(); }
String content() const { return m_content; }
@@ -111,11 +111,11 @@
};
NetworkResourcesData();
-
~NetworkResourcesData();
- void resourceCreated(const String& requestId, const String& loaderId);
- void responseReceived(const String& requestId, const String& frameId, const ResourceResponse&);
+ void resourceCreated(const String& requestId, const String& loaderId, InspectorPageAgent::ResourceType);
+ void resourceCreated(const String& requestId, const String& loaderId, CachedResource&);
+ void responseReceived(const String& requestId, const String& frameId, const ResourceResponse&, InspectorPageAgent::ResourceType);
void setResourceType(const String& requestId, InspectorPageAgent::ResourceType);
InspectorPageAgent::ResourceType resourceType(const String& requestId);
void setResourceContent(const String& requestId, const String& content, bool base64Encoded = false);
@@ -125,7 +125,7 @@
void addResourceSharedBuffer(const String& requestId, RefPtr<SharedBuffer>&&, const String& textEncodingName);
ResourceData const* data(const String& requestId);
Vector<String> removeCachedResource(CachedResource*);
- void clear(const String& preservedLoaderId = String());
+ void clear(std::optional<String> preservedLoaderId = std::nullopt);
Vector<ResourceData*> resources();
private:
@@ -134,10 +134,8 @@
bool ensureFreeSpace(size_t);
Deque<String> m_requestIdsDeque;
-
- typedef HashMap<String, ResourceData*> ResourceDataMap;
- ResourceDataMap m_requestIdToResourceDataMap;
- size_t m_contentSize;
+ HashMap<String, std::unique_ptr<ResourceData>> m_requestIdToResourceDataMap;
+ size_t m_contentSize { 0 };
size_t m_maximumResourcesContentSize;
size_t m_maximumSingleResourceContentSize;
};
Modified: trunk/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp (224595 => 224596)
--- trunk/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp 2017-11-08 21:48:13 UTC (rev 224595)
+++ trunk/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp 2017-11-08 22:01:15 UTC (rev 224596)
@@ -348,7 +348,7 @@
double walltime = currentTime();
String requestId = IdentifiersFactory::requestId(identifier);
- m_resourcesData->resourceCreated(requestId, m_pageAgent->loaderId(&loader));
+ String loaderId = m_pageAgent->loaderId(&loader);
if (type == InspectorPageAgent::OtherResource) {
if (m_loadingXHRSynchronously)
@@ -365,7 +365,7 @@
}
}
- m_resourcesData->setResourceType(requestId, type);
+ m_resourcesData->resourceCreated(requestId, loaderId, type);
for (auto& entry : m_extraRequestHeaders)
request.setHTTPHeaderField(entry.key, entry.value);
@@ -440,11 +440,13 @@
if (type != newType && newType != InspectorPageAgent::XHRResource && newType != InspectorPageAgent::OtherResource)
type = newType;
- m_resourcesData->responseReceived(requestId, m_pageAgent->frameId(loader.frame()), response);
- m_resourcesData->setResourceType(requestId, type);
+ String frameId = m_pageAgent->frameId(loader.frame());
+ String loaderId = m_pageAgent->loaderId(&loader);
- m_frontendDispatcher->responseReceived(requestId, m_pageAgent->frameId(loader.frame()), m_pageAgent->loaderId(&loader), timestamp(), InspectorPageAgent::resourceTypeJSON(type), resourceResponse);
+ m_resourcesData->responseReceived(requestId, frameId, response, type);
+ m_frontendDispatcher->responseReceived(requestId, frameId, loaderId, timestamp(), InspectorPageAgent::resourceTypeJSON(type), resourceResponse);
+
// If we revalidated the resource and got Not modified, send content length following didReceiveResponse
// as there will be no calls to didReceiveData from the network stack.
if (isNotModified && cachedResource && cachedResource->encodedSize())
@@ -523,13 +525,12 @@
void InspectorNetworkAgent::didLoadResourceFromMemoryCache(DocumentLoader& loader, CachedResource& resource)
{
+ unsigned long identifier = loader.frame()->page()->progress().createUniqueIdentifier();
+ String requestId = IdentifiersFactory::requestId(identifier);
String loaderId = m_pageAgent->loaderId(&loader);
String frameId = m_pageAgent->frameId(loader.frame());
- unsigned long identifier = loader.frame()->page()->progress().createUniqueIdentifier();
- String requestId = IdentifiersFactory::requestId(identifier);
- m_resourcesData->resourceCreated(requestId, loaderId);
- m_resourcesData->addCachedResource(requestId, &resource);
+ m_resourcesData->resourceCreated(requestId, loaderId, resource);
RefPtr<Inspector::Protocol::Network::Initiator> initiatorObject = buildInitiatorObject(loader.frame() ? loader.frame()->document() : nullptr);