From 7e8bb5135b7229702a4310b0a908511a4bbf0e78 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Thu, 25 Jun 2020 09:42:08 -0700 Subject: [PATCH] chore: split logic a bit --- shell/renderer/api/electron_api_web_frame.cc | 76 ++++++++++---------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/shell/renderer/api/electron_api_web_frame.cc b/shell/renderer/api/electron_api_web_frame.cc index 9641f5bb014e9..07d29265a217b 100644 --- a/shell/renderer/api/electron_api_web_frame.cc +++ b/shell/renderer/api/electron_api_web_frame.cc @@ -129,6 +129,45 @@ class ScriptExecutionCallback : public blink::WebScriptExecutionCallback { ~ScriptExecutionCallback() override = default; + void CopyResultToCallingContextAndFinalize( + v8::Isolate* isolate, + const v8::Local& result) { + blink::CloneableMessage ret; + bool success; + std::string error_message; + { + v8::TryCatch try_catch(isolate); + success = gin::ConvertFromV8(isolate, result, &ret); + if (try_catch.HasCaught()) { + auto message = try_catch.Message(); + + if (message.IsEmpty() || + !gin::ConvertFromV8(isolate, message->Get(), &error_message)) { + error_message = + "An unknown exception occurred while getting the result of " + "the script"; + } + } + } + if (!success) { + // Failed convert so we send undefined everywhere + if (!callback_.is_null()) + std::move(callback_).Run( + v8::Undefined(isolate), + v8::Exception::Error( + v8::String::NewFromUtf8(isolate, error_message.c_str()) + .ToLocalChecked())); + promise_.RejectWithErrorMessage(error_message); + } else { + v8::Local context = promise_.GetContext(); + v8::Context::Scope context_scope(context); + v8::Local cloned_value = gin::ConvertToV8(isolate, ret); + if (!callback_.is_null()) + std::move(callback_).Run(cloned_value, v8::Undefined(isolate)); + promise_.Resolve(cloned_value); + } + } + void Completed( const blink::WebVector>& result) override { v8::Isolate* isolate = v8::Isolate::GetCurrent(); @@ -145,42 +184,7 @@ class ScriptExecutionCallback : public blink::WebScriptExecutionCallback { std::move(callback_).Run(result[0], v8::Undefined(isolate)); promise_.Resolve(result[0]); } else { - // Serializable objects - blink::CloneableMessage ret; - bool success; - std::string error_message; - { - v8::TryCatch try_catch(isolate); - success = gin::ConvertFromV8(isolate, result[0], &ret); - if (try_catch.HasCaught()) { - auto message = try_catch.Message(); - - if (message.IsEmpty() || - !gin::ConvertFromV8(isolate, message->Get(), - &error_message)) { - error_message = - "An unknown exception occurred while getting the result of " - "the script"; - } - } - } - if (!success) { - // Failed convert so we send undefined everywhere - if (!callback_.is_null()) - std::move(callback_).Run( - v8::Undefined(isolate), - v8::Exception::Error( - v8::String::NewFromUtf8(isolate, error_message.c_str()) - .ToLocalChecked())); - promise_.RejectWithErrorMessage(error_message); - } else { - v8::Local context = promise_.GetContext(); - v8::Context::Scope context_scope(context); - v8::Local cloned_value = gin::ConvertToV8(isolate, ret); - if (!callback_.is_null()) - std::move(callback_).Run(cloned_value, v8::Undefined(isolate)); - promise_.Resolve(cloned_value); - } + CopyResultToCallingContextAndFinalize(isolate, result[0]); } } else { const char* error_message =