blob: 11ac96c29ea71234ef24beb6ced1300a75896dd1 [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_CLASSIC_PENDING_SCRIPT_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_CLASSIC_PENDING_SCRIPT_H_
#include "third_party/blink/renderer/bindings/core/v8/script_cache_consumer_client.h"
#include "third_party/blink/renderer/bindings/core/v8/script_source_location_type.h"
#include "third_party/blink/renderer/bindings/core/v8/script_streamer.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/loader/resource/script_resource.h"
#include "third_party/blink/renderer/core/script/classic_script.h"
#include "third_party/blink/renderer/core/script/pending_script.h"
#include "third_party/blink/renderer/platform/instrumentation/memory_pressure_listener.h"
#include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
namespace blink {
// PendingScript for a classic script
// https://html.spec.whatwg.org/C/#classic-script.
//
// TODO(kochi): The comment below is from pre-oilpan age and may not be correct
// now.
// A RefPtr alone does not prevent the underlying Resource from purging its data
// buffer. This class holds a dummy client open for its lifetime in order to
// guarantee that the data buffer will not be purged.
class CORE_EXPORT ClassicPendingScript final
: public PendingScript,
public ResourceClient,
public ScriptCacheConsumerClient {
public:
// https://html.spec.whatwg.org/C/#fetch-a-classic-script
//
// For a script from an external file, calls ScriptResource::Fetch() and
// creates ClassicPendingScript. Returns nullptr if Fetch() returns nullptr.
static ClassicPendingScript* Fetch(
const KURL&,
Document&,
const ScriptFetchOptions&,
CrossOriginAttributeValue,
const WTF::TextEncoding&,
ScriptElementBase*,
FetchParameters::DeferOption,
scheduler::TaskAttributionInfo* parent_task);
// For an inline script.
static ClassicPendingScript* CreateInline(ScriptElementBase*,
const TextPosition&,
const KURL& source_url,
const KURL& base_url,
const String& source_text,
ScriptSourceLocationType,
const ScriptFetchOptions&,
scheduler::TaskAttributionInfo*);
ClassicPendingScript(ScriptElementBase*,
const TextPosition&,
const KURL& source_url_for_inline_script,
const KURL& base_url_for_inline_script,
const String& source_text_for_inline_script,
ScriptSourceLocationType,
const ScriptFetchOptions&,
bool is_external,
scheduler::TaskAttributionInfo* parent_task);
~ClassicPendingScript() override;
void Trace(Visitor*) const override;
mojom::blink::ScriptType GetScriptType() const override {
return mojom::blink::ScriptType::kClassic;
}
ClassicScript* GetSource() const override;
bool IsReady() const override;
bool IsExternal() const override { return is_external_; }
bool WasCanceled() const override;
KURL UrlForTracing() const override;
void DisposeInternal() override;
// ScriptCacheConsumerClient:
void NotifyCacheConsumeFinished() override;
// Check if this script is eligible for kLowPriorityAsyncScriptExecution
// feature (see crbug/1348467).
bool IsEligibleForLowPriorityAsyncScriptExecution() const override;
private:
// See AdvanceReadyState implementation for valid state transitions.
enum ReadyState : uint8_t {
// These states are considered "not ready".
kWaitingForResource,
kWaitingForCacheConsumer,
// These states are considered "ready".
kReady,
kErrorOccurred,
};
ClassicPendingScript() = delete;
static bool StateIsReady(ReadyState);
// Advances the current state of the script, reporting to the client if
// appropriate.
void AdvanceReadyState(ReadyState);
void CheckState() const override;
// ResourceClient
void NotifyFinished(Resource*) override;
String DebugName() const override { return "PendingScript"; }
void RecordThirdPartyRequestWithCookieIfNeeded(const ResourceResponse&) const;
const ScriptFetchOptions options_;
const KURL source_url_for_inline_script_;
// "base url" snapshot taken at #prepare-a-script timing.
// https://html.spec.whatwg.org/C/#prepare-a-script
// which will eventually be used as #concept-script-base-url.
// https://html.spec.whatwg.org/C/#concept-script-base-url
// This is a null URL for external scripts and is not used.
const KURL base_url_for_inline_script_;
// "element's child text content" snapshot taken at
// #prepare-a-script (Step 4).
// This is a null string for external scripts and is not used.
const String source_text_for_inline_script_;
Member<ClassicScript> classic_script_;
const ScriptSourceLocationType source_location_type_;
const bool is_external_;
ReadyState ready_state_;
// The request is intervened by document.write() intervention.
bool intervened_ = false;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_CLASSIC_PENDING_SCRIPT_H_