Index: extensions/renderer/script_context.cc |
diff --git a/extensions/renderer/script_context.cc b/extensions/renderer/script_context.cc |
index 77dc80cca73b0a64b7b4fd158157b5cdf7494fb7..40a7ce7f23e9603bb0b6290d07235369bccf335f 100644 |
--- a/extensions/renderer/script_context.cc |
+++ b/extensions/renderer/script_context.cc |
@@ -205,17 +205,36 @@ v8::Local<v8::Value> ScriptContext::CallFunction( |
void ScriptContext::SafeCallFunction(const v8::Local<v8::Function>& function, |
int argc, |
v8::Local<v8::Value> argv[]) { |
+ SafeCallFunction(function, argc, argv, |
+ ScriptInjectionCallback::CompleteCallback()); |
+} |
+ |
+void ScriptContext::SafeCallFunction( |
+ const v8::Local<v8::Function>& function, |
+ int argc, |
+ v8::Local<v8::Value> argv[], |
+ const ScriptInjectionCallback::CompleteCallback& callback) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
v8::HandleScope handle_scope(isolate()); |
v8::Context::Scope scope(v8_context()); |
v8::MicrotasksScope microtasks(isolate(), |
v8::MicrotasksScope::kDoNotRunMicrotasks); |
v8::Local<v8::Object> global = v8_context()->Global(); |
if (web_frame_) { |
+ ScriptInjectionCallback* wrapper_callback = nullptr; |
+ if (!callback.is_null()) { |
+ // ScriptInjectionCallback manages its own lifetime. |
+ wrapper_callback = new ScriptInjectionCallback(callback); |
+ } |
web_frame_->requestExecuteV8Function(v8_context(), function, global, argc, |
- argv, nullptr); |
+ argv, wrapper_callback); |
} else { |
// TODO(devlin): This probably isn't safe. |
- function->Call(global, argc, argv); |
+ v8::Local<v8::Value> result = function->Call(global, argc, argv); |
+ if (!callback.is_null()) { |
+ std::vector<v8::Local<v8::Value>> results(1, result); |
+ callback.Run(results); |
+ } |
} |
} |