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 7c7e029eb8be135eb56caa1b837e63793c8d401a..a0de01441465ee86da4cb6e7bafad6c0ef50e6d1 100644 |
--- a/third_party/WebKit/Source/core/fetch/MemoryCache.cpp |
+++ b/third_party/WebKit/Source/core/fetch/MemoryCache.cpp |
@@ -62,13 +62,21 @@ MemoryCache* replaceMemoryCacheForTesting(MemoryCache* cache) |
DEFINE_TRACE(MemoryCacheEntry) |
{ |
- visitor->trace(m_resource); |
+ visitor->template registerWeakMembers<MemoryCacheEntry, &MemoryCacheEntry::clearResourceWeak>(this); |
visitor->trace(m_previousInLiveResourcesList); |
visitor->trace(m_nextInLiveResourcesList); |
visitor->trace(m_previousInAllResourcesList); |
visitor->trace(m_nextInAllResourcesList); |
} |
+void MemoryCacheEntry::clearResourceWeak(Visitor* visitor) |
+{ |
+ if (!m_resource || ThreadHeap::isHeapObjectAlive(m_resource)) |
+ return; |
+ memoryCache()->remove(m_resource.get()); |
+ m_resource.clear(); |
+} |
+ |
void MemoryCacheEntry::dispose() |
{ |
m_resource.clear(); |
@@ -159,7 +167,7 @@ void MemoryCache::add(Resource* resource) |
ASSERT(resource->url().isValid()); |
ResourceMap* resources = ensureResourceMap(resource->cacheIdentifier()); |
KURL url = removeFragmentIdentifierIfNeeded(resource->url()); |
- RELEASE_ASSERT(!resources->contains(url)); |
+ CHECK(!contains(resource)); |
resources->set(url, MemoryCacheEntry::create(resource)); |
update(resource, 0, resource->size(), true); |
@@ -206,8 +214,11 @@ HeapVector<Member<Resource>> MemoryCache::resourcesForURL(const KURL& resourceUR |
KURL url = removeFragmentIdentifierIfNeeded(resourceURL); |
HeapVector<Member<Resource>> results; |
for (const auto& resourceMapIter : m_resourceMaps) { |
- if (MemoryCacheEntry* entry = resourceMapIter.value->get(url)) |
- results.append(entry->resource()); |
+ if (MemoryCacheEntry* entry = resourceMapIter.value->get(url)) { |
+ Resource* resource = entry->resource(); |
+ DCHECK(resource); |
+ results.append(resource); |
+ } |
} |
return results; |
} |
@@ -358,6 +369,7 @@ void MemoryCache::evict(MemoryCacheEntry* entry) |
ASSERT(WTF::isMainThread()); |
Resource* resource = entry->resource(); |
+ DCHECK(resource); |
RESOURCE_LOADING_DVLOG(1) << "Evicting resource " << resource << " for " << resource->url().getString() << " from cache"; |
TRACE_EVENT1("blink", "MemoryCache::evict", "resource", resource->url().getString().utf8()); |
// The resource may have already been removed by someone other than our caller, |
@@ -379,7 +391,7 @@ void MemoryCache::evict(MemoryCacheEntry* entry) |
MemoryCacheEntry* MemoryCache::getEntryForResource(const Resource* resource) const |
{ |
- if (resource->url().isNull() || resource->url().isEmpty()) |
+ if (!resource || resource->url().isNull() || resource->url().isEmpty()) |
return nullptr; |
ResourceMap* resources = m_resourceMaps.get(resource->cacheIdentifier()); |
if (!resources) |
@@ -589,6 +601,7 @@ MemoryCache::Statistics MemoryCache::getStatistics() |
for (const auto& resourceMapIter : m_resourceMaps) { |
for (const auto& resourceIter : *resourceMapIter.value) { |
Resource* resource = resourceIter.value->resource(); |
+ DCHECK(resource); |
switch (resource->getType()) { |
case Resource::Image: |
stats.images.addResource(resource); |