Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |