// 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. #include "browser/api/atom_api_dialog.h" #include "base/bind.h" #include "browser/native_window.h" #include "browser/ui/file_dialog.h" #include "browser/ui/message_box.h" #include "common/v8_conversions.h" #include "vendor/node/src/node_internals.h" using node::node_isolate; namespace atom { namespace api { namespace { template void CallV8Function(v8::Persistent callback, T arg) { DCHECK(!callback.IsEmpty()); v8::HandleScope scope; v8::Handle value = ToV8Value(arg); callback->Call(callback, 1, &value); callback.Dispose(node_isolate); } template void CallV8Function2(v8::Persistent callback, bool result, T arg) { if (result) return CallV8Function(callback, arg); else return CallV8Function(callback, NULL); } void Initialize(v8::Handle target) { v8::HandleScope scope; NODE_SET_METHOD(target, "showMessageBox", ShowMessageBox); NODE_SET_METHOD(target, "showOpenDialog", ShowOpenDialog); NODE_SET_METHOD(target, "showSaveDialog", ShowSaveDialog); } } // namespace v8::Handle ShowMessageBox(const v8::Arguments &args) { v8::HandleScope scope; int type; std::vector buttons; std::string title, message, detail; if (!FromV8Arguments(args, &type, &buttons, &title, &message, &detail)) return node::ThrowTypeError("Bad argument"); NativeWindow* native_window = FromV8Value(args[5]); v8::Persistent callback = FromV8Value(args[6]); if (callback.IsEmpty()) { int chosen = atom::ShowMessageBox( native_window, (MessageBoxType)type, buttons, title, message, detail); return scope.Close(v8::Integer::New(chosen)); } else { atom::ShowMessageBox( native_window, (MessageBoxType)type, buttons, title, message, detail, base::Bind(&CallV8Function, callback)); return v8::Undefined(); } } v8::Handle ShowOpenDialog(const v8::Arguments &args) { v8::HandleScope scope; std::string title; base::FilePath default_path; int properties; if (!FromV8Arguments(args, &title, &default_path, &properties)) return node::ThrowTypeError("Bad argument"); NativeWindow* native_window = FromV8Value(args[3]); v8::Persistent callback = FromV8Value(args[4]); if (callback.IsEmpty()) { std::vector paths; if (!file_dialog::ShowOpenDialog(native_window, title, default_path, properties, &paths)) return v8::Undefined(); v8::Handle result = v8::Array::New(paths.size()); for (size_t i = 0; i < paths.size(); ++i) result->Set(i, ToV8Value(paths[i])); return scope.Close(result); } else { file_dialog::ShowOpenDialog( native_window, title, default_path, properties, base::Bind(&CallV8Function2&>, callback)); return v8::Undefined(); } } v8::Handle ShowSaveDialog(const v8::Arguments &args) { v8::HandleScope scope; std::string title; base::FilePath default_path; if (!FromV8Arguments(args, &title, &default_path)) return node::ThrowTypeError("Bad argument"); NativeWindow* native_window = FromV8Value(args[2]); v8::Persistent callback = FromV8Value(args[3]); if (callback.IsEmpty()) { base::FilePath path; if (!file_dialog::ShowSaveDialog(native_window, title, default_path, &path)) return v8::Undefined(); return scope.Close(ToV8Value(path)); } else { file_dialog::ShowSaveDialog( native_window, title, default_path, base::Bind(&CallV8Function2, callback)); return v8::Undefined(); } } } // namespace api } // namespace atom NODE_MODULE(atom_browser_dialog, atom::api::Initialize)