Title: [224596] trunk/Source/WebCore
Revision
224596
Author
[email protected]
Date
2017-11-08 14:01:15 -0800 (Wed, 08 Nov 2017)

Log Message

Web Inspector: Eliminate unnecessary hash lookups with NetworkResourceData
https://bugs.webkit.org/show_bug.cgi?id=179361

Patch by Joseph Pecoraro <[email protected]> on 2017-11-08
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.

Modified Paths

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);
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to