| Index: third_party/WebKit/Source/core/fetch/MemoryCache.cpp
|
| diff --git a/third_party/WebKit/Source/core/fetch/MemoryCache.cpp b/third_party/WebKit/Source/core/fetch/MemoryCache.cpp
|
| index cc8f4aa88283184ec11c38ae5054fc5643075ebc..b5754b4b792902ce44ebe616e076624bf5ac2932 100644
|
| --- a/third_party/WebKit/Source/core/fetch/MemoryCache.cpp
|
| +++ b/third_party/WebKit/Source/core/fetch/MemoryCache.cpp
|
| @@ -627,19 +627,41 @@ MemoryCache::Statistics MemoryCache::getStatistics() {
|
| return stats;
|
| }
|
|
|
| -void MemoryCache::evictResources() {
|
| - while (true) {
|
| - ResourceMapIndex::iterator resourceMapIter = m_resourceMaps.begin();
|
| - if (resourceMapIter == m_resourceMaps.end())
|
| - break;
|
| +void MemoryCache::evictResources(EvictResourcePolicy policy) {
|
| + for (auto resourceMapIter = m_resourceMaps.begin();
|
| + resourceMapIter != m_resourceMaps.end();) {
|
| ResourceMap* resources = resourceMapIter->value.get();
|
| - while (true) {
|
| - ResourceMap::iterator resourceIter = resources->begin();
|
| - if (resourceIter == resources->end())
|
| - break;
|
| - evict(resourceIter->value.get());
|
| + HeapVector<Member<MemoryCacheEntry>> unusedPreloads;
|
| + for (auto resourceIter = resources->begin();
|
| + resourceIter != resources->end(); resourceIter = resources->begin()) {
|
| + DCHECK(resourceIter.get());
|
| + DCHECK(resourceIter->value.get());
|
| + DCHECK(resourceIter->value->resource());
|
| + if (policy == EvictAllResources ||
|
| + !(resourceIter->value->resource() &&
|
| + resourceIter->value->resource()->isUnusedPreload())) {
|
| + evict(resourceIter->value.get());
|
| + } else {
|
| + // Store unused preloads aside, so they could be added back later.
|
| + // That is in order to avoid the performance impact of iterating over
|
| + // the same resource multiple times.
|
| + unusedPreloads.append(resourceIter->value.get());
|
| + resources->remove(resourceIter);
|
| + }
|
| + }
|
| + for (const auto& unusedPreload : unusedPreloads) {
|
| + KURL url =
|
| + removeFragmentIdentifierIfNeeded(unusedPreload->resource()->url());
|
| + resources->set(url, unusedPreload);
|
| + }
|
| + // We may iterate multiple times over resourceMaps with unused preloads.
|
| + // That's extremely unlikely to have any real-life performance impact.
|
| + if (!resources->size()) {
|
| + m_resourceMaps.remove(resourceMapIter);
|
| + resourceMapIter = m_resourceMaps.begin();
|
| + } else {
|
| + ++resourceMapIter;
|
| }
|
| - m_resourceMaps.remove(resourceMapIter);
|
| }
|
| }
|
|
|
|
|