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

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

Issue 1889973002: Refactoring starting a resource load (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months 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
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 rights reserved. 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ 6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
7 7
8 This library is free software; you can redistribute it and/or 8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Library General Public 9 modify it under the terms of the GNU Library General Public
10 License as published by the Free Software Foundation; either 10 License as published by the Free Software Foundation; either
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 , m_imagesEnabled(true) 197 , m_imagesEnabled(true)
198 , m_allowStaleResources(false) 198 , m_allowStaleResources(false)
199 { 199 {
200 ThreadState::current()->registerPreFinalizer(this); 200 ThreadState::current()->registerPreFinalizer(this);
201 } 201 }
202 202
203 ResourceFetcher::~ResourceFetcher() 203 ResourceFetcher::~ResourceFetcher()
204 { 204 {
205 } 205 }
206 206
207 WebTaskRunner* ResourceFetcher::loadingTaskRunner()
208 {
209 if (!m_context)
210 return nullptr;
211
212 return m_context->loadingTaskRunner();
213 }
214
215 Resource* ResourceFetcher::cachedResource(const KURL& resourceURL) const 207 Resource* ResourceFetcher::cachedResource(const KURL& resourceURL) const
216 { 208 {
217 KURL url = MemoryCache::removeFragmentIdentifierIfNeeded(resourceURL); 209 KURL url = MemoryCache::removeFragmentIdentifierIfNeeded(resourceURL);
218 const WeakMember<Resource>& resource = m_documentResources.get(url); 210 const WeakMember<Resource>& resource = m_documentResources.get(url);
219 return resource.get(); 211 return resource.get();
220 } 212 }
221 213
222 bool ResourceFetcher::canAccessResource(Resource* resource, SecurityOrigin* sour ceOrigin, const KURL& url, AccessControlLoggingDecision logErrorsDecision) const 214 bool ResourceFetcher::canAccessResource(Resource* resource, SecurityOrigin* sour ceOrigin, const KURL& url, AccessControlLoggingDecision logErrorsDecision) const
223 { 215 {
224 // Redirects can change the response URL different from one of request. 216 // Redirects can change the response URL different from one of request.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 return false; 248 return false;
257 if (resource->isImage() && shouldDeferImageLoad(resource->url())) 249 if (resource->isImage() && shouldDeferImageLoad(resource->url()))
258 return false; 250 return false;
259 return policy != Use || resource->stillNeedsLoad(); 251 return policy != Use || resource->stillNeedsLoad();
260 } 252 }
261 253
262 // Limit the number of URLs in m_validatedURLs to avoid memory bloat. 254 // Limit the number of URLs in m_validatedURLs to avoid memory bloat.
263 // http://crbug.com/52411 255 // http://crbug.com/52411
264 static const int kMaxValidatedURLsSize = 10000; 256 static const int kMaxValidatedURLsSize = 10000;
265 257
266 void ResourceFetcher::requestLoadStarted(Resource* resource, const FetchRequest& request, ResourceLoadStartType type, bool isStaticData) 258 void ResourceFetcher::requestLoadStarted(unsigned long identifier, Resource* res ource, const FetchRequest& request, ResourceLoadStartType type, bool isStaticDat a)
267 { 259 {
268 if (type == ResourceLoadingFromCache && resource->getStatus() == Resource::C ached && !m_validatedURLs.contains(resource->url())) 260 if (type == ResourceLoadingFromCache && resource->getStatus() == Resource::C ached && !m_validatedURLs.contains(resource->url()))
269 context().dispatchDidLoadResourceFromMemoryCache(resource, request.resou rceRequest().frameType(), request.resourceRequest().requestContext()); 261 context().dispatchDidLoadResourceFromMemoryCache(identifier, resource, r equest.resourceRequest().frameType(), request.resourceRequest().requestContext() );
270 262
271 if (isStaticData) 263 if (isStaticData)
272 return; 264 return;
273 265
274 if (type == ResourceLoadingFromCache && !resource->stillNeedsLoad() && !m_va lidatedURLs.contains(request.resourceRequest().url())) { 266 if (type == ResourceLoadingFromCache && !resource->stillNeedsLoad() && !m_va lidatedURLs.contains(request.resourceRequest().url())) {
275 // Resources loaded from memory cache should be reported the first time they're used. 267 // Resources loaded from memory cache should be reported the first time they're used.
276 OwnPtr<ResourceTimingInfo> info = ResourceTimingInfo::create(request.opt ions().initiatorInfo.name, monotonicallyIncreasingTime(), resource->getType() == Resource::MainResource); 268 OwnPtr<ResourceTimingInfo> info = ResourceTimingInfo::create(request.opt ions().initiatorInfo.name, monotonicallyIncreasingTime(), resource->getType() == Resource::MainResource);
277 populateResourceTiming(info.get(), resource); 269 populateResourceTiming(info.get(), resource);
278 info->clearLoadTimings(); 270 info->clearLoadTimings();
279 info->setLoadFinishTime(info->initialTime()); 271 info->setLoadFinishTime(info->initialTime());
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 } 382 }
391 383
392 Resource* ResourceFetcher::requestResource(FetchRequest& request, const Resource Factory& factory, const SubstituteData& substituteData) 384 Resource* ResourceFetcher::requestResource(FetchRequest& request, const Resource Factory& factory, const SubstituteData& substituteData)
393 { 385 {
394 ASSERT(request.options().synchronousPolicy == RequestAsynchronously || facto ry.type() == Resource::Raw || factory.type() == Resource::XSLStyleSheet); 386 ASSERT(request.options().synchronousPolicy == RequestAsynchronously || facto ry.type() == Resource::Raw || factory.type() == Resource::XSLStyleSheet);
395 387
396 context().upgradeInsecureRequest(request); 388 context().upgradeInsecureRequest(request);
397 context().addClientHintsIfNecessary(request); 389 context().addClientHintsIfNecessary(request);
398 context().addCSPHeaderIfNecessary(factory.type(), request); 390 context().addCSPHeaderIfNecessary(factory.type(), request);
399 391
400 KURL url = request.resourceRequest().url(); 392 TRACE_EVENT1("blink", "ResourceFetcher::requestResource", "url", urlForTrace Event(request.url()));
401 KURL urlWithoutFragment = MemoryCache::removeFragmentIdentifierIfNeeded(url) ;
402 TRACE_EVENT1("blink", "ResourceFetcher::requestResource", "url", urlForTrace Event(url));
403 393
404 WTF_LOG(ResourceLoading, "ResourceFetcher::requestResource '%s', charset '%s ', priority=%d, forPreload=%u, type=%s", url.elidedString().latin1().data(), req uest.charset().latin1().data(), request.priority(), request.forPreload(), Resour ce::resourceTypeName(factory.type())); 394 if (!request.url().isValid())
405
406 if (!url.isValid())
407 return nullptr; 395 return nullptr;
408 396
409 if (!context().canRequest(factory.type(), request.resourceRequest(), urlWith outFragment, request.options(), request.forPreload(), request.getOriginRestricti on())) 397 if (!context().canRequest(factory.type(), request.resourceRequest(), MemoryC ache::removeFragmentIdentifierIfNeeded(request.url()), request.options(), reques t.forPreload(), request.getOriginRestriction()))
398 return nullptr;
399
400 unsigned long identifier = createUniqueIdentifier();
401 request.setPriority(loadPriority(factory.type(), request, ResourcePriority:: NotVisible));
402 request.mutableResourceRequest().setPriority(request.priority());
403 initializeResourceRequest(request.mutableResourceRequest(), factory.type(), request.defer());
404 context().willStartLoadingResource(identifier, request.mutableResourceReques t(), factory.type());
405 if (!request.url().isValid())
410 return nullptr; 406 return nullptr;
411 407
412 if (!request.forPreload()) { 408 if (!request.forPreload()) {
413 V8DOMActivityLogger* activityLogger = nullptr; 409 V8DOMActivityLogger* activityLogger = nullptr;
414 if (request.options().initiatorInfo.name == FetchInitiatorTypeNames::xml httprequest) 410 if (request.options().initiatorInfo.name == FetchInitiatorTypeNames::xml httprequest)
415 activityLogger = V8DOMActivityLogger::currentActivityLogger(); 411 activityLogger = V8DOMActivityLogger::currentActivityLogger();
416 else 412 else
417 activityLogger = V8DOMActivityLogger::currentActivityLoggerIfIsolate dWorld(); 413 activityLogger = V8DOMActivityLogger::currentActivityLoggerIfIsolate dWorld();
418 414
419 if (activityLogger) { 415 if (activityLogger) {
420 Vector<String> argv; 416 Vector<String> argv;
421 argv.append(Resource::resourceTypeToString(factory.type(), request.o ptions().initiatorInfo)); 417 argv.append(Resource::resourceTypeToString(factory.type(), request.o ptions().initiatorInfo));
422 argv.append(url); 418 argv.append(request.url());
423 activityLogger->logEvent("blinkRequestResource", argv.size(), argv.d ata()); 419 activityLogger->logEvent("blinkRequestResource", argv.size(), argv.d ata());
424 } 420 }
425 } 421 }
426 422
427 bool isStaticData = request.resourceRequest().url().protocolIsData() || subs tituteData.isValid() || m_archive; 423 bool isStaticData = request.resourceRequest().url().protocolIsData() || subs tituteData.isValid() || m_archive;
428 Resource* resource(nullptr); 424 Resource* resource(nullptr);
429 if (isStaticData) 425 if (isStaticData)
430 resource = resourceForStaticData(request, factory, substituteData); 426 resource = resourceForStaticData(request, factory, substituteData);
431 if (!resource) 427 if (!resource)
432 resource = memoryCache()->resourceForURL(url, getCacheIdentifier()); 428 resource = memoryCache()->resourceForURL(request.url(), getCacheIdentifi er());
433 429
434 // See if we can use an existing resource from the cache. If so, we need to move it to be load blocking. 430 // See if we can use an existing resource from the cache. If so, we need to move it to be load blocking.
435 moveCachedNonBlockingResourceToBlocking(resource, request); 431 moveCachedNonBlockingResourceToBlocking(resource, request);
436 432
437 const RevalidationPolicy policy = determineRevalidationPolicy(factory.type() , request, resource, isStaticData); 433 const RevalidationPolicy policy = determineRevalidationPolicy(factory.type() , request, resource, isStaticData);
438 434
439 updateMemoryCacheStats(resource, policy, request, factory, isStaticData); 435 updateMemoryCacheStats(resource, policy, request, factory, isStaticData);
440 436
441 initializeResourceRequest(request.mutableResourceRequest(), factory.type(), request.defer()); 437 if (policy != Use)
438 willSendRequest(identifier, request.mutableResourceRequest(), ResourceRe sponse(), request.options());
439
442 switch (policy) { 440 switch (policy) {
443 case Reload: 441 case Reload:
444 memoryCache()->remove(resource); 442 memoryCache()->remove(resource);
445 // Fall through 443 // Fall through
446 case Load: 444 case Load:
447 resource = createResourceForLoading(request, request.charset(), factory) ; 445 resource = createResourceForLoading(request, request.charset(), factory) ;
448 break; 446 break;
449 case Revalidate: 447 case Revalidate:
450 initializeRevalidation(request, resource); 448 initializeRevalidation(request, resource);
451 break; 449 break;
452 case Use: 450 case Use:
453 memoryCache()->updateForAccess(resource); 451 memoryCache()->updateForAccess(resource);
454 break; 452 break;
455 } 453 }
456 454
457 if (!resource) 455 if (!resource)
458 return nullptr; 456 return nullptr;
459 if (resource->getType() != factory.type()) { 457 if (resource->getType() != factory.type()) {
460 ASSERT(request.forPreload()); 458 ASSERT(request.forPreload());
461 return nullptr; 459 return nullptr;
462 } 460 }
463 461
464 if (!resource->hasClientsOrObservers()) 462 if (!resource->hasClientsOrObservers())
465 m_deadStatsRecorder.update(policy); 463 m_deadStatsRecorder.update(policy);
466 464
467 if (policy != Use) 465 if (policy != Use)
468 resource->setIdentifier(createUniqueIdentifier()); 466 resource->setIdentifier(identifier);
469 467
470 if (!request.forPreload() || policy != Use) { 468 if (!request.forPreload() || policy != Use) {
471 ResourceLoadPriority priority = loadPriority(factory.type(), request, Re sourcePriority::NotVisible);
472 // When issuing another request for a resource that is already in-flight make 469 // When issuing another request for a resource that is already in-flight make
473 // sure to not demote the priority of the in-flight request. If the new request 470 // sure to not demote the priority of the in-flight request. If the new request
474 // isn't at the same priority as the in-flight request, only allow promo tions. 471 // isn't at the same priority as the in-flight request, only allow promo tions.
475 // This can happen when a visible image's priority is increased and then another 472 // This can happen when a visible image's priority is increased and then another
476 // reference to the image is parsed (which would be at a lower priority) . 473 // reference to the image is parsed (which would be at a lower priority) .
477 if (priority > resource->resourceRequest().priority()) 474 if (request.priority() > resource->resourceRequest().priority())
478 resource->didChangePriority(priority, 0); 475 resource->didChangePriority(request.priority(), 0);
479 } 476 }
480 477
481 // If only the fragment identifiers differ, it is the same resource. 478 // If only the fragment identifiers differ, it is the same resource.
482 ASSERT(equalIgnoringFragmentIdentifier(resource->url(), url)); 479 DCHECK(equalIgnoringFragmentIdentifier(resource->url(), request.url()));
483 requestLoadStarted(resource, request, policy == Use ? ResourceLoadingFromCac he : ResourceLoadingFromNetwork, isStaticData); 480 requestLoadStarted(identifier, resource, request, policy == Use ? ResourceLo adingFromCache : ResourceLoadingFromNetwork, isStaticData);
484 m_documentResources.set(urlWithoutFragment, resource); 481 m_documentResources.set(MemoryCache::removeFragmentIdentifierIfNeeded(reques t.url()), resource);
485 482
486 if (!resourceNeedsLoad(resource, request, policy)) 483 if (!resourceNeedsLoad(resource, request, policy))
487 return resource; 484 return resource;
488 485
489 if (!context().shouldLoadNewResource(factory.type())) { 486 if (!startLoad(resource))
490 if (memoryCache()->contains(resource))
491 memoryCache()->remove(resource);
492 return nullptr; 487 return nullptr;
493 }
494
495 resource->load(this);
496 ASSERT(!resource->errorOccurred() || request.options().synchronousPolicy == RequestSynchronously); 488 ASSERT(!resource->errorOccurred() || request.options().synchronousPolicy == RequestSynchronously);
497 return resource; 489 return resource;
498 } 490 }
499 491
500 void ResourceFetcher::resourceTimingReportTimerFired(Timer<ResourceFetcher>* tim er) 492 void ResourceFetcher::resourceTimingReportTimerFired(Timer<ResourceFetcher>* tim er)
501 { 493 {
502 ASSERT_UNUSED(timer, timer == &m_resourceTimingReportTimer); 494 ASSERT_UNUSED(timer, timer == &m_resourceTimingReportTimer);
503 Vector<OwnPtr<ResourceTimingInfo>> timingReports; 495 Vector<OwnPtr<ResourceTimingInfo>> timingReports;
504 timingReports.swap(m_scheduledResourceTimingReports); 496 timingReports.swap(m_scheduledResourceTimingReports);
505 for (const auto& timingInfo : timingReports) 497 for (const auto& timingInfo : timingReports)
(...skipping 16 matching lines...) Expand all
522 if (request.getCachePolicy() == WebCachePolicy::UseProtocolCachePolicy) 514 if (request.getCachePolicy() == WebCachePolicy::UseProtocolCachePolicy)
523 request.setCachePolicy(context().resourceRequestCachePolicy(request, typ e, defer)); 515 request.setCachePolicy(context().resourceRequestCachePolicy(request, typ e, defer));
524 if (request.requestContext() == WebURLRequest::RequestContextUnspecified) 516 if (request.requestContext() == WebURLRequest::RequestContextUnspecified)
525 determineRequestContext(request, type); 517 determineRequestContext(request, type);
526 if (type == Resource::LinkPrefetch) 518 if (type == Resource::LinkPrefetch)
527 request.setHTTPHeaderField(HTTPNames::Purpose, "prefetch"); 519 request.setHTTPHeaderField(HTTPNames::Purpose, "prefetch");
528 520
529 context().addAdditionalRequestHeaders(request, (type == Resource::MainResour ce) ? FetchMainResource : FetchSubresource); 521 context().addAdditionalRequestHeaders(request, (type == Resource::MainResour ce) ? FetchMainResource : FetchSubresource);
530 } 522 }
531 523
532 void ResourceFetcher::initializeRevalidation(const FetchRequest& request, Resour ce* resource) 524 void ResourceFetcher::initializeRevalidation(FetchRequest& request, Resource* re source)
533 { 525 {
534 ASSERT(resource); 526 ASSERT(resource);
535 ASSERT(memoryCache()->contains(resource)); 527 ASSERT(memoryCache()->contains(resource));
536 ASSERT(resource->isLoaded()); 528 ASSERT(resource->isLoaded());
537 ASSERT(resource->canUseCacheValidator()); 529 ASSERT(resource->canUseCacheValidator());
538 ASSERT(!resource->isCacheValidator()); 530 ASSERT(!resource->isCacheValidator());
539 ASSERT(!context().isControlledByServiceWorker()); 531 ASSERT(!context().isControlledByServiceWorker());
540 532
541 ResourceRequest revalidatingRequest(resource->resourceRequest()); 533 ResourceRequest& revalidatingRequest = request.mutableResourceRequest();
542 revalidatingRequest.clearHTTPReferrer(); 534 revalidatingRequest.clearHTTPReferrer();
543 initializeResourceRequest(revalidatingRequest, resource->getType(), request. defer()); 535 initializeResourceRequest(revalidatingRequest, resource->getType(), request. defer());
544 536
545 const AtomicString& lastModified = resource->response().httpHeaderField(HTTP Names::Last_Modified); 537 const AtomicString& lastModified = resource->response().httpHeaderField(HTTP Names::Last_Modified);
546 const AtomicString& eTag = resource->response().httpHeaderField(HTTPNames::E Tag); 538 const AtomicString& eTag = resource->response().httpHeaderField(HTTPNames::E Tag);
547 if (!lastModified.isEmpty() || !eTag.isEmpty()) { 539 if (!lastModified.isEmpty() || !eTag.isEmpty()) {
548 ASSERT(context().getCachePolicy() != CachePolicyReload); 540 ASSERT(context().getCachePolicy() != CachePolicyReload);
549 if (context().getCachePolicy() == CachePolicyRevalidate) 541 if (context().getCachePolicy() == CachePolicyRevalidate)
550 revalidatingRequest.setHTTPHeaderField(HTTPNames::Cache_Control, "ma x-age=0"); 542 revalidatingRequest.setHTTPHeaderField(HTTPNames::Cache_Control, "ma x-age=0");
551 } 543 }
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 return Reload; 673 return Reload;
682 674
683 // Don't try to reuse an in-progress async request for a new sync request. 675 // Don't try to reuse an in-progress async request for a new sync request.
684 if (fetchRequest.options().synchronousPolicy == RequestSynchronously && exis tingResource->isLoading()) 676 if (fetchRequest.options().synchronousPolicy == RequestSynchronously && exis tingResource->isLoading())
685 return Reload; 677 return Reload;
686 678
687 // Don't reload resources while pasting. 679 // Don't reload resources while pasting.
688 if (m_allowStaleResources) 680 if (m_allowStaleResources)
689 return Use; 681 return Use;
690 682
691 if (request.getCachePolicy() == WebCachePolicy::BypassingCache)
692 return Reload;
693
694 if (!fetchRequest.options().canReuseRequest(existingResource->options())) 683 if (!fetchRequest.options().canReuseRequest(existingResource->options()))
695 return Reload; 684 return Reload;
696 685
697 // Always use preloads. 686 // Always use preloads.
698 if (existingResource->isPreloaded()) 687 if (existingResource->isPreloaded())
699 return Use; 688 return Use;
700 689
701 // CachePolicyHistoryBuffer uses the cache no matter what. 690 // CachePolicyHistoryBuffer uses the cache no matter what.
702 CachePolicy cachePolicy = context().getCachePolicy(); 691 CachePolicy cachePolicy = context().getCachePolicy();
703 if (cachePolicy == CachePolicyHistoryBuffer) 692 if (cachePolicy == CachePolicyHistoryBuffer)
(...skipping 21 matching lines...) Expand all
725 // We also group loads of the same resource together. 714 // We also group loads of the same resource together.
726 // Raw resources are exempted, as XHRs fall into this category and may have user-set Cache-Control: 715 // Raw resources are exempted, as XHRs fall into this category and may have user-set Cache-Control:
727 // headers or other factors that require separate requests. 716 // headers or other factors that require separate requests.
728 if (type != Resource::Raw) { 717 if (type != Resource::Raw) {
729 if (!context().isLoadComplete() && m_validatedURLs.contains(existingReso urce->url())) 718 if (!context().isLoadComplete() && m_validatedURLs.contains(existingReso urce->url()))
730 return Use; 719 return Use;
731 if (existingResource->isLoading()) 720 if (existingResource->isLoading())
732 return Use; 721 return Use;
733 } 722 }
734 723
724 if (request.getCachePolicy() == WebCachePolicy::BypassingCache)
Nate Chapin 2016/05/18 23:56:05 Turns out initializeResourceRequest() is called to
725 return Reload;
726
735 // CachePolicyReload always reloads 727 // CachePolicyReload always reloads
736 if (cachePolicy == CachePolicyReload) { 728 if (cachePolicy == CachePolicyReload) {
737 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicy r eloading due to CachePolicyReload."); 729 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicy r eloading due to CachePolicyReload.");
738 return Reload; 730 return Reload;
739 } 731 }
740 732
741 // We'll try to reload the resource if it failed last time. 733 // We'll try to reload the resource if it failed last time.
742 if (existingResource->errorOccurred()) { 734 if (existingResource->errorOccurred()) {
743 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicye reloading due to resource being in the error state"); 735 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicye reloading due to resource being in the error state");
744 return Reload; 736 return Reload;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 795
804 bool ResourceFetcher::shouldDeferImageLoad(const KURL& url) const 796 bool ResourceFetcher::shouldDeferImageLoad(const KURL& url) const
805 { 797 {
806 return !context().allowImage(m_imagesEnabled, url) || !m_autoLoadImages; 798 return !context().allowImage(m_imagesEnabled, url) || !m_autoLoadImages;
807 } 799 }
808 800
809 void ResourceFetcher::reloadImagesIfNotDeferred() 801 void ResourceFetcher::reloadImagesIfNotDeferred()
810 { 802 {
811 for (Resource* resource : m_documentResources.values()) { 803 for (Resource* resource : m_documentResources.values()) {
812 if (resource->getType() == Resource::Image && resource->stillNeedsLoad() && !shouldDeferImageLoad(resource->url())) 804 if (resource->getType() == Resource::Image && resource->stillNeedsLoad() && !shouldDeferImageLoad(resource->url()))
813 const_cast<Resource*>(resource)->load(this); 805 startLoad(resource);
814 } 806 }
815 } 807 }
816 808
817 int ResourceFetcher::requestCount() const 809 int ResourceFetcher::requestCount() const
818 { 810 {
819 return m_loaders ? m_loaders->size() : 0; 811 return m_loaders ? m_loaders->size() : 0;
820 } 812 }
821 813
822 void ResourceFetcher::preloadStarted(Resource* resource) 814 void ResourceFetcher::preloadStarted(Resource* resource)
823 { 815 {
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
945 } 937 }
946 938
947 void ResourceFetcher::moveResourceLoaderToNonBlocking(ResourceLoader* loader) 939 void ResourceFetcher::moveResourceLoaderToNonBlocking(ResourceLoader* loader)
948 { 940 {
949 if (!m_nonBlockingLoaders) 941 if (!m_nonBlockingLoaders)
950 m_nonBlockingLoaders = ResourceLoaderSet::create(); 942 m_nonBlockingLoaders = ResourceLoaderSet::create();
951 m_nonBlockingLoaders->add(loader); 943 m_nonBlockingLoaders->add(loader);
952 m_loaders->remove(loader); 944 m_loaders->remove(loader);
953 } 945 }
954 946
955 void ResourceFetcher::willStartLoadingResource(Resource* resource, ResourceLoade r* loader, ResourceRequest& request) 947 bool ResourceFetcher::startLoad(Resource* resource)
956 { 948 {
949 DCHECK(resource && resource->stillNeedsLoad());
950 if (!context().shouldLoadNewResource(resource->getType())) {
951 memoryCache()->remove(resource);
952 return false;
953 }
954
955 ResourceLoader* loader = ResourceLoader::create(this, resource);
957 if (resource->shouldBlockLoadEvent()) { 956 if (resource->shouldBlockLoadEvent()) {
958 if (!m_loaders) 957 if (!m_loaders)
959 m_loaders = ResourceLoaderSet::create(); 958 m_loaders = ResourceLoaderSet::create();
960 m_loaders->add(loader); 959 m_loaders->add(loader);
961 } else { 960 } else {
962 if (!m_nonBlockingLoaders) 961 if (!m_nonBlockingLoaders)
963 m_nonBlockingLoaders = ResourceLoaderSet::create(); 962 m_nonBlockingLoaders = ResourceLoaderSet::create();
964 m_nonBlockingLoaders->add(loader); 963 m_nonBlockingLoaders->add(loader);
965 } 964 }
966 965
967 context().willStartLoadingResource(resource, request);
968 storeResourceTimingInitiatorInformation(resource); 966 storeResourceTimingInitiatorInformation(resource);
969 967 resource->setFetcherSecurityOrigin(context().getSecurityOrigin());
970 context().dispatchWillSendRequest(resource->identifier(), request, ResourceR esponse(), resource->options().initiatorInfo); 968 loader->start(resource->requestForLoadStart(), context().loadingTaskRunner() , context().defersLoading());
969 return true;
971 } 970 }
972 971
973 void ResourceFetcher::removeResourceLoader(ResourceLoader* loader) 972 void ResourceFetcher::removeResourceLoader(ResourceLoader* loader)
974 { 973 {
975 if (m_loaders && m_loaders->contains(loader)) 974 if (m_loaders && m_loaders->contains(loader))
976 m_loaders->remove(loader); 975 m_loaders->remove(loader);
977 else if (m_nonBlockingLoaders && m_nonBlockingLoaders->contains(loader)) 976 else if (m_nonBlockingLoaders && m_nonBlockingLoaders->contains(loader))
978 m_nonBlockingLoaders->remove(loader); 977 m_nonBlockingLoaders->remove(loader);
979 else 978 else
980 ASSERT_NOT_REACHED(); 979 ASSERT_NOT_REACHED();
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1029 return false; 1028 return false;
1030 } 1029 }
1031 } 1030 }
1032 if (resource->getType() == Resource::Image && shouldDeferImageLoad(newRe quest.url())) 1031 if (resource->getType() == Resource::Image && shouldDeferImageLoad(newRe quest.url()))
1033 return false; 1032 return false;
1034 } 1033 }
1035 1034
1036 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource); 1035 ResourceTimingInfoMap::iterator it = m_resourceTimingInfoMap.find(resource);
1037 if (it != m_resourceTimingInfoMap.end()) 1036 if (it != m_resourceTimingInfoMap.end())
1038 it->value->addRedirect(redirectResponse); 1037 it->value->addRedirect(redirectResponse);
1039 context().dispatchWillSendRequest(resource->identifier(), newRequest, redire ctResponse, resource->options().initiatorInfo); 1038 willSendRequest(resource->identifier(), newRequest, redirectResponse, resour ce->options());
1040 return true; 1039 return true;
1041 } 1040 }
1042 1041
1042 void ResourceFetcher::willSendRequest(unsigned long identifier, ResourceRequest& newRequest, const ResourceResponse& redirectResponse, const ResourceLoaderOptio ns& options)
1043 {
1044 newRequest.setAllowStoredCredentials(options.allowCredentials == AllowStored Credentials);
1045 context().dispatchWillSendRequest(identifier, newRequest, redirectResponse, options.initiatorInfo);
1046 }
1047
1043 void ResourceFetcher::updateAllImageResourcePriorities() 1048 void ResourceFetcher::updateAllImageResourcePriorities()
1044 { 1049 {
1045 TRACE_EVENT0("blink", "ResourceLoadPriorityOptimizer::updateAllImageResource Priorities"); 1050 TRACE_EVENT0("blink", "ResourceLoadPriorityOptimizer::updateAllImageResource Priorities");
1046 for (const auto& documentResource : m_documentResources) { 1051 for (const auto& documentResource : m_documentResources) {
1047 Resource* resource = documentResource.value.get(); 1052 Resource* resource = documentResource.value.get();
1048 if (!resource || !resource->isImage() || !resource->isLoading()) 1053 if (!resource || !resource->isImage() || !resource->isLoading())
1049 continue; 1054 continue;
1050 1055
1051 ResourcePriority resourcePriority = resource->priorityFromObservers(); 1056 ResourcePriority resourcePriority = resource->priorityFromObservers();
1052 ResourceLoadPriority resourceLoadPriority = loadPriority(Resource::Image , FetchRequest(resource->resourceRequest(), FetchInitiatorInfo()), resourcePrior ity.visibility); 1057 ResourceLoadPriority resourceLoadPriority = loadPriority(Resource::Image , FetchRequest(resource->resourceRequest(), FetchInitiatorInfo()), resourcePrior ity.visibility);
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
1171 visitor->trace(m_context); 1176 visitor->trace(m_context);
1172 visitor->trace(m_archive); 1177 visitor->trace(m_archive);
1173 visitor->trace(m_loaders); 1178 visitor->trace(m_loaders);
1174 visitor->trace(m_nonBlockingLoaders); 1179 visitor->trace(m_nonBlockingLoaders);
1175 visitor->trace(m_documentResources); 1180 visitor->trace(m_documentResources);
1176 visitor->trace(m_preloads); 1181 visitor->trace(m_preloads);
1177 visitor->trace(m_resourceTimingInfoMap); 1182 visitor->trace(m_resourceTimingInfoMap);
1178 } 1183 }
1179 1184
1180 } // namespace blink 1185 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/fetch/ResourceFetcher.h ('k') | third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698