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
|
// 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_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/v8_script_runner.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/handle.h"
#include "third_party/blink/renderer/platform/loader/fetch/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 {
// 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:
v8::Local<v8::Module> V8Module() const;
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() {}
const KURL& SourceURL() const { return source_url_; }
// https://html.spec.whatwg.org/C/#run-a-module-script
// Callers must enter a `v8::HandleScope` before calling.
// See the class comments of `RethrowErrorsOption` and
// `ScriptEvaluationResult` for exception handling and return value semantics.
WARN_UNUSED_RESULT ScriptEvaluationResult RunScriptAndReturnValue(
V8ScriptRunner::RethrowErrorsOption =
V8ScriptRunner::RethrowErrorsOption::DoNotRethrow());
Modulator* SettingsObject() const { return settings_object_; }
protected:
ModuleScript(Modulator*,
v8::Local<v8::Module>,
const KURL& source_url,
const KURL& base_url,
const ScriptFetchOptions&);
private:
mojom::blink::ScriptType GetScriptType() const override {
return mojom::blink::ScriptType::kModule;
}
void RunScript(LocalDOMWindow*) override;
bool RunScriptOnWorkerOrWorklet(WorkerOrWorkletGlobalScope&) override;
std::pair<size_t, size_t> GetClassicScriptSizes() const override;
friend class ModuleTreeLinkerTestModulator;
// https://html.spec.whatwg.org/C/#settings-object
Member<Modulator> settings_object_;
// https://html.spec.whatwg.org/C/#concept-script-record
// TODO(keishi): Visitor only defines a trace method for v8::Value so this
// needs to be cast.
GC_PLUGIN_IGNORE("757708")
TraceWrapperV8Reference<v8::Module> record_;
// 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_;
KURL source_url_;
};
CORE_EXPORT std::ostream& operator<<(std::ostream&, const ModuleScript&);
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_MODULE_SCRIPT_H_
|