OLD | NEW |
---|---|
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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
83 ASSERT_UNUSED(timer, timer == &m_linkLoadTimer); | 83 ASSERT_UNUSED(timer, timer == &m_linkLoadTimer); |
84 m_client->linkLoaded(); | 84 m_client->linkLoaded(); |
85 } | 85 } |
86 | 86 |
87 void LinkLoader::linkLoadingErrorTimerFired(Timer<LinkLoader>* timer) | 87 void LinkLoader::linkLoadingErrorTimerFired(Timer<LinkLoader>* timer) |
88 { | 88 { |
89 ASSERT_UNUSED(timer, timer == &m_linkLoadingErrorTimer); | 89 ASSERT_UNUSED(timer, timer == &m_linkLoadingErrorTimer); |
90 m_client->linkLoadingErrored(); | 90 m_client->linkLoadingErrored(); |
91 } | 91 } |
92 | 92 |
93 void LinkLoader::triggerEvents(Resource* resource) | |
94 { | |
95 if (resource->errorOccurred()) | |
96 m_linkLoadingErrorTimer.startOneShot(0, BLINK_FROM_HERE); | |
97 else | |
98 m_linkLoadTimer.startOneShot(0, BLINK_FROM_HERE); | |
99 } | |
100 | |
93 void LinkLoader::notifyFinished(Resource* resource) | 101 void LinkLoader::notifyFinished(Resource* resource) |
94 { | 102 { |
95 ASSERT(this->resource() == resource); | 103 ASSERT(this->resource() == resource); |
96 | 104 |
97 if (resource->errorOccurred()) | 105 triggerEvents(resource); |
98 m_linkLoadingErrorTimer.startOneShot(0, BLINK_FROM_HERE); | |
99 else | |
100 m_linkLoadTimer.startOneShot(0, BLINK_FROM_HERE); | |
101 | |
102 clearResource(); | 106 clearResource(); |
103 } | 107 } |
104 | 108 |
105 void LinkLoader::didStartPrerender() | 109 void LinkLoader::didStartPrerender() |
106 { | 110 { |
107 m_client->didStartLinkPrerender(); | 111 m_client->didStartLinkPrerender(); |
108 } | 112 } |
109 | 113 |
110 void LinkLoader::didStopPrerender() | 114 void LinkLoader::didStopPrerender() |
111 { | 115 { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
177 if (equalIgnoringCase(as, "font")) | 181 if (equalIgnoringCase(as, "font")) |
178 return Resource::Font; | 182 return Resource::Font; |
179 if (equalIgnoringCase(as, "track")) | 183 if (equalIgnoringCase(as, "track")) |
180 return Resource::TextTrack; | 184 return Resource::TextTrack; |
181 if (document && !as.isEmpty()) | 185 if (document && !as.isEmpty()) |
182 document->addConsoleMessage(ConsoleMessage::create(OtherMessageSource, W arningMessageLevel, String("<link rel=preload> must have a valid `as` value"))); | 186 document->addConsoleMessage(ConsoleMessage::create(OtherMessageSource, W arningMessageLevel, String("<link rel=preload> must have a valid `as` value"))); |
183 // TODO(yoav): Is this correct? If as is missing or invalid, it should be su bject to "connect-src" CSP directives. | 187 // TODO(yoav): Is this correct? If as is missing or invalid, it should be su bject to "connect-src" CSP directives. |
184 return Resource::LinkSubresource; | 188 return Resource::LinkSubresource; |
185 } | 189 } |
186 | 190 |
187 static void preloadIfNeeded(const LinkRelAttribute& relAttribute, const KURL& hr ef, Document& document, const String& as) | 191 static void createLinkPreloadResourceClient(ResourcePtr<Resource> resource, Link Loader* linkLoader, Resource::Type type) |
Nate Chapin
2016/01/15 18:53:58
This could either return the LinkPreloadResourceCl
Yoav Weiss
2016/01/15 21:40:25
yeah, adding both this and preloadIfNeeded as stat
| |
188 { | 192 { |
189 if (!document.loader()) | 193 if (!linkLoader || !resource) |
194 return; | |
195 OwnPtr<LinkPreloadResourceClient> resourceClient = nullptr; | |
196 switch (type) { | |
197 case Resource::Image: | |
198 break; | |
199 case Resource::Script: | |
200 resourceClient = LinkPreloadScriptResourceClient::create(linkLoader, res ource.get()); | |
201 break; | |
202 case Resource::CSSStyleSheet: | |
203 resourceClient = LinkPreloadStyleResourceClient::create(linkLoader, reso urce.get()); | |
204 break; | |
205 // TODO(yoav): add support for everything below. | |
206 case Resource::Font: | |
207 break; | |
208 case Resource::Media: | |
209 break; | |
210 case Resource::TextTrack: | |
211 break; | |
212 case Resource::LinkSubresource: | |
213 break; | |
214 default: | |
215 ASSERT_NOT_REACHED(); | |
216 } | |
217 | |
218 linkLoader->setPreloadResourceClient(resourceClient.release()); | |
219 } | |
220 | |
221 static void preloadIfNeeded(const LinkRelAttribute& relAttribute, const KURL& hr ef, Document& document, const String& as, LinkLoader* linkLoader) | |
222 { | |
223 if (!document.loader() || !relAttribute.isLinkPreload()) | |
190 return; | 224 return; |
191 | 225 |
192 if (relAttribute.isLinkPreload()) { | 226 UseCounter::count(document, UseCounter::LinkRelPreload); |
193 UseCounter::count(document, UseCounter::LinkRelPreload); | 227 ASSERT(RuntimeEnabledFeatures::linkPreloadEnabled()); |
194 ASSERT(RuntimeEnabledFeatures::linkPreloadEnabled()); | 228 if (!href.isValid() || href.isEmpty()) { |
195 if (!href.isValid() || href.isEmpty()) { | 229 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource, Wa rningMessageLevel, String("<link rel=preload> has an invalid `href` value"))); |
196 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource , WarningMessageLevel, String("<link rel=preload> has an invalid `href` value")) ); | 230 return; |
197 return; | 231 } |
198 } | 232 Resource::Type type = LinkLoader::getTypeFromAsAttribute(as, &document); |
199 Resource::Type type = LinkLoader::getTypeFromAsAttribute(as, &document); | 233 ResourceRequest resourceRequest(document.completeURL(href)); |
200 ResourceRequest resourceRequest(document.completeURL(href)); | 234 ResourceFetcher::determineRequestContext(resourceRequest, type, false); |
201 ResourceFetcher::determineRequestContext(resourceRequest, type, false); | 235 FetchRequest linkRequest(resourceRequest, FetchInitiatorTypeNames::link); |
202 FetchRequest linkRequest(resourceRequest, FetchInitiatorTypeNames::link) ; | |
203 | 236 |
204 linkRequest.setPriority(document.fetcher()->loadPriority(type, linkReque st)); | 237 linkRequest.setPriority(document.fetcher()->loadPriority(type, linkRequest)) ; |
205 Settings* settings = document.settings(); | 238 Settings* settings = document.settings(); |
206 if (settings && settings->logPreload()) | 239 if (settings && settings->logPreload()) |
207 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource , DebugMessageLevel, String("Preload triggered for " + href.host() + href.path() ))); | 240 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource, De bugMessageLevel, String("Preload triggered for " + href.host() + href.path()))); |
208 linkRequest.setForPreload(true); | 241 linkRequest.setForPreload(true); |
209 linkRequest.setAvoidBlockingOnLoad(true); | 242 linkRequest.setAvoidBlockingOnLoad(true); |
210 document.loader()->startPreload(type, linkRequest); | 243 createLinkPreloadResourceClient(document.loader()->startPreload(type, linkRe quest, linkLoader), linkLoader, type); |
Nate Chapin
2016/01/15 18:53:58
Maybe do this after preloadIfNeeded is called in l
Yoav Weiss
2016/01/15 21:40:25
not sure what you mean by that. Can you elaborate?
Nate Chapin
2016/01/15 21:52:44
createLinkPreloadResourceClient() only does work i
| |
211 } | |
212 } | 244 } |
213 | 245 |
214 bool LinkLoader::loadLinkFromHeader(const String& headerValue, Document* documen t, const NetworkHintsInterface& networkHintsInterface, CanLoadResources canLoadR esources) | 246 bool LinkLoader::loadLinkFromHeader(const String& headerValue, Document* documen t, const NetworkHintsInterface& networkHintsInterface, CanLoadResources canLoadR esources) |
215 { | 247 { |
216 if (!document) | 248 if (!document) |
217 return false; | 249 return false; |
218 LinkHeaderSet headerSet(headerValue); | 250 LinkHeaderSet headerSet(headerValue); |
219 for (auto& header : headerSet) { | 251 for (auto& header : headerSet) { |
220 if (!header.valid() || header.url().isEmpty() || header.rel().isEmpty()) | 252 if (!header.valid() || header.url().isEmpty() || header.rel().isEmpty()) |
221 return false; | 253 return false; |
222 | 254 |
223 LinkRelAttribute relAttribute(header.rel()); | 255 LinkRelAttribute relAttribute(header.rel()); |
224 KURL url = document->completeURL(header.url()); | 256 KURL url = document->completeURL(header.url()); |
225 if (canLoadResources == DoNotLoadResources) { | 257 if (canLoadResources == DoNotLoadResources) { |
226 if (RuntimeEnabledFeatures::linkHeaderEnabled()) | 258 if (RuntimeEnabledFeatures::linkHeaderEnabled()) |
227 dnsPrefetchIfNeeded(relAttribute, url, *document, networkHintsIn terface, LinkCalledFromHeader); | 259 dnsPrefetchIfNeeded(relAttribute, url, *document, networkHintsIn terface, LinkCalledFromHeader); |
228 | 260 |
229 if (RuntimeEnabledFeatures::linkPreconnectEnabled()) | 261 if (RuntimeEnabledFeatures::linkPreconnectEnabled()) |
230 preconnectIfNeeded(relAttribute, url, *document, header.crossOri gin(), networkHintsInterface, LinkCalledFromHeader); | 262 preconnectIfNeeded(relAttribute, url, *document, header.crossOri gin(), networkHintsInterface, LinkCalledFromHeader); |
231 } else { | 263 } else { |
232 if (RuntimeEnabledFeatures::linkPreloadEnabled()) | 264 if (RuntimeEnabledFeatures::linkPreloadEnabled()) |
233 preloadIfNeeded(relAttribute, url, *document, header.as()); | 265 preloadIfNeeded(relAttribute, url, *document, header.as(), nullp tr); |
234 } | 266 } |
235 // TODO(yoav): Add more supported headers as needed. | 267 // TODO(yoav): Add more supported headers as needed. |
236 } | 268 } |
237 return true; | 269 return true; |
238 } | 270 } |
239 | 271 |
240 bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, CrossOriginAttri buteValue crossOrigin, const String& type, const String& as, const KURL& href, D ocument& document, const NetworkHintsInterface& networkHintsInterface) | 272 bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, CrossOriginAttri buteValue crossOrigin, const String& type, const String& as, const KURL& href, D ocument& document, const NetworkHintsInterface& networkHintsInterface) |
241 { | 273 { |
242 // TODO(yoav): Do all links need to load only after they're in document??? | 274 // TODO(yoav): Do all links need to load only after they're in document??? |
243 | 275 |
244 // TODO(yoav): Convert all uses of the CrossOriginAttribute to CrossOriginAt tributeValue. crbug.com/486689 | 276 // TODO(yoav): Convert all uses of the CrossOriginAttribute to CrossOriginAt tributeValue. crbug.com/486689 |
245 // FIXME(crbug.com/463266): We're ignoring type here. Maybe we shouldn't. | 277 // FIXME(crbug.com/463266): We're ignoring type here. Maybe we shouldn't. |
246 dnsPrefetchIfNeeded(relAttribute, href, document, networkHintsInterface, Lin kCalledFromMarkup); | 278 dnsPrefetchIfNeeded(relAttribute, href, document, networkHintsInterface, Lin kCalledFromMarkup); |
247 | 279 |
248 preconnectIfNeeded(relAttribute, href, document, crossOrigin, networkHintsIn terface, LinkCalledFromMarkup); | 280 preconnectIfNeeded(relAttribute, href, document, crossOrigin, networkHintsIn terface, LinkCalledFromMarkup); |
249 | 281 |
250 if (m_client->shouldLoadLink()) | 282 if (m_client->shouldLoadLink()) |
251 preloadIfNeeded(relAttribute, href, document, as); | 283 preloadIfNeeded(relAttribute, href, document, as, this); |
252 | 284 |
253 // FIXME(crbug.com/323096): Should take care of import. | 285 // FIXME(crbug.com/323096): Should take care of import. |
254 if ((relAttribute.isLinkPrefetch() || relAttribute.isLinkSubresource()) && h ref.isValid() && document.frame()) { | 286 if ((relAttribute.isLinkPrefetch() || relAttribute.isLinkSubresource()) && h ref.isValid() && document.frame()) { |
255 if (!m_client->shouldLoadLink()) | 287 if (!m_client->shouldLoadLink()) |
256 return false; | 288 return false; |
257 Resource::Type type = Resource::LinkPrefetch; | 289 Resource::Type type = Resource::LinkPrefetch; |
258 if (relAttribute.isLinkSubresource()) { | 290 if (relAttribute.isLinkSubresource()) { |
259 type = Resource::LinkSubresource; | 291 type = Resource::LinkSubresource; |
260 UseCounter::count(document, UseCounter::LinkRelSubresource); | 292 UseCounter::count(document, UseCounter::LinkRelSubresource); |
261 } else { | 293 } else { |
(...skipping 27 matching lines...) Expand all Loading... | |
289 // atomic (dns prefetch). | 321 // atomic (dns prefetch). |
290 if (m_prerender) { | 322 if (m_prerender) { |
291 m_prerender->cancel(); | 323 m_prerender->cancel(); |
292 m_prerender.clear(); | 324 m_prerender.clear(); |
293 } | 325 } |
294 } | 326 } |
295 | 327 |
296 DEFINE_TRACE(LinkLoader) | 328 DEFINE_TRACE(LinkLoader) |
297 { | 329 { |
298 visitor->trace(m_prerender); | 330 visitor->trace(m_prerender); |
331 visitor->trace(m_linkPreloadResourceClient); | |
299 } | 332 } |
300 | 333 |
301 } | 334 } |
OLD | NEW |