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 19 matching lines...) Expand all Loading... |
30 */ | 30 */ |
31 | 31 |
32 #include "config.h" | 32 #include "config.h" |
33 #include "core/loader/LinkLoader.h" | 33 #include "core/loader/LinkLoader.h" |
34 | 34 |
35 #include "core/dom/Document.h" | 35 #include "core/dom/Document.h" |
36 #include "core/fetch/FetchInitiatorTypeNames.h" | 36 #include "core/fetch/FetchInitiatorTypeNames.h" |
37 #include "core/fetch/FetchRequest.h" | 37 #include "core/fetch/FetchRequest.h" |
38 #include "core/fetch/ResourceFetcher.h" | 38 #include "core/fetch/ResourceFetcher.h" |
39 #include "core/frame/Settings.h" | 39 #include "core/frame/Settings.h" |
40 #include "core/html/CrossOriginAttribute.h" | |
41 #include "core/html/LinkRelAttribute.h" | 40 #include "core/html/LinkRelAttribute.h" |
42 #include "core/inspector/ConsoleMessage.h" | 41 #include "core/inspector/ConsoleMessage.h" |
43 #include "core/loader/LinkHeader.h" | 42 #include "core/loader/LinkHeader.h" |
44 #include "core/loader/PrerenderHandle.h" | 43 #include "core/loader/PrerenderHandle.h" |
45 #include "platform/Prerender.h" | 44 #include "platform/Prerender.h" |
46 #include "platform/RuntimeEnabledFeatures.h" | 45 #include "platform/RuntimeEnabledFeatures.h" |
47 #include "platform/network/NetworkHints.h" | 46 #include "platform/network/NetworkHints.h" |
48 #include "public/platform/WebPrerender.h" | 47 #include "public/platform/WebPrerender.h" |
49 | 48 |
50 namespace blink { | 49 namespace blink { |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 // FIXME: The href attribute of the link element can be in "//hostname"
form, and we shouldn't attempt | 121 // FIXME: The href attribute of the link element can be in "//hostname"
form, and we shouldn't attempt |
123 // to complete that as URL <https://bugs.webkit.org/show_bug.cgi?id=4885
7>. | 122 // to complete that as URL <https://bugs.webkit.org/show_bug.cgi?id=4885
7>. |
124 if (settings && settings->dnsPrefetchingEnabled() && href.isValid() && !
href.isEmpty()) { | 123 if (settings && settings->dnsPrefetchingEnabled() && href.isValid() && !
href.isEmpty()) { |
125 if (settings->logDnsPrefetchAndPreconnect()) | 124 if (settings->logDnsPrefetchAndPreconnect()) |
126 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSo
urce, DebugMessageLevel, String("DNS prefetch triggered for " + href.host()))); | 125 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSo
urce, DebugMessageLevel, String("DNS prefetch triggered for " + href.host()))); |
127 prefetchDNS(href.host()); | 126 prefetchDNS(href.host()); |
128 } | 127 } |
129 } | 128 } |
130 } | 129 } |
131 | 130 |
132 static void preconnectIfNeeded(const LinkRelAttribute& relAttribute, const KURL&
href, Document& document, const CrossOriginAttributeValue crossOrigin) | 131 static void preconnectIfNeeded(const LinkRelAttribute& relAttribute, const KURL&
href, Document& document) |
133 { | 132 { |
134 if (relAttribute.isPreconnect() && href.isValid()) { | 133 if (relAttribute.isPreconnect() && href.isValid()) { |
135 ASSERT(RuntimeEnabledFeatures::linkPreconnectEnabled()); | 134 ASSERT(RuntimeEnabledFeatures::linkPreconnectEnabled()); |
136 Settings* settings = document.settings(); | 135 Settings* settings = document.settings(); |
137 if (settings && settings->logDnsPrefetchAndPreconnect()) { | 136 if (settings && settings->logDnsPrefetchAndPreconnect()) |
138 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource
, DebugMessageLevel, String("Preconnect triggered for " + href.host()))); | 137 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource
, DebugMessageLevel, String("Preconnect triggered for " + href.host()))); |
139 if (crossOrigin != CrossOriginAttributeNotSet) { | 138 preconnect(href); |
140 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSo
urce, DebugMessageLevel, | |
141 String("Preconnect CORS setting is ") + String((crossOrigin
== CrossOriginAttributeAnonymous) ? "anonymous" : "use-credentials"))); | |
142 } | |
143 } | |
144 preconnect(href, crossOrigin); | |
145 } | 139 } |
146 } | 140 } |
147 | 141 |
148 // TODO(yoav): Replace Resource:Type here with some way that conveys priority bu
t not context. | 142 // TODO(yoav): Replace Resource:Type here with some way that conveys priority bu
t not context. |
149 static bool getTypeFromAsAttribute(const String& as, Resource::Type& type) | 143 static bool getTypeFromAsAttribute(const String& as, Resource::Type& type) |
150 { | 144 { |
151 if (as.isEmpty()) | 145 if (as.isEmpty()) |
152 return false; | 146 return false; |
153 // TODO(yoav): Return false also when the `as` value is not a valid one. | 147 // TODO(yoav): Return false also when the `as` value is not a valid one. |
154 // TODO(yoav): Add actual types here and make sure priorities work according
ly. | 148 // TODO(yoav): Add actual types here and make sure priorities work according
ly. |
(...skipping 29 matching lines...) Expand all Loading... |
184 LinkHeaderSet headerSet(headerValue); | 178 LinkHeaderSet headerSet(headerValue); |
185 for (auto& header : headerSet) { | 179 for (auto& header : headerSet) { |
186 if (!header.valid() || header.url().isEmpty() || header.rel().isEmpty()) | 180 if (!header.valid() || header.url().isEmpty() || header.rel().isEmpty()) |
187 return false; | 181 return false; |
188 LinkRelAttribute relAttribute(header.rel()); | 182 LinkRelAttribute relAttribute(header.rel()); |
189 KURL url = document->completeURL(header.url()); | 183 KURL url = document->completeURL(header.url()); |
190 if (RuntimeEnabledFeatures::linkHeaderEnabled()) | 184 if (RuntimeEnabledFeatures::linkHeaderEnabled()) |
191 dnsPrefetchIfNeeded(relAttribute, url, *document); | 185 dnsPrefetchIfNeeded(relAttribute, url, *document); |
192 | 186 |
193 if (RuntimeEnabledFeatures::linkPreconnectEnabled()) | 187 if (RuntimeEnabledFeatures::linkPreconnectEnabled()) |
194 preconnectIfNeeded(relAttribute, url, *document, header.crossOrigin(
)); | 188 preconnectIfNeeded(relAttribute, url, *document); |
195 | 189 |
196 // FIXME: Add more supported headers as needed. | 190 // FIXME: Add more supported headers as needed. |
197 } | 191 } |
198 return true; | 192 return true; |
199 } | 193 } |
200 | 194 |
201 bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, const AtomicStri
ng& crossOriginMode, const String& type, const String& as, const KURL& href, Doc
ument& document) | 195 bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, const AtomicStri
ng& crossOriginMode, const String& type, const String& as, const KURL& href, Doc
ument& document) |
202 { | 196 { |
203 // 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. | 197 // FIXME(crbug.com/463266): We're ignoring type here. Maybe we shouldn't. |
205 dnsPrefetchIfNeeded(relAttribute, href, document); | 198 dnsPrefetchIfNeeded(relAttribute, href, document); |
206 | 199 |
207 preconnectIfNeeded(relAttribute, href, document, crossOriginAttributeValue(c
rossOriginMode)); | 200 preconnectIfNeeded(relAttribute, href, document); |
208 | 201 |
209 preloadIfNeeded(relAttribute, href, document, as); | 202 preloadIfNeeded(relAttribute, href, document, as); |
210 | 203 |
211 // FIXME(crbug.com/323096): Should take care of import. | 204 // FIXME(crbug.com/323096): Should take care of import. |
212 if ((relAttribute.isLinkPrefetch() || relAttribute.isLinkSubresource() || re
lAttribute.isTransitionExitingStylesheet()) && href.isValid() && document.frame(
)) { | 205 if ((relAttribute.isLinkPrefetch() || relAttribute.isLinkSubresource() || re
lAttribute.isTransitionExitingStylesheet()) && href.isValid() && document.frame(
)) { |
213 if (!m_client->shouldLoadLink()) | 206 if (!m_client->shouldLoadLink()) |
214 return false; | 207 return false; |
215 Resource::Type type = relAttribute.isLinkSubresource() ? Resource::Link
Subresource : Resource::LinkPrefetch; | 208 Resource::Type type = relAttribute.isLinkSubresource() ? Resource::Link
Subresource : Resource::LinkPrefetch; |
216 FetchRequest linkRequest(ResourceRequest(document.completeURL(href)), Fe
tchInitiatorTypeNames::link); | 209 FetchRequest linkRequest(ResourceRequest(document.completeURL(href)), Fe
tchInitiatorTypeNames::link); |
217 if (!crossOriginMode.isNull()) | 210 if (!crossOriginMode.isNull()) |
(...skipping 25 matching lines...) Expand all Loading... |
243 m_prerender.clear(); | 236 m_prerender.clear(); |
244 } | 237 } |
245 } | 238 } |
246 | 239 |
247 DEFINE_TRACE(LinkLoader) | 240 DEFINE_TRACE(LinkLoader) |
248 { | 241 { |
249 visitor->trace(m_prerender); | 242 visitor->trace(m_prerender); |
250 } | 243 } |
251 | 244 |
252 } | 245 } |
OLD | NEW |