Index: Source/core/fetch/ResourceFetcher.cpp |
diff --git a/Source/core/fetch/ResourceFetcher.cpp b/Source/core/fetch/ResourceFetcher.cpp |
index e0874bc6d37e800dba7348467b4605dc261321b8..8cef48eb18251e4b00ff9726c2feed07f6ba3024 100644 |
--- a/Source/core/fetch/ResourceFetcher.cpp |
+++ b/Source/core/fetch/ResourceFetcher.cpp |
@@ -63,40 +63,130 @@ ResourceLoadPriority ResourceFetcher::loadPriority(Resource::Type type, const Fe |
if (request.priority() != ResourceLoadPriorityUnresolved) |
return request.priority(); |
- switch (type) { |
- case Resource::MainResource: |
- return context().isLowPriorityIframe() ? ResourceLoadPriorityVeryLow : ResourceLoadPriorityVeryHigh; |
- case Resource::CSSStyleSheet: |
- return ResourceLoadPriorityHigh; |
- case Resource::Raw: |
- return request.options().synchronousPolicy == RequestSynchronously ? ResourceLoadPriorityVeryHigh : ResourceLoadPriorityMedium; |
- case Resource::Script: |
- // Async scripts do not block the parser so they get the lowest priority and can be |
- // loaded in parser order with images. |
- if (FetchRequest::LazyLoad == request.defer()) |
+ // An image fetch is used to distinguish between "early" and "late" scripts in a document |
Bryan McQuade
2015/07/22 17:51:06
this means that if a doc contains no images we'll
Pat Meenan
2015/07/28 16:55:15
Correct though the failure when it doesn't detect
|
+ if (type == Resource::Image) |
+ m_imageFetched = true; |
+ |
+ int fetchMode = context().resourceFetchMode(); |
+ |
+ if (fetchMode == 0) { |
Bryan McQuade
2015/07/22 17:51:06
this code flow is getting pretty complex. how do y
Pat Meenan
2015/07/28 16:55:15
I changed the code and folded them all back into a
|
+ switch (type) { |
+ case Resource::MainResource: |
+ return context().isLowPriorityIframe() ? ResourceLoadPriorityVeryLow : ResourceLoadPriorityVeryHigh; |
+ case Resource::CSSStyleSheet: |
+ return ResourceLoadPriorityHigh; |
+ case Resource::Raw: |
+ return request.options().synchronousPolicy == RequestSynchronously ? ResourceLoadPriorityVeryHigh : ResourceLoadPriorityMedium; |
+ case Resource::Script: |
+ // Async scripts do not block the parser so they get the lowest priority and can be |
+ // loaded in parser order with images. |
+ if (FetchRequest::LazyLoad == request.defer()) |
+ return ResourceLoadPriorityLow; |
+ return ResourceLoadPriorityMedium; |
+ case Resource::Font: |
+ case Resource::ImportResource: |
+ return ResourceLoadPriorityMedium; |
+ case Resource::Image: |
+ // Default images to VeryLow, and promote whatever is visible. This improves |
+ // speed-index by ~5% on average, ~14% at the 99th percentile. |
+ return ResourceLoadPriorityVeryLow; |
+ case Resource::Media: |
return ResourceLoadPriorityLow; |
- return ResourceLoadPriorityMedium; |
- case Resource::Font: |
- case Resource::ImportResource: |
- return ResourceLoadPriorityMedium; |
- case Resource::Image: |
- // Default images to VeryLow, and promote whatever is visible. This improves |
- // speed-index by ~5% on average, ~14% at the 99th percentile. |
- return ResourceLoadPriorityVeryLow; |
- case Resource::Media: |
- return ResourceLoadPriorityLow; |
- case Resource::XSLStyleSheet: |
- ASSERT(RuntimeEnabledFeatures::xsltEnabled()); |
- return ResourceLoadPriorityHigh; |
- case Resource::SVGDocument: |
- return ResourceLoadPriorityLow; |
- case Resource::LinkPrefetch: |
- case Resource::LinkPreload: |
- return ResourceLoadPriorityVeryLow; |
- case Resource::LinkSubresource: |
- return ResourceLoadPriorityLow; |
- case Resource::TextTrack: |
- return ResourceLoadPriorityLow; |
+ case Resource::XSLStyleSheet: |
+ ASSERT(RuntimeEnabledFeatures::xsltEnabled()); |
+ return ResourceLoadPriorityHigh; |
+ case Resource::SVGDocument: |
+ return ResourceLoadPriorityLow; |
+ case Resource::LinkPrefetch: |
+ case Resource::LinkPreload: |
+ return ResourceLoadPriorityVeryLow; |
+ case Resource::LinkSubresource: |
+ return ResourceLoadPriorityLow; |
+ case Resource::TextTrack: |
+ return ResourceLoadPriorityLow; |
+ } |
+ } else if (fetchMode == 1) { |
+ // lower priority for late-body scripts |
+ switch (type) { |
+ case Resource::MainResource: |
+ return context().isLowPriorityIframe() ? ResourceLoadPriorityVeryLow : ResourceLoadPriorityVeryHigh; |
+ case Resource::CSSStyleSheet: |
+ return ResourceLoadPriorityHigh; |
+ case Resource::Raw: |
+ return request.options().synchronousPolicy == RequestSynchronously ? ResourceLoadPriorityVeryHigh : ResourceLoadPriorityMedium; |
+ case Resource::Script: |
+ // Async scripts do not block the parser so they get the lowest priority and can be |
+ // loaded in parser order with images. |
+ if (FetchRequest::LazyLoad == request.defer()) |
+ return ResourceLoadPriorityLow; |
+ if (!request.forPreload()) |
+ return ResourceLoadPriorityMedium; |
+ return m_imageFetched ? ResourceLoadPriorityLow : ResourceLoadPriorityMedium; |
+ case Resource::Font: |
+ case Resource::ImportResource: |
+ return ResourceLoadPriorityMedium; |
+ case Resource::Image: |
+ // Default images to VeryLow, and promote whatever is visible. This improves |
+ // speed-index by ~5% on average, ~14% at the 99th percentile. |
+ return ResourceLoadPriorityVeryLow; |
+ case Resource::Media: |
+ return ResourceLoadPriorityLow; |
+ case Resource::XSLStyleSheet: |
+ ASSERT(RuntimeEnabledFeatures::xsltEnabled()); |
+ return ResourceLoadPriorityHigh; |
+ case Resource::SVGDocument: |
+ return ResourceLoadPriorityLow; |
+ case Resource::LinkPrefetch: |
+ case Resource::LinkPreload: |
+ return ResourceLoadPriorityVeryLow; |
+ case Resource::LinkSubresource: |
+ return ResourceLoadPriorityLow; |
+ case Resource::TextTrack: |
+ return ResourceLoadPriorityLow; |
+ } |
+ } else if (fetchMode == 2) { |
+ // Increased CSS, script and image priorities and lowered late-body script priorities |
+ switch (type) { |
+ case Resource::MainResource: |
+ return context().isLowPriorityIframe() ? ResourceLoadPriorityVeryLow : ResourceLoadPriorityVeryHigh; |
+ case Resource::CSSStyleSheet: |
+ return ResourceLoadPriorityVeryHigh; |
+ case Resource::Raw: |
+ return request.options().synchronousPolicy == RequestSynchronously ? ResourceLoadPriorityVeryHigh : ResourceLoadPriorityMedium; |
+ case Resource::Script: |
+ // Async scripts do not block the parser so they get the lowest priority and can be |
+ // loaded in parser order with images. |
+ if (FetchRequest::LazyLoad == request.defer()) |
+ return ResourceLoadPriorityMedium; |
+ // Parser=blocking scripts need to be loaded at a high priority |
+ if (!request.forPreload()) |
+ return ResourceLoadPriorityHigh; |
+ // Early scripts (before the first image) get a higher priority as they are |
+ // likely render-blocking. |
+ return m_imageFetched ? ResourceLoadPriorityMedium : ResourceLoadPriorityHigh; |
+ case Resource::Font: |
+ return ResourceLoadPriorityVeryHigh; |
+ case Resource::ImportResource: |
+ return ResourceLoadPriorityMedium; |
+ case Resource::Image: |
+ // Default images to VeryLow, and promote whatever is visible. This improves |
+ // speed-index by ~5% on average, ~14% at the 99th percentile. |
+ return ResourceLoadPriorityLow; |
+ case Resource::Media: |
+ return ResourceLoadPriorityLow; |
+ case Resource::XSLStyleSheet: |
+ ASSERT(RuntimeEnabledFeatures::xsltEnabled()); |
+ return ResourceLoadPriorityHigh; |
+ case Resource::SVGDocument: |
+ return ResourceLoadPriorityLow; |
+ case Resource::LinkPrefetch: |
+ case Resource::LinkPreload: |
+ return ResourceLoadPriorityVeryLow; |
+ case Resource::LinkSubresource: |
+ return ResourceLoadPriorityLow; |
+ case Resource::TextTrack: |
+ return ResourceLoadPriorityLow; |
+ } |
} |
ASSERT_NOT_REACHED(); |
return ResourceLoadPriorityUnresolved; |
@@ -162,6 +252,7 @@ ResourceFetcher::ResourceFetcher(FetchContext* context) |
, m_autoLoadImages(true) |
, m_imagesEnabled(true) |
, m_allowStaleResources(false) |
+ , m_imageFetched(false) |
{ |
} |