event_emitter_caller.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Copyright (c) 2015 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #ifndef ATOM_COMMON_API_EVENT_EMITTER_CALLER_H_
  5. #define ATOM_COMMON_API_EVENT_EMITTER_CALLER_H_
  6. #include <vector>
  7. #include "atom/common/native_mate_converters/string16_converter.h"
  8. #include "native_mate/converter.h"
  9. namespace mate {
  10. namespace internal {
  11. using ValueVector = std::vector<v8::Local<v8::Value>>;
  12. v8::Local<v8::Value> CallMethodWithArgs(v8::Isolate* isolate,
  13. v8::Local<v8::Object> obj,
  14. const char* method,
  15. ValueVector* args);
  16. } // namespace internal
  17. // obj.emit.apply(obj, name, args...);
  18. // The caller is responsible of allocating a HandleScope.
  19. template <typename StringType>
  20. v8::Local<v8::Value> EmitEvent(v8::Isolate* isolate,
  21. v8::Local<v8::Object> obj,
  22. const StringType& name,
  23. const internal::ValueVector& args) {
  24. internal::ValueVector concatenated_args = {StringToV8(isolate, name)};
  25. concatenated_args.reserve(1 + args.size());
  26. concatenated_args.insert(concatenated_args.end(), args.begin(), args.end());
  27. return internal::CallMethodWithArgs(isolate, obj, "emit", &concatenated_args);
  28. }
  29. // obj.emit(name, args...);
  30. // The caller is responsible of allocating a HandleScope.
  31. template <typename StringType, typename... Args>
  32. v8::Local<v8::Value> EmitEvent(v8::Isolate* isolate,
  33. v8::Local<v8::Object> obj,
  34. const StringType& name,
  35. const Args&... args) {
  36. internal::ValueVector converted_args = {
  37. StringToV8(isolate, name),
  38. ConvertToV8(isolate, args)...,
  39. };
  40. return internal::CallMethodWithArgs(isolate, obj, "emit", &converted_args);
  41. }
  42. // obj.custom_emit(args...)
  43. template <typename... Args>
  44. v8::Local<v8::Value> CustomEmit(v8::Isolate* isolate,
  45. v8::Local<v8::Object> object,
  46. const char* custom_emit,
  47. const Args&... args) {
  48. internal::ValueVector converted_args = {
  49. ConvertToV8(isolate, args)...,
  50. };
  51. return internal::CallMethodWithArgs(isolate, object, custom_emit,
  52. &converted_args);
  53. }
  54. } // namespace mate
  55. #endif // ATOM_COMMON_API_EVENT_EMITTER_CALLER_H_