1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
// 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_MODULE_SCRIPT_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_MODULE_SCRIPT_H_
#include "third_party/blink/renderer/bindings/core/v8/module_record.h"
#include "third_party/blink/renderer/bindings/core/v8/script_value.h"
#include "third_party/blink/renderer/bindings/core/v8/world_safe_v8_reference.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/script/modulator.h"
#include "third_party/blink/renderer/core/script/script.h"
#include "third_party/blink/renderer/platform/bindings/name_client.h"
#include "third_party/blink/renderer/platform/bindings/parkable_string.h"
#include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/loader/fetch/url_loader/cached_metadata_handler.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
#include "third_party/blink/renderer/platform/weborigin/kurl_hash.h"
#include "third_party/blink/renderer/platform/wtf/hash_map.h"
#include "third_party/blink/renderer/platform/wtf/text/text_position.h"
#include "v8/include/v8.h"
namespace blink {
class BoxedV8Module;
static constexpr char kWasmImportInEvaluationPhaseError[] =
" cannot be imported. Wasm module imports are only supported in the "
"source phase.";
static constexpr char kNonWasmImportInSourcePhaseError[] =
" cannot be imported. Only Wasm module imports are supported in the "
"source phase.";
// ModuleScript is a model object for the "module script" spec concept.
// https://html.spec.whatwg.org/C/#module-script
class CORE_EXPORT ModuleScript : public Script {
public:
bool HasEmptyRecord() const;
// Note: ParseError-related methods should only be used from ModuleTreeLinker
// or unit tests. You probably want to check |*ErrorToRethrow*()|
// instead.
void SetParseErrorAndClearRecord(ScriptValue error);
bool HasParseError() const { return !parse_error_.IsEmpty(); }
// CreateParseError() retrieves |parse_error_| as a ScriptValue.
ScriptValue CreateParseError() const;
void SetErrorToRethrow(ScriptValue error);
bool HasErrorToRethrow() const { return !error_to_rethrow_.IsEmpty(); }
ScriptValue CreateErrorToRethrow() const;
// Resolves a module specifier with the module script's base URL.
KURL ResolveModuleSpecifier(const String& module_request,
String* failure_reason = nullptr) const;
void Trace(Visitor*) const override;
virtual void ProduceCache() {}
virtual v8::Local<v8::Module> V8Module() const;
virtual BoxedV8Module* BoxModuleRecord() const;
virtual v8::Local<v8::WasmModuleObject> WasmModule() const { NOTREACHED(); }
virtual bool IsWasmModuleRecord() const { return false; }
virtual Vector<ModuleRequest> GetModuleRecordRequests() const;
virtual ScriptValue Instantiate() const;
[[nodiscard]] ScriptEvaluationResult RunScriptOnScriptStateAndReturnValue(
ScriptState*,
ExecuteScriptPolicy =
ExecuteScriptPolicy::kDoNotExecuteScriptWhenScriptsDisabled,
V8ScriptRunner::RethrowErrorsOption =
V8ScriptRunner::RethrowErrorsOption::DoNotRethrow()) override;
Modulator* SettingsObject() const { return settings_object_.Get(); }
protected:
ModuleScript(Modulator*,
v8::Local<v8::Data>,
const KURL& source_url,
const KURL& base_url,
const ScriptFetchOptions&,
const TextPosition& start_position);
// https://html.spec.whatwg.org/C/#settings-object
Member<Modulator> settings_object_;
// https://html.spec.whatwg.org/C/#concept-script-record
// Must be either `v8::Module` or `v8::WasmModuleObject`.
TraceWrapperV8Reference<v8::Data> record_;
private:
mojom::blink::ScriptType GetScriptType() const override {
return mojom::blink::ScriptType::kModule;
}
friend class ModuleTreeLinkerTestModulator;
// https://html.spec.whatwg.org/C/#concept-script-parse-error
//
// |record_|, |parse_error_| and |error_to_rethrow_| are wrapper traced and
// kept alive via one or more of following reference graphs:
// * non-inline module script case
// DOMWindow -> Modulator/ModulatorImpl -> ModuleMap -> ModuleMap::Entry
// -> ModuleScript
// * inline module script case, before the PendingScript is created.
// DOMWindow -> Modulator/ModulatorImpl -> ModuleTreeLinkerRegistry
// -> ModuleTreeLinker -> ModuleScript
// * inline module script case, after the PendingScript is created.
// HTMLScriptElement -> ScriptLoader -> ModulePendingScript
// -> ModulePendingScriptTreeClient -> ModuleScript.
// * inline module script case, queued in HTMLParserScriptRunner,
// when HTMLScriptElement is removed before execution.
// Document -> HTMLDocumentParser -> HTMLParserScriptRunner
// -> ModulePendingScript -> ModulePendingScriptTreeClient
// -> ModuleScript.
// * inline module script case, queued in ScriptRunner.
// Document -> ScriptRunner -> ScriptLoader -> ModulePendingScript
// -> ModulePendingScriptTreeClient -> ModuleScript.
// All the classes/references on the graphs above should be
// Member<>/etc.,
//
// A parse error and an error to rethrow belong to a script, not to a
// |parse_error_| and |error_to_rethrow_| should belong to a script (i.e.
// blink::Script) according to the spec, but are put here in ModuleScript,
// because:
// - Error handling for classic and module scripts are somehow separated and
// there are no urgent motivation for merging the error handling and placing
// the errors in Script, and
// - Classic scripts are handled according to the spec before
// https://github.com/whatwg/html/pull/2991. This shouldn't cause any
// observable functional changes, and updating the classic script handling
// will require moderate code changes (e.g. to move compilation timing).
WorldSafeV8Reference<v8::Value> parse_error_;
// https://html.spec.whatwg.org/C/#concept-script-error-to-rethrow
WorldSafeV8Reference<v8::Value> error_to_rethrow_;
mutable HashMap<String, KURL> specifier_to_url_cache_;
};
CORE_EXPORT std::ostream& operator<<(std::ostream&, const ModuleScript&);
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_MODULE_SCRIPT_H_
|