diff --git a/atom/browser/atom_browser_main_parts.cc b/atom/browser/atom_browser_main_parts.cc index 4eae597b8f32..8d05a34780de 100644 --- a/atom/browser/atom_browser_main_parts.cc +++ b/atom/browser/atom_browser_main_parts.cc @@ -63,9 +63,8 @@ void AtomBrowserMainParts::PostEarlyInitialization() { // Support the "--debug" switch. node_debugger_.reset(new NodeDebugger(js_env_->isolate())); - // Create and load the global environment. + // Create the global environment. global_env = node_bindings_->CreateEnvironment(js_env_->context()); - node_bindings_->LoadEnvironment(global_env); // Make sure node can get correct environment when debugging. if (node_debugger_->IsRunning()) @@ -73,6 +72,9 @@ void AtomBrowserMainParts::PostEarlyInitialization() { // Add atom-shell extended APIs. atom_bindings_->BindTo(js_env_->isolate(), global_env->process_object()); + + // Load everything. + node_bindings_->LoadEnvironment(global_env); } void AtomBrowserMainParts::PreMainMessageLoopRun() { diff --git a/atom/browser/lib/init.coffee b/atom/browser/lib/init.coffee index 65b7e4a19a4b..3519a2cb0998 100644 --- a/atom/browser/lib/init.coffee +++ b/atom/browser/lib/init.coffee @@ -23,83 +23,81 @@ process.argv.splice startMark, endMark - startMark + 1 globalPaths = module.globalPaths globalPaths.push path.join process.resourcesPath, 'atom', 'browser', 'api', 'lib' -# Following operations need extra bindings by AtomBindings. -process.once 'BIND_DONE', -> - # Import common settings. - require path.resolve(__dirname, '..', '..', 'common', 'lib', 'init.js') +# Import common settings. +require path.resolve(__dirname, '..', '..', 'common', 'lib', 'init.js') - if process.platform is 'win32' - # Redirect node's console to use our own implementations, since node can not - # handle console output when running as GUI program. - print = (args...) -> - process.log util.format(args...) - console.log = console.error = console.warn = print - process.stdout.write = process.stderr.write = print +if process.platform is 'win32' + # Redirect node's console to use our own implementations, since node can not + # handle console output when running as GUI program. + print = (args...) -> + process.log util.format(args...) + console.log = console.error = console.warn = print + process.stdout.write = process.stderr.write = print - # Always returns EOF for stdin stream. - Readable = require('stream').Readable - stdin = new Readable - stdin.push null - process.__defineGetter__ 'stdin', -> stdin + # Always returns EOF for stdin stream. + Readable = require('stream').Readable + stdin = new Readable + stdin.push null + process.__defineGetter__ 'stdin', -> stdin - # Don't quit on fatal error. - process.on 'uncaughtException', (error) -> - # Do nothing if the user has a custom uncaught exception handler. - if process.listeners('uncaughtException').length > 1 - return +# Don't quit on fatal error. +process.on 'uncaughtException', (error) -> + # Do nothing if the user has a custom uncaught exception handler. + if process.listeners('uncaughtException').length > 1 + return - # Show error in GUI. - stack = error.stack ? "#{error.name}: #{error.message}" - message = "Uncaught Exception:\n#{stack}" - require('dialog').showErrorBox 'A JavaScript error occured in the browser process', message + # Show error in GUI. + stack = error.stack ? "#{error.name}: #{error.message}" + message = "Uncaught Exception:\n#{stack}" + require('dialog').showErrorBox 'A JavaScript error occured in the browser process', message - # Emit 'exit' event on quit. - require('app').on 'quit', -> - process.emit 'exit' +# Emit 'exit' event on quit. +require('app').on 'quit', -> + process.emit 'exit' - # Load the RPC server. - require './rpc-server' +# Load the RPC server. +require './rpc-server' - # Load the guest view manager. - require './guest-view-manager' - require './guest-window-manager' +# Load the guest view manager. +require './guest-view-manager' +require './guest-window-manager' - # Now we try to load app's package.json. - packageJson = null +# Now we try to load app's package.json. +packageJson = null - searchPaths = [ 'app', 'app.asar', 'default_app' ] - for packagePath in searchPaths - try - packagePath = path.join process.resourcesPath, packagePath - packageJson = JSON.parse(fs.readFileSync(path.join(packagePath, 'package.json'))) - break - catch e - continue +searchPaths = [ 'app', 'app.asar', 'default_app' ] +for packagePath in searchPaths + try + packagePath = path.join process.resourcesPath, packagePath + packageJson = JSON.parse(fs.readFileSync(path.join(packagePath, 'package.json'))) + break + catch e + continue - throw new Error("Unable to find a valid app") unless packageJson? +throw new Error("Unable to find a valid app") unless packageJson? - # Set application's version. - app = require 'app' - app.setVersion packageJson.version if packageJson.version? +# Set application's version. +app = require 'app' +app.setVersion packageJson.version if packageJson.version? - # Set application's name. - if packageJson.productName? - app.setName packageJson.productName - else if packageJson.name? - app.setName packageJson.name +# Set application's name. +if packageJson.productName? + app.setName packageJson.productName +else if packageJson.name? + app.setName packageJson.name - # Set application's desktop name. - if packageJson.desktopName? - app.setDesktopName packageJson.desktopName - else - app.setDesktopName '#{app.getName()}.desktop' +# Set application's desktop name. +if packageJson.desktopName? + app.setDesktopName packageJson.desktopName +else + app.setDesktopName '#{app.getName()}.desktop' - # Set the user path according to application's name. - app.setPath 'userData', path.join(app.getPath('appData'), app.getName()) - app.setPath 'userCache', path.join(app.getPath('cache'), app.getName()) +# Set the user path according to application's name. +app.setPath 'userData', path.join(app.getPath('appData'), app.getName()) +app.setPath 'userCache', path.join(app.getPath('cache'), app.getName()) - # Load the chrome extension support. - require './chrome-extension.js' +# Load the chrome extension support. +require './chrome-extension.js' - # Finally load app's main.js and transfer control to C++. - module._load path.join(packagePath, packageJson.main), module, true +# Finally load app's main.js and transfer control to C++. +module._load path.join(packagePath, packageJson.main), module, true diff --git a/atom/common/api/atom_bindings.cc b/atom/common/api/atom_bindings.cc index 7953b2831fab..5655d4fe1d0f 100644 --- a/atom/common/api/atom_bindings.cc +++ b/atom/common/api/atom_bindings.cc @@ -85,9 +85,6 @@ void AtomBindings::BindTo(v8::Isolate* isolate, versions->Set(mate::StringToV8(isolate, "chrome"), mate::StringToV8(isolate, CHROME_VERSION_STRING)); } - - v8::Handle event = mate::StringToV8(isolate, "BIND_DONE"); - node::MakeCallback(isolate, process, "emit", 1, &event); } void AtomBindings::ActivateUVLoop(v8::Isolate* isolate) { diff --git a/atom/common/api/atom_bindings.h b/atom/common/api/atom_bindings.h index 5a232e455fa1..1d92f174d5eb 100644 --- a/atom/common/api/atom_bindings.h +++ b/atom/common/api/atom_bindings.h @@ -24,7 +24,7 @@ class AtomBindings { // Add process.atomBinding function, which behaves like process.binding but // load native code from atom-shell instead. - virtual void BindTo(v8::Isolate* isolate, v8::Handle process); + void BindTo(v8::Isolate* isolate, v8::Handle process); private: void ActivateUVLoop(v8::Isolate* isolate); diff --git a/atom/renderer/api/atom_renderer_bindings.cc b/atom/renderer/api/atom_renderer_bindings.cc index be0a75122a2a..11517606ce99 100644 --- a/atom/renderer/api/atom_renderer_bindings.cc +++ b/atom/renderer/api/atom_renderer_bindings.cc @@ -11,7 +11,6 @@ #include "base/memory/scoped_ptr.h" #include "base/values.h" #include "content/public/renderer/render_view.h" -#include "native_mate/converter.h" #include "third_party/WebKit/public/web/WebFrame.h" #include "third_party/WebKit/public/web/WebView.h" @@ -37,18 +36,6 @@ AtomRendererBindings::AtomRendererBindings() { AtomRendererBindings::~AtomRendererBindings() { } -void AtomRendererBindings::BindToFrame(blink::WebFrame* frame) { - v8::Isolate* isolate = v8::Isolate::GetCurrent(); - v8::HandleScope handle_scope(isolate); - - v8::Handle context = frame->mainWorldScriptContext(); - if (context.IsEmpty()) - return; - - v8::Context::Scope scope(context); - AtomBindings::BindTo(isolate, GetProcessObject(context)); -} - void AtomRendererBindings::OnBrowserMessage(content::RenderView* render_view, const base::string16& channel, const base::ListValue& args) { diff --git a/atom/renderer/api/atom_renderer_bindings.h b/atom/renderer/api/atom_renderer_bindings.h index 92b088b7e1a2..f5f89afb206e 100644 --- a/atom/renderer/api/atom_renderer_bindings.h +++ b/atom/renderer/api/atom_renderer_bindings.h @@ -28,9 +28,6 @@ class AtomRendererBindings : public AtomBindings { AtomRendererBindings(); virtual ~AtomRendererBindings(); - // Call BindTo for process object of the frame. - void BindToFrame(blink::WebFrame* frame); - // Dispatch messages from browser. void OnBrowserMessage(content::RenderView* render_view, const base::string16& channel, diff --git a/atom/renderer/atom_renderer_client.cc b/atom/renderer/atom_renderer_client.cc index e9dc66e96ce8..e775d4188f97 100644 --- a/atom/renderer/atom_renderer_client.cc +++ b/atom/renderer/atom_renderer_client.cc @@ -148,10 +148,9 @@ void AtomRendererClient::DidCreateScriptContext(blink::WebFrame* frame, // Setup node environment for each window. node::Environment* env = node_bindings_->CreateEnvironment(context); - node_bindings_->LoadEnvironment(env); // Add atom-shell extended APIs. - atom_bindings_->BindToFrame(frame); + atom_bindings_->BindTo(env->isolate(), env->process_object()); // Store the created environment. web_page_envs_.push_back(env); @@ -159,6 +158,9 @@ void AtomRendererClient::DidCreateScriptContext(blink::WebFrame* frame, // Make uv loop being wrapped by window context. if (node_bindings_->uv_env() == NULL) node_bindings_->set_uv_env(env); + + // Load everything. + node_bindings_->LoadEnvironment(env); } void AtomRendererClient::WillReleaseScriptContext( diff --git a/atom/renderer/lib/init.coffee b/atom/renderer/lib/init.coffee index c2ca2feb325e..4ea9281aa881 100644 --- a/atom/renderer/lib/init.coffee +++ b/atom/renderer/lib/init.coffee @@ -86,12 +86,9 @@ if nodeIntegration in ['true', 'all', 'except-iframe', 'manual-enable-iframe'] window.addEventListener 'unload', -> process.emit 'exit' else - # There still some native initialization codes needs "process", delete the - # global reference after they are done. - process.once 'BIND_DONE', -> - delete global.process - delete global.setImmediate - delete global.clearImmediate + delete global.process + delete global.setImmediate + delete global.clearImmediate # Load the script specfied by the "preload" attribute. if preloadScript