Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3494)

Unified Diff: third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp

Issue 1428383002: Make ResourceFetcher::m_documentResources use WeakPtr (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add TODOs Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698