@@ -96,7 +96,7 @@ void NetworkResourcesData::ResourceData::appendData(const SharedBuffer& data)
9696 m_dataBuffer.append (data);
9797}
9898
99- unsigned NetworkResourcesData::ResourceData::decodeDataToContent ()
99+ void NetworkResourcesData::ResourceData::decodeDataToContent ()
100100{
101101 ASSERT (!hasContent ());
102102
@@ -111,7 +111,7 @@ unsigned NetworkResourcesData::ResourceData::decodeDataToContent()
111111 m_content = base64EncodeToString (buffer->data (), dataLength);
112112 }
113113
114- return m_content.sizeInBytes () - dataLength ;
114+ ASSERT ( m_content.sizeInBytes () >= buffer-> size ()) ;
115115}
116116
117117NetworkResourcesData::NetworkResourcesData ()
@@ -200,7 +200,7 @@ void NetworkResourcesData::setResourceContent(const String& requestId, const Str
200200 // We can not be sure that we didn't try to save this request data while it was loading, so remove it, if any.
201201 if (resourceData->hasContent () || resourceData->hasData ())
202202 m_contentSize -= resourceData->removeContent ();
203- m_requestIdsDeque.append (requestId);
203+ m_requestIdsDeque.appendOrMoveToLast (requestId);
204204 resourceData->setContent (content, base64Encoded);
205205 m_contentSize += dataLength;
206206 }
@@ -236,7 +236,7 @@ NetworkResourcesData::ResourceData const* NetworkResourcesData::maybeAddResource
236236 return resourceData;
237237
238238 if (ensureFreeSpace (data.size ()) && !resourceData->isContentEvicted ()) {
239- m_requestIdsDeque.append (requestId);
239+ m_requestIdsDeque.appendOrMoveToLast (requestId);
240240 resourceData->appendData (data);
241241 m_contentSize += data.size ();
242242 }
@@ -253,10 +253,18 @@ void NetworkResourcesData::maybeDecodeDataToContent(const String& requestId)
253253 if (!resourceData->hasData ())
254254 return ;
255255
256- m_contentSize += resourceData->decodeDataToContent ();
257- size_t dataLength = resourceData->content ().sizeInBytes ();
258- if (dataLength > m_maximumSingleResourceContentSize)
259- m_contentSize -= resourceData->evictContent ();
256+ auto byteCount = resourceData->dataLength ();
257+ m_contentSize -= byteCount;
258+
259+ resourceData->decodeDataToContent ();
260+ byteCount = resourceData->content ().sizeInBytes ();
261+ if (byteCount > m_maximumSingleResourceContentSize) {
262+ resourceData->evictContent ();
263+ return ;
264+ }
265+
266+ if (ensureFreeSpace (byteCount) && !resourceData->isContentEvicted ())
267+ m_contentSize += byteCount;
260268}
261269
262270void NetworkResourcesData::addCachedResource (const String& requestId, CachedResource* cachedResource)
@@ -313,19 +321,23 @@ Vector<String> NetworkResourcesData::removeCachedResource(CachedResource* cached
313321
314322void NetworkResourcesData::clear (std::optional<String> preservedLoaderId)
315323{
316- m_requestIdsDeque.clear ();
317- m_contentSize = 0 ;
318-
319- if (!preservedLoaderId)
324+ if (!preservedLoaderId) {
320325 m_requestIdToResourceDataMap.clear ();
321- else {
322- Vector<String> keysToRemove;
323- for (auto & [key, value] : m_requestIdToResourceDataMap) {
324- if (value->loaderId () != *preservedLoaderId)
325- keysToRemove.append (key);
326+ m_requestIdsDeque.clear ();
327+ m_contentSize = 0 ;
328+ return ;
329+ }
330+
331+ for (auto && requestId : std::exchange (m_requestIdsDeque, { })) {
332+ auto resourceData = resourceDataForRequestId (requestId);
333+ if (!resourceData)
334+ continue ;
335+ if (resourceData->loaderId () == *preservedLoaderId)
336+ m_requestIdsDeque.add (requestId);
337+ else {
338+ m_contentSize -= resourceData->evictContent ();
339+ m_requestIdToResourceDataMap.remove (requestId);
326340 }
327- for (auto & keyToRemove : keysToRemove)
328- m_requestIdToResourceDataMap.remove (keyToRemove);
329341 }
330342}
331343
@@ -357,6 +369,7 @@ bool NetworkResourcesData::ensureFreeSpace(size_t size)
357369 if (size > m_maximumResourcesContentSize)
358370 return false ;
359371
372+ ASSERT (m_maximumResourcesContentSize >= m_contentSize);
360373 while (size > m_maximumResourcesContentSize - m_contentSize) {
361374 String requestId = m_requestIdsDeque.takeFirst ();
362375 ResourceData* resourceData = resourceDataForRequestId (requestId);
0 commit comments