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

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

Issue 1246493002: Fix Resource Priorities and Scheduling (Blink Side) (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Cleaned up Created 5 years, 5 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
« no previous file with comments | « Source/core/fetch/ResourceFetcher.h ('k') | Source/core/fetch/ResourceLoadPriorityOptimizer.h » ('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 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 using blink::WebURLRequest; 56 using blink::WebURLRequest;
57 57
58 namespace blink { 58 namespace blink {
59 59
60 ResourceLoadPriority ResourceFetcher::loadPriority(Resource::Type type, const Fe tchRequest& request) 60 ResourceLoadPriority ResourceFetcher::loadPriority(Resource::Type type, const Fe tchRequest& request)
61 { 61 {
62 // TODO(yoav): Change it here so that priority can be changed even after it was resolved. 62 // TODO(yoav): Change it here so that priority can be changed even after it was resolved.
63 if (request.priority() != ResourceLoadPriorityUnresolved) 63 if (request.priority() != ResourceLoadPriorityUnresolved)
64 return request.priority(); 64 return request.priority();
65 65
66 switch (type) { 66 // 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
67 case Resource::MainResource: 67 if (type == Resource::Image)
68 return context().isLowPriorityIframe() ? ResourceLoadPriorityVeryLow : R esourceLoadPriorityVeryHigh; 68 m_imageFetched = true;
69 case Resource::CSSStyleSheet: 69
70 return ResourceLoadPriorityHigh; 70 int fetchMode = context().resourceFetchMode();
71 case Resource::Raw: 71
72 return request.options().synchronousPolicy == RequestSynchronously ? Res ourceLoadPriorityVeryHigh : ResourceLoadPriorityMedium; 72 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
73 case Resource::Script: 73 switch (type) {
74 // Async scripts do not block the parser so they get the lowest priority and can be 74 case Resource::MainResource:
75 // loaded in parser order with images. 75 return context().isLowPriorityIframe() ? ResourceLoadPriorityVeryLow : ResourceLoadPriorityVeryHigh;
76 if (FetchRequest::LazyLoad == request.defer()) 76 case Resource::CSSStyleSheet:
77 return ResourceLoadPriorityHigh;
78 case Resource::Raw:
79 return request.options().synchronousPolicy == RequestSynchronously ? ResourceLoadPriorityVeryHigh : ResourceLoadPriorityMedium;
80 case Resource::Script:
81 // Async scripts do not block the parser so they get the lowest prio rity and can be
82 // loaded in parser order with images.
83 if (FetchRequest::LazyLoad == request.defer())
84 return ResourceLoadPriorityLow;
85 return ResourceLoadPriorityMedium;
86 case Resource::Font:
87 case Resource::ImportResource:
88 return ResourceLoadPriorityMedium;
89 case Resource::Image:
90 // Default images to VeryLow, and promote whatever is visible. This improves
91 // speed-index by ~5% on average, ~14% at the 99th percentile.
92 return ResourceLoadPriorityVeryLow;
93 case Resource::Media:
77 return ResourceLoadPriorityLow; 94 return ResourceLoadPriorityLow;
78 return ResourceLoadPriorityMedium; 95 case Resource::XSLStyleSheet:
79 case Resource::Font: 96 ASSERT(RuntimeEnabledFeatures::xsltEnabled());
80 case Resource::ImportResource: 97 return ResourceLoadPriorityHigh;
81 return ResourceLoadPriorityMedium; 98 case Resource::SVGDocument:
82 case Resource::Image: 99 return ResourceLoadPriorityLow;
83 // Default images to VeryLow, and promote whatever is visible. This impr oves 100 case Resource::LinkPrefetch:
84 // speed-index by ~5% on average, ~14% at the 99th percentile. 101 case Resource::LinkPreload:
85 return ResourceLoadPriorityVeryLow; 102 return ResourceLoadPriorityVeryLow;
86 case Resource::Media: 103 case Resource::LinkSubresource:
87 return ResourceLoadPriorityLow; 104 return ResourceLoadPriorityLow;
88 case Resource::XSLStyleSheet: 105 case Resource::TextTrack:
89 ASSERT(RuntimeEnabledFeatures::xsltEnabled()); 106 return ResourceLoadPriorityLow;
90 return ResourceLoadPriorityHigh; 107 }
91 case Resource::SVGDocument: 108 } else if (fetchMode == 1) {
92 return ResourceLoadPriorityLow; 109 // lower priority for late-body scripts
93 case Resource::LinkPrefetch: 110 switch (type) {
94 case Resource::LinkPreload: 111 case Resource::MainResource:
95 return ResourceLoadPriorityVeryLow; 112 return context().isLowPriorityIframe() ? ResourceLoadPriorityVeryLow : ResourceLoadPriorityVeryHigh;
96 case Resource::LinkSubresource: 113 case Resource::CSSStyleSheet:
97 return ResourceLoadPriorityLow; 114 return ResourceLoadPriorityHigh;
98 case Resource::TextTrack: 115 case Resource::Raw:
99 return ResourceLoadPriorityLow; 116 return request.options().synchronousPolicy == RequestSynchronously ? ResourceLoadPriorityVeryHigh : ResourceLoadPriorityMedium;
117 case Resource::Script:
118 // Async scripts do not block the parser so they get the lowest prio rity and can be
119 // loaded in parser order with images.
120 if (FetchRequest::LazyLoad == request.defer())
121 return ResourceLoadPriorityLow;
122 if (!request.forPreload())
123 return ResourceLoadPriorityMedium;
124 return m_imageFetched ? ResourceLoadPriorityLow : ResourceLoadPriori tyMedium;
125 case Resource::Font:
126 case Resource::ImportResource:
127 return ResourceLoadPriorityMedium;
128 case Resource::Image:
129 // Default images to VeryLow, and promote whatever is visible. This improves
130 // speed-index by ~5% on average, ~14% at the 99th percentile.
131 return ResourceLoadPriorityVeryLow;
132 case Resource::Media:
133 return ResourceLoadPriorityLow;
134 case Resource::XSLStyleSheet:
135 ASSERT(RuntimeEnabledFeatures::xsltEnabled());
136 return ResourceLoadPriorityHigh;
137 case Resource::SVGDocument:
138 return ResourceLoadPriorityLow;
139 case Resource::LinkPrefetch:
140 case Resource::LinkPreload:
141 return ResourceLoadPriorityVeryLow;
142 case Resource::LinkSubresource:
143 return ResourceLoadPriorityLow;
144 case Resource::TextTrack:
145 return ResourceLoadPriorityLow;
146 }
147 } else if (fetchMode == 2) {
148 // Increased CSS, script and image priorities and lowered late-body scri pt priorities
149 switch (type) {
150 case Resource::MainResource:
151 return context().isLowPriorityIframe() ? ResourceLoadPriorityVeryLow : ResourceLoadPriorityVeryHigh;
152 case Resource::CSSStyleSheet:
153 return ResourceLoadPriorityVeryHigh;
154 case Resource::Raw:
155 return request.options().synchronousPolicy == RequestSynchronously ? ResourceLoadPriorityVeryHigh : ResourceLoadPriorityMedium;
156 case Resource::Script:
157 // Async scripts do not block the parser so they get the lowest prio rity and can be
158 // loaded in parser order with images.
159 if (FetchRequest::LazyLoad == request.defer())
160 return ResourceLoadPriorityMedium;
161 // Parser=blocking scripts need to be loaded at a high priority
162 if (!request.forPreload())
163 return ResourceLoadPriorityHigh;
164 // Early scripts (before the first image) get a higher priority as t hey are
165 // likely render-blocking.
166 return m_imageFetched ? ResourceLoadPriorityMedium : ResourceLoadPri orityHigh;
167 case Resource::Font:
168 return ResourceLoadPriorityVeryHigh;
169 case Resource::ImportResource:
170 return ResourceLoadPriorityMedium;
171 case Resource::Image:
172 // Default images to VeryLow, and promote whatever is visible. This improves
173 // speed-index by ~5% on average, ~14% at the 99th percentile.
174 return ResourceLoadPriorityLow;
175 case Resource::Media:
176 return ResourceLoadPriorityLow;
177 case Resource::XSLStyleSheet:
178 ASSERT(RuntimeEnabledFeatures::xsltEnabled());
179 return ResourceLoadPriorityHigh;
180 case Resource::SVGDocument:
181 return ResourceLoadPriorityLow;
182 case Resource::LinkPrefetch:
183 case Resource::LinkPreload:
184 return ResourceLoadPriorityVeryLow;
185 case Resource::LinkSubresource:
186 return ResourceLoadPriorityLow;
187 case Resource::TextTrack:
188 return ResourceLoadPriorityLow;
189 }
100 } 190 }
101 ASSERT_NOT_REACHED(); 191 ASSERT_NOT_REACHED();
102 return ResourceLoadPriorityUnresolved; 192 return ResourceLoadPriorityUnresolved;
103 } 193 }
104 194
105 static void populateResourceTiming(ResourceTimingInfo* info, Resource* resource, bool clearLoadTimings) 195 static void populateResourceTiming(ResourceTimingInfo* info, Resource* resource, bool clearLoadTimings)
106 { 196 {
107 info->setInitialRequest(resource->resourceRequest()); 197 info->setInitialRequest(resource->resourceRequest());
108 info->setFinalResponse(resource->response()); 198 info->setFinalResponse(resource->response());
109 if (clearLoadTimings) { 199 if (clearLoadTimings) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 return WebURLRequest::RequestContextSubresource; 245 return WebURLRequest::RequestContextSubresource;
156 } 246 }
157 247
158 ResourceFetcher::ResourceFetcher(FetchContext* context) 248 ResourceFetcher::ResourceFetcher(FetchContext* context)
159 : m_context(context) 249 : m_context(context)
160 , m_garbageCollectDocumentResourcesTimer(this, &ResourceFetcher::garbageColl ectDocumentResourcesTimerFired) 250 , m_garbageCollectDocumentResourcesTimer(this, &ResourceFetcher::garbageColl ectDocumentResourcesTimerFired)
161 , m_resourceTimingReportTimer(this, &ResourceFetcher::resourceTimingReportTi merFired) 251 , m_resourceTimingReportTimer(this, &ResourceFetcher::resourceTimingReportTi merFired)
162 , m_autoLoadImages(true) 252 , m_autoLoadImages(true)
163 , m_imagesEnabled(true) 253 , m_imagesEnabled(true)
164 , m_allowStaleResources(false) 254 , m_allowStaleResources(false)
255 , m_imageFetched(false)
165 { 256 {
166 } 257 }
167 258
168 ResourceFetcher::~ResourceFetcher() 259 ResourceFetcher::~ResourceFetcher()
169 { 260 {
170 clearPreloads(); 261 clearPreloads();
171 } 262 }
172 263
173 Resource* ResourceFetcher::cachedResource(const KURL& resourceURL) const 264 Resource* ResourceFetcher::cachedResource(const KURL& resourceURL) const
174 { 265 {
(...skipping 869 matching lines...) Expand 10 before | Expand all | Expand 10 after
1044 1135
1045 DEFINE_TRACE(ResourceFetcher) 1136 DEFINE_TRACE(ResourceFetcher)
1046 { 1137 {
1047 visitor->trace(m_context); 1138 visitor->trace(m_context);
1048 visitor->trace(m_archiveResourceCollection); 1139 visitor->trace(m_archiveResourceCollection);
1049 visitor->trace(m_loaders); 1140 visitor->trace(m_loaders);
1050 visitor->trace(m_nonBlockingLoaders); 1141 visitor->trace(m_nonBlockingLoaders);
1051 } 1142 }
1052 1143
1053 } 1144 }
OLDNEW
« no previous file with comments | « Source/core/fetch/ResourceFetcher.h ('k') | Source/core/fetch/ResourceLoadPriorityOptimizer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698