event_emitter.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright (c) 2014 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_BROWSER_API_EVENT_EMITTER_H_
  5. #define ATOM_BROWSER_API_EVENT_EMITTER_H_
  6. #include <vector>
  7. #include "atom/common/api/event_emitter_caller.h"
  8. #include "native_mate/wrappable.h"
  9. namespace content {
  10. class WebContents;
  11. }
  12. namespace IPC {
  13. class Message;
  14. }
  15. namespace mate {
  16. namespace internal {
  17. v8::Local<v8::Object> CreateJSEvent(v8::Isolate* isolate,
  18. v8::Local<v8::Object> object,
  19. content::WebContents* sender,
  20. IPC::Message* message);
  21. v8::Local<v8::Object> CreateCustomEvent(
  22. v8::Isolate* isolate,
  23. v8::Local<v8::Object> object,
  24. v8::Local<v8::Object> event);
  25. v8::Local<v8::Object> CreateEventFromFlags(v8::Isolate* isolate, int flags);
  26. } // namespace internal
  27. // Provide helperers to emit event in JavaScript.
  28. template<typename T>
  29. class EventEmitter : public Wrappable<T> {
  30. public:
  31. typedef std::vector<v8::Local<v8::Value>> ValueArray;
  32. // Make the convinient methods visible:
  33. // https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-members
  34. v8::Local<v8::Object> GetWrapper() { return Wrappable<T>::GetWrapper(); }
  35. v8::Isolate* isolate() const { return Wrappable<T>::isolate(); }
  36. // this.emit(name, event, args...);
  37. template<typename... Args>
  38. bool EmitCustomEvent(const base::StringPiece& name,
  39. v8::Local<v8::Object> event,
  40. const Args&... args) {
  41. return EmitWithEvent(
  42. name,
  43. internal::CreateCustomEvent(isolate(), GetWrapper(), event), args...);
  44. }
  45. // this.emit(name, new Event(flags), args...);
  46. template<typename... Args>
  47. bool EmitWithFlags(const base::StringPiece& name,
  48. int flags,
  49. const Args&... args) {
  50. return EmitCustomEvent(
  51. name,
  52. internal::CreateEventFromFlags(isolate(), flags), args...);
  53. }
  54. // this.emit(name, new Event(), args...);
  55. template<typename... Args>
  56. bool Emit(const base::StringPiece& name, const Args&... args) {
  57. return EmitWithSender(name, nullptr, nullptr, args...);
  58. }
  59. // this.emit(name, new Event(sender, message), args...);
  60. template<typename... Args>
  61. bool EmitWithSender(const base::StringPiece& name,
  62. content::WebContents* sender,
  63. IPC::Message* message,
  64. const Args&... args) {
  65. v8::Locker locker(isolate());
  66. v8::HandleScope handle_scope(isolate());
  67. v8::Local<v8::Object> event = internal::CreateJSEvent(
  68. isolate(), GetWrapper(), sender, message);
  69. return EmitWithEvent(name, event, args...);
  70. }
  71. protected:
  72. EventEmitter() {}
  73. private:
  74. // this.emit(name, event, args...);
  75. template<typename... Args>
  76. bool EmitWithEvent(const base::StringPiece& name,
  77. v8::Local<v8::Object> event,
  78. const Args&... args) {
  79. v8::Locker locker(isolate());
  80. v8::HandleScope handle_scope(isolate());
  81. EmitEvent(isolate(), GetWrapper(), name, event, args...);
  82. return event->Get(
  83. StringToV8(isolate(), "defaultPrevented"))->BooleanValue();
  84. }
  85. DISALLOW_COPY_AND_ASSIGN(EventEmitter);
  86. };
  87. } // namespace mate
  88. #endif // ATOM_BROWSER_API_EVENT_EMITTER_H_