From 74fa2c809d7727d3ff792b7f29abd5a797be1095 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 7 Aug 2015 15:18:33 +0800 Subject: [PATCH] Make every JS function call is wrapped with V8RecursionScope --- atom/common/event_emitter_caller.cc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/atom/common/event_emitter_caller.cc b/atom/common/event_emitter_caller.cc index 3dbdc9db956..68c48217a36 100644 --- a/atom/common/event_emitter_caller.cc +++ b/atom/common/event_emitter_caller.cc @@ -4,15 +4,33 @@ #include "atom/common/event_emitter_caller.h" +#include "base/memory/scoped_ptr.h" +#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h" + #include "atom/common/node_includes.h" namespace mate { namespace internal { +namespace { + +// Returns whether current process is browser process, currently we detect it +// by checking whether current has used V8 Lock, but it might be a bad idea. +inline bool IsBrowserProcess() { + return v8::Locker::IsActive(); +} + +} // namespace + v8::Local CallEmitWithArgs(v8::Isolate* isolate, v8::Local obj, ValueVector* args) { + // Perform microtask checkpoint after running JavaScript. + scoped_ptr script_scope( + IsBrowserProcess() ? nullptr : new blink::WebScopedRunV8Script(isolate)); + // Use node::MakeCallback to call the callback, and it will also run pending + // tasks in Node.js. return node::MakeCallback( isolate, obj, "emit", args->size(), &args->front()); }