Commit a3f21077 authored by Dave Tapuska's avatar Dave Tapuska Committed by Commit Bot

Pausable Object Cleanup - Workers

Remove the paused_calls vector on WorkerGlobalScope because all
the calls executed occur on pausable task queues after
http://crrev.com/1eb2d22.

BUG=907125

Change-Id: I42ad827eb1131f643158f9c6e565d69886896ccc
Reviewed-on: https://chromium-review.googlesource.com/c/1385015
Commit-Queue: Matt Falkenhagen <falken@chromium.org>
Reviewed-by: default avatarMatt Falkenhagen <falken@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarHiroki Nakagawa <nhiroki@chromium.org>
Reviewed-by: default avatarAlexander Timin <altimin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#618379}
parent eaf263d7
...@@ -189,7 +189,7 @@ void WebSharedWorkerImpl::ConnectTaskOnWorkerThread( ...@@ -189,7 +189,7 @@ void WebSharedWorkerImpl::ConnectTaskOnWorkerThread(
// event. // event.
DCHECK(worker_thread_->IsCurrentThread()); DCHECK(worker_thread_->IsCurrentThread());
auto* scope = To<SharedWorkerGlobalScope>(worker_thread_->GlobalScope()); auto* scope = To<SharedWorkerGlobalScope>(worker_thread_->GlobalScope());
scope->ConnectPausable(std::move(channel)); scope->Connect(std::move(channel));
} }
void WebSharedWorkerImpl::StartWorkerContext( void WebSharedWorkerImpl::StartWorkerContext(
......
...@@ -77,7 +77,7 @@ void DedicatedWorkerObjectProxy::ProcessMessageFromWorkerObject( ...@@ -77,7 +77,7 @@ void DedicatedWorkerObjectProxy::ProcessMessageFromWorkerObject(
BlinkTransferableMessage message, BlinkTransferableMessage message,
WorkerThread* worker_thread) { WorkerThread* worker_thread) {
To<WorkerGlobalScope>(worker_thread->GlobalScope()) To<WorkerGlobalScope>(worker_thread->GlobalScope())
->ReceiveMessagePausable(std::move(message)); ->ReceiveMessage(std::move(message));
} }
void DedicatedWorkerObjectProxy::ProcessUnhandledException( void DedicatedWorkerObjectProxy::ProcessUnhandledException(
......
...@@ -72,13 +72,8 @@ void SharedWorkerGlobalScope::ImportModuleScript( ...@@ -72,13 +72,8 @@ void SharedWorkerGlobalScope::ImportModuleScript(
NOTREACHED(); NOTREACHED();
} }
void SharedWorkerGlobalScope::ConnectPausable(MessagePortChannel channel) { void SharedWorkerGlobalScope::Connect(MessagePortChannel channel) {
if (IsContextPaused()) { DCHECK(!IsContextPaused());
AddPausedCall(WTF::Bind(&SharedWorkerGlobalScope::ConnectPausable,
WrapWeakPersistent(this), std::move(channel)));
return;
}
MessagePort* port = MessagePort::Create(*this); MessagePort* port = MessagePort::Create(*this);
port->Entangle(std::move(channel)); port->Entangle(std::move(channel));
MessageEvent* event = MessageEvent* event =
......
...@@ -67,7 +67,7 @@ class CORE_EXPORT SharedWorkerGlobalScope final : public WorkerGlobalScope { ...@@ -67,7 +67,7 @@ class CORE_EXPORT SharedWorkerGlobalScope final : public WorkerGlobalScope {
DEFINE_ATTRIBUTE_EVENT_LISTENER(connect, kConnect); DEFINE_ATTRIBUTE_EVENT_LISTENER(connect, kConnect);
String name() const { return name_; } String name() const { return name_; }
void ConnectPausable(MessagePortChannel channel); void Connect(MessagePortChannel channel);
void Trace(blink::Visitor*) override; void Trace(blink::Visitor*) override;
......
...@@ -106,7 +106,6 @@ KURL WorkerGlobalScope::CompleteURL(const String& url) const { ...@@ -106,7 +106,6 @@ KURL WorkerGlobalScope::CompleteURL(const String& url) const {
void WorkerGlobalScope::Dispose() { void WorkerGlobalScope::Dispose() {
DCHECK(IsContextThread()); DCHECK(IsContextThread());
closing_ = true; closing_ = true;
paused_calls_.clear();
WorkerOrWorkletGlobalScope::Dispose(); WorkerOrWorkletGlobalScope::Dispose();
} }
...@@ -343,56 +342,28 @@ ExecutionContext* WorkerGlobalScope::GetExecutionContext() const { ...@@ -343,56 +342,28 @@ ExecutionContext* WorkerGlobalScope::GetExecutionContext() const {
return const_cast<WorkerGlobalScope*>(this); return const_cast<WorkerGlobalScope*>(this);
} }
void WorkerGlobalScope::TasksWereUnpaused() { void WorkerGlobalScope::EvaluateClassicScript(
WorkerOrWorkletGlobalScope::TasksWereUnpaused();
// We cannot run the paused tasks right away, as there might be some other
// code that still needs to be run synchronously.
GetTaskRunner(TaskType::kInternalWorker)
->PostTask(FROM_HERE, WTF::Bind(&WorkerGlobalScope::MaybeRunPausedTasks,
WrapWeakPersistent(this)));
}
void WorkerGlobalScope::MaybeRunPausedTasks() {
if (IsContextPaused())
return;
Vector<base::OnceClosure> calls;
paused_calls_.swap(calls);
for (auto& call : calls)
std::move(call).Run();
}
void WorkerGlobalScope::EvaluateClassicScriptPausable(
const KURL& script_url, const KURL& script_url,
String source_code, String source_code,
std::unique_ptr<Vector<char>> cached_meta_data, std::unique_ptr<Vector<char>> cached_meta_data,
const v8_inspector::V8StackTraceId& stack_id) { const v8_inspector::V8StackTraceId& stack_id) {
if (IsContextPaused()) { DCHECK(!IsContextPaused());
AddPausedCall(WTF::Bind(&WorkerGlobalScope::EvaluateClassicScriptPausable,
WrapWeakPersistent(this), script_url, source_code,
WTF::Passed(std::move(cached_meta_data)),
stack_id));
return;
}
ThreadDebugger* debugger = ThreadDebugger::From(GetThread()->GetIsolate()); ThreadDebugger* debugger = ThreadDebugger::From(GetThread()->GetIsolate());
if (debugger) if (debugger)
debugger->ExternalAsyncTaskStarted(stack_id); debugger->ExternalAsyncTaskStarted(stack_id);
EvaluateClassicScript(script_url, source_code, std::move(cached_meta_data)); EvaluateClassicScriptInternal(script_url, source_code,
std::move(cached_meta_data));
if (debugger) if (debugger)
debugger->ExternalAsyncTaskFinished(stack_id); debugger->ExternalAsyncTaskFinished(stack_id);
} }
// https://html.spec.whatwg.org/multipage/workers.html#worker-processing-model // https://html.spec.whatwg.org/multipage/workers.html#worker-processing-model
void WorkerGlobalScope::ImportClassicScriptPausable( void WorkerGlobalScope::ImportClassicScript(
const KURL& script_url, const KURL& script_url,
FetchClientSettingsObjectSnapshot* outside_settings_object, FetchClientSettingsObjectSnapshot* outside_settings_object,
const v8_inspector::V8StackTraceId& stack_id) { const v8_inspector::V8StackTraceId& stack_id) {
DCHECK(RuntimeEnabledFeatures::OffMainThreadWorkerScriptFetchEnabled()); DCHECK(RuntimeEnabledFeatures::OffMainThreadWorkerScriptFetchEnabled());
if (IsContextPaused()) { DCHECK(!IsContextPaused());
AddPausedCall(WTF::Bind(&WorkerGlobalScope::ImportClassicScriptPausable,
WrapWeakPersistent(this), script_url,
WrapPersistent(outside_settings_object), stack_id));
return;
}
// Step 12. "Fetch a classic worker script given url, outside settings, // Step 12. "Fetch a classic worker script given url, outside settings,
// destination, and inside settings." // destination, and inside settings."
...@@ -466,33 +437,13 @@ void WorkerGlobalScope::DidImportClassicScript( ...@@ -466,33 +437,13 @@ void WorkerGlobalScope::DidImportClassicScript(
// Step 13.7. "Asynchronously complete the perform the fetch steps with // Step 13.7. "Asynchronously complete the perform the fetch steps with
// response." // response."
EvaluateClassicScript(
EvaluateClassicScriptPausable(
classic_script_loader->ResponseURL(), classic_script_loader->SourceText(), classic_script_loader->ResponseURL(), classic_script_loader->SourceText(),
classic_script_loader->ReleaseCachedMetadata(), stack_id); classic_script_loader->ReleaseCachedMetadata(), stack_id);
} }
void WorkerGlobalScope::ImportModuleScriptPausable( void WorkerGlobalScope::ReceiveMessage(BlinkTransferableMessage message) {
const KURL& module_url_record, DCHECK(!IsContextPaused());
FetchClientSettingsObjectSnapshot* outside_settings_object,
network::mojom::FetchCredentialsMode mode) {
if (IsContextPaused()) {
AddPausedCall(WTF::Bind(&WorkerGlobalScope::ImportModuleScriptPausable,
WrapWeakPersistent(this), module_url_record,
WrapPersistent(outside_settings_object), mode));
return;
}
ImportModuleScript(module_url_record, outside_settings_object, mode);
}
void WorkerGlobalScope::ReceiveMessagePausable(
BlinkTransferableMessage message) {
if (IsContextPaused()) {
AddPausedCall(WTF::Bind(&WorkerGlobalScope::ReceiveMessagePausable,
WrapWeakPersistent(this), std::move(message)));
return;
}
MessagePortArray* ports = MessagePortArray* ports =
MessagePort::EntanglePorts(*this, std::move(message.ports)); MessagePort::EntanglePorts(*this, std::move(message.ports));
ThreadDebugger* debugger = ThreadDebugger::From(GetThread()->GetIsolate()); ThreadDebugger* debugger = ThreadDebugger::From(GetThread()->GetIsolate());
...@@ -510,7 +461,7 @@ void WorkerGlobalScope::ReceiveMessagePausable( ...@@ -510,7 +461,7 @@ void WorkerGlobalScope::ReceiveMessagePausable(
debugger->ExternalAsyncTaskFinished(message.sender_stack_trace_id); debugger->ExternalAsyncTaskFinished(message.sender_stack_trace_id);
} }
void WorkerGlobalScope::EvaluateClassicScript( void WorkerGlobalScope::EvaluateClassicScriptInternal(
const KURL& script_url, const KURL& script_url,
String source_code, String source_code,
std::unique_ptr<Vector<char>> cached_meta_data) { std::unique_ptr<Vector<char>> cached_meta_data) {
...@@ -531,10 +482,6 @@ void WorkerGlobalScope::EvaluateClassicScript( ...@@ -531,10 +482,6 @@ void WorkerGlobalScope::EvaluateClassicScript(
ReportingProxy().DidEvaluateClassicScript(success); ReportingProxy().DidEvaluateClassicScript(success);
} }
void WorkerGlobalScope::AddPausedCall(base::OnceClosure closure) {
paused_calls_.push_back(std::move(closure));
}
WorkerGlobalScope::WorkerGlobalScope( WorkerGlobalScope::WorkerGlobalScope(
std::unique_ptr<GlobalScopeCreationParams> creation_params, std::unique_ptr<GlobalScopeCreationParams> creation_params,
WorkerThread* thread, WorkerThread* thread,
......
...@@ -141,23 +141,24 @@ class CORE_EXPORT WorkerGlobalScope ...@@ -141,23 +141,24 @@ class CORE_EXPORT WorkerGlobalScope
ExecutionContext* GetExecutionContext() const final; ExecutionContext* GetExecutionContext() const final;
bool IsWindowOrWorkerGlobalScope() const final { return true; } bool IsWindowOrWorkerGlobalScope() const final { return true; }
// The following methods implement PausbaleObject semantic // These methods should be called in the scope of a pausable
// so that WorkerGlobalScope can be paused. // task runner. ie. They should not be called when the context
void EvaluateClassicScriptPausable( // is paused.
const KURL& script_url, void EvaluateClassicScript(const KURL& script_url,
String source_code, String source_code,
std::unique_ptr<Vector<char>> cached_meta_data, std::unique_ptr<Vector<char>> cached_meta_data,
const v8_inspector::V8StackTraceId& stack_id); const v8_inspector::V8StackTraceId& stack_id);
void ImportClassicScriptPausable( void ImportClassicScript(
const KURL& script_url, const KURL& script_url,
FetchClientSettingsObjectSnapshot* outside_settings_object, FetchClientSettingsObjectSnapshot* outside_settings_object,
const v8_inspector::V8StackTraceId& stack_id); const v8_inspector::V8StackTraceId& stack_id);
void ImportModuleScriptPausable( // Imports the top-level module script for |module_url_record|.
virtual void ImportModuleScript(
const KURL& module_url_record, const KURL& module_url_record,
FetchClientSettingsObjectSnapshot* outside_settings_object, FetchClientSettingsObjectSnapshot* outside_settings_object,
network::mojom::FetchCredentialsMode); network::mojom::FetchCredentialsMode) = 0;
void ReceiveMessagePausable(BlinkTransferableMessage);
void ReceiveMessage(BlinkTransferableMessage);
base::TimeTicks TimeOrigin() const { return time_origin_; } base::TimeTicks TimeOrigin() const { return time_origin_; }
WorkerSettings* GetWorkerSettings() const { return worker_settings_.get(); } WorkerSettings* GetWorkerSettings() const { return worker_settings_.get(); }
...@@ -191,21 +192,11 @@ class CORE_EXPORT WorkerGlobalScope ...@@ -191,21 +192,11 @@ class CORE_EXPORT WorkerGlobalScope
void RemoveURLFromMemoryCache(const KURL&) final; void RemoveURLFromMemoryCache(const KURL&) final;
// Evaluates the given top-level classic script. // Evaluates the given top-level classic script.
virtual void EvaluateClassicScript( virtual void EvaluateClassicScriptInternal(
const KURL& script_url, const KURL& script_url,
String source_code, String source_code,
std::unique_ptr<Vector<char>> cached_meta_data); std::unique_ptr<Vector<char>> cached_meta_data);
// Imports the top-level module script for |module_url_record|.
virtual void ImportModuleScript(
const KURL& module_url_record,
FetchClientSettingsObjectSnapshot* outside_settings_object,
network::mojom::FetchCredentialsMode) = 0;
void AddPausedCall(base::OnceClosure closure);
void MaybeRunPausedTasks();
mojom::ScriptType GetScriptType() const { return script_type_; } mojom::ScriptType GetScriptType() const { return script_type_; }
private: private:
...@@ -252,7 +243,6 @@ class CORE_EXPORT WorkerGlobalScope ...@@ -252,7 +243,6 @@ class CORE_EXPORT WorkerGlobalScope
// ExecutionContext // ExecutionContext
EventTarget* ErrorEventTarget() final { return this; } EventTarget* ErrorEventTarget() final { return this; }
void TasksWereUnpaused() override;
const KURL url_; const KURL url_;
const mojom::ScriptType script_type_; const mojom::ScriptType script_type_;
...@@ -284,8 +274,6 @@ class CORE_EXPORT WorkerGlobalScope ...@@ -284,8 +274,6 @@ class CORE_EXPORT WorkerGlobalScope
const base::UnguessableToken agent_cluster_id_; const base::UnguessableToken agent_cluster_id_;
HttpsState https_state_; HttpsState https_state_;
Vector<base::OnceClosure> paused_calls_;
}; };
template <> template <>
......
...@@ -500,8 +500,8 @@ void WorkerThread::EvaluateClassicScriptOnWorkerThread( ...@@ -500,8 +500,8 @@ void WorkerThread::EvaluateClassicScriptOnWorkerThread(
std::unique_ptr<Vector<char>> cached_meta_data, std::unique_ptr<Vector<char>> cached_meta_data,
const v8_inspector::V8StackTraceId& stack_id) { const v8_inspector::V8StackTraceId& stack_id) {
To<WorkerGlobalScope>(GlobalScope()) To<WorkerGlobalScope>(GlobalScope())
->EvaluateClassicScriptPausable(script_url, std::move(source_code), ->EvaluateClassicScript(script_url, std::move(source_code),
std::move(cached_meta_data), stack_id); std::move(cached_meta_data), stack_id);
} }
void WorkerThread::ImportClassicScriptOnWorkerThread( void WorkerThread::ImportClassicScriptOnWorkerThread(
...@@ -510,7 +510,7 @@ void WorkerThread::ImportClassicScriptOnWorkerThread( ...@@ -510,7 +510,7 @@ void WorkerThread::ImportClassicScriptOnWorkerThread(
outside_settings_object, outside_settings_object,
const v8_inspector::V8StackTraceId& stack_id) { const v8_inspector::V8StackTraceId& stack_id) {
To<WorkerGlobalScope>(GlobalScope()) To<WorkerGlobalScope>(GlobalScope())
->ImportClassicScriptPausable( ->ImportClassicScript(
script_url, script_url,
MakeGarbageCollected<FetchClientSettingsObjectSnapshot>( MakeGarbageCollected<FetchClientSettingsObjectSnapshot>(
std::move(outside_settings_object)), std::move(outside_settings_object)),
...@@ -526,7 +526,7 @@ void WorkerThread::ImportModuleScriptOnWorkerThread( ...@@ -526,7 +526,7 @@ void WorkerThread::ImportModuleScriptOnWorkerThread(
// TODO(nhiroki): Consider excluding this code path from WorkerThread like // TODO(nhiroki): Consider excluding this code path from WorkerThread like
// Worklets. // Worklets.
To<WorkerGlobalScope>(GlobalScope()) To<WorkerGlobalScope>(GlobalScope())
->ImportModuleScriptPausable( ->ImportModuleScript(
script_url, script_url,
MakeGarbageCollected<FetchClientSettingsObjectSnapshot>( MakeGarbageCollected<FetchClientSettingsObjectSnapshot>(
std::move(outside_settings_object)), std::move(outside_settings_object)),
......
...@@ -135,62 +135,6 @@ bool ServiceWorkerGlobalScope::ShouldInstallV8Extensions() const { ...@@ -135,62 +135,6 @@ bool ServiceWorkerGlobalScope::ShouldInstallV8Extensions() const {
return Platform::Current()->AllowScriptExtensionForServiceWorker(Url()); return Platform::Current()->AllowScriptExtensionForServiceWorker(Url());
} }
void ServiceWorkerGlobalScope::EvaluateClassicScript(
const KURL& script_url,
String source_code,
std::unique_ptr<Vector<char>> cached_meta_data) {
DCHECK(IsContextThread());
if (!evaluate_script_ready_) {
evaluate_script_ =
WTF::Bind(&ServiceWorkerGlobalScope::EvaluateClassicScript,
WrapWeakPersistent(this), script_url, std::move(source_code),
std::move(cached_meta_data));
return;
}
// Receive the main script via script streaming if needed.
InstalledScriptsManager* installed_scripts_manager =
GetThread()->GetInstalledScriptsManager();
if (installed_scripts_manager &&
installed_scripts_manager->IsScriptInstalled(script_url)) {
// GetScriptData blocks until the script is received from the browser.
std::unique_ptr<InstalledScriptsManager::ScriptData> script_data =
installed_scripts_manager->GetScriptData(script_url);
if (!script_data) {
ReportingProxy().DidFailToLoadInstalledClassicScript();
// This will eventually initiate worker thread termination. See
// ServiceWorkerGlobalScopeProxy::DidCloseWorkerGlobalScope() for details.
close();
return;
}
DCHECK(source_code.IsEmpty());
DCHECK(!cached_meta_data);
source_code = script_data->TakeSourceText();
cached_meta_data = script_data->TakeMetaData();
base::Optional<ContentSecurityPolicyResponseHeaders>
content_security_policy_raw_headers =
script_data->GetContentSecurityPolicyResponseHeaders();
ApplyContentSecurityPolicyFromHeaders(
content_security_policy_raw_headers.value());
String referrer_policy = script_data->GetReferrerPolicy();
if (!referrer_policy.IsNull())
ParseAndSetReferrerPolicy(referrer_policy);
std::unique_ptr<Vector<String>> origin_trial_tokens =
script_data->CreateOriginTrialTokens();
OriginTrialContext::AddTokens(this, origin_trial_tokens.get());
ReportingProxy().DidLoadInstalledScript();
}
WorkerGlobalScope::EvaluateClassicScript(script_url, source_code,
std::move(cached_meta_data));
}
void ServiceWorkerGlobalScope::ImportModuleScript( void ServiceWorkerGlobalScope::ImportModuleScript(
const KURL& module_url_record, const KURL& module_url_record,
FetchClientSettingsObjectSnapshot* outside_settings_object, FetchClientSettingsObjectSnapshot* outside_settings_object,
...@@ -351,6 +295,62 @@ bool ServiceWorkerGlobalScope::AddEventListenerInternal( ...@@ -351,6 +295,62 @@ bool ServiceWorkerGlobalScope::AddEventListenerInternal(
options); options);
} }
void ServiceWorkerGlobalScope::EvaluateClassicScriptInternal(
const KURL& script_url,
String source_code,
std::unique_ptr<Vector<char>> cached_meta_data) {
DCHECK(IsContextThread());
if (!evaluate_script_ready_) {
evaluate_script_ =
WTF::Bind(&ServiceWorkerGlobalScope::EvaluateClassicScriptInternal,
WrapWeakPersistent(this), script_url, std::move(source_code),
std::move(cached_meta_data));
return;
}
// Receive the main script via script streaming if needed.
InstalledScriptsManager* installed_scripts_manager =
GetThread()->GetInstalledScriptsManager();
if (installed_scripts_manager &&
installed_scripts_manager->IsScriptInstalled(script_url)) {
// GetScriptData blocks until the script is received from the browser.
std::unique_ptr<InstalledScriptsManager::ScriptData> script_data =
installed_scripts_manager->GetScriptData(script_url);
if (!script_data) {
ReportingProxy().DidFailToLoadInstalledClassicScript();
// This will eventually initiate worker thread termination. See
// ServiceWorkerGlobalScopeProxy::DidCloseWorkerGlobalScope() for details.
close();
return;
}
DCHECK(source_code.IsEmpty());
DCHECK(!cached_meta_data);
source_code = script_data->TakeSourceText();
cached_meta_data = script_data->TakeMetaData();
base::Optional<ContentSecurityPolicyResponseHeaders>
content_security_policy_raw_headers =
script_data->GetContentSecurityPolicyResponseHeaders();
ApplyContentSecurityPolicyFromHeaders(
content_security_policy_raw_headers.value());
String referrer_policy = script_data->GetReferrerPolicy();
if (!referrer_policy.IsNull())
ParseAndSetReferrerPolicy(referrer_policy);
std::unique_ptr<Vector<String>> origin_trial_tokens =
script_data->CreateOriginTrialTokens();
OriginTrialContext::AddTokens(this, origin_trial_tokens.get());
ReportingProxy().DidLoadInstalledScript();
}
WorkerGlobalScope::EvaluateClassicScriptInternal(script_url, source_code,
std::move(cached_meta_data));
}
const AtomicString& ServiceWorkerGlobalScope::InterfaceName() const { const AtomicString& ServiceWorkerGlobalScope::InterfaceName() const {
return event_target_names::kServiceWorkerGlobalScope; return event_target_names::kServiceWorkerGlobalScope;
} }
......
...@@ -80,10 +80,6 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope { ...@@ -80,10 +80,6 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope {
bool ShouldInstallV8Extensions() const final; bool ShouldInstallV8Extensions() const final;
// Implements WorkerGlobalScope. // Implements WorkerGlobalScope.
void EvaluateClassicScript(
const KURL& script_url,
String source_code,
std::unique_ptr<Vector<char>> cached_meta_data) override;
void ImportModuleScript( void ImportModuleScript(
const KURL& module_url_record, const KURL& module_url_record,
FetchClientSettingsObjectSnapshot* outside_settings_object, FetchClientSettingsObjectSnapshot* outside_settings_object,
...@@ -158,6 +154,12 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope { ...@@ -158,6 +154,12 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope {
EventListener*, EventListener*,
const AddEventListenerOptionsResolved*) override; const AddEventListenerOptionsResolved*) override;
// WorkerGlobalScope
void EvaluateClassicScriptInternal(
const KURL& script_url,
String source_code,
std::unique_ptr<Vector<char>> cached_meta_data) override;
private: private:
void importScripts(const HeapVector<StringOrTrustedScriptURL>& urls, void importScripts(const HeapVector<StringOrTrustedScriptURL>& urls,
ExceptionState&) override; ExceptionState&) override;
......
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