Commit d5b1ba8c authored by Nate Chapin's avatar Nate Chapin Committed by Commit Bot

Have ResourceFetcher call SetResource() for stylesheet Resources

Bug: 793028
Change-Id: I2c75fa078becfd638afe6072e9e2aa59198af66c
Reviewed-on: https://chromium-review.googlesource.com/815391Reviewed-by: default avatarHiroshige Hayashizaki <hiroshige@chromium.org>
Reviewed-by: default avatarRune Lillesveen <futhark@chromium.org>
Commit-Queue: Nate Chapin <japhet@chromium.org>
Cr-Commit-Position: refs/heads/master@{#523460}
parent 06f56865
......@@ -136,17 +136,18 @@ void StyleRuleImport::RequestStyleSheet() {
options.initiator_info.name = FetchInitiatorTypeNames::css;
FetchParameters params(ResourceRequest(abs_url), options);
params.SetCharset(parent_style_sheet_->Charset());
CSSStyleSheetResource* resource =
CSSStyleSheetResource::Fetch(params, fetcher);
if (resource) {
loading_ = true;
DCHECK(!style_sheet_client_->GetResource());
if (!CSSStyleSheetResource::Fetch(params, fetcher, style_sheet_client_)) {
loading_ = false;
} else if (loading_) {
// if the import rule is issued dynamically, the sheet may be
// removed from the pending sheet count, so let the doc know
// the sheet being imported is pending.
if (parent_style_sheet_ && parent_style_sheet_->LoadCompleted() &&
root_sheet == parent_style_sheet_)
root_sheet == parent_style_sheet_) {
parent_style_sheet_->StartLoadingDynamicSheet();
loading_ = true;
style_sheet_client_->TakeResource(resource);
}
}
}
......
......@@ -74,11 +74,6 @@ class StyleRuleImport : public StyleRuleBase {
void NotifyFinished(Resource* resource) override {
owner_rule_->NotifyFinished(resource);
}
void TakeResource(Resource* resource) {
DCHECK(!GetResource());
SetResource(resource);
}
void Dispose() { ClearResource(); }
String DebugName() const override { return "ImportedStyleSheetClient"; }
......
......@@ -154,20 +154,26 @@ void ProcessingInstruction::Process(const String& href, const String& charset) {
options.initiator_info.name = FetchInitiatorTypeNames::processinginstruction;
FetchParameters params(ResourceRequest(GetDocument().CompleteURL(href)),
options);
loading_ = true;
if (is_xsl_) {
if (RuntimeEnabledFeatures::XSLTEnabled())
resource = XSLStyleSheetResource::Fetch(params, GetDocument().Fetcher());
if (RuntimeEnabledFeatures::XSLTEnabled()) {
resource =
XSLStyleSheetResource::Fetch(params, GetDocument().Fetcher(), this);
}
} else {
params.SetCharset(charset.IsEmpty() ? GetDocument().Encoding()
: WTF::TextEncoding(charset));
resource = CSSStyleSheetResource::Fetch(params, GetDocument().Fetcher());
GetDocument().GetStyleEngine().AddPendingSheet(style_engine_context_);
resource =
CSSStyleSheetResource::Fetch(params, GetDocument().Fetcher(), this);
}
if (resource) {
loading_ = true;
if (!is_xsl_)
GetDocument().GetStyleEngine().AddPendingSheet(style_engine_context_);
SetResource(resource);
if (!resource) {
loading_ = false;
if (!is_xsl_) {
GetDocument().GetStyleEngine().RemovePendingSheet(*this,
style_engine_context_);
}
}
}
......
......@@ -328,14 +328,13 @@ LinkStyle::LoadReturnValue LinkStyle::LoadStylesheetIfNeeded(
params.SetIntegrityMetadata(metadata_set);
params.MutableResourceRequest().SetFetchIntegrity(integrity_attr);
}
SetResource(CSSStyleSheetResource::Fetch(params, GetDocument().Fetcher()));
CSSStyleSheetResource::Fetch(params, GetDocument().Fetcher(), this);
if (loading_ && !GetResource()) {
// Fetch() synchronous failure case.
// The request may have been denied if (for example) the stylesheet is
// local and the document is remote, or if there was a Content Security
// Policy Failure. setCSSStyleSheet() can be called synchronuosly in
// setResource() and thus resource() is null and |m_loading| is false in
// such cases even if the request succeeds.
// Policy Failure.
loading_ = false;
RemovePendingSheet();
NotifyLoadedSheetAndAllCriticalSubresources(
......
......@@ -37,8 +37,6 @@ class InspectorResourceContentLoader::ResourceClient final
explicit ResourceClient(InspectorResourceContentLoader* loader)
: loader_(loader) {}
void WaitForResource(Resource* resource) { SetResource(resource); }
void Trace(blink::Visitor* visitor) override {
visitor->Trace(loader_);
RawResourceClient::Trace(visitor);
......@@ -121,15 +119,17 @@ void InspectorResourceContentLoader::Start() {
ResourceLoaderOptions options;
options.initiator_info.name = FetchInitiatorTypeNames::internal;
FetchParameters params(resource_request, options);
Resource* resource =
CSSStyleSheetResource::Fetch(params, document->Fetcher());
ResourceClient* resource_client = new ResourceClient(this);
Resource* resource = CSSStyleSheetResource::Fetch(
params, document->Fetcher(), resource_client);
if (!resource)
continue;
// Prevent garbage collection by holding a reference to this resource.
resources_.push_back(resource);
ResourceClient* resource_client = new ResourceClient(this);
pending_resource_clients_.insert(resource_client);
resource_client->WaitForResource(resource);
// A cache hit for a css stylesheet will complete synchronously. Don't
// mark the client as pending if it already finished.
if (resource_client->GetResource())
pending_resource_clients_.insert(resource_client);
}
}
......
......@@ -208,7 +208,7 @@ Resource* DocumentLoader::StartPreload(Resource::Type type,
resource = ScriptResource::Fetch(params, Fetcher(), nullptr);
break;
case Resource::kCSSStyleSheet:
resource = CSSStyleSheetResource::Fetch(params, Fetcher());
resource = CSSStyleSheetResource::Fetch(params, Fetcher(), nullptr);
break;
case Resource::kFont:
resource = FontResource::Fetch(params, Fetcher());
......
......@@ -42,12 +42,13 @@
namespace blink {
CSSStyleSheetResource* CSSStyleSheetResource::Fetch(FetchParameters& params,
ResourceFetcher* fetcher) {
ResourceFetcher* fetcher,
ResourceClient* client) {
DCHECK_EQ(params.GetResourceRequest().GetFrameType(),
WebURLRequest::kFrameTypeNone);
params.SetRequestContext(WebURLRequest::kRequestContextStyle);
CSSStyleSheetResource* resource = ToCSSStyleSheetResource(
fetcher->RequestResource(params, CSSStyleSheetResourceFactory()));
fetcher->RequestResource(params, CSSStyleSheetResourceFactory(), client));
return resource;
}
......
......@@ -44,7 +44,9 @@ class CORE_EXPORT CSSStyleSheetResource final : public TextResource {
public:
enum class MIMETypeCheck { kStrict, kLax };
static CSSStyleSheetResource* Fetch(FetchParameters&, ResourceFetcher*);
static CSSStyleSheetResource* Fetch(FetchParameters&,
ResourceFetcher*,
ResourceClient*);
static CSSStyleSheetResource* CreateForTest(const KURL&,
const WTF::TextEncoding&);
......
......@@ -51,19 +51,21 @@ XSLStyleSheetResource* XSLStyleSheetResource::FetchSynchronously(
ResourceFetcher* fetcher) {
ApplyXSLRequestProperties(params);
params.MakeSynchronous();
XSLStyleSheetResource* resource = ToXSLStyleSheetResource(
fetcher->RequestResource(params, XSLStyleSheetResourceFactory()));
XSLStyleSheetResource* resource =
ToXSLStyleSheetResource(fetcher->RequestResource(
params, XSLStyleSheetResourceFactory(), nullptr));
if (resource && resource->Data())
resource->sheet_ = resource->DecodedText();
return resource;
}
XSLStyleSheetResource* XSLStyleSheetResource::Fetch(FetchParameters& params,
ResourceFetcher* fetcher) {
ResourceFetcher* fetcher,
ResourceClient* client) {
DCHECK(RuntimeEnabledFeatures::XSLTEnabled());
ApplyXSLRequestProperties(params);
return ToXSLStyleSheetResource(
fetcher->RequestResource(params, XSLStyleSheetResourceFactory()));
fetcher->RequestResource(params, XSLStyleSheetResourceFactory(), client));
}
XSLStyleSheetResource::XSLStyleSheetResource(
......
......@@ -38,7 +38,9 @@ class XSLStyleSheetResource final : public TextResource {
public:
static XSLStyleSheetResource* FetchSynchronously(FetchParameters&,
ResourceFetcher*);
static XSLStyleSheetResource* Fetch(FetchParameters&, ResourceFetcher*);
static XSLStyleSheetResource* Fetch(FetchParameters&,
ResourceFetcher*,
ResourceClient*);
const String& Sheet() const { return sheet_; }
......
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