Huge commit to use new V8 and Content APIs.

Still got a lots of linking errors!
This commit is contained in:
Cheng Zhao 2013-12-11 15:48:19 +08:00
parent d82cfc023f
commit 409a431892
78 changed files with 969 additions and 1057 deletions

View file

@ -43,7 +43,6 @@ void AtomMainDelegate::PreSandboxStartup() {
#if defined(OS_MACOSX) #if defined(OS_MACOSX)
OverrideChildProcessPath(); OverrideChildProcessPath();
OverrideFrameworkBundlePath(); OverrideFrameworkBundlePath();
SetProcessName();
#endif #endif
InitializeResourceBundle(); InitializeResourceBundle();

View file

@ -23,7 +23,6 @@ class AtomMainDelegate : public brightray::MainDelegate {
virtual base::FilePath GetResourcesPakFilePath(); virtual base::FilePath GetResourcesPakFilePath();
virtual void OverrideChildProcessPath(); virtual void OverrideChildProcessPath();
virtual void OverrideFrameworkBundlePath(); virtual void OverrideFrameworkBundlePath();
virtual void SetProcessName();
#endif #endif
private: private:

View file

@ -45,22 +45,4 @@ void AtomMainDelegate::OverrideChildProcessPath() {
PathService::Override(content::CHILD_PROCESS_EXE, helper_path); PathService::Override(content::CHILD_PROCESS_EXE, helper_path);
} }
void AtomMainDelegate::SetProcessName() {
const auto& command_line = *CommandLine::ForCurrentProcess();
auto process_type = command_line.GetSwitchValueASCII(switches::kProcessType);
std::string suffix;
if (process_type == switches::kRendererProcess)
suffix = "Renderer";
else if (process_type == switches::kPluginProcess ||
process_type == switches::kPpapiPluginProcess)
suffix = "Plug-In Host";
else if (process_type == switches::kUtilityProcess)
suffix = "Utility";
else
return;
base::mac::SetProcessName(base::mac::NSToCFCast(base::SysUTF8ToNSString(
brightray::GetApplicationName() + " " + suffix)));
}
} // namespace atom } // namespace atom

View file

@ -165,7 +165,9 @@
'common/platform_util_mac.mm', 'common/platform_util_mac.mm',
'common/platform_util_win.cc', 'common/platform_util_win.cc',
'common/swap_or_assign.h', 'common/swap_or_assign.h',
'common/v8_conversions.h', 'common/v8/node_common.h',
'common/v8/scoped_persistent.h',
'common/v8/native_type_conversions.h',
'common/v8_value_converter_impl.cc', 'common/v8_value_converter_impl.cc',
'common/v8_value_converter_impl.h', 'common/v8_value_converter_impl.h',
'renderer/api/atom_api_renderer_ipc.cc', 'renderer/api/atom_api_renderer_ipc.cc',
@ -328,6 +330,8 @@
'vendor', 'vendor',
# The `node.h` is using `#include"v8.h"`. # The `node.h` is using `#include"v8.h"`.
'vendor/brightray/vendor/download/libchromiumcontent/src/v8/include', 'vendor/brightray/vendor/download/libchromiumcontent/src/v8/include',
# The `node.h` is using `#include"ares.h"`.
'vendor/node/deps/cares/include',
], ],
'direct_dependent_settings': { 'direct_dependent_settings': {
'include_dirs': [ 'include_dirs': [

View file

@ -7,8 +7,9 @@
#include "base/values.h" #include "base/values.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "browser/browser.h" #include "browser/browser.h"
#include "common/v8_conversions.h" #include "common/v8/native_type_conversions.h"
#include "vendor/node/src/node.h"
#include "common/v8/node_common.h"
namespace atom { namespace atom {
@ -52,93 +53,65 @@ void App::OnFinishLaunching() {
} }
// static // static
v8::Handle<v8::Value> App::New(const v8::Arguments& args) { void App::New(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope; v8::HandleScope scope(args.GetIsolate());
if (!args.IsConstructCall()) if (!args.IsConstructCall())
return node::ThrowError("Require constructor call"); return node::ThrowError("Require constructor call");
new App(args.This()); new App(args.This());
return args.This();
} }
// static // static
v8::Handle<v8::Value> App::Quit(const v8::Arguments& args) { void App::Quit(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
Browser::Get()->Quit(); Browser::Get()->Quit();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> App::Exit(const v8::Arguments& args) { void App::Exit(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
exit(args[0]->IntegerValue()); exit(args[0]->IntegerValue());
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> App::Terminate(const v8::Arguments& args) { void App::Terminate(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
Browser::Get()->Terminate(); Browser::Get()->Terminate();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> App::Focus(const v8::Arguments& args) { void App::Focus(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
Browser::Get()->Focus(); Browser::Get()->Focus();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> App::GetVersion(const v8::Arguments& args) { void App::GetVersion(const v8::FunctionCallbackInfo<v8::Value>& args) {
return ToV8Value(Browser::Get()->GetVersion()); args.GetReturnValue().Set(ToV8Value(Browser::Get()->GetVersion()));
} }
// static // static
v8::Handle<v8::Value> App::SetVersion(const v8::Arguments& args) { void App::SetVersion(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
std::string version; std::string version;
if (!FromV8Arguments(args, &version)) if (!FromV8Arguments(args, &version))
return node::ThrowError("Bad argument"); return node::ThrowError("Bad argument");
Browser::Get()->SetVersion(version); Browser::Get()->SetVersion(version);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> App::GetName(const v8::Arguments& args) { void App::GetName(const v8::FunctionCallbackInfo<v8::Value>& args) {
return ToV8Value(Browser::Get()->GetName()); return args.GetReturnValue().Set(ToV8Value(Browser::Get()->GetName()));
} }
// static // static
v8::Handle<v8::Value> App::SetName(const v8::Arguments& args) { void App::SetName(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
std::string name; std::string name;
if (!FromV8Arguments(args, &name)) if (!FromV8Arguments(args, &name))
return node::ThrowError("Bad argument"); return node::ThrowError("Bad argument");
Browser::Get()->SetName(name); Browser::Get()->SetName(name);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> App::AppendSwitch(const v8::Arguments& args) { void App::AppendSwitch(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
std::string switch_string; std::string switch_string;
if (!FromV8Arguments(args, &switch_string)) if (!FromV8Arguments(args, &switch_string))
return node::ThrowError("Bad argument"); return node::ThrowError("Bad argument");
@ -150,27 +123,21 @@ v8::Handle<v8::Value> App::AppendSwitch(const v8::Arguments& args) {
CommandLine::ForCurrentProcess()->AppendSwitchASCII( CommandLine::ForCurrentProcess()->AppendSwitchASCII(
switch_string, value); switch_string, value);
} }
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> App::AppendArgument(const v8::Arguments& args) { void App::AppendArgument(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
std::string value; std::string value;
if (!FromV8Arguments(args, &value)) if (!FromV8Arguments(args, &value))
return node::ThrowError("Bad argument"); return node::ThrowError("Bad argument");
CommandLine::ForCurrentProcess()->AppendArg(value); CommandLine::ForCurrentProcess()->AppendArg(value);
return v8::Undefined();
} }
#if defined(OS_MACOSX) #if defined(OS_MACOSX)
// static // static
v8::Handle<v8::Value> App::DockBounce(const v8::Arguments& args) { void App::DockBounce(const v8::FunctionCallbackInfo<v8::Value>& args) {
std::string type; std::string type;
if (!FromV8Arguments(args, &type)) if (!FromV8Arguments(args, &type))
return node::ThrowError("Bad argument"); return node::ThrowError("Bad argument");
@ -184,34 +151,32 @@ v8::Handle<v8::Value> App::DockBounce(const v8::Arguments& args) {
else else
return node::ThrowTypeError("Invalid bounce type"); return node::ThrowTypeError("Invalid bounce type");
return ToV8Value(request_id); args.GetReturnValue().Set(request_id);
} }
// static // static
v8::Handle<v8::Value> App::DockCancelBounce(const v8::Arguments& args) { void App::DockCancelBounce(const v8::FunctionCallbackInfo<v8::Value>& args) {
Browser::Get()->DockCancelBounce(FromV8Value(args[0])); Browser::Get()->DockCancelBounce(FromV8Value(args[0]));
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> App::DockSetBadgeText(const v8::Arguments& args) { void App::DockSetBadgeText(const v8::FunctionCallbackInfo<v8::Value>& args) {
Browser::Get()->DockSetBadgeText(FromV8Value(args[0])); Browser::Get()->DockSetBadgeText(FromV8Value(args[0]));
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> App::DockGetBadgeText(const v8::Arguments& args) { void App::DockGetBadgeText(const v8::FunctionCallbackInfo<v8::Value>& args) {
std::string text(Browser::Get()->DockGetBadgeText()); std::string text(Browser::Get()->DockGetBadgeText());
return ToV8Value(text); args.GetReturnValue().Set(ToV8Value(text));
} }
#endif // defined(OS_MACOSX) #endif // defined(OS_MACOSX)
// static // static
void App::Initialize(v8::Handle<v8::Object> target) { void App::Initialize(v8::Handle<v8::Object> target) {
v8::HandleScope scope; v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(App::New); v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(New);
t->InstanceTemplate()->SetInternalFieldCount(1); t->InstanceTemplate()->SetInternalFieldCount(1);
t->SetClassName(v8::String::NewSymbol("Application")); t->SetClassName(v8::String::NewSymbol("Application"));

View file

@ -33,24 +33,24 @@ class App : public EventEmitter,
virtual void OnFinishLaunching() OVERRIDE; virtual void OnFinishLaunching() OVERRIDE;
private: private:
static v8::Handle<v8::Value> New(const v8::Arguments& args); static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Quit(const v8::Arguments& args); static void Quit(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Exit(const v8::Arguments& args); static void Exit(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Terminate(const v8::Arguments& args); static void Terminate(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Focus(const v8::Arguments& args); static void Focus(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetVersion(const v8::Arguments& args); static void GetVersion(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetVersion(const v8::Arguments& args); static void SetVersion(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetName(const v8::Arguments& args); static void GetName(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetName(const v8::Arguments& args); static void SetName(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> AppendSwitch(const v8::Arguments& args); static void AppendSwitch(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> AppendArgument(const v8::Arguments& args); static void AppendArgument(const v8::FunctionCallbackInfo<v8::Value>& args);
#if defined(OS_MACOSX) #if defined(OS_MACOSX)
static v8::Handle<v8::Value> DockBounce(const v8::Arguments& args); static void DockBounce(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> DockCancelBounce(const v8::Arguments& args); static void DockCancelBounce(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> DockSetBadgeText(const v8::Arguments& args); static void DockSetBadgeText(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> DockGetBadgeText(const v8::Arguments& args); static void DockGetBadgeText(const v8::FunctionCallbackInfo<v8::Value>& args);
#endif // defined(OS_MACOSX) #endif // defined(OS_MACOSX)
DISALLOW_COPY_AND_ASSIGN(App); DISALLOW_COPY_AND_ASSIGN(App);

View file

@ -6,7 +6,12 @@
#include "base/values.h" #include "base/values.h"
#include "browser/auto_updater.h" #include "browser/auto_updater.h"
#include "common/v8_conversions.h" #include "common/v8/native_type_conversions.h"
#undef CHECK
#undef DISALLOW_COPY_AND_ASSIGN
#include "vendor/node/src/node.h"
#include "vendor/node/src/node_internals.h"
namespace atom { namespace atom {
@ -44,69 +49,63 @@ void AutoUpdater::ReadyForUpdateOnQuit(const std::string& version,
} }
// static // static
v8::Handle<v8::Value> AutoUpdater::New(const v8::Arguments& args) { void AutoUpdater::New(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope; v8::HandleScope handle_scope(args.GetIsolate());
if (!args.IsConstructCall()) if (!args.IsConstructCall())
return node::ThrowError("Require constructor call"); return node::ThrowError("Require constructor call");
new AutoUpdater(args.This()); new AutoUpdater(args.This());
return args.This();
} }
// static // static
v8::Handle<v8::Value> AutoUpdater::SetFeedURL(const v8::Arguments& args) { void AutoUpdater::SetFeedURL(const v8::FunctionCallbackInfo<v8::Value>& args) {
auto_updater::AutoUpdater::SetFeedURL(FromV8Value(args[0])); auto_updater::AutoUpdater::SetFeedURL(FromV8Value(args[0]));
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> AutoUpdater::SetAutomaticallyChecksForUpdates( void AutoUpdater::SetAutomaticallyChecksForUpdates(
const v8::Arguments& args) { const v8::FunctionCallbackInfo<v8::Value>& args) {
auto_updater::AutoUpdater::SetAutomaticallyChecksForUpdates( auto_updater::AutoUpdater::SetAutomaticallyChecksForUpdates(
args[0]->BooleanValue()); FromV8Value(args[0]));
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> AutoUpdater::SetAutomaticallyDownloadsUpdates( void AutoUpdater::SetAutomaticallyDownloadsUpdates(
const v8::Arguments& args) { const v8::FunctionCallbackInfo<v8::Value>& args) {
auto_updater::AutoUpdater::SetAutomaticallyDownloadsUpdates( auto_updater::AutoUpdater::SetAutomaticallyDownloadsUpdates(
args[0]->BooleanValue()); FromV8Value(args[0]));
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> AutoUpdater::CheckForUpdates(const v8::Arguments& args) { void AutoUpdater::CheckForUpdates(
const v8::FunctionCallbackInfo<v8::Value>& args) {
auto_updater::AutoUpdater::CheckForUpdates(); auto_updater::AutoUpdater::CheckForUpdates();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> AutoUpdater::CheckForUpdatesInBackground( void AutoUpdater::CheckForUpdatesInBackground(
const v8::Arguments& args) { const v8::FunctionCallbackInfo<v8::Value>& args) {
auto_updater::AutoUpdater::CheckForUpdatesInBackground(); auto_updater::AutoUpdater::CheckForUpdatesInBackground();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> AutoUpdater::ContinueUpdate(const v8::Arguments& args) { void AutoUpdater::ContinueUpdate(
const v8::FunctionCallbackInfo<v8::Value>& args) {
AutoUpdater* self = AutoUpdater::Unwrap<AutoUpdater>(args.This()); AutoUpdater* self = AutoUpdater::Unwrap<AutoUpdater>(args.This());
self->continue_update_.Run(); self->continue_update_.Run();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> AutoUpdater::QuitAndInstall(const v8::Arguments& args) { void AutoUpdater::QuitAndInstall(
const v8::FunctionCallbackInfo<v8::Value>& args) {
AutoUpdater* self = AutoUpdater::Unwrap<AutoUpdater>(args.This()); AutoUpdater* self = AutoUpdater::Unwrap<AutoUpdater>(args.This());
self->quit_and_install_.Run(); self->quit_and_install_.Run();
return v8::Undefined();
} }
// static // static
void AutoUpdater::Initialize(v8::Handle<v8::Object> target) { void AutoUpdater::Initialize(v8::Handle<v8::Object> target) {
v8::HandleScope scope; v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
v8::Local<v8::FunctionTemplate> t( v8::Local<v8::FunctionTemplate> t(
v8::FunctionTemplate::New(AutoUpdater::New)); v8::FunctionTemplate::New(AutoUpdater::New));

View file

@ -31,19 +31,19 @@ class AutoUpdater : public EventEmitter,
const base::Closure& quit_and_install) OVERRIDE; const base::Closure& quit_and_install) OVERRIDE;
private: private:
static v8::Handle<v8::Value> New(const v8::Arguments& args); static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetFeedURL(const v8::Arguments& args); static void SetFeedURL(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetAutomaticallyChecksForUpdates( static void SetAutomaticallyChecksForUpdates(
const v8::Arguments& args); const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetAutomaticallyDownloadsUpdates( static void SetAutomaticallyDownloadsUpdates(
const v8::Arguments& args); const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> CheckForUpdates(const v8::Arguments& args); static void CheckForUpdates(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> CheckForUpdatesInBackground( static void CheckForUpdatesInBackground(
const v8::Arguments& args); const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> ContinueUpdate(const v8::Arguments& args); static void ContinueUpdate(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> QuitAndInstall(const v8::Arguments& args); static void QuitAndInstall(const v8::FunctionCallbackInfo<v8::Value>& args);
base::Closure continue_update_; base::Closure continue_update_;
base::Closure quit_and_install_; base::Closure quit_and_install_;

View file

@ -5,10 +5,9 @@
#include "browser/api/atom_api_browser_ipc.h" #include "browser/api/atom_api_browser_ipc.h"
#include "common/api/api_messages.h" #include "common/api/api_messages.h"
#include "common/v8_conversions.h" #include "common/v8/node_common.h"
#include "common/v8/native_type_conversions.h"
#include "content/public/browser/render_view_host.h" #include "content/public/browser/render_view_host.h"
#include "vendor/node/src/node.h"
#include "vendor/node/src/node_internals.h"
using content::RenderViewHost; using content::RenderViewHost;
using content::V8ValueConverter; using content::V8ValueConverter;
@ -18,9 +17,7 @@ namespace atom {
namespace api { namespace api {
// static // static
v8::Handle<v8::Value> BrowserIPC::Send(const v8::Arguments& args) { void BrowserIPC::Send(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
string16 channel; string16 channel;
int process_id, routing_id; int process_id, routing_id;
scoped_ptr<base::Value> arguments; scoped_ptr<base::Value> arguments;
@ -34,17 +31,15 @@ v8::Handle<v8::Value> BrowserIPC::Send(const v8::Arguments& args) {
if (!render_view_host) if (!render_view_host)
return node::ThrowError("Invalid render view host"); return node::ThrowError("Invalid render view host");
render_view_host->Send(new AtomViewMsg_Message( args.GetReturnValue().Set(render_view_host->Send(new AtomViewMsg_Message(
routing_id, routing_id,
channel, channel,
*static_cast<base::ListValue*>(arguments.get()))); *static_cast<base::ListValue*>(arguments.get()))));
return v8::Undefined();
} }
// static // static
void BrowserIPC::Initialize(v8::Handle<v8::Object> target) { void BrowserIPC::Initialize(v8::Handle<v8::Object> target) {
node::SetMethod(target, "send", Send); NODE_SET_METHOD(target, "send", Send);
} }
} // namespace api } // namespace api

View file

@ -17,7 +17,7 @@ class BrowserIPC {
static void Initialize(v8::Handle<v8::Object> target); static void Initialize(v8::Handle<v8::Object> target);
private: private:
static v8::Handle<v8::Value> Send(const v8::Arguments& args); static void Send(const v8::FunctionCallbackInfo<v8::Value>& args);
DISALLOW_IMPLICIT_CONSTRUCTORS(BrowserIPC); DISALLOW_IMPLICIT_CONSTRUCTORS(BrowserIPC);
}; };

View file

@ -8,10 +8,8 @@
#include "browser/native_window.h" #include "browser/native_window.h"
#include "browser/ui/file_dialog.h" #include "browser/ui/file_dialog.h"
#include "browser/ui/message_box.h" #include "browser/ui/message_box.h"
#include "common/v8_conversions.h" #include "common/v8/node_common.h"
#include "vendor/node/src/node_internals.h" #include "common/v8/native_type_conversions.h"
using node::node_isolate;
namespace atom { namespace atom {
@ -20,19 +18,14 @@ namespace api {
namespace { namespace {
template<typename T> template<typename T>
void CallV8Function(v8::Persistent<v8::Function> callback, T arg) { void CallV8Function(const RefCountedV8Function& callback, T arg) {
DCHECK(!callback.IsEmpty());
v8::HandleScope scope;
v8::Handle<v8::Value> value = ToV8Value(arg); v8::Handle<v8::Value> value = ToV8Value(arg);
callback->Call(callback, 1, &value); callback->NewHandle(node_isolate)->Call(
callback.Dispose(node_isolate); v8::Context::GetCurrent()->Global(), 1, &value);
} }
template<typename T> template<typename T>
void CallV8Function2(v8::Persistent<v8::Function> callback, void CallV8Function2(const RefCountedV8Function& callback, bool result, T arg) {
bool result,
T arg) {
if (result) if (result)
return CallV8Function<T>(callback, arg); return CallV8Function<T>(callback, arg);
else else
@ -40,7 +33,7 @@ void CallV8Function2(v8::Persistent<v8::Function> callback,
} }
void Initialize(v8::Handle<v8::Object> target) { void Initialize(v8::Handle<v8::Object> target) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
NODE_SET_METHOD(target, "showMessageBox", ShowMessageBox); NODE_SET_METHOD(target, "showMessageBox", ShowMessageBox);
NODE_SET_METHOD(target, "showOpenDialog", ShowOpenDialog); NODE_SET_METHOD(target, "showOpenDialog", ShowOpenDialog);
@ -49,9 +42,7 @@ void Initialize(v8::Handle<v8::Object> target) {
} // namespace } // namespace
v8::Handle<v8::Value> ShowMessageBox(const v8::Arguments& args) { void ShowMessageBox(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
int type; int type;
std::vector<std::string> buttons; std::vector<std::string> buttons;
std::string title, message, detail; std::string title, message, detail;
@ -68,9 +59,9 @@ v8::Handle<v8::Value> ShowMessageBox(const v8::Arguments& args) {
title, title,
message, message,
detail); detail);
return scope.Close(v8::Integer::New(chosen)); args.GetReturnValue().Set(chosen);
} else { } else {
v8::Persistent<v8::Function> callback = FromV8Value(args[6]); RefCountedV8Function callback = FromV8Value(args[6]);
atom::ShowMessageBox( atom::ShowMessageBox(
native_window, native_window,
(MessageBoxType)type, (MessageBoxType)type,
@ -79,13 +70,10 @@ v8::Handle<v8::Value> ShowMessageBox(const v8::Arguments& args) {
message, message,
detail, detail,
base::Bind(&CallV8Function<int>, callback)); base::Bind(&CallV8Function<int>, callback));
return v8::Undefined();
} }
} }
v8::Handle<v8::Value> ShowOpenDialog(const v8::Arguments& args) { void ShowOpenDialog(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
std::string title; std::string title;
base::FilePath default_path; base::FilePath default_path;
int properties; int properties;
@ -101,15 +89,15 @@ v8::Handle<v8::Value> ShowOpenDialog(const v8::Arguments& args) {
default_path, default_path,
properties, properties,
&paths)) &paths))
return v8::Undefined(); return;
v8::Handle<v8::Array> result = v8::Array::New(paths.size()); v8::Handle<v8::Array> result = v8::Array::New(paths.size());
for (size_t i = 0; i < paths.size(); ++i) for (size_t i = 0; i < paths.size(); ++i)
result->Set(i, ToV8Value(paths[i])); result->Set(i, ToV8Value(paths[i]));
return scope.Close(result); args.GetReturnValue().Set(result);
} else { } else {
v8::Persistent<v8::Function> callback = FromV8Value(args[4]); RefCountedV8Function callback = FromV8Value(args[4]);
file_dialog::ShowOpenDialog( file_dialog::ShowOpenDialog(
native_window, native_window,
title, title,
@ -117,13 +105,10 @@ v8::Handle<v8::Value> ShowOpenDialog(const v8::Arguments& args) {
properties, properties,
base::Bind(&CallV8Function2<const std::vector<base::FilePath>&>, base::Bind(&CallV8Function2<const std::vector<base::FilePath>&>,
callback)); callback));
return v8::Undefined();
} }
} }
v8::Handle<v8::Value> ShowSaveDialog(const v8::Arguments& args) { void ShowSaveDialog(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
std::string title; std::string title;
base::FilePath default_path; base::FilePath default_path;
if (!FromV8Arguments(args, &title, &default_path)) if (!FromV8Arguments(args, &title, &default_path))
@ -133,21 +118,18 @@ v8::Handle<v8::Value> ShowSaveDialog(const v8::Arguments& args) {
if (!args[3]->IsFunction()) { if (!args[3]->IsFunction()) {
base::FilePath path; base::FilePath path;
if (!file_dialog::ShowSaveDialog(native_window, if (file_dialog::ShowSaveDialog(native_window,
title, title,
default_path, default_path,
&path)) &path))
return v8::Undefined(); args.GetReturnValue().Set(ToV8Value(path));
return scope.Close(ToV8Value(path));
} else { } else {
v8::Persistent<v8::Function> callback = FromV8Value(args[3]); RefCountedV8Function callback = FromV8Value(args[3]);
file_dialog::ShowSaveDialog( file_dialog::ShowSaveDialog(
native_window, native_window,
title, title,
default_path, default_path,
base::Bind(&CallV8Function2<const base::FilePath&>, callback)); base::Bind(&CallV8Function2<const base::FilePath&>, callback));
return v8::Undefined();
} }
} }

View file

@ -11,9 +11,9 @@ namespace atom {
namespace api { namespace api {
v8::Handle<v8::Value> ShowMessageBox(const v8::Arguments& args); void ShowMessageBox(const v8::FunctionCallbackInfo<v8::Value>& args);
v8::Handle<v8::Value> ShowOpenDialog(const v8::Arguments& args); void ShowOpenDialog(const v8::FunctionCallbackInfo<v8::Value>& args);
v8::Handle<v8::Value> ShowSaveDialog(const v8::Arguments& args); void ShowSaveDialog(const v8::FunctionCallbackInfo<v8::Value>& args);
} // namespace api } // namespace api

View file

@ -6,15 +6,14 @@
#include "browser/native_window.h" #include "browser/native_window.h"
#include "common/api/api_messages.h" #include "common/api/api_messages.h"
#include "common/v8_conversions.h" #include "common/v8/node_common.h"
#include "common/v8/native_type_conversions.h"
using node::node_isolate;
namespace atom { namespace atom {
namespace api { namespace api {
v8::Persistent<v8::FunctionTemplate> Event::constructor_template_; ScopedPersistent<v8::Function> Event::constructor_template_;
Event::Event() Event::Event()
: sender_(NULL), : sender_(NULL),
@ -29,24 +28,20 @@ Event::~Event() {
// static // static
v8::Handle<v8::Object> Event::CreateV8Object() { v8::Handle<v8::Object> Event::CreateV8Object() {
v8::HandleScope scope;
if (constructor_template_.IsEmpty()) { if (constructor_template_.IsEmpty()) {
v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(New); v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(New);
constructor_template_ = v8::Persistent<v8::FunctionTemplate>::New( t->InstanceTemplate()->SetInternalFieldCount(1);
node_isolate, t); t->SetClassName(v8::String::NewSymbol("Event"));
constructor_template_->InstanceTemplate()->SetInternalFieldCount(1);
constructor_template_->SetClassName(v8::String::NewSymbol("Event"));
NODE_SET_PROTOTYPE_METHOD(t, "preventDefault", PreventDefault); NODE_SET_PROTOTYPE_METHOD(t, "preventDefault", PreventDefault);
NODE_SET_PROTOTYPE_METHOD(t, "sendReply", SendReply); NODE_SET_PROTOTYPE_METHOD(t, "sendReply", SendReply);
NODE_SET_PROTOTYPE_METHOD(t, "destroy", Destroy); NODE_SET_PROTOTYPE_METHOD(t, "destroy", Destroy);
constructor_template_.reset(t->GetFunction());
} }
v8::Handle<v8::Object> v8_event = v8::Handle<v8::Function> t = constructor_template_.NewHandle(node_isolate);
constructor_template_->GetFunction()->NewInstance(0, NULL); return t->NewInstance(0, NULL);
return scope.Close(v8_event);
} }
void Event::SetSenderAndMessage(NativeWindow* sender, IPC::Message* message) { void Event::SetSenderAndMessage(NativeWindow* sender, IPC::Message* message) {
@ -64,26 +59,22 @@ void Event::OnWindowClosed() {
} }
// static // static
v8::Handle<v8::Value> Event::New(const v8::Arguments& args) { void Event::New(const v8::FunctionCallbackInfo<v8::Value>& args) {
Event* event = new Event; Event* event = new Event;
event->Wrap(args.This()); event->Wrap(args.This());
return args.This();
} }
// static // static
v8::Handle<v8::Value> Event::PreventDefault(const v8::Arguments& args) { void Event::PreventDefault(const v8::FunctionCallbackInfo<v8::Value>& args) {
Event* event = Unwrap<Event>(args.This()); Event* event = Unwrap<Event>(args.This());
if (event == NULL) if (event == NULL)
return node::ThrowError("Event is already destroyed"); return node::ThrowError("Event is already destroyed");
event->prevent_default_ = true; event->prevent_default_ = true;
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Event::SendReply(const v8::Arguments& args) { void Event::SendReply(const v8::FunctionCallbackInfo<v8::Value>& args) {
Event* event = Unwrap<Event>(args.This()); Event* event = Unwrap<Event>(args.This());
if (event == NULL) if (event == NULL)
return node::ThrowError("Event is already destroyed"); return node::ThrowError("Event is already destroyed");
@ -97,14 +88,11 @@ v8::Handle<v8::Value> Event::SendReply(const v8::Arguments& args) {
event->sender_->Send(event->message_); event->sender_->Send(event->message_);
delete event; delete event;
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Event::Destroy(const v8::Arguments& args) { void Event::Destroy(const v8::FunctionCallbackInfo<v8::Value>& args) {
delete Unwrap<Event>(args.This()); delete Unwrap<Event>(args.This());
return v8::Undefined();
} }
} // namespace api } // namespace api

View file

@ -9,6 +9,7 @@
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "browser/native_window_observer.h" #include "browser/native_window_observer.h"
#include "common/v8/scoped_persistent.h"
#include "vendor/node/src/node_object_wrap.h" #include "vendor/node/src/node_object_wrap.h"
namespace IPC { namespace IPC {
@ -32,9 +33,6 @@ class Event : public node::ObjectWrap,
// Pass the sender and message to be replied. // Pass the sender and message to be replied.
void SetSenderAndMessage(NativeWindow* sender, IPC::Message* message); void SetSenderAndMessage(NativeWindow* sender, IPC::Message* message);
// Accessor to return handle_, this follows Google C++ Style.
v8::Persistent<v8::Object>& handle() { return handle_; }
// Whether event.preventDefault() is called. // Whether event.preventDefault() is called.
bool prevent_default() const { return prevent_default_; } bool prevent_default() const { return prevent_default_; }
@ -45,13 +43,13 @@ class Event : public node::ObjectWrap,
virtual void OnWindowClosed() OVERRIDE; virtual void OnWindowClosed() OVERRIDE;
private: private:
static v8::Handle<v8::Value> New(const v8::Arguments& args); static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> PreventDefault(const v8::Arguments& args); static void PreventDefault(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SendReply(const v8::Arguments& args); static void SendReply(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Destroy(const v8::Arguments& args); static void Destroy(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Persistent<v8::FunctionTemplate> constructor_template_; static ScopedPersistent<v8::Function> constructor_template_;
// Replyer for the synchronous messages. // Replyer for the synchronous messages.
NativeWindow* sender_; NativeWindow* sender_;

View file

@ -8,9 +8,8 @@
#include "base/logging.h" #include "base/logging.h"
#include "browser/api/atom_api_event.h" #include "browser/api/atom_api_event.h"
#include "common/v8_conversions.h" #include "common/v8/node_common.h"
#include "vendor/node/src/node.h" #include "common/v8/native_type_conversions.h"
#include "vendor/node/src/node_internals.h"
namespace atom { namespace atom {
@ -24,7 +23,8 @@ EventEmitter::EventEmitter(v8::Handle<v8::Object> wrapper) {
v8::String::New("ATOM_BROWSER_INTERNAL_NEW"), v8::String::New("ATOM_BROWSER_INTERNAL_NEW"),
wrapper, wrapper,
}; };
node::MakeCallback(node::process, "emit", 2, args); node::Environment* env = node::Environment::GetCurrent(node_isolate);
node::MakeCallback(env->process_object(), "emit", 2, args);
} }
EventEmitter::~EventEmitter() { EventEmitter::~EventEmitter() {
@ -36,7 +36,7 @@ bool EventEmitter::Emit(const std::string& name) {
} }
bool EventEmitter::Emit(const std::string& name, base::ListValue* args) { bool EventEmitter::Emit(const std::string& name, base::ListValue* args) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
v8::Handle<v8::Context> context = v8::Context::GetCurrent(); v8::Handle<v8::Context> context = v8::Context::GetCurrent();
scoped_ptr<content::V8ValueConverter> converter(new V8ValueConverterImpl); scoped_ptr<content::V8ValueConverter> converter(new V8ValueConverterImpl);

View file

@ -29,6 +29,11 @@ class EventEmitter : public node::ObjectWrap {
bool Emit(const std::string& name); bool Emit(const std::string& name);
bool Emit(const std::string& name, base::ListValue* args); bool Emit(const std::string& name, base::ListValue* args);
// The handle() of ObjectWrap doesn't provide the const version.
inline v8::Local<v8::Object> handle() const {
return const_cast<EventEmitter*>(this)->handle();
}
protected: protected:
explicit EventEmitter(v8::Handle<v8::Object> wrapper); explicit EventEmitter(v8::Handle<v8::Object> wrapper);

View file

@ -5,7 +5,8 @@
#include "browser/api/atom_api_menu.h" #include "browser/api/atom_api_menu.h"
#include "browser/ui/accelerator_util.h" #include "browser/ui/accelerator_util.h"
#include "common/v8_conversions.h" #include "common/v8/node_common.h"
#include "common/v8/native_type_conversions.h"
#define UNWRAP_MEMNU_AND_CHECK \ #define UNWRAP_MEMNU_AND_CHECK \
Menu* self = ObjectWrap::Unwrap<Menu>(args.This()); \ Menu* self = ObjectWrap::Unwrap<Menu>(args.This()); \
@ -23,7 +24,7 @@ v8::Handle<v8::Value> CallDelegate(v8::Handle<v8::Value> default_value,
v8::Handle<v8::Object> menu, v8::Handle<v8::Object> menu,
const char* method, const char* method,
int command_id) { int command_id) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
v8::Handle<v8::Value> delegate = menu->Get(v8::String::New("delegate")); v8::Handle<v8::Value> delegate = menu->Get(v8::String::New("delegate"));
if (!delegate->IsObject()) if (!delegate->IsObject())
@ -36,7 +37,7 @@ v8::Handle<v8::Value> CallDelegate(v8::Handle<v8::Value> default_value,
v8::Handle<v8::Value> argv = v8::Integer::New(command_id); v8::Handle<v8::Value> argv = v8::Integer::New(command_id);
return scope.Close( return handle_scope.Close(
function->Call(v8::Context::GetCurrent()->Global(), 1, &argv)); function->Call(v8::Context::GetCurrent()->Global(), 1, &argv));
} }
@ -51,7 +52,7 @@ Menu::~Menu() {
} }
bool Menu::IsCommandIdChecked(int command_id) const { bool Menu::IsCommandIdChecked(int command_id) const {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
return CallDelegate(v8::False(), return CallDelegate(v8::False(),
handle(), handle(),
"isCommandIdChecked", "isCommandIdChecked",
@ -59,7 +60,7 @@ bool Menu::IsCommandIdChecked(int command_id) const {
} }
bool Menu::IsCommandIdEnabled(int command_id) const { bool Menu::IsCommandIdEnabled(int command_id) const {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
return CallDelegate(v8::True(), return CallDelegate(v8::True(),
handle(), handle(),
"isCommandIdEnabled", "isCommandIdEnabled",
@ -67,7 +68,7 @@ bool Menu::IsCommandIdEnabled(int command_id) const {
} }
bool Menu::IsCommandIdVisible(int command_id) const { bool Menu::IsCommandIdVisible(int command_id) const {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
return CallDelegate(v8::True(), return CallDelegate(v8::True(),
handle(), handle(),
"isCommandIdVisible", "isCommandIdVisible",
@ -76,7 +77,7 @@ bool Menu::IsCommandIdVisible(int command_id) const {
bool Menu::GetAcceleratorForCommandId(int command_id, bool Menu::GetAcceleratorForCommandId(int command_id,
ui::Accelerator* accelerator) { ui::Accelerator* accelerator) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
v8::Handle<v8::Value> shortcut = CallDelegate(v8::Undefined(), v8::Handle<v8::Value> shortcut = CallDelegate(v8::Undefined(),
handle(), handle(),
"getAcceleratorForCommandId", "getAcceleratorForCommandId",
@ -90,7 +91,7 @@ bool Menu::GetAcceleratorForCommandId(int command_id,
} }
bool Menu::IsItemForCommandIdDynamic(int command_id) const { bool Menu::IsItemForCommandIdDynamic(int command_id) const {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
return CallDelegate(v8::False(), return CallDelegate(v8::False(),
handle(), handle(),
"isItemForCommandIdDynamic", "isItemForCommandIdDynamic",
@ -98,7 +99,7 @@ bool Menu::IsItemForCommandIdDynamic(int command_id) const {
} }
string16 Menu::GetLabelForCommandId(int command_id) const { string16 Menu::GetLabelForCommandId(int command_id) const {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
return FromV8Value(CallDelegate(v8::False(), return FromV8Value(CallDelegate(v8::False(),
handle(), handle(),
"getLabelForCommandId", "getLabelForCommandId",
@ -106,7 +107,7 @@ string16 Menu::GetLabelForCommandId(int command_id) const {
} }
string16 Menu::GetSublabelForCommandId(int command_id) const { string16 Menu::GetSublabelForCommandId(int command_id) const {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
return FromV8Value(CallDelegate(v8::False(), return FromV8Value(CallDelegate(v8::False(),
handle(), handle(),
"getSubLabelForCommandId", "getSubLabelForCommandId",
@ -114,24 +115,22 @@ string16 Menu::GetSublabelForCommandId(int command_id) const {
} }
void Menu::ExecuteCommand(int command_id, int event_flags) { void Menu::ExecuteCommand(int command_id, int event_flags) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
CallDelegate(v8::False(), handle(), "executeCommand", command_id); CallDelegate(v8::False(), handle(), "executeCommand", command_id);
} }
// static // static
v8::Handle<v8::Value> Menu::New(const v8::Arguments& args) { void Menu::New(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope; v8::HandleScope handle_scope(args.GetIsolate());
if (!args.IsConstructCall()) if (!args.IsConstructCall())
return node::ThrowError("Require constructor call"); return node::ThrowError("Require constructor call");
Menu::Create(args.This()); Menu::Create(args.This());
return args.This();
} }
// static // static
v8::Handle<v8::Value> Menu::InsertItem(const v8::Arguments& args) { void Menu::InsertItem(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
int index, command_id; int index, command_id;
@ -143,12 +142,10 @@ v8::Handle<v8::Value> Menu::InsertItem(const v8::Arguments& args) {
self->model_->AddItem(command_id, label); self->model_->AddItem(command_id, label);
else else
self->model_->InsertItemAt(index, command_id, label); self->model_->InsertItemAt(index, command_id, label);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Menu::InsertCheckItem(const v8::Arguments& args) { void Menu::InsertCheckItem(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
int index, command_id; int index, command_id;
@ -160,12 +157,10 @@ v8::Handle<v8::Value> Menu::InsertCheckItem(const v8::Arguments& args) {
self->model_->AddCheckItem(command_id, label); self->model_->AddCheckItem(command_id, label);
else else
self->model_->InsertCheckItemAt(index, command_id, label); self->model_->InsertCheckItemAt(index, command_id, label);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Menu::InsertRadioItem(const v8::Arguments& args) { void Menu::InsertRadioItem(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
int index, command_id, group_id; int index, command_id, group_id;
@ -177,12 +172,10 @@ v8::Handle<v8::Value> Menu::InsertRadioItem(const v8::Arguments& args) {
self->model_->AddRadioItem(command_id, label, group_id); self->model_->AddRadioItem(command_id, label, group_id);
else else
self->model_->InsertRadioItemAt(index, command_id, label, group_id); self->model_->InsertRadioItemAt(index, command_id, label, group_id);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Menu::InsertSeparator(const v8::Arguments& args) { void Menu::InsertSeparator(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
int index; int index;
@ -193,12 +186,10 @@ v8::Handle<v8::Value> Menu::InsertSeparator(const v8::Arguments& args) {
self->model_->AddSeparator(ui::NORMAL_SEPARATOR); self->model_->AddSeparator(ui::NORMAL_SEPARATOR);
else else
self->model_->InsertSeparatorAt(index, ui::NORMAL_SEPARATOR); self->model_->InsertSeparatorAt(index, ui::NORMAL_SEPARATOR);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Menu::InsertSubMenu(const v8::Arguments& args) { void Menu::InsertSubMenu(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
int index, command_id; int index, command_id;
@ -215,12 +206,10 @@ v8::Handle<v8::Value> Menu::InsertSubMenu(const v8::Arguments& args) {
else else
self->model_->InsertSubMenuAt( self->model_->InsertSubMenuAt(
index, command_id, label, submenu->model_.get()); index, command_id, label, submenu->model_.get());
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Menu::SetIcon(const v8::Arguments& args) { void Menu::SetIcon(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
int index; int index;
@ -229,12 +218,10 @@ v8::Handle<v8::Value> Menu::SetIcon(const v8::Arguments& args) {
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
// FIXME use webkit_glue's image decoder here. // FIXME use webkit_glue's image decoder here.
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Menu::SetSublabel(const v8::Arguments& args) { void Menu::SetSublabel(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
int index; int index;
@ -243,74 +230,71 @@ v8::Handle<v8::Value> Menu::SetSublabel(const v8::Arguments& args) {
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
self->model_->SetSublabel(index, label); self->model_->SetSublabel(index, label);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Menu::Clear(const v8::Arguments& args) { void Menu::Clear(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
self->model_->Clear(); self->model_->Clear();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Menu::GetIndexOfCommandId(const v8::Arguments& args) { void Menu::GetIndexOfCommandId(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
int index = args[0]->IntegerValue(); int index = FromV8Value(args[0]);
return v8::Integer::New(self->model_->GetIndexOfCommandId(index)); args.GetReturnValue().Set(self->model_->GetIndexOfCommandId(index));
} }
// static // static
v8::Handle<v8::Value> Menu::GetItemCount(const v8::Arguments& args) { void Menu::GetItemCount(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
return v8::Integer::New(self->model_->GetItemCount()); args.GetReturnValue().Set(self->model_->GetItemCount());
} }
// static // static
v8::Handle<v8::Value> Menu::GetCommandIdAt(const v8::Arguments& args) { void Menu::GetCommandIdAt(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
int index = args[0]->IntegerValue(); int index = FromV8Value(args[0]);
return v8::Integer::New(self->model_->GetCommandIdAt(index)); args.GetReturnValue().Set(self->model_->GetCommandIdAt(index));
} }
// static // static
v8::Handle<v8::Value> Menu::GetLabelAt(const v8::Arguments& args) { void Menu::GetLabelAt(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
int index = args[0]->IntegerValue(); int index = FromV8Value(args[0]);
return ToV8Value(self->model_->GetLabelAt(index)); args.GetReturnValue().Set(ToV8Value(self->model_->GetLabelAt(index)));
} }
// static // static
v8::Handle<v8::Value> Menu::GetSublabelAt(const v8::Arguments& args) { void Menu::GetSublabelAt(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
int index = args[0]->IntegerValue(); int index = FromV8Value(args[0]);
return ToV8Value(self->model_->GetSublabelAt(index)); args.GetReturnValue().Set(ToV8Value(self->model_->GetSublabelAt(index)));
} }
// static // static
v8::Handle<v8::Value> Menu::IsItemCheckedAt(const v8::Arguments& args) { void Menu::IsItemCheckedAt(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
int index = args[0]->IntegerValue(); int index = FromV8Value(args[0]);
return v8::Boolean::New(self->model_->IsItemCheckedAt(index)); args.GetReturnValue().Set(self->model_->IsItemCheckedAt(index));
} }
// static // static
v8::Handle<v8::Value> Menu::IsEnabledAt(const v8::Arguments& args) { void Menu::IsEnabledAt(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
return v8::Boolean::New(self->model_->IsEnabledAt(args[0]->IntegerValue())); int index = FromV8Value(args[0]);
args.GetReturnValue().Set(self->model_->IsEnabledAt(index));
} }
// static // static
v8::Handle<v8::Value> Menu::IsVisibleAt(const v8::Arguments& args) { void Menu::IsVisibleAt(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
return v8::Boolean::New(self->model_->IsVisibleAt(args[0]->IntegerValue())); int index = FromV8Value(args[0]);
args.GetReturnValue().Set(self->model_->IsVisibleAt(index));
} }
// static // static
v8::Handle<v8::Value> Menu::Popup(const v8::Arguments& args) { void Menu::Popup(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_MEMNU_AND_CHECK; UNWRAP_MEMNU_AND_CHECK;
atom::NativeWindow* window; atom::NativeWindow* window;
@ -318,12 +302,11 @@ v8::Handle<v8::Value> Menu::Popup(const v8::Arguments& args) {
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
self->Popup(window); self->Popup(window);
return v8::Undefined();
} }
// static // static
void Menu::Initialize(v8::Handle<v8::Object> target) { void Menu::Initialize(v8::Handle<v8::Object> target) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
v8::Local<v8::FunctionTemplate> t(v8::FunctionTemplate::New(Menu::New)); v8::Local<v8::FunctionTemplate> t(v8::FunctionTemplate::New(Menu::New));
t->InstanceTemplate()->SetInternalFieldCount(1); t->InstanceTemplate()->SetInternalFieldCount(1);

View file

@ -44,36 +44,37 @@ class Menu : public EventEmitter,
scoped_ptr<ui::SimpleMenuModel> model_; scoped_ptr<ui::SimpleMenuModel> model_;
private: private:
static v8::Handle<v8::Value> New(const v8::Arguments& args); static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> InsertItem(const v8::Arguments& args); static void InsertItem(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> InsertCheckItem(const v8::Arguments& args); static void InsertCheckItem(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> InsertRadioItem(const v8::Arguments& args); static void InsertRadioItem(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> InsertSeparator(const v8::Arguments& args); static void InsertSeparator(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> InsertSubMenu(const v8::Arguments& args); static void InsertSubMenu(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetIcon(const v8::Arguments& args); static void SetIcon(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetSublabel(const v8::Arguments& args); static void SetSublabel(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Clear(const v8::Arguments& args); static void Clear(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetIndexOfCommandId(const v8::Arguments& args); static void GetIndexOfCommandId(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetItemCount(const v8::Arguments& args); static void GetItemCount(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetCommandIdAt(const v8::Arguments& args); static void GetCommandIdAt(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetLabelAt(const v8::Arguments& args); static void GetLabelAt(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetSublabelAt(const v8::Arguments& args); static void GetSublabelAt(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsItemCheckedAt(const v8::Arguments& args); static void IsItemCheckedAt(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsEnabledAt(const v8::Arguments& args); static void IsEnabledAt(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsVisibleAt(const v8::Arguments& args); static void IsVisibleAt(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Popup(const v8::Arguments& args); static void Popup(const v8::FunctionCallbackInfo<v8::Value>& args);
#if defined(OS_WIN) #if defined(OS_WIN)
static v8::Handle<v8::Value> AttachToWindow(const v8::Arguments& args); static void AttachToWindow(const v8::FunctionCallbackInfo<v8::Value>& args);
#elif defined(OS_MACOSX) #elif defined(OS_MACOSX)
static v8::Handle<v8::Value> SetApplicationMenu(const v8::Arguments& args); static void SetApplicationMenu(
static v8::Handle<v8::Value> SendActionToFirstResponder( const v8::FunctionCallbackInfo<v8::Value>& args);
const v8::Arguments& args); static void SendActionToFirstResponder(
const v8::FunctionCallbackInfo<v8::Value>& args);
#endif #endif
DISALLOW_COPY_AND_ASSIGN(Menu); DISALLOW_COPY_AND_ASSIGN(Menu);

View file

@ -21,7 +21,7 @@ class MenuMac : public Menu {
protected: protected:
virtual void Popup(NativeWindow* window) OVERRIDE; virtual void Popup(NativeWindow* window) OVERRIDE;
scoped_nsobject<AtomMenuController> menu_controller_; base::scoped_nsobject<AtomMenuController> menu_controller_;
private: private:
friend class Menu; friend class Menu;

View file

@ -4,11 +4,12 @@
#import "browser/api/atom_api_menu_mac.h" #import "browser/api/atom_api_menu_mac.h"
#include "base/message_loop.h"
#include "base/mac/scoped_sending_event.h" #include "base/mac/scoped_sending_event.h"
#include "base/message_loop/message_loop.h"
#include "base/strings/sys_string_conversions.h" #include "base/strings/sys_string_conversions.h"
#include "browser/native_window.h" #include "browser/native_window.h"
#include "common/v8_conversions.h" #include "common/v8/node_common.h"
#include "common/v8/native_type_conversions.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_view.h" #include "content/public/browser/web_contents_view.h"
@ -24,7 +25,7 @@ MenuMac::~MenuMac() {
} }
void MenuMac::Popup(NativeWindow* native_window) { void MenuMac::Popup(NativeWindow* native_window) {
scoped_nsobject<AtomMenuController> menu_controller( base::scoped_nsobject<AtomMenuController> menu_controller(
[[AtomMenuController alloc] initWithModel:model_.get()]); [[AtomMenuController alloc] initWithModel:model_.get()]);
NSWindow* window = native_window->GetNativeWindow(); NSWindow* window = native_window->GetNativeWindow();
@ -46,7 +47,8 @@ void MenuMac::Popup(NativeWindow* native_window) {
{ {
// Make sure events can be pumped while the menu is up. // Make sure events can be pumped while the menu is up.
MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); base::MessageLoop::ScopedNestableTaskAllower allow(
base::MessageLoop::current());
// One of the events that could be pumped is |window.close()|. // One of the events that could be pumped is |window.close()|.
// User-initiated event-tracking loops protect against this by // User-initiated event-tracking loops protect against this by
@ -71,8 +73,8 @@ void MenuMac::SendActionToFirstResponder(const std::string& action) {
} }
// static // static
v8::Handle<v8::Value> Menu::SetApplicationMenu(const v8::Arguments& args) { void Menu::SetApplicationMenu(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope; v8::HandleScope handle_scope(args.GetIsolate());
if (!args[0]->IsObject()) if (!args[0]->IsObject())
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
@ -81,28 +83,24 @@ v8::Handle<v8::Value> Menu::SetApplicationMenu(const v8::Arguments& args) {
if (!menu) if (!menu)
return node::ThrowError("Menu is destroyed"); return node::ThrowError("Menu is destroyed");
scoped_nsobject<AtomMenuController> menu_controller( base::scoped_nsobject<AtomMenuController> menu_controller(
[[AtomMenuController alloc] initWithModel:menu->model_.get()]); [[AtomMenuController alloc] initWithModel:menu->model_.get()]);
[NSApp setMainMenu:[menu_controller menu]]; [NSApp setMainMenu:[menu_controller menu]];
// Ensure the menu_controller_ is destroyed after main menu is set. // Ensure the menu_controller_ is destroyed after main menu is set.
menu_controller.swap(menu->menu_controller_); menu_controller.swap(menu->menu_controller_);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Menu::SendActionToFirstResponder( void Menu::SendActionToFirstResponder(
const v8::Arguments& args) { const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope; v8::HandleScope handle_scope(args.GetIsolate());
std::string action; std::string action;
if (!FromV8Arguments(args, &action)) if (!FromV8Arguments(args, &action))
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
MenuMac::SendActionToFirstResponder(action); MenuMac::SendActionToFirstResponder(action);
return v8::Undefined();
} }
// static // static

View file

@ -6,7 +6,7 @@
#include "browser/native_window_win.h" #include "browser/native_window_win.h"
#include "browser/ui/win/menu_2.h" #include "browser/ui/win/menu_2.h"
#include "common/v8_conversions.h" #include "common/v8/native_type_conversions.h"
#include "ui/gfx/point.h" #include "ui/gfx/point.h"
#include "ui/gfx/screen.h" #include "ui/gfx/screen.h"
@ -28,8 +28,8 @@ void MenuWin::Popup(NativeWindow* native_window) {
} }
// static // static
v8::Handle<v8::Value> Menu::AttachToWindow(const v8::Arguments& args) { void Menu::AttachToWindow(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope; v8::HandleScope handle_scope(args.GetIsolate());
Menu* self = ObjectWrap::Unwrap<Menu>(args.This()); Menu* self = ObjectWrap::Unwrap<Menu>(args.This());
if (self == NULL) if (self == NULL)

View file

@ -5,6 +5,9 @@
#include "browser/api/atom_api_power_monitor.h" #include "browser/api/atom_api_power_monitor.h"
#include "base/power_monitor/power_monitor.h" #include "base/power_monitor/power_monitor.h"
#include "base/power_monitor/power_monitor_device_source.h"
#include "common/v8/node_common.h"
namespace atom { namespace atom {
@ -35,20 +38,22 @@ void PowerMonitor::OnResume() {
} }
// static // static
v8::Handle<v8::Value> PowerMonitor::New(const v8::Arguments& args) { void PowerMonitor::New(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope; v8::HandleScope handle_scope(args.GetIsolate());
if (!args.IsConstructCall()) if (!args.IsConstructCall())
return node::ThrowError("Require constructor call"); return node::ThrowError("Require constructor call");
new PowerMonitor(args.This()); new PowerMonitor(args.This());
return args.This();
} }
// static // static
void PowerMonitor::Initialize(v8::Handle<v8::Object> target) { void PowerMonitor::Initialize(v8::Handle<v8::Object> target) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
#if defined(OS_MACOSX)
base::PowerMonitorDeviceSource::AllocateSystemIOPorts();
#endif
v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New( v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(
PowerMonitor::New); PowerMonitor::New);

View file

@ -29,7 +29,7 @@ class PowerMonitor : public EventEmitter,
virtual void OnResume() OVERRIDE; virtual void OnResume() OVERRIDE;
private: private:
static v8::Handle<v8::Value> New(const v8::Arguments& args); static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
DISALLOW_COPY_AND_ASSIGN(PowerMonitor); DISALLOW_COPY_AND_ASSIGN(PowerMonitor);
}; };

View file

@ -9,11 +9,11 @@
#include "browser/net/adapter_request_job.h" #include "browser/net/adapter_request_job.h"
#include "browser/net/atom_url_request_context_getter.h" #include "browser/net/atom_url_request_context_getter.h"
#include "browser/net/atom_url_request_job_factory.h" #include "browser/net/atom_url_request_job_factory.h"
#include "common/v8_conversions.h" #include "common/v8/native_type_conversions.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context.h"
#include "vendor/node/src/node.h"
#include "vendor/node/src/node_internals.h" #include "common/v8/node_common.h"
namespace atom { namespace atom {
@ -24,10 +24,10 @@ typedef net::URLRequestJobFactory::ProtocolHandler ProtocolHandler;
namespace { namespace {
// The protocol module object. // The protocol module object.
v8::Persistent<v8::Object> g_protocol_object; ScopedPersistent<v8::Object> g_protocol_object;
// Registered protocol handlers. // Registered protocol handlers.
typedef std::map<std::string, v8::Persistent<v8::Function>> HandlersMap; typedef std::map<std::string, RefCountedV8Function> HandlersMap;
static HandlersMap g_handlers; static HandlersMap g_handlers;
static const char* kEarlyUseProtocolError = "This method can only be used" static const char* kEarlyUseProtocolError = "This method can only be used"
@ -35,25 +35,23 @@ static const char* kEarlyUseProtocolError = "This method can only be used"
// Emit an event for the protocol module. // Emit an event for the protocol module.
void EmitEventInUI(const std::string& event, const std::string& parameter) { void EmitEventInUI(const std::string& event, const std::string& parameter) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
v8::Handle<v8::Value> argv[] = { v8::Handle<v8::Value> argv[] = {
ToV8Value(event), ToV8Value(event),
ToV8Value(parameter), ToV8Value(parameter),
}; };
node::MakeCallback(g_protocol_object, "emit", arraysize(argv), argv); node::MakeCallback(g_protocol_object.NewHandle(node_isolate),
"emit", 2, argv);
} }
// Convert the URLRequest object to V8 object. // Convert the URLRequest object to V8 object.
v8::Handle<v8::Object> ConvertURLRequestToV8Object( v8::Handle<v8::Object> ConvertURLRequestToV8Object(
const net::URLRequest* request) { const net::URLRequest* request) {
v8::Local<v8::Object> obj = v8::Object::New(); v8::Local<v8::Object> obj = v8::Object::New();
obj->Set(v8::String::New("method"), obj->Set(ToV8Value("method"), ToV8Value(request->method()));
v8::String::New(request->method().c_str())); obj->Set(ToV8Value("url"), ToV8Value(request->url().spec()));
obj->Set(v8::String::New("url"), obj->Set(ToV8Value("referrer"), ToV8Value(request->referrer()));
v8::String::New(request->url().spec().c_str()));
obj->Set(v8::String::New("referrer"),
v8::String::New(request->referrer().c_str()));
return obj; return obj;
} }
@ -74,13 +72,15 @@ class CustomProtocolRequestJob : public AdapterRequestJob {
virtual void GetJobTypeInUI() OVERRIDE { virtual void GetJobTypeInUI() OVERRIDE {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
v8::HandleScope handle_scope(node_isolate);
// Call the JS handler. // Call the JS handler.
v8::HandleScope scope;
v8::Handle<v8::Value> argv[] = { v8::Handle<v8::Value> argv[] = {
ConvertURLRequestToV8Object(request()), ConvertURLRequestToV8Object(request()),
}; };
v8::Handle<v8::Value> result = g_handlers[request()->url().scheme()]->Call( RefCountedV8Function callback = g_handlers[request()->url().scheme()];
v8::Context::GetCurrent()->Global(), arraysize(argv), argv); v8::Handle<v8::Value> result = callback->NewHandle(node_isolate)->Call(
v8::Context::GetCurrent()->Global(), 1, argv);
// Determine the type of the job we are going to create. // Determine the type of the job we are going to create.
if (result->IsString()) { if (result->IsString()) {
@ -180,9 +180,10 @@ class CustomProtocolHandler : public ProtocolHandler {
} // namespace } // namespace
// static // static
v8::Handle<v8::Value> Protocol::RegisterProtocol(const v8::Arguments& args) { void Protocol::RegisterProtocol(
const v8::FunctionCallbackInfo<v8::Value>& args) {
std::string scheme; std::string scheme;
v8::Persistent<v8::Function> callback; RefCountedV8Function callback;
if (!FromV8Arguments(args, &scheme, &callback)) if (!FromV8Arguments(args, &scheme, &callback))
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
@ -199,12 +200,11 @@ v8::Handle<v8::Value> Protocol::RegisterProtocol(const v8::Arguments& args) {
content::BrowserThread::PostTask(content::BrowserThread::IO, content::BrowserThread::PostTask(content::BrowserThread::IO,
FROM_HERE, FROM_HERE,
base::Bind(&RegisterProtocolInIO, scheme)); base::Bind(&RegisterProtocolInIO, scheme));
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Protocol::UnregisterProtocol(const v8::Arguments& args) { void Protocol::UnregisterProtocol(
const v8::FunctionCallbackInfo<v8::Value>& args) {
std::string scheme; std::string scheme;
if (!FromV8Arguments(args, &scheme)) if (!FromV8Arguments(args, &scheme))
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
@ -221,19 +221,20 @@ v8::Handle<v8::Value> Protocol::UnregisterProtocol(const v8::Arguments& args) {
content::BrowserThread::PostTask(content::BrowserThread::IO, content::BrowserThread::PostTask(content::BrowserThread::IO,
FROM_HERE, FROM_HERE,
base::Bind(&UnregisterProtocolInIO, scheme)); base::Bind(&UnregisterProtocolInIO, scheme));
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Protocol::IsHandledProtocol(const v8::Arguments& args) { void Protocol::IsHandledProtocol(
return ToV8Value(net::URLRequest::IsHandledProtocol(FromV8Value(args[0]))); const v8::FunctionCallbackInfo<v8::Value>& args) {
std::string scheme = FromV8Value(args[0]);
args.GetReturnValue().Set(net::URLRequest::IsHandledProtocol(scheme));
} }
// static // static
v8::Handle<v8::Value> Protocol::InterceptProtocol(const v8::Arguments& args) { void Protocol::InterceptProtocol(
const v8::FunctionCallbackInfo<v8::Value>& args) {
std::string scheme; std::string scheme;
v8::Persistent<v8::Function> callback; RefCountedV8Function callback;
if (!FromV8Arguments(args, &scheme, &callback)) if (!FromV8Arguments(args, &scheme, &callback))
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
@ -252,11 +253,11 @@ v8::Handle<v8::Value> Protocol::InterceptProtocol(const v8::Arguments& args) {
content::BrowserThread::PostTask(content::BrowserThread::IO, content::BrowserThread::PostTask(content::BrowserThread::IO,
FROM_HERE, FROM_HERE,
base::Bind(&InterceptProtocolInIO, scheme)); base::Bind(&InterceptProtocolInIO, scheme));
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Protocol::UninterceptProtocol(const v8::Arguments& args) { void Protocol::UninterceptProtocol(
const v8::FunctionCallbackInfo<v8::Value>& args) {
std::string scheme; std::string scheme;
if (!FromV8Arguments(args, &scheme)) if (!FromV8Arguments(args, &scheme))
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
@ -274,7 +275,6 @@ v8::Handle<v8::Value> Protocol::UninterceptProtocol(const v8::Arguments& args) {
FROM_HERE, FROM_HERE,
base::Bind(&UninterceptProtocolInIO, base::Bind(&UninterceptProtocolInIO,
scheme)); scheme));
return v8::Undefined();
} }
// static // static
@ -361,14 +361,13 @@ void Protocol::UninterceptProtocolInIO(const std::string& scheme) {
// static // static
void Protocol::Initialize(v8::Handle<v8::Object> target) { void Protocol::Initialize(v8::Handle<v8::Object> target) {
// Remember the protocol object, used for emitting event later. // Remember the protocol object, used for emitting event later.
g_protocol_object = v8::Persistent<v8::Object>::New( g_protocol_object.reset(v8::Object::New());
node::node_isolate, target);
node::SetMethod(target, "registerProtocol", RegisterProtocol); NODE_SET_METHOD(target, "registerProtocol", RegisterProtocol);
node::SetMethod(target, "unregisterProtocol", UnregisterProtocol); NODE_SET_METHOD(target, "unregisterProtocol", UnregisterProtocol);
node::SetMethod(target, "isHandledProtocol", IsHandledProtocol); NODE_SET_METHOD(target, "isHandledProtocol", IsHandledProtocol);
node::SetMethod(target, "interceptProtocol", InterceptProtocol); NODE_SET_METHOD(target, "interceptProtocol", InterceptProtocol);
node::SetMethod(target, "uninterceptProtocol", UninterceptProtocol); NODE_SET_METHOD(target, "uninterceptProtocol", UninterceptProtocol);
} }
} // namespace api } // namespace api

View file

@ -20,12 +20,12 @@ class Protocol {
static void Initialize(v8::Handle<v8::Object> target); static void Initialize(v8::Handle<v8::Object> target);
private: private:
static v8::Handle<v8::Value> RegisterProtocol(const v8::Arguments& args); static void RegisterProtocol(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> UnregisterProtocol(const v8::Arguments& args); static void UnregisterProtocol(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsHandledProtocol(const v8::Arguments& args); static void IsHandledProtocol(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> InterceptProtocol(const v8::Arguments& args); static void InterceptProtocol(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> UninterceptProtocol(const v8::Arguments& args); static void UninterceptProtocol(const v8::FunctionCallbackInfo<v8::Value>& args);
static void RegisterProtocolInIO(const std::string& scheme); static void RegisterProtocolInIO(const std::string& scheme);
static void UnregisterProtocolInIO(const std::string& scheme); static void UnregisterProtocolInIO(const std::string& scheme);

View file

@ -4,9 +4,9 @@
#include "browser/api/atom_api_window.h" #include "browser/api/atom_api_window.h"
#include "base/process_util.h" #include "base/process/kill.h"
#include "browser/native_window.h" #include "browser/native_window.h"
#include "common/v8_conversions.h" #include "common/v8/native_type_conversions.h"
#include "content/public/browser/navigation_entry.h" #include "content/public/browser/navigation_entry.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host.h"
@ -14,6 +14,8 @@
#include "ui/gfx/size.h" #include "ui/gfx/size.h"
#include "vendor/node/src/node_buffer.h" #include "vendor/node/src/node_buffer.h"
#include "common/v8/node_common.h"
using content::NavigationController; using content::NavigationController;
using node::ObjectWrap; using node::ObjectWrap;
@ -87,23 +89,20 @@ void Window::OnRendererCrashed() {
Emit("crashed"); Emit("crashed");
} }
void Window::OnCapturePageDone(v8::Persistent<v8::Function> callback, void Window::OnCapturePageDone(const RefCountedV8Function& callback,
const std::vector<unsigned char>& data) { const std::vector<unsigned char>& data) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
// TODO(zcbenz): Use new Buffer API when we updated to node v0.12.x. v8::Local<v8::Value> buffer = node::Buffer::New(
node::Buffer* buffer = node::Buffer::New(
reinterpret_cast<const char*>(data.data()), reinterpret_cast<const char*>(data.data()),
data.size()); data.size());
callback->NewHandle(node_isolate)->Call(
v8::Handle<v8::Value> arg = buffer->handle_; v8::Context::GetCurrent()->Global(), 1, &buffer);
callback->Call(v8::Context::GetCurrent()->Global(), 1, &arg);
callback.Dispose(v8::Isolate::GetCurrent());
} }
// static // static
v8::Handle<v8::Value> Window::New(const v8::Arguments& args) { void Window::New(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope; v8::HandleScope handle_scope(args.GetIsolate());
if (!args.IsConstructCall()) if (!args.IsConstructCall())
return node::ThrowError("Require constructor call"); return node::ThrowError("Require constructor call");
@ -119,12 +118,10 @@ v8::Handle<v8::Value> Window::New(const v8::Arguments& args) {
// Give js code a chance to do initialization. // Give js code a chance to do initialization.
node::MakeCallback(args.This(), "_init", 0, NULL); node::MakeCallback(args.This(), "_init", 0, NULL);
return args.This();
} }
// static // static
v8::Handle<v8::Value> Window::Destroy(const v8::Arguments& args) { void Window::Destroy(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
base::ProcessHandle handle = self->window_->GetRenderProcessHandle(); base::ProcessHandle handle = self->window_->GetRenderProcessHandle();
@ -135,96 +132,70 @@ v8::Handle<v8::Value> Window::Destroy(const v8::Arguments& args) {
if (!base::WaitForSingleProcess(handle, if (!base::WaitForSingleProcess(handle,
base::TimeDelta::FromMilliseconds(500))) base::TimeDelta::FromMilliseconds(500)))
base::KillProcess(handle, 0, true); base::KillProcess(handle, 0, true);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::Close(const v8::Arguments& args) { void Window::Close(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->Close(); self->window_->Close();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::Focus(const v8::Arguments& args) { void Window::Focus(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->Focus(args[0]->IsBoolean() ? args[0]->BooleanValue(): true); self->window_->Focus(args[0]->IsBoolean() ? args[0]->BooleanValue(): true);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::IsFocused(const v8::Arguments& args) { void Window::IsFocused(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
return ToV8Value(self->window_->IsFocused()); args.GetReturnValue().Set(self->window_->IsFocused());
} }
// static // static
v8::Handle<v8::Value> Window::Show(const v8::Arguments& args) { void Window::Show(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->Show(); self->window_->Show();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::Hide(const v8::Arguments& args) { void Window::Hide(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->Hide(); self->window_->Hide();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::IsVisible(const v8::Arguments& args) { void Window::IsVisible(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
return ToV8Value(self->window_->IsVisible()); return args.GetReturnValue().Set(self->window_->IsVisible());
} }
// static // static
v8::Handle<v8::Value> Window::Maximize(const v8::Arguments& args) { void Window::Maximize(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->Maximize(); self->window_->Maximize();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::Unmaximize(const v8::Arguments& args) { void Window::Unmaximize(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->Unmaximize(); self->window_->Unmaximize();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::Minimize(const v8::Arguments& args) { void Window::Minimize(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->Minimize(); self->window_->Minimize();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::Restore(const v8::Arguments& args) { void Window::Restore(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->Restore(); self->window_->Restore();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::SetFullscreen(const v8::Arguments& args) { void Window::SetFullscreen(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
bool fs; bool fs;
@ -232,18 +203,16 @@ v8::Handle<v8::Value> Window::SetFullscreen(const v8::Arguments& args) {
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
self->window_->SetFullscreen(fs); self->window_->SetFullscreen(fs);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::IsFullscreen(const v8::Arguments& args) { void Window::IsFullscreen(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
args.GetReturnValue().Set(self->window_->IsFullscreen());
return ToV8Value(self->window_->IsFullscreen());
} }
// static // static
v8::Handle<v8::Value> Window::SetSize(const v8::Arguments& args) { void Window::SetSize(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
int width, height; int width, height;
@ -251,11 +220,10 @@ v8::Handle<v8::Value> Window::SetSize(const v8::Arguments& args) {
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
self->window_->SetSize(gfx::Size(width, height)); self->window_->SetSize(gfx::Size(width, height));
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::GetSize(const v8::Arguments& args) { void Window::GetSize(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
gfx::Size size = self->window_->GetSize(); gfx::Size size = self->window_->GetSize();
@ -263,11 +231,11 @@ v8::Handle<v8::Value> Window::GetSize(const v8::Arguments& args) {
ret->Set(0, ToV8Value(size.width())); ret->Set(0, ToV8Value(size.width()));
ret->Set(1, ToV8Value(size.height())); ret->Set(1, ToV8Value(size.height()));
return ret; args.GetReturnValue().Set(ret);
} }
// static // static
v8::Handle<v8::Value> Window::SetMinimumSize(const v8::Arguments& args) { void Window::SetMinimumSize(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
int width, height; int width, height;
@ -275,11 +243,10 @@ v8::Handle<v8::Value> Window::SetMinimumSize(const v8::Arguments& args) {
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
self->window_->SetMinimumSize(gfx::Size(width, height)); self->window_->SetMinimumSize(gfx::Size(width, height));
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::GetMinimumSize(const v8::Arguments& args) { void Window::GetMinimumSize(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
gfx::Size size = self->window_->GetMinimumSize(); gfx::Size size = self->window_->GetMinimumSize();
@ -287,24 +254,22 @@ v8::Handle<v8::Value> Window::GetMinimumSize(const v8::Arguments& args) {
ret->Set(0, ToV8Value(size.width())); ret->Set(0, ToV8Value(size.width()));
ret->Set(1, ToV8Value(size.height())); ret->Set(1, ToV8Value(size.height()));
return ret; args.GetReturnValue().Set(ret);
} }
// static // static
v8::Handle<v8::Value> Window::SetMaximumSize(const v8::Arguments& args) { void Window::SetMaximumSize(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
int width, height; int width, height;
if (!FromV8Arguments(args, &width, &height)) if (!FromV8Arguments(args, &width, &height))
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
self->window_->SetMaximumSize(gfx::Size(width, height)); self->window_->SetMaximumSize(gfx::Size(width, height));
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::GetMaximumSize(const v8::Arguments& args) { void Window::GetMaximumSize(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
gfx::Size size = self->window_->GetMaximumSize(); gfx::Size size = self->window_->GetMaximumSize();
@ -312,11 +277,11 @@ v8::Handle<v8::Value> Window::GetMaximumSize(const v8::Arguments& args) {
ret->Set(0, ToV8Value(size.width())); ret->Set(0, ToV8Value(size.width()));
ret->Set(1, ToV8Value(size.height())); ret->Set(1, ToV8Value(size.height()));
return ret; args.GetReturnValue().Set(ret);
} }
// static // static
v8::Handle<v8::Value> Window::SetResizable(const v8::Arguments& args) { void Window::SetResizable(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
bool resizable; bool resizable;
@ -324,18 +289,16 @@ v8::Handle<v8::Value> Window::SetResizable(const v8::Arguments& args) {
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
self->window_->SetResizable(resizable); self->window_->SetResizable(resizable);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::IsResizable(const v8::Arguments& args) { void Window::IsResizable(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
args.GetReturnValue().Set(self->window_->IsResizable());
return ToV8Value(self->window_->IsResizable());
} }
// static // static
v8::Handle<v8::Value> Window::SetAlwaysOnTop(const v8::Arguments& args) { void Window::SetAlwaysOnTop(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
bool top; bool top;
@ -343,27 +306,22 @@ v8::Handle<v8::Value> Window::SetAlwaysOnTop(const v8::Arguments& args) {
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
self->window_->SetAlwaysOnTop(top); self->window_->SetAlwaysOnTop(top);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::IsAlwaysOnTop(const v8::Arguments& args) { void Window::IsAlwaysOnTop(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
args.GetReturnValue().Set(self->window_->IsAlwaysOnTop());
return ToV8Value(self->window_->IsAlwaysOnTop());
} }
// static // static
v8::Handle<v8::Value> Window::Center(const v8::Arguments& args) { void Window::Center(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->Center(); self->window_->Center();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::SetPosition(const v8::Arguments& args) { void Window::SetPosition(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
int x, y; int x, y;
@ -371,11 +329,10 @@ v8::Handle<v8::Value> Window::SetPosition(const v8::Arguments& args) {
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
self->window_->SetPosition(gfx::Point(x, y)); self->window_->SetPosition(gfx::Point(x, y));
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::GetPosition(const v8::Arguments& args) { void Window::GetPosition(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
gfx::Point pos = self->window_->GetPosition(); gfx::Point pos = self->window_->GetPosition();
@ -383,11 +340,11 @@ v8::Handle<v8::Value> Window::GetPosition(const v8::Arguments& args) {
ret->Set(0, ToV8Value(pos.x())); ret->Set(0, ToV8Value(pos.x()));
ret->Set(1, ToV8Value(pos.y())); ret->Set(1, ToV8Value(pos.y()));
return ret; args.GetReturnValue().Set(ret);
} }
// static // static
v8::Handle<v8::Value> Window::SetTitle(const v8::Arguments& args) { void Window::SetTitle(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
std::string title; std::string title;
@ -395,27 +352,23 @@ v8::Handle<v8::Value> Window::SetTitle(const v8::Arguments& args) {
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
self->window_->SetTitle(title); self->window_->SetTitle(title);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::GetTitle(const v8::Arguments& args) { void Window::GetTitle(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
return ToV8Value(self->window_->GetTitle()); args.GetReturnValue().Set(ToV8Value(self->window_->GetTitle()));
} }
// static // static
v8::Handle<v8::Value> Window::FlashFrame(const v8::Arguments& args) { void Window::FlashFrame(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->FlashFrame( self->window_->FlashFrame(
args[0]->IsBoolean() ? args[0]->BooleanValue(): true); args[0]->IsBoolean() ? args[0]->BooleanValue(): true);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::SetKiosk(const v8::Arguments& args) { void Window::SetKiosk(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
bool kiosk; bool kiosk;
@ -423,42 +376,34 @@ v8::Handle<v8::Value> Window::SetKiosk(const v8::Arguments& args) {
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
self->window_->SetKiosk(kiosk); self->window_->SetKiosk(kiosk);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::IsKiosk(const v8::Arguments& args) { void Window::IsKiosk(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
args.GetReturnValue().Set(self->window_->IsKiosk());
return ToV8Value(self->window_->IsKiosk());
} }
// static // static
v8::Handle<v8::Value> Window::OpenDevTools(const v8::Arguments& args) { void Window::OpenDevTools(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->OpenDevTools(); self->window_->OpenDevTools();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::CloseDevTools(const v8::Arguments& args) { void Window::CloseDevTools(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->CloseDevTools(); self->window_->CloseDevTools();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::IsDevToolsOpened(const v8::Arguments& args) { void Window::IsDevToolsOpened(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
return ToV8Value(self->window_->IsDevToolsOpened()); args.GetReturnValue().Set(self->window_->IsDevToolsOpened());
} }
// static // static
v8::Handle<v8::Value> Window::InspectElement(const v8::Arguments& args) { void Window::InspectElement(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
int x, y; int x, y;
@ -466,39 +411,32 @@ v8::Handle<v8::Value> Window::InspectElement(const v8::Arguments& args) {
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
self->window_->InspectElement(x, y); self->window_->InspectElement(x, y);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::FocusOnWebView(const v8::Arguments& args) { void Window::FocusOnWebView(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->FocusOnWebView(); self->window_->FocusOnWebView();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::BlurWebView(const v8::Arguments& args) { void Window::BlurWebView(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->BlurWebView(); self->window_->BlurWebView();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::IsWebViewFocused(const v8::Arguments& args) { void Window::IsWebViewFocused(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
return ToV8Value(self->window_->IsWebViewFocused()); args.GetReturnValue().Set(self->window_->IsWebViewFocused());
} }
// static // static
v8::Handle<v8::Value> Window::CapturePage(const v8::Arguments& args) { void Window::CapturePage(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
gfx::Rect rect; gfx::Rect rect;
v8::Persistent<v8::Function> callback; RefCountedV8Function callback;
if (!FromV8Arguments(args, &rect, &callback) && if (!FromV8Arguments(args, &rect, &callback) &&
!FromV8Arguments(args, &callback)) !FromV8Arguments(args, &callback))
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
@ -506,64 +444,56 @@ v8::Handle<v8::Value> Window::CapturePage(const v8::Arguments& args) {
self->window_->CapturePage(rect, base::Bind(&Window::OnCapturePageDone, self->window_->CapturePage(rect, base::Bind(&Window::OnCapturePageDone,
base::Unretained(self), base::Unretained(self),
callback)); callback));
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::GetPageTitle(const v8::Arguments& args) { void Window::GetPageTitle(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
args.GetReturnValue().Set(ToV8Value(
return ToV8Value(self->window_->GetWebContents()->GetTitle()); self->window_->GetWebContents()->GetTitle()));
} }
// static // static
v8::Handle<v8::Value> Window::IsLoading(const v8::Arguments& args) { void Window::IsLoading(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
args.GetReturnValue().Set(self->window_->GetWebContents()->IsLoading());
return ToV8Value(self->window_->GetWebContents()->IsLoading());
} }
// static // static
v8::Handle<v8::Value> Window::IsWaitingForResponse(const v8::Arguments& args) { void Window::IsWaitingForResponse(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
args.GetReturnValue().Set(
return ToV8Value(self->window_->GetWebContents()->IsWaitingForResponse()); self->window_->GetWebContents()->IsWaitingForResponse());
} }
// static // static
v8::Handle<v8::Value> Window::Stop(const v8::Arguments& args) { void Window::Stop(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
self->window_->GetWebContents()->Stop(); self->window_->GetWebContents()->Stop();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::GetRoutingID(const v8::Arguments& args) { void Window::GetRoutingID(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
args.GetReturnValue().Set(self->window_->GetWebContents()->GetRoutingID());
return ToV8Value(self->window_->GetWebContents()->GetRoutingID());
} }
// static // static
v8::Handle<v8::Value> Window::GetProcessID(const v8::Arguments& args) { void Window::GetProcessID(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
return ToV8Value( args.GetReturnValue().Set(
self->window_->GetWebContents()->GetRenderProcessHost()->GetID()); self->window_->GetWebContents()->GetRenderProcessHost()->GetID());
} }
// static // static
v8::Handle<v8::Value> Window::IsCrashed(const v8::Arguments& args) { void Window::IsCrashed(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
args.GetReturnValue().Set(self->window_->GetWebContents()->IsCrashed());
return ToV8Value(self->window_->GetWebContents()->IsCrashed());
} }
// static // static
v8::Handle<v8::Value> Window::LoadURL(const v8::Arguments& args) { void Window::LoadURL(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
GURL url; GURL url;
@ -577,12 +507,10 @@ v8::Handle<v8::Value> Window::LoadURL(const v8::Arguments& args) {
params.transition_type = content::PAGE_TRANSITION_TYPED; params.transition_type = content::PAGE_TRANSITION_TYPED;
params.override_user_agent = content::NavigationController::UA_OVERRIDE_TRUE; params.override_user_agent = content::NavigationController::UA_OVERRIDE_TRUE;
controller.LoadURLWithParams(params); controller.LoadURLWithParams(params);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::GetURL(const v8::Arguments& args) { void Window::GetURL(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
NavigationController& controller = NavigationController& controller =
@ -591,31 +519,31 @@ v8::Handle<v8::Value> Window::GetURL(const v8::Arguments& args) {
if (controller.GetActiveEntry()) if (controller.GetActiveEntry())
url = controller.GetActiveEntry()->GetVirtualURL(); url = controller.GetActiveEntry()->GetVirtualURL();
return ToV8Value(url); args.GetReturnValue().Set(ToV8Value(url));
} }
// static // static
v8::Handle<v8::Value> Window::CanGoBack(const v8::Arguments& args) { void Window::CanGoBack(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
NavigationController& controller = NavigationController& controller =
self->window_->GetWebContents()->GetController(); self->window_->GetWebContents()->GetController();
return ToV8Value(controller.CanGoBack()); args.GetReturnValue().Set(controller.CanGoBack());
} }
// static // static
v8::Handle<v8::Value> Window::CanGoForward(const v8::Arguments& args) { void Window::CanGoForward(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
NavigationController& controller = NavigationController& controller =
self->window_->GetWebContents()->GetController(); self->window_->GetWebContents()->GetController();
return ToV8Value(controller.CanGoForward()); args.GetReturnValue().Set(controller.CanGoForward());
} }
// static // static
v8::Handle<v8::Value> Window::CanGoToOffset(const v8::Arguments& args) { void Window::CanGoToOffset(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
int offset; int offset;
@ -625,33 +553,29 @@ v8::Handle<v8::Value> Window::CanGoToOffset(const v8::Arguments& args) {
NavigationController& controller = NavigationController& controller =
self->window_->GetWebContents()->GetController(); self->window_->GetWebContents()->GetController();
return ToV8Value(controller.CanGoToOffset(offset)); args.GetReturnValue().Set(controller.CanGoToOffset(offset));
} }
// static // static
v8::Handle<v8::Value> Window::GoBack(const v8::Arguments& args) { void Window::GoBack(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
NavigationController& controller = NavigationController& controller =
self->window_->GetWebContents()->GetController(); self->window_->GetWebContents()->GetController();
controller.GoBack(); controller.GoBack();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::GoForward(const v8::Arguments& args) { void Window::GoForward(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
NavigationController& controller = NavigationController& controller =
self->window_->GetWebContents()->GetController(); self->window_->GetWebContents()->GetController();
controller.GoForward(); controller.GoForward();
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::GoToIndex(const v8::Arguments& args) { void Window::GoToIndex(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
int index; int index;
@ -661,12 +585,10 @@ v8::Handle<v8::Value> Window::GoToIndex(const v8::Arguments& args) {
NavigationController& controller = NavigationController& controller =
self->window_->GetWebContents()->GetController(); self->window_->GetWebContents()->GetController();
controller.GoToIndex(index); controller.GoToIndex(index);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::GoToOffset(const v8::Arguments& args) { void Window::GoToOffset(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
int offset; int offset;
@ -676,36 +598,30 @@ v8::Handle<v8::Value> Window::GoToOffset(const v8::Arguments& args) {
NavigationController& controller = NavigationController& controller =
self->window_->GetWebContents()->GetController(); self->window_->GetWebContents()->GetController();
controller.GoToOffset(offset); controller.GoToOffset(offset);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::Reload(const v8::Arguments& args) { void Window::Reload(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
NavigationController& controller = NavigationController& controller =
self->window_->GetWebContents()->GetController(); self->window_->GetWebContents()->GetController();
controller.Reload(args[0]->IsBoolean() ? args[0]->BooleanValue(): false); controller.Reload(args[0]->IsBoolean() ? args[0]->BooleanValue(): false);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Window::ReloadIgnoringCache(const v8::Arguments& args) { void Window::ReloadIgnoringCache(const v8::FunctionCallbackInfo<v8::Value>& args) {
UNWRAP_WINDOW_AND_CHECK; UNWRAP_WINDOW_AND_CHECK;
NavigationController& controller = NavigationController& controller =
self->window_->GetWebContents()->GetController(); self->window_->GetWebContents()->GetController();
controller.ReloadIgnoringCache( controller.ReloadIgnoringCache(
args[0]->IsBoolean() ? args[0]->BooleanValue(): false); args[0]->IsBoolean() ? args[0]->BooleanValue(): false);
return v8::Undefined();
} }
// static // static
void Window::Initialize(v8::Handle<v8::Object> target) { void Window::Initialize(v8::Handle<v8::Object> target) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(Window::New); v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(Window::New);
t->InstanceTemplate()->SetInternalFieldCount(1); t->InstanceTemplate()->SetInternalFieldCount(1);

View file

@ -10,6 +10,7 @@
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "browser/api/atom_api_event_emitter.h" #include "browser/api/atom_api_event_emitter.h"
#include "browser/native_window_observer.h" #include "browser/native_window_observer.h"
#include "common/v8/scoped_persistent.h"
namespace base { namespace base {
class DictionaryValue; class DictionaryValue;
@ -47,73 +48,73 @@ class Window : public EventEmitter,
virtual void OnRendererCrashed() OVERRIDE; virtual void OnRendererCrashed() OVERRIDE;
private: private:
static v8::Handle<v8::Value> New(const v8::Arguments& args); static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Destroy(const v8::Arguments& args); static void Destroy(const v8::FunctionCallbackInfo<v8::Value>& args);
// APIs for NativeWindow. // APIs for NativeWindow.
static v8::Handle<v8::Value> Close(const v8::Arguments& args); static void Close(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Focus(const v8::Arguments& args); static void Focus(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsFocused(const v8::Arguments& args); static void IsFocused(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Show(const v8::Arguments& args); static void Show(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Hide(const v8::Arguments& args); static void Hide(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsVisible(const v8::Arguments& args); static void IsVisible(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Maximize(const v8::Arguments& args); static void Maximize(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Unmaximize(const v8::Arguments& args); static void Unmaximize(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Minimize(const v8::Arguments& args); static void Minimize(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Restore(const v8::Arguments& args); static void Restore(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetFullscreen(const v8::Arguments& args); static void SetFullscreen(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsFullscreen(const v8::Arguments& args); static void IsFullscreen(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetSize(const v8::Arguments& args); static void SetSize(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetSize(const v8::Arguments& args); static void GetSize(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetMinimumSize(const v8::Arguments& args); static void SetMinimumSize(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetMinimumSize(const v8::Arguments& args); static void GetMinimumSize(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetMaximumSize(const v8::Arguments& args); static void SetMaximumSize(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetMaximumSize(const v8::Arguments& args); static void GetMaximumSize(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetResizable(const v8::Arguments& args); static void SetResizable(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsResizable(const v8::Arguments& args); static void IsResizable(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetAlwaysOnTop(const v8::Arguments& args); static void SetAlwaysOnTop(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsAlwaysOnTop(const v8::Arguments& args); static void IsAlwaysOnTop(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Center(const v8::Arguments& args); static void Center(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetPosition(const v8::Arguments& args); static void SetPosition(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetPosition(const v8::Arguments& args); static void GetPosition(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetTitle(const v8::Arguments& args); static void SetTitle(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetTitle(const v8::Arguments& args); static void GetTitle(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> FlashFrame(const v8::Arguments& args); static void FlashFrame(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SetKiosk(const v8::Arguments& args); static void SetKiosk(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsKiosk(const v8::Arguments& args); static void IsKiosk(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> OpenDevTools(const v8::Arguments& args); static void OpenDevTools(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> CloseDevTools(const v8::Arguments& args); static void CloseDevTools(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsDevToolsOpened(const v8::Arguments& args); static void IsDevToolsOpened(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> InspectElement(const v8::Arguments& args); static void InspectElement(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> FocusOnWebView(const v8::Arguments& args); static void FocusOnWebView(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> BlurWebView(const v8::Arguments& args); static void BlurWebView(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsWebViewFocused(const v8::Arguments& args); static void IsWebViewFocused(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> CapturePage(const v8::Arguments& args); static void CapturePage(const v8::FunctionCallbackInfo<v8::Value>& args);
// APIs for WebContents. // APIs for WebContents.
static v8::Handle<v8::Value> GetPageTitle(const v8::Arguments& args); static void GetPageTitle(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsLoading(const v8::Arguments& args); static void IsLoading(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsWaitingForResponse(const v8::Arguments& args); static void IsWaitingForResponse(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Stop(const v8::Arguments& args); static void Stop(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetRoutingID(const v8::Arguments& args); static void GetRoutingID(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetProcessID(const v8::Arguments& args); static void GetProcessID(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> IsCrashed(const v8::Arguments& args); static void IsCrashed(const v8::FunctionCallbackInfo<v8::Value>& args);
// APIs for NavigationController. // APIs for NavigationController.
static v8::Handle<v8::Value> LoadURL(const v8::Arguments& args); static void LoadURL(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetURL(const v8::Arguments& args); static void GetURL(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> CanGoBack(const v8::Arguments& args); static void CanGoBack(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> CanGoForward(const v8::Arguments& args); static void CanGoForward(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> CanGoToOffset(const v8::Arguments& args); static void CanGoToOffset(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GoBack(const v8::Arguments& args); static void GoBack(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GoForward(const v8::Arguments& args); static void GoForward(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GoToIndex(const v8::Arguments& args); static void GoToIndex(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GoToOffset(const v8::Arguments& args); static void GoToOffset(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Reload(const v8::Arguments& args); static void Reload(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> ReloadIgnoringCache(const v8::Arguments& args); static void ReloadIgnoringCache(const v8::FunctionCallbackInfo<v8::Value>& args);
// Called when capturePage is done. // Called when capturePage is done.
void OnCapturePageDone(v8::Persistent<v8::Function> callback, void OnCapturePageDone(const RefCountedV8Function& callback,
const std::vector<unsigned char>& data); const std::vector<unsigned char>& data);
scoped_ptr<NativeWindow> window_; scoped_ptr<NativeWindow> window_;

View file

@ -8,13 +8,12 @@
#include "base/logging.h" #include "base/logging.h"
#include "browser/api/atom_api_event.h" #include "browser/api/atom_api_event.h"
#include "common/v8_conversions.h" #include "common/v8/native_type_conversions.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "vendor/node/src/node.h"
#include "vendor/node/src/node_internals.h" #include "common/v8/node_common.h"
using content::V8ValueConverter; using content::V8ValueConverter;
using node::node_isolate;
namespace atom { namespace atom {
@ -27,16 +26,14 @@ AtomBrowserBindings::~AtomBrowserBindings() {
void AtomBrowserBindings::AfterLoad() { void AtomBrowserBindings::AfterLoad() {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
v8::Handle<v8::Object> global = node::g_context->Global(); v8::Handle<v8::Object> global = global_env->context()->Global();
v8::Handle<v8::Object> atom = v8::Handle<v8::Object> atom = global->Get(ToV8Value("__atom"))->ToObject();
global->Get(v8::String::New("__atom"))->ToObject();
DCHECK(!atom.IsEmpty()); DCHECK(!atom.IsEmpty());
browser_main_parts_ = v8::Persistent<v8::Object>::New( browser_main_parts_.reset(
node_isolate, atom->Get(ToV8Value("browserMainParts"))->ToObject());
atom->Get(v8::String::New("browserMainParts"))->ToObject());
DCHECK(!browser_main_parts_.IsEmpty()); DCHECK(!browser_main_parts_.IsEmpty());
} }
@ -44,9 +41,7 @@ void AtomBrowserBindings::OnRendererMessage(int process_id,
int routing_id, int routing_id,
const string16& channel, const string16& channel,
const base::ListValue& args) { const base::ListValue& args) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
v8::Handle<v8::Context> context = v8::Context::GetCurrent();
scoped_ptr<V8ValueConverter> converter(new V8ValueConverterImpl()); scoped_ptr<V8ValueConverter> converter(new V8ValueConverterImpl());
@ -56,17 +51,20 @@ void AtomBrowserBindings::OnRendererMessage(int process_id,
arguments.push_back(ToV8Value(channel)); arguments.push_back(ToV8Value(channel));
const base::Value* value; const base::Value* value;
if (args.Get(0, &value)) if (args.Get(0, &value))
arguments.push_back(converter->ToV8Value(value, context)); arguments.push_back(converter->ToV8Value(value, global_env->context()));
arguments.push_back(v8::Integer::New(process_id)); arguments.push_back(v8::Integer::New(process_id));
arguments.push_back(v8::Integer::New(routing_id)); arguments.push_back(v8::Integer::New(routing_id));
for (size_t i = 1; i < args.GetSize(); i++) { for (size_t i = 1; i < args.GetSize(); i++) {
const base::Value* value; const base::Value* value;
if (args.Get(i, &value)) if (args.Get(i, &value))
arguments.push_back(converter->ToV8Value(value, context)); arguments.push_back(converter->ToV8Value(value, global_env->context()));
} }
node::MakeCallback(node::process, "emit", arguments.size(), &arguments[0]); node::MakeCallback(global_env->process_object(),
"emit",
arguments.size(),
&arguments[0]);
} }
void AtomBrowserBindings::OnRendererMessageSync( void AtomBrowserBindings::OnRendererMessageSync(
@ -76,9 +74,7 @@ void AtomBrowserBindings::OnRendererMessageSync(
const base::ListValue& args, const base::ListValue& args,
NativeWindow* sender, NativeWindow* sender,
IPC::Message* message) { IPC::Message* message) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
v8::Handle<v8::Context> context = v8::Context::GetCurrent();
scoped_ptr<V8ValueConverter> converter(new V8ValueConverterImpl()); scoped_ptr<V8ValueConverter> converter(new V8ValueConverterImpl());
@ -92,7 +88,7 @@ void AtomBrowserBindings::OnRendererMessageSync(
arguments.push_back(ToV8Value(channel)); arguments.push_back(ToV8Value(channel));
const base::Value* value; const base::Value* value;
if (args.Get(0, &value)) if (args.Get(0, &value))
arguments.push_back(converter->ToV8Value(value, context)); arguments.push_back(converter->ToV8Value(value, global_env->context()));
arguments.push_back(event); arguments.push_back(event);
arguments.push_back(v8::Integer::New(process_id)); arguments.push_back(v8::Integer::New(process_id));
arguments.push_back(v8::Integer::New(routing_id)); arguments.push_back(v8::Integer::New(routing_id));
@ -100,10 +96,13 @@ void AtomBrowserBindings::OnRendererMessageSync(
for (size_t i = 1; i < args.GetSize(); i++) { for (size_t i = 1; i < args.GetSize(); i++) {
const base::Value* value; const base::Value* value;
if (args.Get(i, &value)) if (args.Get(i, &value))
arguments.push_back(converter->ToV8Value(value, context)); arguments.push_back(converter->ToV8Value(value, global_env->context()));
} }
node::MakeCallback(node::process, "emit", arguments.size(), &arguments[0]); node::MakeCallback(global_env->process_object(),
"emit",
arguments.size(),
&arguments[0]);
} }
} // namespace atom } // namespace atom

View file

@ -7,6 +7,7 @@
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "common/api/atom_bindings.h" #include "common/api/atom_bindings.h"
#include "common/v8/scoped_persistent.h"
namespace base { namespace base {
class ListValue; class ListValue;
@ -44,11 +45,11 @@ class AtomBrowserBindings : public AtomBindings {
// The require('atom').browserMainParts object. // The require('atom').browserMainParts object.
v8::Handle<v8::Object> browser_main_parts() { v8::Handle<v8::Object> browser_main_parts() {
return browser_main_parts_; return browser_main_parts_.NewHandle();
} }
private: private:
v8::Persistent<v8::Object> browser_main_parts_; ScopedPersistent<v8::Object> browser_main_parts_;
DISALLOW_COPY_AND_ASSIGN(AtomBrowserBindings); DISALLOW_COPY_AND_ASSIGN(AtomBrowserBindings);
}; };

View file

@ -7,7 +7,7 @@
#include "browser/atom_browser_context.h" #include "browser/atom_browser_context.h"
#include "browser/atom_browser_main_parts.h" #include "browser/atom_browser_main_parts.h"
#include "browser/net/atom_url_request_context_getter.h" #include "browser/net/atom_url_request_context_getter.h"
#include "webkit/glue/webpreferences.h" #include "webkit/common/webpreferences.h"
namespace atom { namespace atom {

View file

@ -33,6 +33,14 @@ class AtomResourceContext : public content::ResourceContext {
return getter_->GetURLRequestContext(); return getter_->GetURLRequestContext();
} }
virtual bool AllowMicAccess(const GURL& origin) OVERRIDE {
return true;
}
virtual bool AllowCameraAccess(const GURL& origin) OVERRIDE {
return true;
}
private: private:
AtomURLRequestContextGetter* getter_; AtomURLRequestContextGetter* getter_;

View file

@ -4,15 +4,13 @@
#include "browser/atom_browser_main_parts.h" #include "browser/atom_browser_main_parts.h"
#include "base/power_monitor/power_monitor.h"
#include "browser/api/atom_browser_bindings.h" #include "browser/api/atom_browser_bindings.h"
#include "browser/atom_browser_client.h" #include "browser/atom_browser_client.h"
#include "browser/atom_browser_context.h" #include "browser/atom_browser_context.h"
#include "browser/browser.h" #include "browser/browser.h"
#include "common/node_bindings.h" #include "common/node_bindings.h"
#include "net/proxy/proxy_resolver_v8.h"
#include "vendor/node/src/node.h" #include "common/v8/node_common.h"
#include "vendor/node/src/node_internals.h"
namespace atom { namespace atom {
@ -43,19 +41,14 @@ brightray::BrowserContext* AtomBrowserMainParts::CreateBrowserContext() {
void AtomBrowserMainParts::PostEarlyInitialization() { void AtomBrowserMainParts::PostEarlyInitialization() {
brightray::BrowserMainParts::PostEarlyInitialization(); brightray::BrowserMainParts::PostEarlyInitialization();
#if defined(OS_MACOSX) v8::HandleScope handle_scope(node_isolate);
base::PowerMonitor::AllocateSystemIOPorts();
#endif
node_bindings_->Initialize(); node_bindings_->Initialize();
// Wrap whole process in one global context. // Wrap whole process in one global context.
node::g_context->Enter(); global_env->context()->Enter();
atom_bindings_->BindTo(node::process);
node_bindings_->Load();
atom_bindings_->BindTo(global_env->process_object());
atom_bindings_->AfterLoad(); atom_bindings_->AfterLoad();
} }
@ -65,8 +58,8 @@ void AtomBrowserMainParts::PreMainMessageLoopRun() {
brightray::BrowserMainParts::PreMainMessageLoopRun(); brightray::BrowserMainParts::PreMainMessageLoopRun();
{ {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
v8::Context::Scope context_scope(node::g_context); v8::Context::Scope context_scope(global_env->context());
v8::Handle<v8::Value> args; v8::Handle<v8::Value> args;
node::MakeCallback(atom_bindings_->browser_main_parts(), node::MakeCallback(atom_bindings_->browser_main_parts(),
@ -88,10 +81,4 @@ void AtomBrowserMainParts::PreMainMessageLoopRun() {
#endif #endif
} }
int AtomBrowserMainParts::PreCreateThreads() {
// TODO(zcbenz): Calling CreateIsolate() on Windows when updated to Chrome30.
net::ProxyResolverV8::RememberDefaultIsolate();
return 0;
}
} // namespace atom } // namespace atom

View file

@ -30,7 +30,6 @@ class AtomBrowserMainParts : public brightray::BrowserMainParts {
// Implementations of content::BrowserMainParts. // Implementations of content::BrowserMainParts.
virtual void PostEarlyInitialization() OVERRIDE; virtual void PostEarlyInitialization() OVERRIDE;
virtual void PreMainMessageLoopRun() OVERRIDE; virtual void PreMainMessageLoopRun() OVERRIDE;
virtual int PreCreateThreads() OVERRIDE;
#if defined(OS_MACOSX) #if defined(OS_MACOSX)
virtual void PreMainMessageLoopStart() OVERRIDE; virtual void PreMainMessageLoopStart() OVERRIDE;
virtual void PostDestroyThreads() OVERRIDE; virtual void PostDestroyThreads() OVERRIDE;

View file

@ -4,7 +4,7 @@
#include "browser/atom_javascript_dialog_manager.h" #include "browser/atom_javascript_dialog_manager.h"
#include "base/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
namespace atom { namespace atom {

View file

@ -26,7 +26,9 @@ class AtomJavaScriptDialogManager : public content::JavaScriptDialogManager {
const string16& message_text, const string16& message_text,
bool is_reload, bool is_reload,
const DialogClosedCallback& callback) OVERRIDE; const DialogClosedCallback& callback) OVERRIDE;
virtual void ResetJavaScriptState( virtual void CancelActiveAndPendingDialogs(
content::WebContents* web_contents) OVERRIDE {}
virtual void WebContentsDestroyed(
content::WebContents* web_contents) OVERRIDE {} content::WebContents* web_contents) OVERRIDE {}
}; };

View file

@ -7,9 +7,9 @@
#include <string> #include <string>
#include "base/file_util.h" #include "base/file_util.h"
#include "base/message_loop.h" #include "base/message_loop/message_loop.h"
#include "base/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/values.h" #include "base/values.h"
#include "brightray/browser/inspectable_web_contents.h" #include "brightray/browser/inspectable_web_contents.h"
#include "brightray/browser/inspectable_web_contents_view.h" #include "brightray/browser/inspectable_web_contents_view.h"
@ -37,8 +37,7 @@
#include "ui/gfx/point.h" #include "ui/gfx/point.h"
#include "ui/gfx/rect.h" #include "ui/gfx/rect.h"
#include "ui/gfx/size.h" #include "ui/gfx/size.h"
#include "webkit/glue/image_decoder.h" #include "webkit/common/user_agent/user_agent_util.h"
#include "webkit/user_agent/user_agent_util.h"
using content::NavigationEntry; using content::NavigationEntry;
@ -165,7 +164,7 @@ void NativeWindow::CloseDevTools() {
} }
bool NativeWindow::IsDevToolsOpened() { bool NativeWindow::IsDevToolsOpened() {
return inspectable_web_contents()->IsDevToolsOpened(); return inspectable_web_contents()->IsDevToolsViewShowing();
} }
void NativeWindow::InspectElement(int x, int y) { void NativeWindow::InspectElement(int x, int y) {
@ -193,15 +192,14 @@ bool NativeWindow::SetIcon(const std::string& str_path) {
// Read the file from disk. // Read the file from disk.
std::string file_contents; std::string file_contents;
if (path.empty() || !file_util::ReadFileToString(path, &file_contents)) if (path.empty() || !base::ReadFileToString(path, &file_contents))
return false; return false;
// Decode the bitmap using WebKit's image decoder. // Decode the bitmap using WebKit's image decoder.
const unsigned char* data = const unsigned char* data =
reinterpret_cast<const unsigned char*>(file_contents.data()); reinterpret_cast<const unsigned char*>(file_contents.data());
webkit_glue::ImageDecoder decoder;
scoped_ptr<SkBitmap> decoded(new SkBitmap()); scoped_ptr<SkBitmap> decoded(new SkBitmap());
*decoded = decoder.Decode(data, file_contents.length()); gfx::PNGCodec::Decode(data, file_contents.length(), decoded.get());
if (decoded->empty()) if (decoded->empty())
return false; // Unable to decode. return false; // Unable to decode.
@ -383,6 +381,21 @@ void NativeWindow::RendererResponsive(content::WebContents* source) {
FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnRendererResponsive()); FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnRendererResponsive());
} }
void NativeWindow::RenderViewDeleted(content::RenderViewHost* rvh) {
FOR_EACH_OBSERVER(NativeWindowObserver, observers_,
OnRenderViewDeleted(rvh->GetProcess()->GetID(),
rvh->GetRoutingID()));
}
void NativeWindow::RenderProcessGone(base::TerminationStatus status) {
FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnRendererCrashed());
}
void NativeWindow::BeforeUnloadFired(const base::TimeTicks& proceed_time) {
// Do nothing, we override this method just to avoid compilation error since
// there are two virtual functions named BeforeUnloadFired.
}
bool NativeWindow::OnMessageReceived(const IPC::Message& message) { bool NativeWindow::OnMessageReceived(const IPC::Message& message) {
bool handled = true; bool handled = true;
IPC_BEGIN_MESSAGE_MAP(NativeWindow, message) IPC_BEGIN_MESSAGE_MAP(NativeWindow, message)
@ -397,16 +410,6 @@ bool NativeWindow::OnMessageReceived(const IPC::Message& message) {
return handled; return handled;
} }
void NativeWindow::RenderViewDeleted(content::RenderViewHost* rvh) {
FOR_EACH_OBSERVER(NativeWindowObserver, observers_,
OnRenderViewDeleted(rvh->GetProcess()->GetID(),
rvh->GetRoutingID()));
}
void NativeWindow::RenderViewGone(base::TerminationStatus status) {
FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnRendererCrashed());
}
void NativeWindow::Observe(int type, void NativeWindow::Observe(int type,
const content::NotificationSource& source, const content::NotificationSource& source,
const content::NotificationDetails& details) { const content::NotificationDetails& details) {

View file

@ -184,7 +184,8 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
// Implementations of content::WebContentsObserver. // Implementations of content::WebContentsObserver.
virtual void RenderViewDeleted(content::RenderViewHost*) OVERRIDE; virtual void RenderViewDeleted(content::RenderViewHost*) OVERRIDE;
virtual void RenderViewGone(base::TerminationStatus status) OVERRIDE; virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE;
virtual void BeforeUnloadFired(const base::TimeTicks& proceed_time) OVERRIDE;
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
// Implementations of content::NotificationObserver // Implementations of content::NotificationObserver

View file

@ -11,6 +11,7 @@
#define BASE_MAC_FOUNDATION_UTIL_H_ #define BASE_MAC_FOUNDATION_UTIL_H_
#include "base/mac/mac_util.h" #include "base/mac/mac_util.h"
#include "base/mac/scoped_nsobject.h"
#include "base/strings/sys_string_conversions.h" #include "base/strings/sys_string_conversions.h"
#include "base/values.h" #include "base/values.h"
#import "browser/ui/atom_event_processing_window.h" #import "browser/ui/atom_event_processing_window.h"
@ -490,7 +491,7 @@ void NativeWindowMac::InstallDraggableRegionViews() {
// Note that [webView subviews] returns the view's mutable internal array and // Note that [webView subviews] returns the view's mutable internal array and
// it should be copied to avoid mutating the original array while enumerating // it should be copied to avoid mutating the original array while enumerating
// it. // it.
scoped_nsobject<NSArray> subviews([[webView subviews] copy]); base::scoped_nsobject<NSArray> subviews([[webView subviews] copy]);
for (NSView* subview in subviews.get()) for (NSView* subview in subviews.get())
if ([subview isKindOfClass:[ControlRegionView class]]) if ([subview isKindOfClass:[ControlRegionView class]])
[subview removeFromSuperview]; [subview removeFromSuperview];
@ -501,7 +502,7 @@ void NativeWindowMac::InstallDraggableRegionViews() {
system_drag_exclude_areas_.begin(); system_drag_exclude_areas_.begin();
iter != system_drag_exclude_areas_.end(); iter != system_drag_exclude_areas_.end();
++iter) { ++iter) {
scoped_nsobject<NSView> controlRegion( base::scoped_nsobject<NSView> controlRegion(
[[ControlRegionView alloc] initWithShellWindow:this]); [[ControlRegionView alloc] initWithShellWindow:this]);
[controlRegion setFrame:NSMakeRect(iter->x(), [controlRegion setFrame:NSMakeRect(iter->x(),
webViewHeight - iter->bottom(), webViewHeight - iter->bottom(),

View file

@ -4,6 +4,7 @@
#include "browser/net/adapter_request_job.h" #include "browser/net/adapter_request_job.h"
#include "base/threading/sequenced_worker_pool.h"
#include "browser/net/url_request_string_job.h" #include "browser/net/url_request_string_job.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
@ -87,7 +88,13 @@ void AdapterRequestJob::CreateStringJobAndStart(const std::string& mime_type,
void AdapterRequestJob::CreateFileJobAndStart(const base::FilePath& path) { void AdapterRequestJob::CreateFileJobAndStart(const base::FilePath& path) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
real_job_ = new net::URLRequestFileJob(request(), network_delegate(), path); real_job_ = new net::URLRequestFileJob(
request(),
network_delegate(),
path,
content::BrowserThread::GetBlockingPool()->
GetTaskRunnerWithShutdownBehavior(
base::SequencedWorkerPool::SKIP_ON_SHUTDOWN));
real_job_->Start(); real_job_->Start();
} }

View file

@ -4,7 +4,8 @@
#include "browser/net/atom_url_request_context_getter.h" #include "browser/net/atom_url_request_context_getter.h"
#include "base/string_util.h" #include "base/strings/string_util.h"
#include "base/threading/sequenced_worker_pool.h"
#include "base/threading/worker_pool.h" #include "base/threading/worker_pool.h"
#include "browser/net/atom_url_request_job_factory.h" #include "browser/net/atom_url_request_job_factory.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
@ -36,8 +37,8 @@ using content::BrowserThread;
AtomURLRequestContextGetter::AtomURLRequestContextGetter( AtomURLRequestContextGetter::AtomURLRequestContextGetter(
const base::FilePath& base_path, const base::FilePath& base_path,
MessageLoop* io_loop, base::MessageLoop* io_loop,
MessageLoop* file_loop, base::MessageLoop* file_loop,
scoped_ptr<brightray::NetworkDelegate> network_delegate, scoped_ptr<brightray::NetworkDelegate> network_delegate,
content::ProtocolHandlerMap* protocol_handlers) content::ProtocolHandlerMap* protocol_handlers)
: base_path_(base_path), : base_path_(base_path),
@ -74,6 +75,7 @@ net::URLRequestContext* AtomURLRequestContextGetter::GetURLRequestContext() {
base_path_.Append(FILE_PATH_LITERAL("Cookies")), base_path_.Append(FILE_PATH_LITERAL("Cookies")),
false, false,
nullptr, nullptr,
nullptr,
nullptr)); nullptr));
storage_->set_server_bound_cert_service(new net::ServerBoundCertService( storage_->set_server_bound_cert_service(new net::ServerBoundCertService(
new net::DefaultServerBoundCertStore(NULL), new net::DefaultServerBoundCertStore(NULL),
@ -98,7 +100,9 @@ net::URLRequestContext* AtomURLRequestContextGetter::GetURLRequestContext() {
storage_->set_ssl_config_service(new net::SSLConfigServiceDefaults); storage_->set_ssl_config_service(new net::SSLConfigServiceDefaults);
storage_->set_http_auth_handler_factory( storage_->set_http_auth_handler_factory(
net::HttpAuthHandlerFactory::CreateDefault(host_resolver.get())); net::HttpAuthHandlerFactory::CreateDefault(host_resolver.get()));
storage_->set_http_server_properties(new net::HttpServerPropertiesImpl); scoped_ptr<net::HttpServerProperties> server_properties(
new net::HttpServerPropertiesImpl);
storage_->set_http_server_properties(server_properties.Pass());
base::FilePath cache_path = base_path_.Append(FILE_PATH_LITERAL("Cache")); base::FilePath cache_path = base_path_.Append(FILE_PATH_LITERAL("Cache"));
net::HttpCache::DefaultBackend* main_backend = net::HttpCache::DefaultBackend* main_backend =
@ -147,10 +151,15 @@ net::URLRequestContext* AtomURLRequestContextGetter::GetURLRequestContext() {
} }
protocol_handlers_.clear(); protocol_handlers_.clear();
scoped_ptr<net::FileProtocolHandler> file_protocol_handler(
new net::FileProtocolHandler(
content::BrowserThread::GetBlockingPool()->
GetTaskRunnerWithShutdownBehavior(
base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)));
job_factory_->SetProtocolHandler(chrome::kDataScheme, job_factory_->SetProtocolHandler(chrome::kDataScheme,
new net::DataProtocolHandler); new net::DataProtocolHandler);
job_factory_->SetProtocolHandler(chrome::kFileScheme, job_factory_->SetProtocolHandler(chrome::kFileScheme,
new net::FileProtocolHandler); file_protocol_handler.release());
storage_->set_job_factory(job_factory_); storage_->set_job_factory(job_factory_);
} }

View file

@ -6,7 +6,6 @@
#include "browser/net/atom_url_request_job_factory.h" #include "browser/net/atom_url_request_job_factory.h"
#include "base/stl_util.h" #include "base/stl_util.h"
#include "googleurl/src/gurl.h"
#include "net/base/load_flags.h" #include "net/base/load_flags.h"
#include "net/url_request/url_request.h" #include "net/url_request/url_request.h"
@ -102,4 +101,9 @@ bool AtomURLRequestJobFactory::IsHandledURL(const GURL& url) const {
return IsHandledProtocol(url.scheme()); return IsHandledProtocol(url.scheme());
} }
bool AtomURLRequestJobFactory::IsSafeRedirectTarget(
const GURL& location) const {
return IsHandledURL(location);
}
} // namespace atom } // namespace atom

View file

@ -45,6 +45,7 @@ class AtomURLRequestJobFactory : public net::URLRequestJobFactory {
net::NetworkDelegate* network_delegate) const OVERRIDE; net::NetworkDelegate* network_delegate) const OVERRIDE;
virtual bool IsHandledProtocol(const std::string& scheme) const OVERRIDE; virtual bool IsHandledProtocol(const std::string& scheme) const OVERRIDE;
virtual bool IsHandledURL(const GURL& url) const OVERRIDE; virtual bool IsHandledURL(const GURL& url) const OVERRIDE;
virtual bool IsSafeRedirectTarget(const GURL& location) const OVERRIDE;
private: private:
typedef std::map<std::string, ProtocolHandler*> ProtocolHandlerMap; typedef std::map<std::string, ProtocolHandler*> ProtocolHandlerMap;

View file

@ -8,7 +8,7 @@
#include <string> #include <string>
#include "base/string_util.h" #include "base/strings/string_util.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h" #include "base/strings/string_split.h"
#include "ui/base/accelerators/accelerator.h" #include "ui/base/accelerators/accelerator.h"

View file

@ -6,7 +6,7 @@
#include "ui/base/accelerators/accelerator.h" #include "ui/base/accelerators/accelerator.h"
#import "ui/base/accelerators/platform_accelerator_cocoa.h" #import "ui/base/accelerators/platform_accelerator_cocoa.h"
#import "ui/base/keycodes/keyboard_code_conversion_mac.h" #import "ui/events/keycodes/keyboard_code_conversion_mac.h"
namespace accelerator_util { namespace accelerator_util {

View file

@ -7,8 +7,6 @@
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
#include "base/memory/scoped_nsobject.h"
// Override NSWindow to access unhandled keyboard events (for command // Override NSWindow to access unhandled keyboard events (for command
// processing); subclassing NSWindow is the only method to do // processing); subclassing NSWindow is the only method to do
// this. // this.

View file

@ -8,7 +8,7 @@
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
#include "base/memory/scoped_nsobject.h" #include "base/mac/scoped_nsobject.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
namespace ui { namespace ui {
@ -24,7 +24,7 @@ class MenuModel;
@interface AtomMenuController : NSObject<NSMenuDelegate> { @interface AtomMenuController : NSObject<NSMenuDelegate> {
@protected @protected
ui::MenuModel* model_; // weak ui::MenuModel* model_; // weak
scoped_nsobject<NSMenu> menu_; base::scoped_nsobject<NSMenu> menu_;
BOOL isMenuOpen_; BOOL isMenuOpen_;
} }

View file

@ -133,7 +133,7 @@ int EventFlagsFromNSEvent(NSEvent* event) {
fromModel:(ui::MenuModel*)model { fromModel:(ui::MenuModel*)model {
string16 label16 = model->GetLabelAt(index); string16 label16 = model->GetLabelAt(index);
NSString* label = l10n_util::FixUpWindowsStyleLabel(label16); NSString* label = l10n_util::FixUpWindowsStyleLabel(label16);
scoped_nsobject<NSMenuItem> item( base::scoped_nsobject<NSMenuItem> item(
[[NSMenuItem alloc] initWithTitle:label [[NSMenuItem alloc] initWithTitle:label
action:@selector(itemSelected:) action:@selector(itemSelected:)
keyEquivalent:@""]); keyEquivalent:@""]);

View file

@ -24,7 +24,7 @@ void SetupDialog(NSSavePanel* dialog,
NSString* default_dir = nil; NSString* default_dir = nil;
NSString* default_filename = nil; NSString* default_filename = nil;
if (!default_path.empty()) { if (!default_path.empty()) {
if (file_util::DirectoryExists(default_path)) { if (base::DirectoryExists(default_path)) {
default_dir = base::SysUTF8ToNSString(default_path.value()); default_dir = base::SysUTF8ToNSString(default_path.value());
} else { } else {
default_dir = base::SysUTF8ToNSString(default_path.DirName().value()); default_dir = base::SysUTF8ToNSString(default_path.DirName().value());

View file

@ -6,92 +6,81 @@
#include <string> #include <string>
#include "common/v8/native_type_conversions.h"
#include "ui/base/clipboard/clipboard.h" #include "ui/base/clipboard/clipboard.h"
#include "vendor/node/src/node.h"
#include "common/v8/node_common.h"
namespace atom { namespace atom {
namespace api { namespace api {
// static // static
v8::Handle<v8::Value> Clipboard::Has(const v8::Arguments& args) { void Clipboard::Has(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope; std::string format_string;
if (!FromV8Arguments(args, &format_string))
if (!args[0]->IsString())
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread(); ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
std::string format_string(*v8::String::Utf8Value(args[0]));
ui::Clipboard::FormatType format(ui::Clipboard::GetFormatType(format_string)); ui::Clipboard::FormatType format(ui::Clipboard::GetFormatType(format_string));
return scope.Close(v8::Boolean::New( args.GetReturnValue().Set(
clipboard->IsFormatAvailable(format, ui::Clipboard::BUFFER_STANDARD))); clipboard->IsFormatAvailable(format, ui::Clipboard::BUFFER_STANDARD));
} }
// static // static
v8::Handle<v8::Value> Clipboard::Read(const v8::Arguments& args) { void Clipboard::Read(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope; std::string format_string;
if (!FromV8Arguments(args, &format_string))
if (!args[0]->IsString())
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread(); ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
std::string format_string(*v8::String::Utf8Value(args[0]));
ui::Clipboard::FormatType format(ui::Clipboard::GetFormatType(format_string)); ui::Clipboard::FormatType format(ui::Clipboard::GetFormatType(format_string));
std::string data; std::string data;
clipboard->ReadData(format, &data); clipboard->ReadData(format, &data);
return scope.Close(v8::String::New(data.c_str(), data.size())); args.GetReturnValue().Set(ToV8Value(data));
} }
// static // static
v8::Handle<v8::Value> Clipboard::ReadText(const v8::Arguments& args) { void Clipboard::ReadText(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread(); ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
std::string data; std::string data;
clipboard->ReadAsciiText(ui::Clipboard::BUFFER_STANDARD, &data); clipboard->ReadAsciiText(ui::Clipboard::BUFFER_STANDARD, &data);
return scope.Close(v8::String::New(data.c_str(), data.size())); args.GetReturnValue().Set(ToV8Value(data));
} }
// static // static
v8::Handle<v8::Value> Clipboard::WriteText(const v8::Arguments& args) { void Clipboard::WriteText(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope; std::string text;
if (!FromV8Arguments(args, &text))
if (!args[0]->IsString())
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
std::string text(*v8::String::Utf8Value(args[0]));
ui::Clipboard::ObjectMap object_map; ui::Clipboard::ObjectMap object_map;
object_map[ui::Clipboard::CBF_TEXT].push_back( object_map[ui::Clipboard::CBF_TEXT].push_back(
std::vector<char>(text.begin(), text.end())); std::vector<char>(text.begin(), text.end()));
clipboard->WriteObjects(ui::Clipboard::BUFFER_STANDARD, object_map, NULL);
return v8::Undefined(); ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
clipboard->WriteObjects(ui::Clipboard::BUFFER_STANDARD, object_map);
} }
// static // static
v8::Handle<v8::Value> Clipboard::Clear(const v8::Arguments& args) { void Clipboard::Clear(const v8::FunctionCallbackInfo<v8::Value>& args) {
ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread(); ui::Clipboard::GetForCurrentThread()->Clear(ui::Clipboard::BUFFER_STANDARD);
clipboard->Clear(ui::Clipboard::BUFFER_STANDARD);
return v8::Undefined();
} }
// static // static
void Clipboard::Initialize(v8::Handle<v8::Object> target) { void Clipboard::Initialize(v8::Handle<v8::Object> target) {
node::SetMethod(target, "has", Has); v8::HandleScope handle_scope(node_isolate);
node::SetMethod(target, "read", Read);
node::SetMethod(target, "readText", ReadText); NODE_SET_METHOD(target, "has", Has);
node::SetMethod(target, "writeText", WriteText); NODE_SET_METHOD(target, "read", Read);
node::SetMethod(target, "clear", Clear); NODE_SET_METHOD(target, "readText", ReadText);
NODE_SET_METHOD(target, "writeText", WriteText);
NODE_SET_METHOD(target, "clear", Clear);
} }
} // namespace api } // namespace api

View file

@ -17,11 +17,11 @@ class Clipboard {
static void Initialize(v8::Handle<v8::Object> target); static void Initialize(v8::Handle<v8::Object> target);
private: private:
static v8::Handle<v8::Value> Has(const v8::Arguments& args); static void Has(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Read(const v8::Arguments& args); static void Read(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> ReadText(const v8::Arguments& args); static void ReadText(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> WriteText(const v8::Arguments& args); static void WriteText(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Clear(const v8::Arguments& args); static void Clear(const v8::FunctionCallbackInfo<v8::Value>& args);
DISALLOW_IMPLICIT_CONSTRUCTORS(Clipboard); DISALLOW_IMPLICIT_CONSTRUCTORS(Clipboard);
}; };

View file

@ -5,16 +5,16 @@
#include "common/api/atom_api_crash_reporter.h" #include "common/api/atom_api_crash_reporter.h"
#include "common/crash_reporter/crash_reporter.h" #include "common/crash_reporter/crash_reporter.h"
#include "common/v8_conversions.h" #include "common/v8/native_type_conversions.h"
#include "vendor/node/src/node.h"
#include "vendor/node/src/node_internals.h" #include "common/v8/node_common.h"
namespace atom { namespace atom {
namespace api { namespace api {
// static // static
v8::Handle<v8::Value> CrashReporter::Start(const v8::Arguments& args) { void CrashReporter::Start(const v8::FunctionCallbackInfo<v8::Value>& args) {
std::string product_name, company_name, submit_url; std::string product_name, company_name, submit_url;
bool auto_submit, skip_system; bool auto_submit, skip_system;
std::map<std::string, std::string> dict; std::map<std::string, std::string> dict;
@ -24,13 +24,11 @@ v8::Handle<v8::Value> CrashReporter::Start(const v8::Arguments& args) {
crash_reporter::CrashReporter::GetInstance()->Start( crash_reporter::CrashReporter::GetInstance()->Start(
product_name, company_name, submit_url, auto_submit, skip_system, dict); product_name, company_name, submit_url, auto_submit, skip_system, dict);
return v8::Undefined();
} }
// static // static
void CrashReporter::Initialize(v8::Handle<v8::Object> target) { void CrashReporter::Initialize(v8::Handle<v8::Object> target) {
node::SetMethod(target, "start", Start); NODE_SET_METHOD(target, "start", Start);
} }
} // namespace api } // namespace api

View file

@ -17,7 +17,7 @@ class CrashReporter {
static void Initialize(v8::Handle<v8::Object> target); static void Initialize(v8::Handle<v8::Object> target);
private: private:
static v8::Handle<v8::Value> Start(const v8::Arguments& args); static void Start(const v8::FunctionCallbackInfo<v8::Value>& args);
DISALLOW_IMPLICIT_CONSTRUCTORS(CrashReporter); DISALLOW_IMPLICIT_CONSTRUCTORS(CrashReporter);
}; };

View file

@ -5,7 +5,11 @@
#include "common/api/atom_api_id_weak_map.h" #include "common/api/atom_api_id_weak_map.h"
#include <algorithm>
#include "base/logging.h" #include "base/logging.h"
#include "common/v8/native_type_conversions.h"
#include "common/v8/node_common.h"
namespace atom { namespace atom {
@ -16,29 +20,17 @@ IDWeakMap::IDWeakMap()
} }
IDWeakMap::~IDWeakMap() { IDWeakMap::~IDWeakMap() {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
auto copied_map = map_;
for (auto el = copied_map.begin(); el != copied_map.end(); ++el)
Erase(isolate, el->first);
} }
bool IDWeakMap::Has(int key) const { bool IDWeakMap::Has(int key) const {
return map_.find(key) != map_.end(); return map_.find(key) != map_.end();
} }
void IDWeakMap::Erase(v8::Isolate* isolate, int key) { void IDWeakMap::Erase(int key) {
if (!Has(key)) { if (Has(key))
map_.erase(key);
else
LOG(WARNING) << "Object with key " << key << " is being GCed for twice."; LOG(WARNING) << "Object with key " << key << " is being GCed for twice.";
return;
}
v8::Persistent<v8::Value> value = map_[key];
value.ClearWeak(isolate);
value.Dispose(isolate);
value.Clear();
map_.erase(key);
} }
int IDWeakMap::GetNextID() { int IDWeakMap::GetNextID() {
@ -47,104 +39,93 @@ int IDWeakMap::GetNextID() {
// static // static
void IDWeakMap::WeakCallback(v8::Isolate* isolate, void IDWeakMap::WeakCallback(v8::Isolate* isolate,
v8::Persistent<v8::Value> value, v8::Persistent<v8::Object>* value,
void *data) { IDWeakMap* self) {
v8::HandleScope scope; v8::HandleScope handle_scope(isolate);
v8::Local<v8::Object> local = v8::Local<v8::Object>::New(isolate, *value);
IDWeakMap* obj = static_cast<IDWeakMap*>(data); self->Erase(
int key = value->ToObject()->GetHiddenValue( FromV8Value(local->GetHiddenValue(v8::String::New("IDWeakMapKey"))));
v8::String::New("IDWeakMapKey"))->IntegerValue();
obj->Erase(isolate, key);
} }
// static // static
v8::Handle<v8::Value> IDWeakMap::New(const v8::Arguments& args) { void IDWeakMap::New(const v8::FunctionCallbackInfo<v8::Value>& args) {
IDWeakMap* obj = new IDWeakMap(); (new IDWeakMap)->Wrap(args.This());
obj->Wrap(args.This());
return args.This();
} }
// static // static
v8::Handle<v8::Value> IDWeakMap::Add(const v8::Arguments& args) { void IDWeakMap::Add(const v8::FunctionCallbackInfo<v8::Value>& args) {
if (!args[0]->IsObject()) if (!args[0]->IsObject())
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
v8::Isolate* isolate = v8::Isolate::GetCurrent(); IDWeakMap* self = Unwrap<IDWeakMap>(args.This());
IDWeakMap* obj = ObjectWrap::Unwrap<IDWeakMap>(args.This());
int key = obj->GetNextID();
v8::Handle<v8::Value> v8_key = v8::Integer::New(key); int key = self->GetNextID();
v8::Persistent<v8::Value> value = v8::Local<v8::Object> v8_value = args[0]->ToObject();
v8::Persistent<v8::Value>::New(isolate, args[0]); v8_value->SetHiddenValue(v8::String::New("IDWeakMapKey"), ToV8Value(key));
value->ToObject()->SetHiddenValue(v8::String::New("IDWeakMapKey"), v8_key); RefCountedV8Object& value = self->map_[key];
value.MakeWeak(isolate, obj, WeakCallback); value->reset(v8_value);
obj->map_[key] = value; value->MakeWeak(self, WeakCallback);
return v8_key; args.GetReturnValue().Set(key);
} }
// static // static
v8::Handle<v8::Value> IDWeakMap::Get(const v8::Arguments& args) { void IDWeakMap::Get(const v8::FunctionCallbackInfo<v8::Value>& args) {
if (!args[0]->IsNumber()) int key;
if (!FromV8Arguments(args, &key))
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
IDWeakMap* obj = ObjectWrap::Unwrap<IDWeakMap>(args.This()); IDWeakMap* self = Unwrap<IDWeakMap>(args.This());
if (!self->Has(key))
int key = args[0]->IntegerValue();
if (!obj->Has(key))
return node::ThrowError("Invalid key"); return node::ThrowError("Invalid key");
return obj->map_[key]; args.GetReturnValue().Set(self->map_[key]->NewHandle());
} }
// static // static
v8::Handle<v8::Value> IDWeakMap::Has(const v8::Arguments& args) { void IDWeakMap::Has(const v8::FunctionCallbackInfo<v8::Value>& args) {
if (!args[0]->IsNumber()) int key;
if (!FromV8Arguments(args, &key))
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
IDWeakMap* obj = ObjectWrap::Unwrap<IDWeakMap>(args.This()); IDWeakMap* self = Unwrap<IDWeakMap>(args.This());
args.GetReturnValue().Set(self->Has(key));
int key = args[0]->IntegerValue();
return v8::Boolean::New(obj->Has(key));
} }
// static // static
v8::Handle<v8::Value> IDWeakMap::Keys(const v8::Arguments& args) { void IDWeakMap::Keys(const v8::FunctionCallbackInfo<v8::Value>& args) {
IDWeakMap* obj = ObjectWrap::Unwrap<IDWeakMap>(args.This()); IDWeakMap* self = Unwrap<IDWeakMap>(args.This());
v8::Handle<v8::Array> keys = v8::Array::New(obj->map_.size()); v8::Local<v8::Array> keys = v8::Array::New(self->map_.size());
int i = 0; int i = 0;
for (auto el = obj->map_.begin(); el != obj->map_.end(); ++el) { for (auto el = self->map_.begin(); el != self->map_.end(); ++el) {
keys->Set(i, v8::Integer::New(el->first)); keys->Set(i, ToV8Value(el->first));
++i; ++i;
} }
return keys; args.GetReturnValue().Set(keys);
} }
// static // static
v8::Handle<v8::Value> IDWeakMap::Remove(const v8::Arguments& args) { void IDWeakMap::Remove(const v8::FunctionCallbackInfo<v8::Value>& args) {
if (!args[0]->IsNumber()) int key;
if (!FromV8Arguments(args, &key))
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
IDWeakMap* obj = ObjectWrap::Unwrap<IDWeakMap>(args.This()); IDWeakMap* self = Unwrap<IDWeakMap>(args.This());
if (!self->Has(key))
int key = args[0]->IntegerValue();
if (!obj->Has(key))
return node::ThrowError("Invalid key"); return node::ThrowError("Invalid key");
obj->Erase(v8::Isolate::GetCurrent(), key); self->Erase(key);
return v8::Undefined();
} }
// static // static
void IDWeakMap::Initialize(v8::Handle<v8::Object> target) { void IDWeakMap::Initialize(v8::Handle<v8::Object> target) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(IDWeakMap::New); v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(New);
t->InstanceTemplate()->SetInternalFieldCount(1); t->InstanceTemplate()->SetInternalFieldCount(1);
t->SetClassName(v8::String::NewSymbol("IDWeakMap")); t->SetClassName(v8::String::NewSymbol("IDWeakMap"));

View file

@ -9,6 +9,7 @@
#include <map> #include <map>
#include "base/basictypes.h" #include "base/basictypes.h"
#include "common/v8/scoped_persistent.h"
#include "vendor/node/src/node_object_wrap.h" #include "vendor/node/src/node_object_wrap.h"
namespace atom { namespace atom {
@ -24,23 +25,22 @@ class IDWeakMap : public node::ObjectWrap {
virtual ~IDWeakMap(); virtual ~IDWeakMap();
bool Has(int key) const; bool Has(int key) const;
void Erase(v8::Isolate* isolate, int key); void Erase(int key);
int GetNextID(); int GetNextID();
static void WeakCallback(v8::Isolate* isolate, static void WeakCallback(v8::Isolate* isolate,
v8::Persistent<v8::Value> value, v8::Persistent<v8::Object>* value,
void *data); IDWeakMap* self);
static v8::Handle<v8::Value> New(const v8::Arguments& args); static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Add(const v8::Arguments& args); static void Add(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Get(const v8::Arguments& args); static void Get(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Has(const v8::Arguments& args); static void Has(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Keys(const v8::Arguments& args); static void Keys(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Remove(const v8::Arguments& args); static void Remove(const v8::FunctionCallbackInfo<v8::Value>& args);
int next_id_; int next_id_;
std::map<int, RefCountedV8Object> map_;
std::map<int, v8::Persistent<v8::Value>> map_;
DISALLOW_COPY_AND_ASSIGN(IDWeakMap); DISALLOW_COPY_AND_ASSIGN(IDWeakMap);
}; };

View file

@ -8,91 +8,65 @@
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "common/platform_util.h" #include "common/platform_util.h"
#include "googleurl/src/gurl.h" #include "common/v8/native_type_conversions.h"
#include "vendor/node/src/node.h" #include "url/gurl.h"
#include "common/v8/node_common.h"
namespace atom { namespace atom {
namespace api { namespace api {
namespace {
bool V8ValueToFilePath(v8::Handle<v8::Value> value, base::FilePath* path) {
if (!value->IsString())
return false;
std::string file_path_string(*v8::String::Utf8Value(value));
base::FilePath file_path = base::FilePath::FromUTF8Unsafe(file_path_string);
if (file_path.empty())
return false;
*path = file_path;
return true;
}
} // namespace
// static // static
v8::Handle<v8::Value> Shell::ShowItemInFolder(const v8::Arguments& args) { void Shell::ShowItemInFolder(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
base::FilePath file_path; base::FilePath file_path;
if (!V8ValueToFilePath(args[0], &file_path)) if (!FromV8Arguments(args, &file_path))
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
platform_util::ShowItemInFolder(file_path); platform_util::ShowItemInFolder(file_path);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Shell::OpenItem(const v8::Arguments& args) { void Shell::OpenItem(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
base::FilePath file_path; base::FilePath file_path;
if (!V8ValueToFilePath(args[0], &file_path)) if (!FromV8Arguments(args, &file_path))
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
platform_util::OpenItem(file_path); platform_util::OpenItem(file_path);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Shell::OpenExternal(const v8::Arguments& args) { void Shell::OpenExternal(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope; GURL url;
if (!FromV8Arguments(args, &url))
if (!args[0]->IsString())
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
platform_util::OpenExternal(GURL(*v8::String::Utf8Value(args[0]))); platform_util::OpenExternal(url);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Shell::MoveItemToTrash(const v8::Arguments& args) { void Shell::MoveItemToTrash(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
base::FilePath file_path; base::FilePath file_path;
if (!V8ValueToFilePath(args[0], &file_path)) if (!FromV8Arguments(args, &file_path))
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
platform_util::MoveItemToTrash(file_path); platform_util::MoveItemToTrash(file_path);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> Shell::Beep(const v8::Arguments& args) { void Shell::Beep(const v8::FunctionCallbackInfo<v8::Value>& args) {
platform_util::Beep(); platform_util::Beep();
return v8::Undefined();
} }
// static // static
void Shell::Initialize(v8::Handle<v8::Object> target) { void Shell::Initialize(v8::Handle<v8::Object> target) {
node::SetMethod(target, "showItemInFolder", ShowItemInFolder); v8::HandleScope handle_scope(node_isolate);
node::SetMethod(target, "openItem", OpenItem);
node::SetMethod(target, "openExternal", OpenExternal); NODE_SET_METHOD(target, "showItemInFolder", ShowItemInFolder);
node::SetMethod(target, "moveItemToTrash", MoveItemToTrash); NODE_SET_METHOD(target, "openItem", OpenItem);
node::SetMethod(target, "beep", Beep); NODE_SET_METHOD(target, "openExternal", OpenExternal);
NODE_SET_METHOD(target, "moveItemToTrash", MoveItemToTrash);
NODE_SET_METHOD(target, "beep", Beep);
} }
} // namespace api } // namespace api

View file

@ -17,11 +17,11 @@ class Shell {
static void Initialize(v8::Handle<v8::Object> target); static void Initialize(v8::Handle<v8::Object> target);
private: private:
static v8::Handle<v8::Value> ShowItemInFolder(const v8::Arguments& args); static void ShowItemInFolder(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> OpenItem(const v8::Arguments& args); static void OpenItem(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> OpenExternal(const v8::Arguments& args); static void OpenExternal(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> MoveItemToTrash(const v8::Arguments& args); static void MoveItemToTrash(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Beep(const v8::Arguments& args); static void Beep(const v8::FunctionCallbackInfo<v8::Value>& args);
DISALLOW_IMPLICIT_CONSTRUCTORS(Shell); DISALLOW_IMPLICIT_CONSTRUCTORS(Shell);
}; };

View file

@ -3,9 +3,11 @@
// found in the LICENSE file. // found in the LICENSE file.
#include "common/api/object_life_monitor.h" #include "common/api/object_life_monitor.h"
#include "common/v8/native_type_conversions.h"
#include "v8/include/v8-profiler.h" #include "v8/include/v8-profiler.h"
#include "vendor/node/src/node.h"
#include "vendor/node/src/node_internals.h" #include "common/v8/node_common.h"
namespace atom { namespace atom {
@ -13,48 +15,39 @@ namespace api {
namespace { namespace {
v8::Handle<v8::Value> DummyNew(const v8::Arguments& args) { void CreateObjectWithName(const v8::FunctionCallbackInfo<v8::Value>& args) {
return args.This(); v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New();
}
v8::Handle<v8::Value> CreateObjectWithName(const v8::Arguments& args) {
v8::HandleScope scope;
v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(DummyNew);
t->SetClassName(args[0]->ToString()); t->SetClassName(args[0]->ToString());
args.GetReturnValue().Set(t->GetFunction()->NewInstance());
return scope.Close(t->GetFunction()->NewInstance());
} }
v8::Handle<v8::Value> GetHiddenValue(const v8::Arguments& args) { void GetHiddenValue(const v8::FunctionCallbackInfo<v8::Value>& args) {
return args[0]->ToObject()->GetHiddenValue(args[1]->ToString()); args.GetReturnValue().Set(
args[0]->ToObject()->GetHiddenValue(args[1]->ToString()));
} }
v8::Handle<v8::Value> SetHiddenValue(const v8::Arguments& args) { void SetHiddenValue(const v8::FunctionCallbackInfo<v8::Value>& args) {
args[0]->ToObject()->SetHiddenValue(args[1]->ToString(), args[2]); args[0]->ToObject()->SetHiddenValue(args[1]->ToString(), args[2]);
return v8::Undefined();
} }
v8::Handle<v8::Value> GetObjectHash(const v8::Arguments& args) { void GetObjectHash(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope handle_scope; args.GetReturnValue().Set(args[0]->ToObject()->GetIdentityHash());
return handle_scope.Close(v8::Integer::New(
args[0]->ToObject()->GetIdentityHash()));
} }
v8::Handle<v8::Value> SetDestructor(const v8::Arguments& args) { void SetDestructor(const v8::FunctionCallbackInfo<v8::Value>& args) {
ObjectLifeMonitor::BindTo(args[0]->ToObject(), args[1]); ObjectLifeMonitor::BindTo(args[0]->ToObject(), args[1]);
return v8::Undefined();
} }
v8::Handle<v8::Value> TakeHeapSnapshot(const v8::Arguments& args) { void TakeHeapSnapshot(const v8::FunctionCallbackInfo<v8::Value>& args) {
node::node_isolate->GetHeapProfiler()->TakeHeapSnapshot( node::node_isolate->GetHeapProfiler()->TakeHeapSnapshot(
v8::String::New("test")); v8::String::New("test"));
return v8::Undefined();
} }
} // namespace } // namespace
void InitializeV8Util(v8::Handle<v8::Object> target) { void InitializeV8Util(v8::Handle<v8::Object> target) {
v8::HandleScope handle_scope(node_isolate);
NODE_SET_METHOD(target, "createObjectWithName", CreateObjectWithName); NODE_SET_METHOD(target, "createObjectWithName", CreateObjectWithName);
NODE_SET_METHOD(target, "getHiddenValue", GetHiddenValue); NODE_SET_METHOD(target, "getHiddenValue", GetHiddenValue);
NODE_SET_METHOD(target, "setHiddenValue", SetHiddenValue); NODE_SET_METHOD(target, "setHiddenValue", SetHiddenValue);

View file

@ -6,8 +6,9 @@
#include "base/logging.h" #include "base/logging.h"
#include "common/atom_version.h" #include "common/atom_version.h"
#include "common/v8_conversions.h" #include "common/v8/native_type_conversions.h"
#include "vendor/node/src/node.h"
#include "common/v8/node_common.h"
namespace atom { namespace atom {
@ -50,22 +51,20 @@ AtomBindings::~AtomBindings() {
} }
void AtomBindings::BindTo(v8::Handle<v8::Object> process) { void AtomBindings::BindTo(v8::Handle<v8::Object> process) {
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
node::SetMethod(process, "atomBinding", Binding); NODE_SET_METHOD(process, "atomBinding", Binding);
node::SetMethod(process, "crash", Crash); NODE_SET_METHOD(process, "crash", Crash);
node::SetMethod(process, "activateUvLoop", ActivateUVLoop); NODE_SET_METHOD(process, "activateUvLoop", ActivateUVLoop);
node::SetMethod(process, "log", Log); NODE_SET_METHOD(process, "log", Log);
node::SetMethod(process, "getCurrentStackTrace", GetCurrentStackTrace); NODE_SET_METHOD(process, "getCurrentStackTrace", GetCurrentStackTrace);
process->Get(v8::String::New("versions"))->ToObject()-> process->Get(v8::String::New("versions"))->ToObject()->
Set(v8::String::New("atom-shell"), v8::String::New(ATOM_VERSION_STRING)); Set(v8::String::New("atom-shell"), v8::String::New(ATOM_VERSION_STRING));
} }
// static // static
v8::Handle<v8::Value> AtomBindings::Binding(const v8::Arguments& args) { void AtomBindings::Binding(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
v8::Local<v8::String> module = args[0]->ToString(); v8::Local<v8::String> module = args[0]->ToString();
v8::String::Utf8Value module_v(module); v8::String::Utf8Value module_v(module);
node::node_module_struct* modp; node::node_module_struct* modp;
@ -93,7 +92,7 @@ v8::Handle<v8::Value> AtomBindings::Binding(const v8::Arguments& args) {
if (binding_cache->Has(module)) { if (binding_cache->Has(module)) {
exports = binding_cache->Get(module)->ToObject(); exports = binding_cache->Get(module)->ToObject();
return scope.Close(exports); return args.GetReturnValue().Set(exports);
} }
if ((modp = GetBuiltinModule(*module_v, is_browser)) != NULL) { if ((modp = GetBuiltinModule(*module_v, is_browser)) != NULL) {
@ -102,39 +101,36 @@ v8::Handle<v8::Value> AtomBindings::Binding(const v8::Arguments& args) {
// only exports. // only exports.
modp->register_func(exports, v8::Undefined()); modp->register_func(exports, v8::Undefined());
binding_cache->Set(module, exports); binding_cache->Set(module, exports);
return scope.Close(exports); return args.GetReturnValue().Set(exports);
} }
return v8::ThrowException(v8::Exception::Error( return node::ThrowError("No such module");
v8::String::New("No such module")));
} }
// static // static
v8::Handle<v8::Value> AtomBindings::Crash(const v8::Arguments& args) { void AtomBindings::Crash(const v8::FunctionCallbackInfo<v8::Value>& args) {
static_cast<DummyClass*>(NULL)->crash = true; static_cast<DummyClass*>(NULL)->crash = true;
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> AtomBindings::ActivateUVLoop(const v8::Arguments& args) { void AtomBindings::ActivateUVLoop(
const v8::FunctionCallbackInfo<v8::Value>& args) {
uv_async_send(&dummy_uv_handle); uv_async_send(&dummy_uv_handle);
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> AtomBindings::Log(const v8::Arguments& args) { void AtomBindings::Log(const v8::FunctionCallbackInfo<v8::Value>& args) {
std::string message; std::string message;
for (int i = 0; i < args.Length(); ++i) for (int i = 0; i < args.Length(); ++i)
message += *v8::String::Utf8Value(args[i]); message += *v8::String::Utf8Value(args[i]);
logging::LogMessage("CONSOLE", 0, 0).stream() << message; logging::LogMessage("CONSOLE", 0, 0).stream() << message;
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> AtomBindings::GetCurrentStackTrace( void AtomBindings::GetCurrentStackTrace(
const v8::Arguments& args) { const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope; v8::HandleScope handle_scope(args.GetIsolate());
int stack_limit = kMaxCallStackSize; int stack_limit = kMaxCallStackSize;
FromV8Arguments(args, &stack_limit); FromV8Arguments(args, &stack_limit);
@ -147,7 +143,7 @@ v8::Handle<v8::Value> AtomBindings::GetCurrentStackTrace(
for (int i = 0; i < frame_count; ++i) for (int i = 0; i < frame_count; ++i)
result->Set(i, DumpStackFrame(stack_trace->GetFrame(i))); result->Set(i, DumpStackFrame(stack_trace->GetFrame(i)));
return scope.Close(result); args.GetReturnValue().Set(result);
} }
} // namespace atom } // namespace atom

View file

@ -20,11 +20,12 @@ class AtomBindings {
virtual void BindTo(v8::Handle<v8::Object> process); virtual void BindTo(v8::Handle<v8::Object> process);
private: private:
static v8::Handle<v8::Value> Binding(const v8::Arguments& args); static void Binding(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Crash(const v8::Arguments& args); static void Crash(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> ActivateUVLoop(const v8::Arguments& args); static void ActivateUVLoop(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> Log(const v8::Arguments& args); static void Log(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> GetCurrentStackTrace(const v8::Arguments& args); static void GetCurrentStackTrace(
const v8::FunctionCallbackInfo<v8::Value>& args);
DISALLOW_COPY_AND_ASSIGN(AtomBindings); DISALLOW_COPY_AND_ASSIGN(AtomBindings);
}; };

View file

@ -5,10 +5,11 @@
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include "base/string_util.h" #include "base/strings/string_util.h"
#include "vendor/node/src/node.h"
#include "vendor/node/src/node_version.h" #include "vendor/node/src/node_version.h"
#include "common/v8/node_common.h"
namespace atom { namespace atom {
#undef NODE_EXT_LIST_START #undef NODE_EXT_LIST_START

View file

@ -10,42 +10,29 @@ namespace atom {
// static // static
void ObjectLifeMonitor::BindTo(v8::Handle<v8::Object> target, void ObjectLifeMonitor::BindTo(v8::Handle<v8::Object> target,
v8::Handle<v8::Value> destructor) { v8::Handle<v8::Value> destructor) {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
target->SetHiddenValue(v8::String::New("destructor"), destructor); target->SetHiddenValue(v8::String::New("destructor"), destructor);
ObjectLifeMonitor* olm = new ObjectLifeMonitor(); ObjectLifeMonitor* olm = new ObjectLifeMonitor();
olm->handle_ = v8::Persistent<v8::Object>::New(isolate, target); olm->handle_.reset(target);
olm->handle_.MakeWeak(isolate, olm, WeakCallback); olm->handle_.MakeWeak(olm, WeakCallback);
} }
ObjectLifeMonitor::ObjectLifeMonitor() { ObjectLifeMonitor::ObjectLifeMonitor() {
} }
ObjectLifeMonitor::~ObjectLifeMonitor() {
if (!handle_.IsEmpty()) {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
handle_.ClearWeak(isolate);
handle_.Dispose(isolate);
handle_.Clear();
}
}
// static // static
void ObjectLifeMonitor::WeakCallback(v8::Isolate* isolate, void ObjectLifeMonitor::WeakCallback(v8::Isolate* isolate,
v8::Persistent<v8::Value> value, v8::Persistent<v8::Object>* value,
void *data) { ObjectLifeMonitor* self) {
// destructor.call(object, object); // destructor.call(object, object);
{ {
v8::HandleScope scope; v8::HandleScope handle_scope(isolate);
v8::Local<v8::Object> obj = self->handle_.NewHandle();
v8::Local<v8::Object> obj = value->ToObject();
v8::Local<v8::Value> args[] = { obj };
v8::Local<v8::Function>::Cast(obj->GetHiddenValue( v8::Local<v8::Function>::Cast(obj->GetHiddenValue(
v8::String::New("destructor")))->Call(obj, 1, args); v8::String::New("destructor")))->Call(obj, 0, NULL);
} }
ObjectLifeMonitor* obj = static_cast<ObjectLifeMonitor*>(data); delete self;
delete obj;
} }
} // namespace atom } // namespace atom

View file

@ -7,7 +7,7 @@
#define ATOM_COMMON_API_OBJECT_LIFE_MONITOR_H_ #define ATOM_COMMON_API_OBJECT_LIFE_MONITOR_H_
#include "base/basictypes.h" #include "base/basictypes.h"
#include "v8/include/v8.h" #include "common/v8/scoped_persistent.h"
namespace atom { namespace atom {
@ -18,13 +18,12 @@ class ObjectLifeMonitor {
private: private:
ObjectLifeMonitor(); ObjectLifeMonitor();
virtual ~ObjectLifeMonitor();
static void WeakCallback(v8::Isolate* isolate, static void WeakCallback(v8::Isolate* isolate,
v8::Persistent<v8::Value> value, v8::Persistent<v8::Object>* value,
void *data); ObjectLifeMonitor* self);
v8::Persistent<v8::Object> handle_; ScopedPersistent<v8::Object> handle_;
DISALLOW_COPY_AND_ASSIGN(ObjectLifeMonitor); DISALLOW_COPY_AND_ASSIGN(ObjectLifeMonitor);
}; };

View file

@ -6,22 +6,34 @@
#include "base/command_line.h" #include "base/command_line.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/message_loop.h" #include "base/message_loop/message_loop.h"
#include "common/v8_conversions.h" #include "common/v8/native_type_conversions.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "net/base/escape.h" #include "net/base/escape.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" #include "third_party/WebKit/public/web/WebDocument.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" #include "third_party/WebKit/public/web/WebFrame.h"
#include "vendor/node/src/node.h"
#include "vendor/node/src/node_internals.h"
#include "vendor/node/src/node_javascript.h" #include "vendor/node/src/node_javascript.h"
#if defined(OS_WIN) #if defined(OS_WIN)
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#endif #endif
#include "common/v8/node_common.h"
using content::BrowserThread; using content::BrowserThread;
namespace node {
void Init(int* argc,
const char** argv,
int* exec_argc,
const char*** exec_argv);
Environment* CreateEnvironment(v8::Isolate* isolate,
int argc,
const char* const* argv,
int exec_argc,
const char* const* exec_argv);
}
namespace atom { namespace atom {
namespace { namespace {
@ -31,6 +43,8 @@ void UvNoOp(uv_async_t* handle, int status) {
} // namespace } // namespace
node::Environment* global_env = NULL;
NodeBindings::NodeBindings(bool is_browser) NodeBindings::NodeBindings(bool is_browser)
: is_browser_(is_browser), : is_browser_(is_browser),
message_loop_(NULL), message_loop_(NULL),
@ -61,14 +75,14 @@ void NodeBindings::Initialize() {
utf8_str_argv.reserve(str_argv.size()); utf8_str_argv.reserve(str_argv.size());
#endif #endif
// Convert string vector to char* array. // Convert string vector to const char* array.
std::vector<char*> argv(str_argv.size(), NULL); std::vector<const char*> args(str_argv.size(), NULL);
for (size_t i = 0; i < str_argv.size(); ++i) { for (size_t i = 0; i < str_argv.size(); ++i) {
#if defined(OS_WIN) #if defined(OS_WIN)
utf8_str_argv.push_back(UTF16ToUTF8(str_argv[i])); utf8_str_argv.push_back(UTF16ToUTF8(str_argv[i]));
argv[i] = const_cast<char*>(utf8_str_argv[i].c_str()); args[i] = utf8_str_argv[i].c_str();
#else #else
argv[i] = const_cast<char*>(str_argv[i].c_str()); args[i] = str_argv[i].c_str();
#endif #endif
} }
@ -81,33 +95,30 @@ void NodeBindings::Initialize() {
node::g_upstream_node_mode = false; node::g_upstream_node_mode = false;
// Init node. // Init node.
node::Init(argv.size(), &argv[0]); int argc = args.size();
const char** argv = &args[0];
int exec_argc;
const char** exec_argv;
node::Init(&argc, argv, &exec_argc, &exec_argv);
v8::V8::Initialize(); v8::V8::Initialize();
// Load node.js. // Create environment (setup process object and load node.js).
v8::HandleScope scope; global_env = node::CreateEnvironment(node_isolate, argc, argv, argc, argv);
node::g_context = v8::Persistent<v8::Context>::New(
node::node_isolate, v8::Context::New(node::node_isolate)); // Set the process.__atom_type.
{ {
v8::Context::Scope context_scope(node::g_context); v8::Context::Scope context_scope(global_env->context());
v8::Handle<v8::Object> process = node::SetupProcessObject( v8::HandleScope handle_scope(global_env->isolate());
argv.size(), &argv[0]);
// Tell node.js we are in browser or renderer. // Tell node.js we are in browser or renderer.
v8::Handle<v8::String> type = v8::Handle<v8::String> type =
is_browser_ ? v8::String::New("browser") : v8::String::New("renderer"); is_browser_ ? v8::String::New("browser") : v8::String::New("renderer");
process->Set(v8::String::New("__atom_type"), type); global_env->process_object()->Set(v8::String::New("__atom_type"), type);
} }
} }
void NodeBindings::Load() {
v8::HandleScope scope;
v8::Context::Scope context_scope(node::g_context);
node::Load(node::process);
}
void NodeBindings::BindTo(WebKit::WebFrame* frame) { void NodeBindings::BindTo(WebKit::WebFrame* frame) {
v8::HandleScope handle_scope; v8::HandleScope handle_scope(node_isolate);
v8::Handle<v8::Context> context = frame->mainWorldScriptContext(); v8::Handle<v8::Context> context = frame->mainWorldScriptContext();
if (context.IsEmpty()) if (context.IsEmpty())
@ -116,7 +127,7 @@ void NodeBindings::BindTo(WebKit::WebFrame* frame) {
v8::Context::Scope scope(context); v8::Context::Scope scope(context);
// Erase security token. // Erase security token.
context->SetSecurityToken(node::g_context->GetSecurityToken()); context->SetSecurityToken(global_env->context()->GetSecurityToken());
// Evaluate cefode.js. // Evaluate cefode.js.
v8::Handle<v8::Script> script = node::CompileCefodeMainSource(); v8::Handle<v8::Script> script = node::CompileCefodeMainSource();
@ -128,7 +139,7 @@ void NodeBindings::BindTo(WebKit::WebFrame* frame) {
script_path, script_path,
net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS); net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS);
v8::Handle<v8::Value> args[2] = { v8::Handle<v8::Value> args[2] = {
v8::Local<v8::Value>::New(node::process), global_env->process_object(),
ToV8Value(script_path), ToV8Value(script_path),
}; };
v8::Local<v8::Function>::Cast(result)->Call(context->Global(), 2, args); v8::Local<v8::Function>::Cast(result)->Call(context->Global(), 2, args);
@ -160,8 +171,8 @@ void NodeBindings::UvRunOnce() {
DCHECK(!is_browser_ || BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(!is_browser_ || BrowserThread::CurrentlyOn(BrowserThread::UI));
// Enter node context while dealing with uv events. // Enter node context while dealing with uv events.
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
v8::Context::Scope context_scope(node::g_context); v8::Context::Scope context_scope(global_env->context());
// Deal with uv events. // Deal with uv events.
int r = uv_run(uv_loop_, (uv_run_mode)(UV_RUN_ONCE | UV_RUN_NOWAIT)); int r = uv_run(uv_loop_, (uv_run_mode)(UV_RUN_ONCE | UV_RUN_NOWAIT));

View file

@ -24,12 +24,9 @@ class NodeBindings {
virtual ~NodeBindings(); virtual ~NodeBindings();
// Setup V8, libuv and the process object. // Setup V8, libuv and the process object, then load the node.js script.
virtual void Initialize(); virtual void Initialize();
// Load node.js main script.
virtual void Load();
// Load cefode.js script under web frame. // Load cefode.js script under web frame.
virtual void BindTo(WebKit::WebFrame* frame); virtual void BindTo(WebKit::WebFrame* frame);

View file

@ -9,8 +9,7 @@
#include <sys/time.h> #include <sys/time.h>
#include <sys/types.h> #include <sys/types.h>
#include "vendor/node/src/node.h" #include "common/v8/node_common.h"
#include "vendor/node/src/node_internals.h"
namespace atom { namespace atom {

View file

@ -12,7 +12,7 @@
#include "base/mac/mac_logging.h" #include "base/mac/mac_logging.h"
#include "base/mac/scoped_aedesc.h" #include "base/mac/scoped_aedesc.h"
#include "base/strings/sys_string_conversions.h" #include "base/strings/sys_string_conversions.h"
#include "googleurl/src/gurl.h" #include "url/gurl.h"
namespace platform_util { namespace platform_util {

View file

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef COMMON_V8_CONVERSIONS_H_ #ifndef ATOM_COMMON_V8_NATIVE_TYPE_CONVERSIONS_H_
#define COMMON_V8_CONVERSIONS_H_ #define ATOM_COMMON_V8_NATIVE_TYPE_CONVERSIONS_H_
#include <map> #include <map>
#include <string> #include <string>
@ -15,11 +15,11 @@
#include "base/values.h" #include "base/values.h"
#include "browser/api/atom_api_window.h" #include "browser/api/atom_api_window.h"
#include "common/swap_or_assign.h" #include "common/swap_or_assign.h"
#include "common/v8/scoped_persistent.h"
#include "common/v8_value_converter_impl.h" #include "common/v8_value_converter_impl.h"
#include "content/public/renderer/v8_value_converter.h" #include "content/public/renderer/v8_value_converter.h"
#include "googleurl/src/gurl.h"
#include "ui/gfx/rect.h" #include "ui/gfx/rect.h"
#include "v8/include/v8.h" #include "url/gurl.h"
// Convert V8 value to arbitrary supported types. // Convert V8 value to arbitrary supported types.
struct FromV8Value { struct FromV8Value {
@ -104,10 +104,10 @@ struct FromV8Value {
return NULL; return NULL;
} }
operator v8::Persistent<v8::Function>() { operator atom::RefCountedV8Function() {
return v8::Persistent<v8::Function>::New( v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(value_);
node::node_isolate, return atom::RefCountedV8Function(
v8::Handle<v8::Function>::Cast(value_)); new atom::RefCountedPersistent<v8::Function>(func));
} }
v8::Handle<v8::Value> value_; v8::Handle<v8::Value> value_;
@ -233,7 +233,9 @@ bool V8ValueCanBeConvertedTo<v8::Persistent<v8::Function>>(
// Check and convert V8's Arguments to native types. // Check and convert V8's Arguments to native types.
template<typename T1> inline template<typename T1> inline
bool FromV8Arguments(const v8::Arguments& args, T1* value, int index = 0) { bool FromV8Arguments(const v8::FunctionCallbackInfo<v8::Value>& args,
T1* value,
int index = 0) {
if (!V8ValueCanBeConvertedTo<T1>(args[index])) if (!V8ValueCanBeConvertedTo<T1>(args[index]))
return false; return false;
internal::SwapOrAssign(*value, internal::SwapOrAssign(*value,
@ -242,18 +244,23 @@ bool FromV8Arguments(const v8::Arguments& args, T1* value, int index = 0) {
} }
template<typename T1, typename T2> inline template<typename T1, typename T2> inline
bool FromV8Arguments(const v8::Arguments& args, T1* a1, T2* a2) { bool FromV8Arguments(const v8::FunctionCallbackInfo<v8::Value>& args,
T1* a1,
T2* a2) {
return FromV8Arguments<T1>(args, a1) && FromV8Arguments<T2>(args, a2, 1); return FromV8Arguments<T1>(args, a1) && FromV8Arguments<T2>(args, a2, 1);
} }
template<typename T1, typename T2, typename T3> inline template<typename T1, typename T2, typename T3> inline
bool FromV8Arguments(const v8::Arguments& args, T1* a1, T2* a2, T3* a3) { bool FromV8Arguments(const v8::FunctionCallbackInfo<v8::Value>& args,
T1* a1,
T2* a2,
T3* a3) {
return FromV8Arguments<T1, T2>(args, a1, a2) && return FromV8Arguments<T1, T2>(args, a1, a2) &&
FromV8Arguments<T3>(args, a3, 2); FromV8Arguments<T3>(args, a3, 2);
} }
template<typename T1, typename T2, typename T3, typename T4> inline template<typename T1, typename T2, typename T3, typename T4> inline
bool FromV8Arguments(const v8::Arguments& args, bool FromV8Arguments(const v8::FunctionCallbackInfo<v8::Value>& args,
T1* a1, T1* a1,
T2* a2, T2* a2,
T3* a3, T3* a3,
@ -263,7 +270,7 @@ bool FromV8Arguments(const v8::Arguments& args,
} }
template<typename T1, typename T2, typename T3, typename T4, typename T5> inline template<typename T1, typename T2, typename T3, typename T4, typename T5> inline
bool FromV8Arguments(const v8::Arguments& args, bool FromV8Arguments(const v8::FunctionCallbackInfo<v8::Value>& args,
T1* a1, T1* a1,
T2* a2, T2* a2,
T3* a3, T3* a3,
@ -275,7 +282,7 @@ bool FromV8Arguments(const v8::Arguments& args,
template<typename T1, typename T2, typename T3, typename T4, typename T5, template<typename T1, typename T2, typename T3, typename T4, typename T5,
typename T6> inline typename T6> inline
bool FromV8Arguments(const v8::Arguments& args, bool FromV8Arguments(const v8::FunctionCallbackInfo<v8::Value>& args,
T1* a1, T1* a1,
T2* a2, T2* a2,
T3* a3, T3* a3,
@ -288,7 +295,7 @@ bool FromV8Arguments(const v8::Arguments& args,
template<typename T1, typename T2, typename T3, typename T4, typename T5, template<typename T1, typename T2, typename T3, typename T4, typename T5,
typename T6, typename T7> inline typename T6, typename T7> inline
bool FromV8Arguments(const v8::Arguments& args, bool FromV8Arguments(const v8::FunctionCallbackInfo<v8::Value>& args,
T1* a1, T1* a1,
T2* a2, T2* a2,
T3* a3, T3* a3,
@ -301,4 +308,4 @@ bool FromV8Arguments(const v8::Arguments& args,
FromV8Arguments<T7>(args, a7, 6); FromV8Arguments<T7>(args, a7, 6);
} }
#endif // COMMON_V8_CONVERSIONS_H_ #endif // ATOM_COMMON_V8_NATIVE_TYPE_CONVERSIONS_H_

22
common/v8/node_common.h Normal file
View file

@ -0,0 +1,22 @@
// Copyright (c) 2013 GitHub, Inc. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ATOM_COMMON_V8_NODE_COMMON_H_
#define ATOM_COMMON_V8_NODE_COMMON_H_
// Common helper for using node APIs.
#undef CHECK
#undef DISALLOW_COPY_AND_ASSIGN
#include "vendor/node/src/env.h"
#include "vendor/node/src/node.h"
#include "vendor/node/src/node_internals.h"
using node::node_isolate;
namespace atom {
// Defined in node_bindings.cc.
extern node::Environment* global_env;
}
#endif // ATOM_COMMON_V8_NODE_COMMON_H_

View file

@ -0,0 +1,115 @@
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ATOM_COMMON_SCOPED_PERSISTENT_H_
#define ATOM_COMMON_SCOPED_PERSISTENT_H_
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "v8/include/v8.h"
namespace atom {
// A v8::Persistent handle to a V8 value which destroys and clears the
// underlying handle on destruction.
template <typename T>
class ScopedPersistent {
public:
ScopedPersistent() {
}
explicit ScopedPersistent(v8::Handle<T> handle) {
reset(handle);
}
~ScopedPersistent() {
reset();
}
void reset(v8::Handle<T> handle) {
if (!handle.IsEmpty())
handle_.Reset(GetIsolate(handle), handle);
else
reset();
}
void reset() {
handle_.Reset();
}
bool IsEmpty() const {
return handle_.IsEmpty();
}
v8::Handle<T> NewHandle() const {
if (handle_.IsEmpty())
return v8::Local<T>();
return v8::Local<T>::New(GetIsolate(handle_), handle_);
}
v8::Handle<T> NewHandle(v8::Isolate* isolate) const {
if (handle_.IsEmpty())
return v8::Local<T>();
return v8::Local<T>::New(isolate, handle_);
}
template <typename P>
void MakeWeak(P* parameters,
typename v8::WeakReferenceCallbacks<T, P>::Revivable callback) {
handle_.MakeWeak(parameters, callback);
}
private:
template <typename U>
static v8::Isolate* GetIsolate(v8::Handle<U> object_handle) {
// Only works for v8::Object and its subclasses. Add specialisations for
// anything else.
if (!object_handle.IsEmpty())
return GetIsolate(object_handle->CreationContext());
return v8::Isolate::GetCurrent();
}
static v8::Isolate* GetIsolate(v8::Handle<v8::Context> context_handle) {
if (!context_handle.IsEmpty())
return context_handle->GetIsolate();
return v8::Isolate::GetCurrent();
}
static v8::Isolate* GetIsolate(
v8::Handle<v8::ObjectTemplate> template_handle) {
return v8::Isolate::GetCurrent();
}
template <typename U>
static v8::Isolate* GetIsolate(const U& any_handle) {
return v8::Isolate::GetCurrent();
}
v8::Persistent<T> handle_;
DISALLOW_COPY_AND_ASSIGN(ScopedPersistent);
};
template <typename T>
class RefCountedPersistent : public ScopedPersistent<T>,
public base::RefCounted<RefCountedPersistent<T>> {
public:
RefCountedPersistent() {}
explicit RefCountedPersistent(v8::Handle<T> handle)
: ScopedPersistent<T>(handle) {
}
protected:
friend class base::RefCounted<RefCountedPersistent<T>>;
~RefCountedPersistent() {}
private:
DISALLOW_COPY_AND_ASSIGN(RefCountedPersistent);
};
typedef scoped_refptr<RefCountedPersistent<v8::Function>> RefCountedV8Function;
typedef scoped_refptr<RefCountedPersistent<v8::Object>> RefCountedV8Object;
} // namespace atom
#endif // ATOM_COMMON_SCOPED_PERSISTENT_H_

View file

@ -36,10 +36,14 @@ void V8ValueConverterImpl::SetStripNullFromObjects(bool val) {
strip_null_from_objects_ = val; strip_null_from_objects_ = val;
} }
void V8ValueConverterImpl::SetStrategy(Strategy* strategy) {
// Ignore any strategy.
}
v8::Handle<v8::Value> V8ValueConverterImpl::ToV8Value( v8::Handle<v8::Value> V8ValueConverterImpl::ToV8Value(
const base::Value* value, v8::Handle<v8::Context> context) const { const base::Value* value, v8::Handle<v8::Context> context) const {
v8::Context::Scope context_scope(context); v8::Context::Scope context_scope(context);
v8::HandleScope handle_scope; v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
return handle_scope.Close(ToV8ValueImpl(value)); return handle_scope.Close(ToV8ValueImpl(value));
} }
@ -47,7 +51,7 @@ Value* V8ValueConverterImpl::FromV8Value(
v8::Handle<v8::Value> val, v8::Handle<v8::Value> val,
v8::Handle<v8::Context> context) const { v8::Handle<v8::Context> context) const {
v8::Context::Scope context_scope(context); v8::Context::Scope context_scope(context);
v8::HandleScope handle_scope; v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
HashToHandleMap unique_map; HashToHandleMap unique_map;
return FromV8ValueImpl(val, &unique_map); return FromV8ValueImpl(val, &unique_map);
} }

View file

@ -31,6 +31,7 @@ class V8ValueConverterImpl : public content::V8ValueConverter {
virtual void SetRegExpAllowed(bool val) OVERRIDE; virtual void SetRegExpAllowed(bool val) OVERRIDE;
virtual void SetFunctionAllowed(bool val) OVERRIDE; virtual void SetFunctionAllowed(bool val) OVERRIDE;
virtual void SetStripNullFromObjects(bool val) OVERRIDE; virtual void SetStripNullFromObjects(bool val) OVERRIDE;
virtual void SetStrategy(Strategy* strategy) OVERRIDE;
virtual v8::Handle<v8::Value> ToV8Value( virtual v8::Handle<v8::Value> ToV8Value(
const base::Value* value, const base::Value* value,
v8::Handle<v8::Context> context) const OVERRIDE; v8::Handle<v8::Context> context) const OVERRIDE;

View file

@ -5,11 +5,12 @@
#include "renderer/api/atom_api_renderer_ipc.h" #include "renderer/api/atom_api_renderer_ipc.h"
#include "common/api/api_messages.h" #include "common/api/api_messages.h"
#include "common/v8_conversions.h" #include "common/v8/native_type_conversions.h"
#include "content/public/renderer/render_view.h" #include "content/public/renderer/render_view.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" #include "third_party/WebKit/public/web/WebFrame.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" #include "third_party/WebKit/public/web/WebView.h"
#include "vendor/node/src/node.h"
#include "common/v8/node_common.h"
using content::RenderView; using content::RenderView;
using WebKit::WebFrame; using WebKit::WebFrame;
@ -36,9 +37,7 @@ RenderView* GetCurrentRenderView() {
} // namespace } // namespace
// static // static
v8::Handle<v8::Value> RendererIPC::Send(const v8::Arguments& args) { void RendererIPC::Send(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
string16 channel; string16 channel;
scoped_ptr<base::Value> arguments; scoped_ptr<base::Value> arguments;
if (!FromV8Arguments(args, &channel, &arguments)) if (!FromV8Arguments(args, &channel, &arguments))
@ -46,7 +45,7 @@ v8::Handle<v8::Value> RendererIPC::Send(const v8::Arguments& args) {
RenderView* render_view = GetCurrentRenderView(); RenderView* render_view = GetCurrentRenderView();
if (render_view == NULL) if (render_view == NULL)
return v8::Undefined(); return;
bool success = render_view->Send(new AtomViewHostMsg_Message( bool success = render_view->Send(new AtomViewHostMsg_Message(
render_view->GetRoutingID(), render_view->GetRoutingID(),
@ -55,14 +54,10 @@ v8::Handle<v8::Value> RendererIPC::Send(const v8::Arguments& args) {
if (!success) if (!success)
return node::ThrowError("Unable to send AtomViewHostMsg_Message"); return node::ThrowError("Unable to send AtomViewHostMsg_Message");
return v8::Undefined();
} }
// static // static
v8::Handle<v8::Value> RendererIPC::SendSync(const v8::Arguments& args) { void RendererIPC::SendSync(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::HandleScope scope;
string16 channel; string16 channel;
scoped_ptr<base::Value> arguments; scoped_ptr<base::Value> arguments;
if (!FromV8Arguments(args, &channel, &arguments)) if (!FromV8Arguments(args, &channel, &arguments))
@ -70,7 +65,7 @@ v8::Handle<v8::Value> RendererIPC::SendSync(const v8::Arguments& args) {
RenderView* render_view = GetCurrentRenderView(); RenderView* render_view = GetCurrentRenderView();
if (render_view == NULL) if (render_view == NULL)
return v8::Undefined(); return;
string16 json; string16 json;
IPC::SyncMessage* message = new AtomViewHostMsg_Message_Sync( IPC::SyncMessage* message = new AtomViewHostMsg_Message_Sync(
@ -85,13 +80,15 @@ v8::Handle<v8::Value> RendererIPC::SendSync(const v8::Arguments& args) {
if (!success) if (!success)
return node::ThrowError("Unable to send AtomViewHostMsg_Message_Sync"); return node::ThrowError("Unable to send AtomViewHostMsg_Message_Sync");
return scope.Close(ToV8Value(json)); args.GetReturnValue().Set(ToV8Value(json));
} }
// static // static
void RendererIPC::Initialize(v8::Handle<v8::Object> target) { void RendererIPC::Initialize(v8::Handle<v8::Object> target) {
node::SetMethod(target, "send", Send); v8::HandleScope handle_scope(node_isolate);
node::SetMethod(target, "sendSync", SendSync);
NODE_SET_METHOD(target, "send", Send);
NODE_SET_METHOD(target, "sendSync", SendSync);
} }
} // namespace api } // namespace api

View file

@ -17,8 +17,8 @@ class RendererIPC {
static void Initialize(v8::Handle<v8::Object> target); static void Initialize(v8::Handle<v8::Object> target);
private: private:
static v8::Handle<v8::Value> Send(const v8::Arguments& args); static void Send(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Handle<v8::Value> SendSync(const v8::Arguments& args); static void SendSync(const v8::FunctionCallbackInfo<v8::Value>& args);
DISALLOW_IMPLICIT_CONSTRUCTORS(RendererIPC); DISALLOW_IMPLICIT_CONSTRUCTORS(RendererIPC);
}; };

View file

@ -7,11 +7,12 @@
#include <vector> #include <vector>
#include "base/logging.h" #include "base/logging.h"
#include "common/v8_conversions.h" #include "common/v8/native_type_conversions.h"
#include "content/public/renderer/render_view.h" #include "content/public/renderer/render_view.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" #include "third_party/WebKit/public/web/WebFrame.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" #include "third_party/WebKit/public/web/WebView.h"
#include "vendor/node/src/node.h"
#include "common/v8/node_common.h"
using content::RenderView; using content::RenderView;
using content::V8ValueConverter; using content::V8ValueConverter;
@ -39,7 +40,7 @@ AtomRendererBindings::~AtomRendererBindings() {
} }
void AtomRendererBindings::BindToFrame(WebFrame* frame) { void AtomRendererBindings::BindToFrame(WebFrame* frame) {
v8::HandleScope handle_scope; v8::HandleScope handle_scope(node_isolate);
v8::Handle<v8::Context> context = frame->mainWorldScriptContext(); v8::Handle<v8::Context> context = frame->mainWorldScriptContext();
if (context.IsEmpty()) if (context.IsEmpty())
@ -55,7 +56,7 @@ void AtomRendererBindings::OnBrowserMessage(const string16& channel,
if (!render_view_->GetWebView()) if (!render_view_->GetWebView())
return; return;
v8::HandleScope scope; v8::HandleScope handle_scope(node_isolate);
v8::Local<v8::Context> context = v8::Local<v8::Context> context =
render_view_->GetWebView()->mainFrame()->mainWorldScriptContext(); render_view_->GetWebView()->mainFrame()->mainWorldScriptContext();

View file

@ -12,9 +12,9 @@
#include "ipc/ipc_message_macros.h" #include "ipc/ipc_message_macros.h"
#include "renderer/api/atom_renderer_bindings.h" #include "renderer/api/atom_renderer_bindings.h"
#include "renderer/atom_renderer_client.h" #include "renderer/atom_renderer_client.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" #include "third_party/WebKit/public/web/WebDocument.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDraggableRegion.h" #include "third_party/WebKit/public/web/WebDraggableRegion.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" #include "third_party/WebKit/public/web/WebFrame.h"
#include "v8/include/v8.h" #include "v8/include/v8.h"
using WebKit::WebFrame; using WebKit::WebFrame;

View file

@ -6,7 +6,8 @@
#include "common/node_bindings.h" #include "common/node_bindings.h"
#include "renderer/atom_render_view_observer.h" #include "renderer/atom_render_view_observer.h"
#include "vendor/node/src/node_internals.h"
#include "common/v8/node_common.h"
namespace webkit { namespace webkit {
extern void SetGetNodeContext(v8::Handle<v8::Context> (*)()); extern void SetGetNodeContext(v8::Handle<v8::Context> (*)());
@ -17,7 +18,7 @@ namespace atom {
namespace { namespace {
v8::Handle<v8::Context> GetNodeContext() { v8::Handle<v8::Context> GetNodeContext() {
return node::g_context; return global_env->context();
} }
} // namespace } // namespace
@ -35,7 +36,6 @@ void AtomRendererClient::RenderThreadStarted() {
// Interact with dirty workarounds of extra node context in WebKit. // Interact with dirty workarounds of extra node context in WebKit.
webkit::SetGetNodeContext(GetNodeContext); webkit::SetGetNodeContext(GetNodeContext);
node_bindings_->Load();
node_bindings_->PrepareMessageLoop(); node_bindings_->PrepareMessageLoop();
node_bindings_->RunMessageLoop(); node_bindings_->RunMessageLoop();
} }

2
vendor/brightray vendored

@ -1 +1 @@
Subproject commit 8e453e36fe6ab74cf4e72fe0fa67e30eb048d2b3 Subproject commit 3f92be3fd3e7d841e0153d32eb8945ed65827225

2
vendor/node vendored

@ -1 +1 @@
Subproject commit 4b6ab23cb972a96bde40c899aab41703f08a1f0d Subproject commit 264b0177bc11c4b2e733294c7921fd4c72e5b4e5