Commit 680bf272 authored by Dominic Farolino's avatar Dominic Farolino Committed by Commit Bot

Finish migrating LoadStylesheetIfNeeded logic to LinkLoader

Before this CL, ResourceRequest-based logic for all <link>s
that were not rel=manifest or rel=import resided in LinkStyle.
This CL pushes that logic down to LinkLoader for a better
separation of concerns.

R=yoav@yoav.ws

Bug: n/a
Change-Id: If1cc664b7de2ad54cf73d63a2e0d14943e698d04
Reviewed-on: https://chromium-review.googlesource.com/1087351
Commit-Queue: Dominic Farolino <domfarolino@gmail.com>
Reviewed-by: default avatarYoav Weiss <yoav@yoav.ws>
Cr-Commit-Position: refs/heads/master@{#565317}
parent 67fdb4f1
...@@ -134,6 +134,14 @@ bool HTMLLinkElement::LoadLink(const LinkLoadParameters& params) { ...@@ -134,6 +134,14 @@ bool HTMLLinkElement::LoadLink(const LinkLoadParameters& params) {
NetworkHintsInterfaceImpl()); NetworkHintsInterfaceImpl());
} }
void HTMLLinkElement::LoadStylesheet(const LinkLoadParameters& params,
const WTF::TextEncoding& charset,
FetchParameters::DeferOption defer_option,
ResourceClient* link_client) {
return link_loader_->LoadStylesheet(params, localName(), charset,
defer_option, GetDocument(), link_client);
}
LinkResource* HTMLLinkElement::LinkResourceToProcess() { LinkResource* HTMLLinkElement::LinkResourceToProcess() {
if (!ShouldLoadLink()) { if (!ShouldLoadLink()) {
// If we shouldn't load the link, but the link is already of type // If we shouldn't load the link, but the link is already of type
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "third_party/blink/renderer/core/loader/link_loader.h" #include "third_party/blink/renderer/core/loader/link_loader.h"
#include "third_party/blink/renderer/core/loader/link_loader_client.h" #include "third_party/blink/renderer/core/loader/link_loader_client.h"
#include "third_party/blink/renderer/platform/bindings/trace_wrapper_member.h" #include "third_party/blink/renderer/platform/bindings/trace_wrapper_member.h"
#include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
namespace blink { namespace blink {
...@@ -101,6 +102,10 @@ class CORE_EXPORT HTMLLinkElement final : public HTMLElement, ...@@ -101,6 +102,10 @@ class CORE_EXPORT HTMLLinkElement final : public HTMLElement,
// For LinkStyle // For LinkStyle
bool LoadLink(const LinkLoadParameters&); bool LoadLink(const LinkLoadParameters&);
void LoadStylesheet(const LinkLoadParameters&,
const WTF::TextEncoding&,
FetchParameters::DeferOption,
ResourceClient*);
bool IsAlternate() const { bool IsAlternate() const {
return GetLinkStyle()->IsUnset() && rel_attribute_.IsAlternate(); return GetLinkStyle()->IsUnset() && rel_attribute_.IsAlternate();
} }
......
...@@ -17,8 +17,6 @@ ...@@ -17,8 +17,6 @@
#include "third_party/blink/renderer/core/loader/subresource_integrity_helper.h" #include "third_party/blink/renderer/core/loader/subresource_integrity_helper.h"
#include "third_party/blink/renderer/platform/histogram.h" #include "third_party/blink/renderer/platform/histogram.h"
#include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_loader_options.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_request.h"
#include "third_party/blink/renderer/platform/loader/subresource_integrity.h" #include "third_party/blink/renderer/platform/loader/subresource_integrity.h"
#include "third_party/blink/renderer/platform/network/mime/content_type.h" #include "third_party/blink/renderer/platform/network/mime/content_type.h"
#include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h" #include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h"
...@@ -254,11 +252,11 @@ void LinkStyle::SetCrossOriginStylesheetStatus(CSSStyleSheet* sheet) { ...@@ -254,11 +252,11 @@ void LinkStyle::SetCrossOriginStylesheetStatus(CSSStyleSheet* sheet) {
} }
LinkStyle::LoadReturnValue LinkStyle::LoadStylesheetIfNeeded( LinkStyle::LoadReturnValue LinkStyle::LoadStylesheetIfNeeded(
const LinkLoadParameters& parameters, const LinkLoadParameters& params,
const WTF::TextEncoding& charset) { const WTF::TextEncoding& charset) {
if (disabled_state_ == kDisabled || !owner_->RelAttribute().IsStyleSheet() || if (disabled_state_ == kDisabled || !owner_->RelAttribute().IsStyleSheet() ||
!StyleSheetTypeIsSupported(parameters.type) || !ShouldLoadResource() || !StyleSheetTypeIsSupported(params.type) || !ShouldLoadResource() ||
!parameters.href.IsValid()) !params.href.IsValid())
return kNotNeeded; return kNotNeeded;
if (GetResource()) { if (GetResource()) {
...@@ -292,51 +290,18 @@ LinkStyle::LoadReturnValue LinkStyle::LoadStylesheetIfNeeded( ...@@ -292,51 +290,18 @@ LinkStyle::LoadReturnValue LinkStyle::LoadStylesheetIfNeeded(
owner_->IsCreatedByParser(); owner_->IsCreatedByParser();
AddPendingSheet(blocking ? kBlocking : kNonBlocking); AddPendingSheet(blocking ? kBlocking : kNonBlocking);
// TODO(domfarolino): move the below fetching logic to if (params.cross_origin != kCrossOriginAttributeNotSet) {
// LinkLoader::LoadStylesheet SetFetchFollowingCORS();
ResourceRequest resource_request(GetDocument().CompleteURL(parameters.href));
ReferrerPolicy referrer_policy = owner_->GetReferrerPolicy();
if (referrer_policy != kReferrerPolicyDefault) {
resource_request.SetHTTPReferrer(SecurityPolicy::GenerateReferrer(
referrer_policy, parameters.href, GetDocument().OutgoingReferrer()));
}
if (RuntimeEnabledFeatures::PriorityHintsEnabled()) {
resource_request.SetFetchImportanceMode(
GetFetchImportanceAttributeValue(owner_->ImportanceValue()));
} }
ResourceLoaderOptions options;
options.initiator_info.name = owner_->localName();
FetchParameters params(resource_request, options);
params.SetCharset(charset);
// Load stylesheets that are not needed for the layout immediately with low // Load stylesheets that are not needed for the layout immediately with low
// priority. When the link element is created by scripts, load the // priority. When the link element is created by scripts, load the
// stylesheets asynchronously but in high priority. // stylesheets asynchronously but in high priority.
if (!media_query_matches || owner_->IsAlternate()) FetchParameters::DeferOption defer_option =
params.SetDefer(FetchParameters::kLazyLoad); !media_query_matches || owner_->IsAlternate() ? FetchParameters::kLazyLoad
: FetchParameters::kNoDefer;
params.SetContentSecurityPolicyNonce(owner_->nonce());
CrossOriginAttributeValue cross_origin = owner_->LoadStylesheet(params, charset, defer_option, this);
GetCrossOriginAttributeValue(owner_->FastGetAttribute(crossoriginAttr));
if (cross_origin != kCrossOriginAttributeNotSet) {
params.SetCrossOriginAccessControl(GetDocument().GetSecurityOrigin(),
cross_origin);
SetFetchFollowingCORS();
}
String integrity_attr = owner_->FastGetAttribute(integrityAttr);
if (!integrity_attr.IsEmpty()) {
IntegrityMetadataSet metadata_set;
SubresourceIntegrity::ParseIntegrityAttribute(
integrity_attr, SubresourceIntegrityHelper::GetFeatures(&GetDocument()),
metadata_set);
params.SetIntegrityMetadata(metadata_set);
params.MutableResourceRequest().SetFetchIntegrity(integrity_attr);
}
CSSStyleSheetResource::Fetch(params, GetDocument().Fetcher(), this);
if (loading_ && !GetResource()) { if (loading_ && !GetResource()) {
// Fetch() synchronous failure case. // Fetch() synchronous failure case.
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "third_party/blink/renderer/core/dom/node.h" #include "third_party/blink/renderer/core/dom/node.h"
#include "third_party/blink/renderer/core/html/link_resource.h" #include "third_party/blink/renderer/core/html/link_resource.h"
#include "third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.h" #include "third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.h"
#include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_client.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_client.h"
#include "third_party/blink/renderer/platform/wtf/forward.h" #include "third_party/blink/renderer/platform/wtf/forward.h"
......
...@@ -51,13 +51,13 @@ ...@@ -51,13 +51,13 @@
#include "third_party/blink/renderer/core/loader/modulescript/module_script_fetch_request.h" #include "third_party/blink/renderer/core/loader/modulescript/module_script_fetch_request.h"
#include "third_party/blink/renderer/core/loader/network_hints_interface.h" #include "third_party/blink/renderer/core/loader/network_hints_interface.h"
#include "third_party/blink/renderer/core/loader/private/prerender_handle.h" #include "third_party/blink/renderer/core/loader/private/prerender_handle.h"
#include "third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.h"
#include "third_party/blink/renderer/core/loader/resource/link_fetch_resource.h" #include "third_party/blink/renderer/core/loader/resource/link_fetch_resource.h"
#include "third_party/blink/renderer/core/loader/subresource_integrity_helper.h" #include "third_party/blink/renderer/core/loader/subresource_integrity_helper.h"
#include "third_party/blink/renderer/core/script/module_script.h" #include "third_party/blink/renderer/core/script/module_script.h"
#include "third_party/blink/renderer/core/script/script_loader.h" #include "third_party/blink/renderer/core/script/script_loader.h"
#include "third_party/blink/renderer/core/script/settings_object.h" #include "third_party/blink/renderer/core/script/settings_object.h"
#include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_type_names.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_type_names.h"
#include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_client.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_client.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_finish_observer.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_finish_observer.h"
...@@ -693,6 +693,55 @@ bool LinkLoader::LoadLink( ...@@ -693,6 +693,55 @@ bool LinkLoader::LoadLink(
return true; return true;
} }
void LinkLoader::LoadStylesheet(const LinkLoadParameters& params,
const AtomicString& local_name,
const WTF::TextEncoding& charset,
FetchParameters::DeferOption defer_option,
Document& document,
ResourceClient* link_client) {
ResourceRequest resource_request(document.CompleteURL(params.href));
ReferrerPolicy referrer_policy = params.referrer_policy;
if (referrer_policy != kReferrerPolicyDefault) {
resource_request.SetHTTPReferrer(SecurityPolicy::GenerateReferrer(
referrer_policy, params.href, document.OutgoingReferrer()));
}
mojom::FetchImportanceMode importance_mode =
GetFetchImportanceAttributeValue(params.importance);
DCHECK(importance_mode == mojom::FetchImportanceMode::kImportanceAuto ||
RuntimeEnabledFeatures::PriorityHintsEnabled());
resource_request.SetFetchImportanceMode(importance_mode);
ResourceLoaderOptions options;
options.initiator_info.name = local_name;
FetchParameters link_fetch_params(resource_request, options);
link_fetch_params.SetCharset(charset);
link_fetch_params.SetDefer(defer_option);
link_fetch_params.SetContentSecurityPolicyNonce(params.nonce);
CrossOriginAttributeValue cross_origin = params.cross_origin;
if (cross_origin != kCrossOriginAttributeNotSet) {
link_fetch_params.SetCrossOriginAccessControl(document.GetSecurityOrigin(),
cross_origin);
}
String integrity_attr = params.integrity;
if (!integrity_attr.IsEmpty()) {
IntegrityMetadataSet metadata_set;
SubresourceIntegrity::ParseIntegrityAttribute(
integrity_attr, SubresourceIntegrityHelper::GetFeatures(&document),
metadata_set);
link_fetch_params.SetIntegrityMetadata(metadata_set);
link_fetch_params.MutableResourceRequest().SetFetchIntegrity(
integrity_attr);
}
CSSStyleSheetResource::Fetch(link_fetch_params, document.Fetcher(),
link_client);
}
void LinkLoader::DispatchLinkLoadingErroredAsync() { void LinkLoader::DispatchLinkLoadingErroredAsync() {
client_->GetLoadingTaskRunner()->PostTask( client_->GetLoadingTaskRunner()->PostTask(
FROM_HERE, WTF::Bind(&LinkLoaderClient::LinkLoadingErrored, FROM_HERE, WTF::Bind(&LinkLoaderClient::LinkLoadingErrored,
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "third_party/blink/renderer/core/loader/link_loader_client.h" #include "third_party/blink/renderer/core/loader/link_loader_client.h"
#include "third_party/blink/renderer/core/script/modulator.h" #include "third_party/blink/renderer/core/script/modulator.h"
#include "third_party/blink/renderer/platform/cross_origin_attribute_value.h" #include "third_party/blink/renderer/platform/cross_origin_attribute_value.h"
#include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource.h" #include "third_party/blink/renderer/platform/loader/fetch/resource.h"
#include "third_party/blink/renderer/platform/prerender_client.h" #include "third_party/blink/renderer/platform/prerender_client.h"
...@@ -114,6 +115,12 @@ class CORE_EXPORT LinkLoader final : public SingleModuleClient, ...@@ -114,6 +115,12 @@ class CORE_EXPORT LinkLoader final : public SingleModuleClient,
bool LoadLink(const LinkLoadParameters&, bool LoadLink(const LinkLoadParameters&,
Document&, Document&,
const NetworkHintsInterface&); const NetworkHintsInterface&);
void LoadStylesheet(const LinkLoadParameters&,
const AtomicString&,
const WTF::TextEncoding&,
FetchParameters::DeferOption,
Document&,
ResourceClient*);
void DispatchLinkLoadingErroredAsync(); void DispatchLinkLoadingErroredAsync();
enum CanLoadResources { enum CanLoadResources {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment