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

Side by Side Diff: Source/core/loader/LinkLoader.cpp

Issue 1141883003: Enable `as` based priorities for <link rel=preload> (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Review comments Created 5 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
« no previous file with comments | « Source/core/loader/FrameFetchContext.cpp ('k') | Source/core/loader/LinkLoaderTest.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) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource , DebugMessageLevel, String("Preconnect triggered for " + href.host()))); 138 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource , DebugMessageLevel, String("Preconnect triggered for " + href.host())));
139 if (crossOrigin != CrossOriginAttributeNotSet) { 139 if (crossOrigin != CrossOriginAttributeNotSet) {
140 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSo urce, DebugMessageLevel, 140 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSo urce, DebugMessageLevel,
141 String("Preconnect CORS setting is ") + String((crossOrigin == CrossOriginAttributeAnonymous) ? "anonymous" : "use-credentials"))); 141 String("Preconnect CORS setting is ") + String((crossOrigin == CrossOriginAttributeAnonymous) ? "anonymous" : "use-credentials")));
142 } 142 }
143 } 143 }
144 preconnect(href, crossOrigin); 144 preconnect(href, crossOrigin);
145 } 145 }
146 } 146 }
147 147
148 // TODO(yoav): Replace Resource:Type here with some way that conveys priority bu t not context. 148 static bool getPriorityTypeFromAsAttribute(const String& as, Resource::Type& typ e)
149 static bool getTypeFromAsAttribute(const String& as, Resource::Type& type)
150 { 149 {
151 if (as.isEmpty()) 150 if (as.isEmpty())
152 return false; 151 return false;
153 // TODO(yoav): Return false also when the `as` value is not a valid one. 152
154 // TODO(yoav): Add actual types here and make sure priorities work according ly. 153 if (equalIgnoringCase(as, "image"))
155 type = Resource::LinkSubresource; 154 type = Resource::Image;
155 else if (equalIgnoringCase(as, "script"))
156 type = Resource::Script;
157 else if (equalIgnoringCase(as, "stylesheet"))
158 type = Resource::CSSStyleSheet;
159 else
160 return false;
161
156 return true; 162 return true;
157 } 163 }
158 164
159 void LinkLoader::preloadIfNeeded(const LinkRelAttribute& relAttribute, const KUR L& href, Document& document, const String& as) 165 void LinkLoader::preloadIfNeeded(const LinkRelAttribute& relAttribute, const KUR L& href, Document& document, const String& as)
160 { 166 {
161 if (relAttribute.isLinkPreload()) { 167 if (relAttribute.isLinkPreload()) {
162 ASSERT(RuntimeEnabledFeatures::linkPreloadEnabled()); 168 ASSERT(RuntimeEnabledFeatures::linkPreloadEnabled());
163 if (!href.isValid() || href.isEmpty()) { 169 if (!href.isValid() || href.isEmpty()) {
164 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource , WarningMessageLevel, String("<link rel=preload> has an invalid `href` value")) ); 170 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource , WarningMessageLevel, String("<link rel=preload> has an invalid `href` value")) );
165 return; 171 return;
166 } 172 }
167 Resource::Type type; 173 // TODO(yoav): Figure out a way that 'as' would be used to set request h eaders.
168 if (!getTypeFromAsAttribute(as, type)) { 174 Resource::Type priorityType;
175 if (!getPriorityTypeFromAsAttribute(as, priorityType)) {
169 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource , WarningMessageLevel, String("<link rel=preload> must have a valid `as` value") )); 176 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource , WarningMessageLevel, String("<link rel=preload> must have a valid `as` value") ));
170 return; 177 return;
171 } 178 }
172 FetchRequest linkRequest(ResourceRequest(document.completeURL(href)), Fe tchInitiatorTypeNames::link); 179 FetchRequest linkRequest(ResourceRequest(document.completeURL(href)), Fe tchInitiatorTypeNames::link);
180 linkRequest.setPriority(ResourceFetcher::loadPriority(priorityType, link Request));
173 Settings* settings = document.settings(); 181 Settings* settings = document.settings();
174 if (settings && settings->logPreload()) 182 if (settings && settings->logPreload())
175 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource , DebugMessageLevel, String("Preload triggered for " + href.host() + href.path() ))); 183 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource , DebugMessageLevel, String("Preload triggered for " + href.host() + href.path() )));
176 setResource(document.fetcher()->fetchLinkPreloadResource(type, linkReque st)); 184 setResource(document.fetcher()->fetchLinkPreloadResource(Resource::LinkP reload, linkRequest));
177 } 185 }
178 } 186 }
179 187
180 bool LinkLoader::loadLinkFromHeader(const String& headerValue, Document* documen t) 188 bool LinkLoader::loadLinkFromHeader(const String& headerValue, Document* documen t)
181 { 189 {
182 if (!document) 190 if (!document)
183 return false; 191 return false;
184 LinkHeaderSet headerSet(headerValue); 192 LinkHeaderSet headerSet(headerValue);
185 for (auto& header : headerSet) { 193 for (auto& header : headerSet) {
186 if (!header.valid() || header.url().isEmpty() || header.rel().isEmpty()) 194 if (!header.valid() || header.url().isEmpty() || header.rel().isEmpty())
187 return false; 195 return false;
188 LinkRelAttribute relAttribute(header.rel()); 196 LinkRelAttribute relAttribute(header.rel());
189 KURL url = document->completeURL(header.url()); 197 KURL url = document->completeURL(header.url());
190 if (RuntimeEnabledFeatures::linkHeaderEnabled()) 198 if (RuntimeEnabledFeatures::linkHeaderEnabled())
191 dnsPrefetchIfNeeded(relAttribute, url, *document); 199 dnsPrefetchIfNeeded(relAttribute, url, *document);
192 200
193 if (RuntimeEnabledFeatures::linkPreconnectEnabled()) 201 if (RuntimeEnabledFeatures::linkPreconnectEnabled())
194 preconnectIfNeeded(relAttribute, url, *document, header.crossOrigin( )); 202 preconnectIfNeeded(relAttribute, url, *document, header.crossOrigin( ));
195 203
196 // FIXME: Add more supported headers as needed. 204 // FIXME: Add more supported headers as needed.
197 } 205 }
198 return true; 206 return true;
199 } 207 }
200 208
201 bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, const AtomicStri ng& crossOriginMode, const String& type, const String& as, const KURL& href, Doc ument& document) 209 bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, const AtomicStri ng& crossOriginMode, const String& type, const String& as, const KURL& href, Doc ument& document)
202 { 210 {
211 // TODO(yoav): Do all links need to load only after they're in document???
212
203 // TODO(yoav): Convert all uses of the CrossOriginAttribute to CrossOriginAt tributeValue. crbug.com/486689 213 // TODO(yoav): Convert all uses of the CrossOriginAttribute to CrossOriginAt tributeValue. crbug.com/486689
204 // FIXME(crbug.com/463266): We're ignoring type here. Maybe we shouldn't. 214 // FIXME(crbug.com/463266): We're ignoring type here. Maybe we shouldn't.
205 dnsPrefetchIfNeeded(relAttribute, href, document); 215 dnsPrefetchIfNeeded(relAttribute, href, document);
206 216
207 preconnectIfNeeded(relAttribute, href, document, crossOriginAttributeValue(c rossOriginMode)); 217 preconnectIfNeeded(relAttribute, href, document, crossOriginAttributeValue(c rossOriginMode));
208 218
209 preloadIfNeeded(relAttribute, href, document, as); 219 if (m_client->shouldLoadLink())
220 preloadIfNeeded(relAttribute, href, document, as);
210 221
211 // FIXME(crbug.com/323096): Should take care of import. 222 // FIXME(crbug.com/323096): Should take care of import.
212 if ((relAttribute.isLinkPrefetch() || relAttribute.isLinkSubresource() || re lAttribute.isTransitionExitingStylesheet()) && href.isValid() && document.frame( )) { 223 if ((relAttribute.isLinkPrefetch() || relAttribute.isLinkSubresource() || re lAttribute.isTransitionExitingStylesheet()) && href.isValid() && document.frame( )) {
213 if (!m_client->shouldLoadLink()) 224 if (!m_client->shouldLoadLink())
214 return false; 225 return false;
215 Resource::Type type = relAttribute.isLinkSubresource() ? Resource::Link Subresource : Resource::LinkPrefetch; 226 Resource::Type type = relAttribute.isLinkSubresource() ? Resource::Link Subresource : Resource::LinkPrefetch;
216 FetchRequest linkRequest(ResourceRequest(document.completeURL(href)), Fe tchInitiatorTypeNames::link); 227 FetchRequest linkRequest(ResourceRequest(document.completeURL(href)), Fe tchInitiatorTypeNames::link);
217 if (!crossOriginMode.isNull()) 228 if (!crossOriginMode.isNull())
218 linkRequest.setCrossOriginAccessControl(document.securityOrigin(), c rossOriginMode); 229 linkRequest.setCrossOriginAccessControl(document.securityOrigin(), c rossOriginMode);
219 setResource(document.fetcher()->fetchLinkResource(type, linkRequest)); 230 setResource(document.fetcher()->fetchLinkResource(type, linkRequest));
(...skipping 23 matching lines...) Expand all
243 m_prerender.clear(); 254 m_prerender.clear();
244 } 255 }
245 } 256 }
246 257
247 DEFINE_TRACE(LinkLoader) 258 DEFINE_TRACE(LinkLoader)
248 { 259 {
249 visitor->trace(m_prerender); 260 visitor->trace(m_prerender);
250 } 261 }
251 262
252 } 263 }
OLDNEW
« no previous file with comments | « Source/core/loader/FrameFetchContext.cpp ('k') | Source/core/loader/LinkLoaderTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698