From aa1efe70e249dbcc36ebf47ceeb1125ca8e382c9 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 16 Apr 2014 15:14:44 +0800 Subject: [PATCH] Use native_mate to simplify dialog api. --- atom.gyp | 1 - atom/browser/api/atom_api_dialog.cc | 201 ++++++++++-------- atom/browser/api/atom_api_dialog.h | 22 -- atom/common/api/atom_api_id_weak_map.cc | 2 +- atom/common/api/atom_api_id_weak_map.h | 5 +- atom/common/api/atom_api_shell.cc | 17 +- .../v8_converters/file_path_converter.h | 34 +++ .../common/v8_converters/string16_converter.h | 31 +++ atom/renderer/api/atom_api_renderer_ipc.cc | 17 +- vendor/native_mate | 2 +- 10 files changed, 189 insertions(+), 143 deletions(-) delete mode 100644 atom/browser/api/atom_api_dialog.h create mode 100644 atom/common/v8_converters/file_path_converter.h create mode 100644 atom/common/v8_converters/string16_converter.h diff --git a/atom.gyp b/atom.gyp index 73429f2248e2..e2fde27ef4ca 100644 --- a/atom.gyp +++ b/atom.gyp @@ -51,7 +51,6 @@ 'atom/browser/api/atom_api_browser_ipc.cc', 'atom/browser/api/atom_api_browser_ipc.h', 'atom/browser/api/atom_api_dialog.cc', - 'atom/browser/api/atom_api_dialog.h', 'atom/browser/api/atom_api_event.cc', 'atom/browser/api/atom_api_event.h', 'atom/browser/api/atom_api_menu.cc', diff --git a/atom/browser/api/atom_api_dialog.cc b/atom/browser/api/atom_api_dialog.cc index 8551f4375fba..4cc5b4bab5f7 100644 --- a/atom/browser/api/atom_api_dialog.cc +++ b/atom/browser/api/atom_api_dialog.cc @@ -2,143 +2,174 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "atom/browser/api/atom_api_dialog.h" - #include #include #include "base/bind.h" +#include "atom/browser/api/atom_api_window.h" #include "atom/browser/native_window.h" #include "atom/browser/ui/file_dialog.h" #include "atom/browser/ui/message_box.h" +#include "atom/common/v8_converters/file_path_converter.h" +#include "native_mate/dictionary.h" +#include "native_mate/scoped_persistent.h" + #include "atom/common/v8/node_common.h" -#include "atom/common/v8/native_type_conversions.h" -namespace atom { +namespace mate { + +template<> +struct Converter { + static bool FromV8(v8::Isolate* isolate, + v8::Handle val, + atom::NativeWindow** out) { + using atom::api::Window; + if (val->IsNull()) { + *out = NULL; + return true; // NULL is a valid value for NativeWindow*. + } else if (val->IsObject()) { + Window* window = Window::Unwrap(val->ToObject()); + *out = window->window(); + return true; + } else { + return false; + } + } +}; + + +typedef scoped_refptr> RefCountedV8Function; + +template<> +struct Converter { + static bool FromV8(v8::Isolate* isolate, + v8::Handle val, + RefCountedV8Function* out) { + if (!val->IsFunction()) + return false; + + v8::Handle function = v8::Handle::Cast(val); + *out = new mate::RefCountedPersistent(function); + return true; + } +}; + +} // namespace mate -namespace api { namespace { template -void CallV8Function(const RefCountedV8Function& callback, T arg) { +void CallV8Function(const mate::RefCountedV8Function& callback, T arg) { v8::Locker locker(node_isolate); v8::HandleScope handle_scope(node_isolate); - v8::Handle value = ToV8Value(arg); + v8::Handle value = mate::Converter::ToV8(node_isolate, arg); callback->NewHandle(node_isolate)->Call( v8::Context::GetCurrent()->Global(), 1, &value); } template -void CallV8Function2(const RefCountedV8Function& callback, bool result, T arg) { +void CallV8Function2( + const mate::RefCountedV8Function& callback, bool result, const T& arg) { if (result) return CallV8Function(callback, arg); else return CallV8Function(callback, NULL); } -void Initialize(v8::Handle target) { - NODE_SET_METHOD(target, "showMessageBox", ShowMessageBox); - NODE_SET_METHOD(target, "showOpenDialog", ShowOpenDialog); - NODE_SET_METHOD(target, "showSaveDialog", ShowSaveDialog); -} -} // namespace - -void ShowMessageBox(const v8::FunctionCallbackInfo& args) { - 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]); - - if (!args[6]->IsFunction()) { - int chosen = atom::ShowMessageBox( - native_window, - (MessageBoxType)type, - buttons, - title, - message, - detail); - args.GetReturnValue().Set(chosen); - } else { - RefCountedV8Function callback = FromV8Value(args[6]); +void ShowMessageBox(int type, + const std::vector& buttons, + const std::string& title, + const std::string& message, + const std::string& detail, + atom::NativeWindow* window, + mate::Arguments* args) { + v8::Handle peek = args->PeekNext(); + mate::RefCountedV8Function callback; + if (mate::Converter::FromV8(node_isolate, + peek, + &callback)) { atom::ShowMessageBox( - native_window, - (MessageBoxType)type, + window, + (atom::MessageBoxType)type, buttons, title, message, detail, base::Bind(&CallV8Function, callback)); + } else { + int chosen = atom::ShowMessageBox( + window, + (atom::MessageBoxType)type, + buttons, + title, + message, + detail); + args->Return(chosen); } } -void ShowOpenDialog(const v8::FunctionCallbackInfo& args) { - 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]); - - if (!args[4]->IsFunction()) { - std::vector paths; - if (!file_dialog::ShowOpenDialog(native_window, - title, - default_path, - properties, - &paths)) - return; - - v8::Handle result = v8::Array::New(paths.size()); - for (size_t i = 0; i < paths.size(); ++i) - result->Set(i, ToV8Value(paths[i])); - - args.GetReturnValue().Set(result); - } else { - RefCountedV8Function callback = FromV8Value(args[4]); +void ShowOpenDialog(const std::string& title, + const base::FilePath& default_path, + int properties, + atom::NativeWindow* window, + mate::Arguments* args) { + v8::Handle peek = args->PeekNext(); + mate::RefCountedV8Function callback; + if (mate::Converter::FromV8(node_isolate, + peek, + &callback)) { file_dialog::ShowOpenDialog( - native_window, + window, title, default_path, properties, - base::Bind(&CallV8Function2&>, + base::Bind(&CallV8Function2>, callback)); + } else { + std::vector paths; + if (file_dialog::ShowOpenDialog(window, + title, + default_path, + properties, + &paths)) + args->Return(paths); } } -void ShowSaveDialog(const v8::FunctionCallbackInfo& args) { - std::string title; - base::FilePath default_path; - if (!FromV8Arguments(args, &title, &default_path)) - return node::ThrowTypeError("Bad argument"); - - NativeWindow* native_window = FromV8Value(args[2]); - - if (!args[3]->IsFunction()) { +void ShowSaveDialog(const std::string& title, + const base::FilePath& default_path, + atom::NativeWindow* window, + mate::Arguments* args) { + v8::Handle peek = args->PeekNext(); + mate::RefCountedV8Function callback; + if (mate::Converter::FromV8(node_isolate, + peek, + &callback)) { + file_dialog::ShowSaveDialog( + window, + title, + default_path, + base::Bind(&CallV8Function2, callback)); + } else { base::FilePath path; - if (file_dialog::ShowSaveDialog(native_window, + if (file_dialog::ShowSaveDialog(window, title, default_path, &path)) - args.GetReturnValue().Set(ToV8Value(path)); - } else { - RefCountedV8Function callback = FromV8Value(args[3]); - file_dialog::ShowSaveDialog( - native_window, - title, - default_path, - base::Bind(&CallV8Function2, callback)); + args->Return(path); } } -} // namespace api +void Initialize(v8::Handle exports) { + mate::Dictionary dict(v8::Isolate::GetCurrent(), exports); + dict.SetMethod("showMessageBox", &ShowMessageBox); + dict.SetMethod("showOpenDialog", &ShowOpenDialog); + dict.SetMethod("showSaveDialog", &ShowSaveDialog); +} -} // namespace atom +} // namespace -NODE_MODULE(atom_browser_dialog, atom::api::Initialize) +NODE_MODULE(atom_browser_dialog, Initialize) diff --git a/atom/browser/api/atom_api_dialog.h b/atom/browser/api/atom_api_dialog.h deleted file mode 100644 index 86c718dae094..000000000000 --- a/atom/browser/api/atom_api_dialog.h +++ /dev/null @@ -1,22 +0,0 @@ -// 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_BROWSER_API_ATOM_API_DIALOG_H_ -#define ATOM_BROWSER_API_ATOM_API_DIALOG_H_ - -#include "v8/include/v8.h" - -namespace atom { - -namespace api { - -void ShowMessageBox(const v8::FunctionCallbackInfo& args); -void ShowOpenDialog(const v8::FunctionCallbackInfo& args); -void ShowSaveDialog(const v8::FunctionCallbackInfo& args); - -} // namespace api - -} // namespace atom - -#endif // ATOM_BROWSER_API_ATOM_API_DIALOG_H_ diff --git a/atom/common/api/atom_api_id_weak_map.cc b/atom/common/api/atom_api_id_weak_map.cc index 5339b6f05abb..43df9b5e43cf 100644 --- a/atom/common/api/atom_api_id_weak_map.cc +++ b/atom/common/api/atom_api_id_weak_map.cc @@ -28,7 +28,7 @@ int32_t IDWeakMap::Add(v8::Isolate* isolate, v8::Handle object) { object->SetHiddenValue(mate::StringToV8(isolate, "IDWeakMapKey"), mate::Converter::ToV8(isolate, key)); - map_[key] = new RefCountedPersistent(object); + map_[key] = new mate::RefCountedPersistent(object); map_[key]->MakeWeak(this, WeakCallback); return key; } diff --git a/atom/common/api/atom_api_id_weak_map.h b/atom/common/api/atom_api_id_weak_map.h index 704d332fffbe..0b206225ea2e 100644 --- a/atom/common/api/atom_api_id_weak_map.h +++ b/atom/common/api/atom_api_id_weak_map.h @@ -9,8 +9,8 @@ #include #include -#include "atom/common/v8/scoped_persistent.h" #include "base/basictypes.h" +#include "native_mate/scoped_persistent.h" #include "native_mate/wrappable.h" namespace atom { @@ -40,6 +40,9 @@ class IDWeakMap : public mate::Wrappable { IDWeakMap* self); int32_t next_id_; + + typedef scoped_refptr > + RefCountedV8Object; std::map map_; DISALLOW_COPY_AND_ASSIGN(IDWeakMap); diff --git a/atom/common/api/atom_api_shell.cc b/atom/common/api/atom_api_shell.cc index 071a733f2c1d..be6ab614d332 100644 --- a/atom/common/api/atom_api_shell.cc +++ b/atom/common/api/atom_api_shell.cc @@ -5,7 +5,7 @@ #include #include "atom/common/platform_util.h" -#include "base/files/file_path.h" +#include "atom/common/v8_converters/file_path_converter.h" #include "native_mate/object_template_builder.h" #include "url/gurl.h" @@ -28,21 +28,6 @@ struct Converter { } }; -template<> -struct Converter { - static bool FromV8(v8::Isolate* isolate, - v8::Handle val, - base::FilePath* out) { - std::string path; - if (Converter::FromV8(isolate, val, &path)) { - *out = base::FilePath::FromUTF8Unsafe(path); - return true; - } else { - return false; - } - } -}; - } // namespace mate namespace { diff --git a/atom/common/v8_converters/file_path_converter.h b/atom/common/v8_converters/file_path_converter.h new file mode 100644 index 000000000000..e83dc44ec810 --- /dev/null +++ b/atom/common/v8_converters/file_path_converter.h @@ -0,0 +1,34 @@ +// Copyright (c) 2014 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_CONVERTERS_FILE_PATH_CONVERTER_H_ +#define ATOM_COMMON_V8_CONVERTERS_FILE_PATH_CONVERTER_H_ + +#include "atom/common/v8_converters/string16_converter.h" +#include "base/files/file_path.h" + +namespace mate { + +template<> +struct Converter { + static v8::Handle ToV8(v8::Isolate* isolate, + const base::FilePath& val) { + return Converter::ToV8(isolate, val.value()); + } + static bool FromV8(v8::Isolate* isolate, + v8::Handle val, + base::FilePath* out) { + std::string path; + if (Converter::FromV8(isolate, val, &path)) { + *out = base::FilePath::FromUTF8Unsafe(path); + return true; + } else { + return false; + } + } +}; + +} // namespace mate + +#endif // ATOM_COMMON_V8_CONVERTERS_FILE_PATH_CONVERTER_H_ diff --git a/atom/common/v8_converters/string16_converter.h b/atom/common/v8_converters/string16_converter.h new file mode 100644 index 000000000000..d891dc00c992 --- /dev/null +++ b/atom/common/v8_converters/string16_converter.h @@ -0,0 +1,31 @@ +// Copyright (c) 2014 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_CONVERTERS_STRING16_CONVERTER_H_ +#define ATOM_COMMON_V8_CONVERTERS_STRING16_CONVERTER_H_ + +#include "base/strings/string16.h" +#include "native_mate/converter.h" + +namespace mate { + +template<> +struct Converter { + static v8::Handle ToV8(v8::Isolate* isolate, + const string16& val) { + return v8::String::New(reinterpret_cast(val.data()), + val.size()); + } + static bool FromV8(v8::Isolate* isolate, + v8::Handle val, + string16* out) { + v8::String::Value s(val); + *out = string16(reinterpret_cast(*s), s.length()); + return true; + } +}; + +} // namespace mate + +#endif // ATOM_COMMON_V8_CONVERTERS_STRING16_CONVERTER_H_ diff --git a/atom/renderer/api/atom_api_renderer_ipc.cc b/atom/renderer/api/atom_api_renderer_ipc.cc index 30a489f5854b..bd305f1977f7 100644 --- a/atom/renderer/api/atom_api_renderer_ipc.cc +++ b/atom/renderer/api/atom_api_renderer_ipc.cc @@ -4,6 +4,7 @@ #include "atom/common/api/api_messages.h" #include "atom/common/v8/v8_value_converter.h" +#include "atom/common/v8_converters/string16_converter.h" #include "content/public/renderer/render_view.h" #include "native_mate/object_template_builder.h" #include "third_party/WebKit/public/web/WebFrame.h" @@ -17,22 +18,6 @@ using WebKit::WebView; namespace mate { -template<> -struct Converter { - static v8::Handle ToV8(v8::Isolate* isolate, - const string16& val) { - return v8::String::New(reinterpret_cast(val.data()), - val.size()); - } - static bool FromV8(v8::Isolate* isolate, - v8::Handle val, - string16* out) { - v8::String::Value s(val); - *out = string16(reinterpret_cast(*s), s.length()); - return true; - } -}; - template<> struct Converter { static bool FromV8(v8::Isolate* isolate, diff --git a/vendor/native_mate b/vendor/native_mate index ace550d6b20a..c9fa29ef640e 160000 --- a/vendor/native_mate +++ b/vendor/native_mate @@ -1 +1 @@ -Subproject commit ace550d6b20a62ca1101153a06bccb4ba1484a14 +Subproject commit c9fa29ef640e8d3d2edf6b48c2311b16ce314464