Chromium Code Reviews| Index: third_party/WebKit/Source/core/loader/LinkLoader.cpp |
| diff --git a/third_party/WebKit/Source/core/loader/LinkLoader.cpp b/third_party/WebKit/Source/core/loader/LinkLoader.cpp |
| index 867e8fae1f1392bfb7259471d58ed4c4887da3e7..7847b18504374c41c8d02c9842532e959d6aa18c 100644 |
| --- a/third_party/WebKit/Source/core/loader/LinkLoader.cpp |
| +++ b/third_party/WebKit/Source/core/loader/LinkLoader.cpp |
| @@ -34,6 +34,8 @@ |
| #include "core/css/MediaList.h" |
| #include "core/css/MediaQueryEvaluator.h" |
| #include "core/dom/Document.h" |
| +#include "core/frame/FrameConsole.h" |
| +#include "core/frame/LocalFrame.h" |
| #include "core/frame/Settings.h" |
| #include "core/frame/UseCounter.h" |
| #include "core/html/CrossOriginAttribute.h" |
| @@ -128,26 +130,41 @@ enum LinkCaller { |
| kLinkCalledFromMarkup, |
| }; |
| +static void SendMessageToConsoleForPossiblyNullDocument( |
|
Nate Chapin
2017/04/28 21:33:31
I hate this name, but I don't have a better idea.
kinuko
2017/04/29 14:10:20
Maybe add the same comment with the one in FrameFe
|
| + ConsoleMessage* console_message, |
| + Document* document, |
| + LocalFrame* frame) { |
| + DCHECK(document || frame); |
| + DCHECK(!document || document->GetFrame() == frame); |
| + if (document) |
| + document->AddConsoleMessage(console_message); |
| + else |
| + frame->Console().AddMessage(console_message); |
| +} |
| + |
| static void DnsPrefetchIfNeeded( |
| const LinkRelAttribute& rel_attribute, |
| const KURL& href, |
| - Document& document, |
| + Document* document, |
| + LocalFrame* frame, |
| const NetworkHintsInterface& network_hints_interface, |
| LinkCaller caller) { |
| if (rel_attribute.IsDNSPrefetch()) { |
| - UseCounter::Count(document, UseCounter::kLinkRelDnsPrefetch); |
| + UseCounter::Count(frame, UseCounter::kLinkRelDnsPrefetch); |
| if (caller == kLinkCalledFromHeader) |
| - UseCounter::Count(document, UseCounter::kLinkHeaderDnsPrefetch); |
| - Settings* settings = document.GetSettings(); |
| + UseCounter::Count(frame, UseCounter::kLinkHeaderDnsPrefetch); |
| + Settings* settings = frame ? frame->GetSettings() : nullptr; |
| // FIXME: The href attribute of the link element can be in "//hostname" |
| // form, and we shouldn't attempt to complete that as URL |
| // <https://bugs.webkit.org/show_bug.cgi?id=48857>. |
| if (settings && settings->GetDNSPrefetchingEnabled() && href.IsValid() && |
| !href.IsEmpty()) { |
| if (settings->GetLogDnsPrefetchAndPreconnect()) { |
| - document.AddConsoleMessage(ConsoleMessage::Create( |
| - kOtherMessageSource, kVerboseMessageLevel, |
| - String("DNS prefetch triggered for " + href.Host()))); |
| + SendMessageToConsoleForPossiblyNullDocument( |
| + ConsoleMessage::Create( |
| + kOtherMessageSource, kVerboseMessageLevel, |
| + String("DNS prefetch triggered for " + href.Host())), |
| + document, frame); |
| } |
| network_hints_interface.DnsPrefetchHost(href.Host()); |
| } |
| @@ -157,27 +174,32 @@ static void DnsPrefetchIfNeeded( |
| static void PreconnectIfNeeded( |
| const LinkRelAttribute& rel_attribute, |
| const KURL& href, |
| - Document& document, |
| + Document* document, |
| + LocalFrame* frame, |
| const CrossOriginAttributeValue cross_origin, |
| const NetworkHintsInterface& network_hints_interface, |
| LinkCaller caller) { |
| if (rel_attribute.IsPreconnect() && href.IsValid() && |
| href.ProtocolIsInHTTPFamily()) { |
| - UseCounter::Count(document, UseCounter::kLinkRelPreconnect); |
| + UseCounter::Count(frame, UseCounter::kLinkRelPreconnect); |
| if (caller == kLinkCalledFromHeader) |
| - UseCounter::Count(document, UseCounter::kLinkHeaderPreconnect); |
| - Settings* settings = document.GetSettings(); |
| + UseCounter::Count(frame, UseCounter::kLinkHeaderPreconnect); |
| + Settings* settings = frame ? frame->GetSettings() : nullptr; |
| if (settings && settings->GetLogDnsPrefetchAndPreconnect()) { |
| - document.AddConsoleMessage(ConsoleMessage::Create( |
| - kOtherMessageSource, kVerboseMessageLevel, |
| - String("Preconnect triggered for ") + href.GetString())); |
| + SendMessageToConsoleForPossiblyNullDocument( |
| + ConsoleMessage::Create( |
| + kOtherMessageSource, kVerboseMessageLevel, |
| + String("Preconnect triggered for ") + href.GetString()), |
| + document, frame); |
| if (cross_origin != kCrossOriginAttributeNotSet) { |
| - document.AddConsoleMessage(ConsoleMessage::Create( |
| - kOtherMessageSource, kVerboseMessageLevel, |
| - String("Preconnect CORS setting is ") + |
| - String((cross_origin == kCrossOriginAttributeAnonymous) |
| - ? "anonymous" |
| - : "use-credentials"))); |
| + SendMessageToConsoleForPossiblyNullDocument( |
| + ConsoleMessage::Create( |
| + kOtherMessageSource, kVerboseMessageLevel, |
| + String("Preconnect CORS setting is ") + |
| + String((cross_origin == kCrossOriginAttributeAnonymous) |
| + ? "anonymous" |
| + : "use-credentials")), |
| + document, frame); |
| } |
| } |
| network_hints_interface.PreconnectHost(href, cross_origin); |
| @@ -380,12 +402,13 @@ static Resource* PrefetchIfNeeded(Document& document, |
| void LinkLoader::LoadLinksFromHeader( |
| const String& header_value, |
| const KURL& base_url, |
| + LocalFrame& frame, |
| Document* document, |
| const NetworkHintsInterface& network_hints_interface, |
| CanLoadResources can_load_resources, |
| MediaPreloadPolicy media_policy, |
| ViewportDescriptionWrapper* viewport_description_wrapper) { |
| - if (!document || header_value.IsEmpty()) |
| + if (header_value.IsEmpty()) |
| return; |
| LinkHeaderSet header_set(header_value); |
| for (auto& header : header_set) { |
| @@ -403,14 +426,15 @@ void LinkLoader::LoadLinksFromHeader( |
| if (url == base_url) |
| continue; |
| if (can_load_resources != kOnlyLoadResources) { |
| - DnsPrefetchIfNeeded(rel_attribute, url, *document, |
| + DnsPrefetchIfNeeded(rel_attribute, url, document, &frame, |
| network_hints_interface, kLinkCalledFromHeader); |
| - PreconnectIfNeeded(rel_attribute, url, *document, |
| + PreconnectIfNeeded(rel_attribute, url, document, &frame, |
| GetCrossOriginAttributeValue(header.CrossOrigin()), |
| network_hints_interface, kLinkCalledFromHeader); |
| } |
| if (can_load_resources != kDoNotLoadResources) { |
| + DCHECK(document); |
| bool error_occurred = false; |
| ViewportDescription* viewport_description = |
| (viewport_description_wrapper && viewport_description_wrapper->set) |
| @@ -427,7 +451,7 @@ void LinkLoader::LoadLinksFromHeader( |
| kReferrerPolicyDefault); |
| } |
| if (rel_attribute.IsServiceWorker()) { |
| - UseCounter::Count(*document, UseCounter::kLinkHeaderServiceWorker); |
| + UseCounter::Count(&frame, UseCounter::kLinkHeaderServiceWorker); |
| } |
| // TODO(yoav): Add more supported headers as needed. |
| } |
| @@ -446,11 +470,12 @@ bool LinkLoader::LoadLink( |
| if (!client_->ShouldLoadLink()) |
| return false; |
| - DnsPrefetchIfNeeded(rel_attribute, href, document, network_hints_interface, |
| - kLinkCalledFromMarkup); |
| + DnsPrefetchIfNeeded(rel_attribute, href, &document, document.GetFrame(), |
| + network_hints_interface, kLinkCalledFromMarkup); |
| - PreconnectIfNeeded(rel_attribute, href, document, cross_origin, |
| - network_hints_interface, kLinkCalledFromMarkup); |
| + PreconnectIfNeeded(rel_attribute, href, &document, document.GetFrame(), |
| + cross_origin, network_hints_interface, |
| + kLinkCalledFromMarkup); |
| bool error_occurred = false; |
| CreateLinkPreloadResourceClient(PreloadIfNeeded( |