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