Index: third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
index d51f1939f3844f9c5ae88f087b026986413dde8b..2d483809ab89344772b85c0ca31fe7688cb2b576 100644 |
--- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
+++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
@@ -166,7 +166,6 @@ static WebURLRequest::RequestContext requestContextFromType(bool isMainFrame, Re |
ResourceFetcher::ResourceFetcher(FetchContext* context) |
: m_context(context) |
- , m_garbageCollectDocumentResourcesTimer(this, &ResourceFetcher::garbageCollectDocumentResourcesTimerFired) |
, m_resourceTimingReportTimer(this, &ResourceFetcher::resourceTimingReportTimerFired) |
, m_autoLoadImages(true) |
, m_imagesEnabled(true) |
@@ -195,7 +194,8 @@ WebTaskRunner* ResourceFetcher::loadingTaskRunner() |
Resource* ResourceFetcher::cachedResource(const KURL& resourceURL) const |
{ |
KURL url = MemoryCache::removeFragmentIdentifierIfNeeded(resourceURL); |
- return m_documentResources.get(url).get(); |
+ const WeakPtrWillBeWeakMember<Resource>& resource = m_documentResources.get(url); |
+ return resource.get(); |
} |
bool ResourceFetcher::canAccessResource(Resource* resource, SecurityOrigin* sourceOrigin, const KURL& url, AccessControlLoggingDecision logErrorsDecision) const |
@@ -321,7 +321,6 @@ void ResourceFetcher::preCacheData(const FetchRequest& request, const ResourceFa |
resource->setCacheIdentifier(cacheIdentifier); |
resource->finish(); |
memoryCache()->add(resource.get()); |
- scheduleDocumentResourcesGC(); |
} |
void ResourceFetcher::moveCachedNonBlockingResourceToBlocking(Resource* resource) |
@@ -458,7 +457,7 @@ ResourcePtr<Resource> ResourceFetcher::requestResource(FetchRequest& request, co |
requestLoadStarted(resource.get(), request, policy == Use ? ResourceLoadingFromCache : ResourceLoadingFromNetwork, isStaticData); |
ASSERT(resource->url() == url.string()); |
- m_documentResources.set(resource->url(), resource); |
+ m_documentResources.set(resource->url(), resource->asWeakPtr()); |
return resource; |
} |
@@ -770,9 +769,12 @@ bool ResourceFetcher::shouldDeferImageLoad(const KURL& url) const |
void ResourceFetcher::reloadImagesIfNotDeferred() |
{ |
+ // TODO(japhet): Once oilpan ships, the const auto& |
+ // can be replaced with a Resource*. Also, null checking |
+ // the resource probably won't be necesssary. |
for (const auto& documentResource : m_documentResources) { |
Resource* resource = documentResource.value.get(); |
- if (resource->type() == Resource::Image && resource->stillNeedsLoad() && !clientDefersImage(resource->url())) |
+ if (resource && resource->type() == Resource::Image && resource->stillNeedsLoad() && !clientDefersImage(resource->url())) |
const_cast<Resource*>(resource)->load(this, defaultResourceOptions()); |
} |
} |
@@ -786,41 +788,9 @@ void ResourceFetcher::redirectReceived(Resource* resource, const ResourceRespons |
void ResourceFetcher::didLoadResource() |
{ |
- scheduleDocumentResourcesGC(); |
context().didLoadResource(); |
} |
-void ResourceFetcher::scheduleDocumentResourcesGC() |
-{ |
- if (!m_garbageCollectDocumentResourcesTimer.isActive()) |
- m_garbageCollectDocumentResourcesTimer.startOneShot(0, BLINK_FROM_HERE); |
-} |
- |
-// Garbage collecting m_documentResources is a workaround for the |
-// ResourcePtrs on the RHS being strong references. Ideally this |
-// would be a weak map, however ResourcePtrs perform additional |
-// bookkeeping on Resources, so instead pseudo-GC them -- when the |
-// reference count reaches 1, m_documentResources is the only reference, so |
-// remove it from the map. |
-void ResourceFetcher::garbageCollectDocumentResourcesTimerFired(Timer<ResourceFetcher>* timer) |
-{ |
- ASSERT_UNUSED(timer, timer == &m_garbageCollectDocumentResourcesTimer); |
- garbageCollectDocumentResources(); |
-} |
- |
-void ResourceFetcher::garbageCollectDocumentResources() |
-{ |
- typedef Vector<String, 10> StringVector; |
- StringVector resourcesToDelete; |
- |
- for (const auto& documentResource : m_documentResources) { |
- if (documentResource.value->hasOneHandle()) |
- resourcesToDelete.append(documentResource.key); |
- } |
- |
- m_documentResources.removeAll(resourcesToDelete); |
-} |
- |
int ResourceFetcher::requestCount() const |
{ |
return m_loaders ? m_loaders->size() : 0; |
@@ -1182,6 +1152,7 @@ DEFINE_TRACE(ResourceFetcher) |
visitor->trace(m_loaders); |
visitor->trace(m_nonBlockingLoaders); |
#if ENABLE(OILPAN) |
+ visitor->trace(m_documentResources); |
visitor->trace(m_preloads); |
visitor->trace(m_resourceTimingInfoMap); |
#endif |