mirror of https://github.com/electron/electron
264 lines
14 KiB
Diff
264 lines
14 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: deepak1556 <hop2deep@gmail.com>
|
|
Date: Mon, 5 Sep 2022 19:07:54 +0900
|
|
Subject: fix: return v8::Value from LocalFrame::RequestExecuteScript
|
|
|
|
Allows api::WebFrame::ExecuteJavaScript(InIsolateWorld) to work with
|
|
v8::Value instead of base::Value.
|
|
Refs https://bugs.chromium.org/p/chromium/issues/detail?id=1323953
|
|
|
|
diff --git a/extensions/renderer/script_injection.cc b/extensions/renderer/script_injection.cc
|
|
index a1c787d8404f3d91dc8b3305690efa374f24e69b..5505852a3556ecb01d1ceaf460dc17e28cfee46b 100644
|
|
--- a/extensions/renderer/script_injection.cc
|
|
+++ b/extensions/renderer/script_injection.cc
|
|
@@ -309,6 +309,7 @@ void ScriptInjection::InjectJs(std::set<std::string>* executing_scripts,
|
|
blink::mojom::LoadEventBlockingOption::kBlock,
|
|
base::BindOnce(&ScriptInjection::OnJsInjectionCompleted,
|
|
weak_ptr_factory_.GetWeakPtr()),
|
|
+ base::NullCallback(),
|
|
blink::BackForwardCacheAware::kPossiblyDisallow,
|
|
injector_->ExpectsResults(), injector_->ShouldWaitForPromise());
|
|
}
|
|
diff --git a/third_party/blink/public/web/web_local_frame.h b/third_party/blink/public/web/web_local_frame.h
|
|
index c2760ba7a404a4f3f1053712b728e1b222b83198..ee1175595a24f202b873a82f8744d3da8dd38779 100644
|
|
--- a/third_party/blink/public/web/web_local_frame.h
|
|
+++ b/third_party/blink/public/web/web_local_frame.h
|
|
@@ -438,6 +438,7 @@ class BLINK_EXPORT WebLocalFrame : public WebFrame {
|
|
mojom::EvaluationTiming,
|
|
mojom::LoadEventBlockingOption,
|
|
WebScriptExecutionCallback,
|
|
+ WebScriptExecutionCallbackUnmodified,
|
|
BackForwardCacheAware,
|
|
mojom::WantResultOption,
|
|
mojom::PromiseResultOption) = 0;
|
|
diff --git a/third_party/blink/public/web/web_script_execution_callback.h b/third_party/blink/public/web/web_script_execution_callback.h
|
|
index cba373664bec3a32abad6fe0396bd67b53b7e67f..7a985067b1371604644d48159f2f5aa7a7abb88d 100644
|
|
--- a/third_party/blink/public/web/web_script_execution_callback.h
|
|
+++ b/third_party/blink/public/web/web_script_execution_callback.h
|
|
@@ -14,8 +14,17 @@ class TimeTicks;
|
|
class Value;
|
|
}
|
|
|
|
+namespace v8 {
|
|
+class Value;
|
|
+template <class T>
|
|
+class Local;
|
|
+}
|
|
+
|
|
namespace blink {
|
|
|
|
+template <typename T>
|
|
+class WebVector;
|
|
+
|
|
// Non-nullopt `base::Value` is passed to the callback if
|
|
// -`WantResultOption::kWantResult` or
|
|
// `WantResultOption::kWantResultDateAndRegexpAllowed` is used,
|
|
@@ -43,6 +52,9 @@ namespace blink {
|
|
using WebScriptExecutionCallback =
|
|
base::OnceCallback<void(std::optional<base::Value>, base::TimeTicks)>;
|
|
|
|
+using WebScriptExecutionCallbackUnmodified =
|
|
+ base::OnceCallback<void(const WebVector<v8::Local<v8::Value>>&)>;
|
|
+
|
|
} // namespace blink
|
|
|
|
#endif // THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_SCRIPT_EXECUTION_CALLBACK_H_
|
|
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
|
|
index 8d818e8f77d08a22a114782296ea45c622e46fd9..46db31f1b07f6fa70859fb4565d8e455e7dbc076 100644
|
|
--- a/third_party/blink/renderer/core/frame/local_frame.cc
|
|
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
|
|
@@ -3008,6 +3008,7 @@ void LocalFrame::RequestExecuteScript(
|
|
mojom::blink::EvaluationTiming evaluation_timing,
|
|
mojom::blink::LoadEventBlockingOption blocking_option,
|
|
WebScriptExecutionCallback callback,
|
|
+ WebScriptExecutionCallbackUnmodified raw_callback,
|
|
BackForwardCacheAware back_forward_cache_aware,
|
|
mojom::blink::WantResultOption want_result_option,
|
|
mojom::blink::PromiseResultOption promise_behavior) {
|
|
@@ -3041,7 +3042,7 @@ void LocalFrame::RequestExecuteScript(
|
|
PausableScriptExecutor::CreateAndRun(
|
|
script_state, std::move(script_sources), execute_script_policy,
|
|
user_gesture, evaluation_timing, blocking_option, want_result_option,
|
|
- promise_behavior, std::move(callback));
|
|
+ promise_behavior, std::move(callback), std::move(raw_callback));
|
|
}
|
|
|
|
void LocalFrame::SetEvictCachedSessionStorageOnFreezeOrUnload() {
|
|
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h
|
|
index 8b7da41000213b17aaaf4945854cdb1912ff7965..849243513d417aff4fada54235e06da153169df4 100644
|
|
--- a/third_party/blink/renderer/core/frame/local_frame.h
|
|
+++ b/third_party/blink/renderer/core/frame/local_frame.h
|
|
@@ -825,6 +825,7 @@ class CORE_EXPORT LocalFrame final
|
|
mojom::blink::EvaluationTiming,
|
|
mojom::blink::LoadEventBlockingOption,
|
|
WebScriptExecutionCallback,
|
|
+ WebScriptExecutionCallbackUnmodified,
|
|
BackForwardCacheAware back_forward_cache_aware,
|
|
mojom::blink::WantResultOption,
|
|
mojom::blink::PromiseResultOption);
|
|
diff --git a/third_party/blink/renderer/core/frame/local_frame_mojo_handler.cc b/third_party/blink/renderer/core/frame/local_frame_mojo_handler.cc
|
|
index f71aaa743632d3f88b004b5665c3ebdd862c3daf..597f6dc8427d9e50c809a37e6050bc774d5b25a9 100644
|
|
--- a/third_party/blink/renderer/core/frame/local_frame_mojo_handler.cc
|
|
+++ b/third_party/blink/renderer/core/frame/local_frame_mojo_handler.cc
|
|
@@ -955,6 +955,7 @@ void LocalFrameMojoHandler::JavaScriptExecuteRequestInIsolatedWorld(
|
|
std::move(callback).Run(value ? std::move(*value) : base::Value());
|
|
},
|
|
std::move(callback)),
|
|
+ base::NullCallback(),
|
|
BackForwardCacheAware::kAllow,
|
|
wants_result
|
|
? mojom::blink::WantResultOption::kWantResultDateAndRegExpAllowed
|
|
diff --git a/third_party/blink/renderer/core/frame/pausable_script_executor.cc b/third_party/blink/renderer/core/frame/pausable_script_executor.cc
|
|
index c456bca706df4f22b7b1afdaf47de7afe1a3a1e3..7bdc959503911b3c394939e7a20c96be5a13039b 100644
|
|
--- a/third_party/blink/renderer/core/frame/pausable_script_executor.cc
|
|
+++ b/third_party/blink/renderer/core/frame/pausable_script_executor.cc
|
|
@@ -249,7 +249,7 @@ void PausableScriptExecutor::CreateAndRun(
|
|
script_state, mojom::blink::UserActivationOption::kDoNotActivate,
|
|
mojom::blink::LoadEventBlockingOption::kDoNotBlock,
|
|
want_result_option, mojom::blink::PromiseResultOption::kDoNotWait,
|
|
- std::move(callback),
|
|
+ std::move(callback), base::NullCallback(),
|
|
MakeGarbageCollected<V8FunctionExecutor>(
|
|
script_state->GetIsolate(), function, receiver, argc, argv));
|
|
executor->Run();
|
|
@@ -264,10 +264,11 @@ void PausableScriptExecutor::CreateAndRun(
|
|
mojom::blink::LoadEventBlockingOption blocking_option,
|
|
mojom::blink::WantResultOption want_result_option,
|
|
mojom::blink::PromiseResultOption promise_result_option,
|
|
- WebScriptExecutionCallback callback) {
|
|
+ WebScriptExecutionCallback callback,
|
|
+ WebScriptExecutionCallbackUnmodified raw_callback) {
|
|
auto* executor = MakeGarbageCollected<PausableScriptExecutor>(
|
|
script_state, user_activation_option, blocking_option, want_result_option,
|
|
- promise_result_option, std::move(callback),
|
|
+ promise_result_option, std::move(callback), std::move(raw_callback),
|
|
MakeGarbageCollected<WebScriptExecutor>(std::move(sources),
|
|
execute_script_policy));
|
|
switch (evaluation_timing) {
|
|
@@ -289,6 +290,14 @@ void PausableScriptExecutor::ContextDestroyed() {
|
|
ScriptState::Scope script_scope(script_state_);
|
|
std::move(callback_).Run({}, {});
|
|
}
|
|
+ if (raw_callback_) {
|
|
+ // Though the context is (about to be) destroyed, the callback is invoked
|
|
+ // with a vector of v8::Local<>s, which implies that creating v8::Locals
|
|
+ // is permitted. Ensure a valid scope is present for the callback.
|
|
+ // See https://crbug.com/840719.
|
|
+ ScriptState::Scope script_scope(script_state_);
|
|
+ std::move(raw_callback_).Run(Vector<v8::Local<v8::Value>>());
|
|
+ }
|
|
Dispose();
|
|
}
|
|
|
|
@@ -299,10 +308,12 @@ PausableScriptExecutor::PausableScriptExecutor(
|
|
mojom::blink::WantResultOption want_result_option,
|
|
mojom::blink::PromiseResultOption promise_result_option,
|
|
WebScriptExecutionCallback callback,
|
|
+ WebScriptExecutionCallbackUnmodified raw_callback,
|
|
Executor* executor)
|
|
: ExecutionContextLifecycleObserver(ExecutionContext::From(script_state)),
|
|
script_state_(script_state),
|
|
callback_(std::move(callback)),
|
|
+ raw_callback_(std::move(raw_callback)),
|
|
user_activation_option_(user_activation_option),
|
|
blocking_option_(blocking_option),
|
|
want_result_option_(want_result_option),
|
|
@@ -426,6 +437,9 @@ void PausableScriptExecutor::HandleResults(
|
|
std::move(callback_).Run(std::move(value), start_time_);
|
|
}
|
|
|
|
+ if (raw_callback_)
|
|
+ std::move(raw_callback_).Run(results);
|
|
+
|
|
Dispose();
|
|
}
|
|
|
|
diff --git a/third_party/blink/renderer/core/frame/pausable_script_executor.h b/third_party/blink/renderer/core/frame/pausable_script_executor.h
|
|
index fa65331f40b90d812b71a489fd560e9359152d2b..390714d631dc88ef92d59ef9618a5706b4b52f22 100644
|
|
--- a/third_party/blink/renderer/core/frame/pausable_script_executor.h
|
|
+++ b/third_party/blink/renderer/core/frame/pausable_script_executor.h
|
|
@@ -48,7 +48,8 @@ class CORE_EXPORT PausableScriptExecutor final
|
|
mojom::blink::LoadEventBlockingOption,
|
|
mojom::blink::WantResultOption,
|
|
mojom::blink::PromiseResultOption,
|
|
- WebScriptExecutionCallback);
|
|
+ WebScriptExecutionCallback,
|
|
+ WebScriptExecutionCallbackUnmodified);
|
|
|
|
class Executor : public GarbageCollected<Executor> {
|
|
public:
|
|
@@ -65,6 +66,7 @@ class CORE_EXPORT PausableScriptExecutor final
|
|
mojom::blink::WantResultOption,
|
|
mojom::blink::PromiseResultOption,
|
|
WebScriptExecutionCallback,
|
|
+ WebScriptExecutionCallbackUnmodified,
|
|
Executor*);
|
|
~PausableScriptExecutor() override;
|
|
|
|
@@ -83,6 +85,7 @@ class CORE_EXPORT PausableScriptExecutor final
|
|
|
|
Member<ScriptState> script_state_;
|
|
WebScriptExecutionCallback callback_;
|
|
+ WebScriptExecutionCallbackUnmodified raw_callback_;
|
|
base::TimeTicks start_time_;
|
|
const mojom::blink::UserActivationOption user_activation_option_;
|
|
const mojom::blink::LoadEventBlockingOption blocking_option_;
|
|
diff --git a/third_party/blink/renderer/core/frame/web_frame_test.cc b/third_party/blink/renderer/core/frame/web_frame_test.cc
|
|
index 79ea68069bdb1ec895f9c444c7b07fc787a0594f..2850d537cc27758f5e812a1abae7d0aba97fbf31 100644
|
|
--- a/third_party/blink/renderer/core/frame/web_frame_test.cc
|
|
+++ b/third_party/blink/renderer/core/frame/web_frame_test.cc
|
|
@@ -289,6 +289,7 @@ void ExecuteScriptsInMainWorld(
|
|
DOMWrapperWorld::kMainWorldId, sources, user_gesture,
|
|
mojom::blink::EvaluationTiming::kSynchronous,
|
|
mojom::blink::LoadEventBlockingOption::kDoNotBlock, std::move(callback),
|
|
+ base::NullCallback(),
|
|
BackForwardCacheAware::kAllow,
|
|
mojom::blink::WantResultOption::kWantResult, wait_for_promise);
|
|
}
|
|
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
|
|
index dd04f47ca556c3355fba092d30b0239cd03f3d4e..cbae75c48103d10b4104b5387ca51ba159f17e5e 100644
|
|
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
|
|
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
|
|
@@ -1111,14 +1111,15 @@ void WebLocalFrameImpl::RequestExecuteScript(
|
|
mojom::blink::EvaluationTiming evaluation_timing,
|
|
mojom::blink::LoadEventBlockingOption blocking_option,
|
|
WebScriptExecutionCallback callback,
|
|
+ WebScriptExecutionCallbackUnmodified raw_callback,
|
|
BackForwardCacheAware back_forward_cache_aware,
|
|
mojom::blink::WantResultOption want_result_option,
|
|
mojom::blink::PromiseResultOption promise_behavior) {
|
|
DCHECK(GetFrame());
|
|
GetFrame()->RequestExecuteScript(
|
|
world_id, sources, user_gesture, evaluation_timing, blocking_option,
|
|
- std::move(callback), back_forward_cache_aware, want_result_option,
|
|
- promise_behavior);
|
|
+ std::move(callback), std::move(raw_callback), back_forward_cache_aware,
|
|
+ want_result_option, promise_behavior);
|
|
}
|
|
|
|
v8::MaybeLocal<v8::Value> WebLocalFrameImpl::CallFunctionEvenIfScriptDisabled(
|
|
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
|
|
index df5fe9ff02ef2d2e964b2acc16976adff0e83756..7e381d75342471ec905bab0fd86cd6f6c9cac4a6 100644
|
|
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h
|
|
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
|
|
@@ -193,6 +193,7 @@ class CORE_EXPORT WebLocalFrameImpl final
|
|
mojom::blink::EvaluationTiming,
|
|
mojom::blink::LoadEventBlockingOption,
|
|
WebScriptExecutionCallback,
|
|
+ WebScriptExecutionCallbackUnmodified,
|
|
BackForwardCacheAware back_forward_cache_aware,
|
|
mojom::blink::WantResultOption,
|
|
mojom::blink::PromiseResultOption) override;
|
|
diff --git a/third_party/blink/renderer/core/scheduler_integration_tests/virtual_time_test.cc b/third_party/blink/renderer/core/scheduler_integration_tests/virtual_time_test.cc
|
|
index 5b633b529b13213cb95865d0116395cf8c40d573..cf861f130b3426d1da6c37f1efd5cd8984dee9dc 100644
|
|
--- a/third_party/blink/renderer/core/scheduler_integration_tests/virtual_time_test.cc
|
|
+++ b/third_party/blink/renderer/core/scheduler_integration_tests/virtual_time_test.cc
|
|
@@ -58,6 +58,7 @@ class VirtualTimeTest : public SimTest {
|
|
mojom::blink::LoadEventBlockingOption::kDoNotBlock,
|
|
WTF::BindOnce(&ScriptExecutionCallbackHelper::Completed,
|
|
base::Unretained(&callback_helper)),
|
|
+ base::NullCallback(),
|
|
BackForwardCacheAware::kAllow,
|
|
mojom::blink::WantResultOption::kWantResult,
|
|
mojom::blink::PromiseResultOption::kDoNotWait);
|