From 1b30cac372b3506d1647a115acb70179b8c3b87d Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Fri, 22 Dec 2017 17:47:41 +0530 Subject: [PATCH] Don't delay node module initialization --- atom/app/node_main.cc | 1 - atom/browser/api/atom_api_app.cc | 2 -- atom/browser/atom_browser_main_parts.cc | 44 ++++++++++++------------- atom/browser/javascript_environment.cc | 32 +++++++++--------- atom/browser/javascript_environment.h | 5 +-- 5 files changed, 41 insertions(+), 43 deletions(-) diff --git a/atom/app/node_main.cc b/atom/app/node_main.cc index 3111e9be39a3..c1e8dd8aff47 100644 --- a/atom/app/node_main.cc +++ b/atom/app/node_main.cc @@ -46,7 +46,6 @@ int NodeMain(int argc, char *argv[]) { base::TaskScheduler::CreateAndStartWithDefaultParams("Electron"); // Initialize gin::IsolateHolder. - JavascriptEnvironment::Initialize(); JavascriptEnvironment gin_env; int exec_argc; diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index b35ffcbfc2bd..39fd59612fae 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -529,8 +529,6 @@ void OnIconDataAvailable(v8::Isolate* isolate, } // namespace App::App(v8::Isolate* isolate) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - static_cast(AtomBrowserClient::Get())->set_delegate(this); Browser::Get()->AddObserver(this); content::GpuDataManager::GetInstance()->AddObserver(this); diff --git a/atom/browser/atom_browser_main_parts.cc b/atom/browser/atom_browser_main_parts.cc index 8a6bc4278e1a..cf3c96ac2c85 100644 --- a/atom/browser/atom_browser_main_parts.cc +++ b/atom/browser/atom_browser_main_parts.cc @@ -130,7 +130,27 @@ void AtomBrowserMainParts::PostEarlyInitialization() { // The ProxyResolverV8 has setup a complete V8 environment, in order to // avoid conflicts we only initialize our V8 environment after that. - JavascriptEnvironment::Initialize(); + js_env_.reset(new JavascriptEnvironment); + + node_bindings_->Initialize(); + + // Create the global environment. + node::Environment* env = + node_bindings_->CreateEnvironment(js_env_->context()); + node_env_.reset(new NodeEnvironment(env)); + + // Enable support for v8 inspector + node_debugger_.reset(new NodeDebugger(env)); + node_debugger_->Start(); + + // Add Electron extended APIs. + atom_bindings_->BindTo(js_env_->isolate(), env->process_object()); + + // Load everything. + node_bindings_->LoadEnvironment(env); + + // Wrap the uv loop with global env. + node_bindings_->set_uv_env(env); } int AtomBrowserMainParts::PreCreateThreads() { @@ -195,28 +215,6 @@ void AtomBrowserMainParts::PostMainMessageLoopStart() { base::FilePath user_dir; PathService::Get(brightray::DIR_USER_DATA, &user_dir); process_singleton_.reset(new ProcessSingleton(user_dir)); - - js_env_.reset(new JavascriptEnvironment); - - node_bindings_->Initialize(); - - // Create the global environment. - node::Environment* env = - node_bindings_->CreateEnvironment(js_env_->context()); - node_env_.reset(new NodeEnvironment(env)); - - // Enable support for v8 inspector - node_debugger_.reset(new NodeDebugger(env)); - node_debugger_->Start(); - - // Add Electron extended APIs. - atom_bindings_->BindTo(js_env_->isolate(), env->process_object()); - - // Load everything. - node_bindings_->LoadEnvironment(env); - - // Wrap the uv loop with global env. - node_bindings_->set_uv_env(env); } void AtomBrowserMainParts::PostMainMessageLoopRun() { diff --git a/atom/browser/javascript_environment.cc b/atom/browser/javascript_environment.cc index 2a22c344389a..e7a510488a98 100644 --- a/atom/browser/javascript_environment.cc +++ b/atom/browser/javascript_environment.cc @@ -18,22 +18,9 @@ namespace atom { -// static -void JavascriptEnvironment::Initialize() { - auto cmd = base::CommandLine::ForCurrentProcess(); - - // --js-flags. - std::string js_flags = cmd->GetSwitchValueASCII(switches::kJavaScriptFlags); - if (!js_flags.empty()) - v8::V8::SetFlagsFromString(js_flags.c_str(), js_flags.size()); - - gin::IsolateHolder::Initialize(gin::IsolateHolder::kNonStrictMode, - gin::IsolateHolder::kStableV8Extras, - gin::ArrayBufferAllocator::SharedInstance()); -} - JavascriptEnvironment::JavascriptEnvironment() - : isolate_holder_(base::ThreadTaskRunnerHandle::Get()), + : initialized_(Initialize()), + isolate_holder_(base::ThreadTaskRunnerHandle::Get()), isolate_(isolate_holder_.isolate()), isolate_scope_(isolate_), locker_(isolate_), @@ -49,6 +36,21 @@ void JavascriptEnvironment::OnMessageLoopDestroying() { isolate_holder_.RemoveRunMicrotasksObserver(); } +bool JavascriptEnvironment::Initialize() { + auto cmd = base::CommandLine::ForCurrentProcess(); + + // --js-flags. + std::string js_flags = cmd->GetSwitchValueASCII(switches::kJavaScriptFlags); + if (!js_flags.empty()) + v8::V8::SetFlagsFromString(js_flags.c_str(), js_flags.size()); + + gin::IsolateHolder::Initialize(gin::IsolateHolder::kNonStrictMode, + gin::IsolateHolder::kStableV8Extras, + gin::ArrayBufferAllocator::SharedInstance()); + + return true; +} + NodeEnvironment::NodeEnvironment(node::Environment* env) : env_(env) { } diff --git a/atom/browser/javascript_environment.h b/atom/browser/javascript_environment.h index 4a14caafbd4f..e515307819c1 100644 --- a/atom/browser/javascript_environment.h +++ b/atom/browser/javascript_environment.h @@ -18,8 +18,6 @@ namespace atom { // Manage the V8 isolate and context automatically. class JavascriptEnvironment { public: - static void Initialize(); - JavascriptEnvironment(); void OnMessageLoopCreated(); @@ -32,6 +30,9 @@ class JavascriptEnvironment { } private: + bool Initialize(); + + bool initialized_; gin::IsolateHolder isolate_holder_; v8::Isolate* isolate_; v8::Isolate::Scope isolate_scope_;