| 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..6147ac524a572790bf718d56fa4b6d420a2fee3c 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,44 @@ enum LinkCaller {
|
| kLinkCalledFromMarkup,
|
| };
|
|
|
| +static void SendMessageToConsoleForPossiblyNullDocument(
|
| + ConsoleMessage* console_message,
|
| + Document* document,
|
| + LocalFrame* frame) {
|
| + DCHECK(document || frame);
|
| + DCHECK(!document || document->GetFrame() == frame);
|
| + // Route the console message through Document if possible, so that script line
|
| + // numbers can be included. Otherwise, route directly to the FrameConsole, to
|
| + // ensure we never drop a message.
|
| + 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 +177,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 +405,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 +429,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 +454,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 +473,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(
|
|
|