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

Side by Side Diff: third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp

Issue 2537303003: Fix memory corruption related to load blocking resource move (Closed)
Patch Set: CHECK Created 4 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 unified diff | Download patch
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All
6 rights reserved. 6 rights reserved.
7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ 7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
8 8
9 This library is free software; you can redistribute it and/or 9 This library is free software; you can redistribute it and/or
10 modify it under the terms of the GNU Library General Public 10 modify it under the terms of the GNU Library General Public
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 return resource; 444 return resource;
445 } 445 }
446 446
447 void ResourceFetcher::moveCachedNonBlockingResourceToBlocking( 447 void ResourceFetcher::moveCachedNonBlockingResourceToBlocking(
448 Resource* resource, 448 Resource* resource,
449 const FetchRequest& request) { 449 const FetchRequest& request) {
450 // TODO(yoav): Test that non-blocking resources (video/audio/track) continue 450 // TODO(yoav): Test that non-blocking resources (video/audio/track) continue
451 // to not-block even after being preloaded and discovered. 451 // to not-block even after being preloaded and discovered.
452 if (resource && resource->loader() && 452 if (resource && resource->loader() &&
453 resource->isLoadEventBlockingResourceType() && 453 resource->isLoadEventBlockingResourceType() &&
454 m_nonBlockingLoaders.contains(resource->loader()) &&
454 resource->isLinkPreload() && !request.forPreload()) { 455 resource->isLinkPreload() && !request.forPreload()) {
455 m_nonBlockingLoaders.remove(resource->loader()); 456 m_nonBlockingLoaders.remove(resource->loader());
456 m_loaders.add(resource->loader()); 457 m_loaders.add(resource->loader());
457 } 458 }
458 } 459 }
459 460
460 void ResourceFetcher::updateMemoryCacheStats(Resource* resource, 461 void ResourceFetcher::updateMemoryCacheStats(Resource* resource,
461 RevalidationPolicy policy, 462 RevalidationPolicy policy,
462 const FetchRequest& request, 463 const FetchRequest& request,
463 const ResourceFactory& factory, 464 const ResourceFactory& factory,
(...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after
1273 1274
1274 void ResourceFetcher::acceptDataFromThreadedReceiver(unsigned long identifier, 1275 void ResourceFetcher::acceptDataFromThreadedReceiver(unsigned long identifier,
1275 const char* data, 1276 const char* data,
1276 int dataLength, 1277 int dataLength,
1277 int encodedDataLength) { 1278 int encodedDataLength) {
1278 context().dispatchDidReceiveData(identifier, data, dataLength, 1279 context().dispatchDidReceiveData(identifier, data, dataLength,
1279 encodedDataLength); 1280 encodedDataLength);
1280 } 1281 }
1281 1282
1282 void ResourceFetcher::moveResourceLoaderToNonBlocking(ResourceLoader* loader) { 1283 void ResourceFetcher::moveResourceLoaderToNonBlocking(ResourceLoader* loader) {
1284 DCHECK(loader);
1285 // TODO(yoav): Convert CHECK to DCHECK if no crash reports come in.
1286 CHECK(m_loaders.contains(loader));
1283 m_nonBlockingLoaders.add(loader); 1287 m_nonBlockingLoaders.add(loader);
1284 m_loaders.remove(loader); 1288 m_loaders.remove(loader);
1285 } 1289 }
1286 1290
1287 bool ResourceFetcher::startLoad(Resource* resource) { 1291 bool ResourceFetcher::startLoad(Resource* resource) {
1288 DCHECK(resource); 1292 DCHECK(resource);
1289 DCHECK(resource->stillNeedsLoad()); 1293 DCHECK(resource->stillNeedsLoad());
1290 if (!context().shouldLoadNewResource(resource->getType())) { 1294 if (!context().shouldLoadNewResource(resource->getType())) {
1291 memoryCache()->remove(resource); 1295 memoryCache()->remove(resource);
1292 return false; 1296 return false;
(...skipping 24 matching lines...) Expand all
1317 storeResourceTimingInitiatorInformation(resource); 1321 storeResourceTimingInitiatorInformation(resource);
1318 resource->setFetcherSecurityOrigin(sourceOrigin); 1322 resource->setFetcherSecurityOrigin(sourceOrigin);
1319 1323
1320 loader->activateCacheAwareLoadingIfNeeded(request); 1324 loader->activateCacheAwareLoadingIfNeeded(request);
1321 loader->start(request, context().loadingTaskRunner(), 1325 loader->start(request, context().loadingTaskRunner(),
1322 context().defersLoading()); 1326 context().defersLoading());
1323 return true; 1327 return true;
1324 } 1328 }
1325 1329
1326 void ResourceFetcher::removeResourceLoader(ResourceLoader* loader) { 1330 void ResourceFetcher::removeResourceLoader(ResourceLoader* loader) {
1331 DCHECK(loader);
1327 if (m_loaders.contains(loader)) 1332 if (m_loaders.contains(loader))
1328 m_loaders.remove(loader); 1333 m_loaders.remove(loader);
1329 else if (m_nonBlockingLoaders.contains(loader)) 1334 else if (m_nonBlockingLoaders.contains(loader))
1330 m_nonBlockingLoaders.remove(loader); 1335 m_nonBlockingLoaders.remove(loader);
1331 else 1336 else
1332 NOTREACHED(); 1337 NOTREACHED();
1333 } 1338 }
1334 1339
1335 void ResourceFetcher::stopFetching() { 1340 void ResourceFetcher::stopFetching() {
1336 HeapVector<Member<ResourceLoader>> loadersToCancel; 1341 HeapVector<Member<ResourceLoader>> loadersToCancel;
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
1641 visitor->trace(m_context); 1646 visitor->trace(m_context);
1642 visitor->trace(m_archive); 1647 visitor->trace(m_archive);
1643 visitor->trace(m_loaders); 1648 visitor->trace(m_loaders);
1644 visitor->trace(m_nonBlockingLoaders); 1649 visitor->trace(m_nonBlockingLoaders);
1645 visitor->trace(m_documentResources); 1650 visitor->trace(m_documentResources);
1646 visitor->trace(m_preloads); 1651 visitor->trace(m_preloads);
1647 visitor->trace(m_resourceTimingInfoMap); 1652 visitor->trace(m_resourceTimingInfoMap);
1648 } 1653 }
1649 1654
1650 } // namespace blink 1655 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698