blob: 5bfa557f48741947da43185a22ec5898e9abaaec [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// 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_MODULATOR_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_MODULATOR_H_
#include "base/single_thread_task_runner.h"
#include "services/network/public/mojom/referrer_policy.mojom-shared.h"
#include "third_party/blink/public/platform/web_url_request.h"
#include "third_party/blink/renderer/bindings/core/v8/sanitize_script_errors.h"
#include "third_party/blink/renderer/bindings/core/v8/script_module.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/script/module_import_meta.h"
#include "third_party/blink/renderer/platform/bindings/name_client.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/bindings/v8_per_context_data.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/loader/fetch/script_fetch_options.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
#include "third_party/blink/renderer/platform/wtf/text/text_position.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
class FetchClientSettingsObjectSnapshot;
class ModuleScript;
class ModuleScriptFetchRequest;
class ModuleScriptFetcher;
class ReferrerScriptInfo;
class ScriptModuleResolver;
class ScriptPromiseResolver;
class ScriptState;
class ScriptValue;
// A SingleModuleClient is notified when single module script node (node as in a
// module tree graph) load is complete and its corresponding entry is created in
// module map.
class CORE_EXPORT SingleModuleClient
: public GarbageCollectedFinalized<SingleModuleClient>,
public NameClient {
public:
virtual ~SingleModuleClient() = default;
virtual void Trace(blink::Visitor* visitor) {}
const char* NameInHeapSnapshot() const override {
return "SingleModuleClient";
}
virtual void NotifyModuleLoadFinished(ModuleScript*) = 0;
};
// A ModuleTreeClient is notified when a module script and its whole descendent
// tree load is complete.
class CORE_EXPORT ModuleTreeClient
: public GarbageCollectedFinalized<ModuleTreeClient>,
public NameClient {
public:
virtual ~ModuleTreeClient() = default;
virtual void Trace(blink::Visitor* visitor) {}
const char* NameInHeapSnapshot() const override { return "ModuleTreeClient"; }
virtual void NotifyModuleTreeLoadFinished(ModuleScript*) = 0;
};
// spec: "top-level module fetch flag"
// https://html.spec.whatwg.org/multipage/webappapis.html#fetching-scripts-is-top-level
enum class ModuleGraphLevel { kTopLevelModuleFetch, kDependentModuleFetch };
// spec: "custom peform the fetch hook"
// https://html.spec.whatwg.org/multipage/webappapis.html#fetching-scripts-perform-fetch
enum class ModuleScriptCustomFetchType {
// Fetch module scripts without invoking custom fetch steps.
kNone,
// Perform custom fetch steps for worker's constructor defined in the HTML
// spec:
// https://html.spec.whatwg.org/multipage/workers.html#worker-processing-model
kWorkerConstructor,
// Perform custom fetch steps for Worklet's addModule() function defined in
// the Worklet spec:
// https://drafts.css-houdini.org/worklets/#fetch-a-worklet-script
kWorkletAddModule,
// Fetch a Service Worker's installed module script from the Service Worker's
// script storage.
kInstalledServiceWorker
};
// A Modulator is an interface for "environment settings object" concept for
// module scripts.
// https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object
//
// A Modulator also serves as an entry point for various module spec algorithms.
class CORE_EXPORT Modulator : public GarbageCollectedFinalized<Modulator>,
public V8PerContextData::Data,
public NameClient {
USING_GARBAGE_COLLECTED_MIXIN(Modulator);
public:
static Modulator* From(ScriptState*);
virtual ~Modulator();
static void SetModulator(ScriptState*, Modulator*);
static void ClearModulator(ScriptState*);
void Trace(blink::Visitor* visitor) override {}
const char* NameInHeapSnapshot() const override { return "Modulator"; }
virtual ScriptModuleResolver* GetScriptModuleResolver() = 0;
virtual base::SingleThreadTaskRunner* TaskRunner() = 0;
virtual ScriptState* GetScriptState() = 0;
// https://html.spec.whatwg.org/multipage/webappapis.html#concept-bc-noscript
// "scripting is disabled for settings's responsible browsing context"
virtual bool IsScriptingDisabled() const = 0;
// https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-module-script-tree
// https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-module-worker-script-tree
// Note that |this| is the "module map settings object" used in the "fetch a
// module worker script graph" algorithm.
virtual void FetchTree(
const KURL&,
FetchClientSettingsObjectSnapshot* fetch_client_settings_object,
mojom::RequestContextType destination,
const ScriptFetchOptions&,
ModuleScriptCustomFetchType,
ModuleTreeClient*) = 0;
// Asynchronously retrieve a module script from the module map, or fetch it
// and put it in the map if it's not there already.
// https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-single-module-script
// Note that |this| is the "module map settings object".
virtual void FetchSingle(
const ModuleScriptFetchRequest&,
FetchClientSettingsObjectSnapshot* fetch_client_settings_object,
ModuleGraphLevel,
ModuleScriptCustomFetchType,
SingleModuleClient*) = 0;
virtual void FetchDescendantsForInlineScript(
ModuleScript*,
FetchClientSettingsObjectSnapshot* fetch_client_settings_object,
mojom::RequestContextType destination,
ModuleTreeClient*) = 0;
// Synchronously retrieves a single module script from existing module map
// entry.
// Note: returns nullptr if the module map entry doesn't exist, or
// is still "fetching".
virtual ModuleScript* GetFetchedModuleScript(const KURL&) = 0;
// https://html.spec.whatwg.org/multipage/webappapis.html#resolve-a-module-specifier
virtual KURL ResolveModuleSpecifier(const String& module_request,
const KURL& base_url,
String* failure_reason = nullptr) = 0;
// https://tc39.github.io/proposal-dynamic-import/#sec-hostimportmoduledynamically
virtual void ResolveDynamically(const String& specifier,
const KURL&,
const ReferrerScriptInfo&,
ScriptPromiseResolver*) = 0;
// https://html.spec.whatwg.org/multipage/webappapis.html#hostgetimportmetaproperties
virtual ModuleImportMeta HostGetImportMetaProperties(ScriptModule) const = 0;
virtual bool HasValidContext() = 0;
virtual ScriptValue InstantiateModule(ScriptModule) = 0;
struct ModuleRequest {
String specifier;
TextPosition position;
ModuleRequest(const String& specifier, const TextPosition& position)
: specifier(specifier), position(position) {}
};
virtual Vector<ModuleRequest> ModuleRequestsFromScriptModule(
ScriptModule) = 0;
enum class CaptureEvalErrorFlag : bool { kReport, kCapture };
// ExecuteModule implements #run-a-module-script HTML spec algorithm.
// https://html.spec.whatwg.org/multipage/webappapis.html#run-a-module-script
// CaptureEvalErrorFlag is used to implement "rethrow errors" parameter in
// run-a-module-script.
// - When "rethrow errors" is to be set, use kCapture for EvaluateModule().
// Then EvaluateModule() returns an exception if any (instead of throwing it),
// and the caller should rethrow the returned exception. - When "rethrow
// errors" is not to be set, use kReport. EvaluateModule() "report the error"
// inside it (if any), and always returns null ScriptValue().
virtual ScriptValue ExecuteModule(const ModuleScript*,
CaptureEvalErrorFlag) = 0;
virtual ModuleScriptFetcher* CreateModuleScriptFetcher(
ModuleScriptCustomFetchType) = 0;
};
} // namespace blink
#endif