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.
5 #ifndef ATOM_BROWSER_API_EVENT_EMITTER_H_
6 #define ATOM_BROWSER_API_EVENT_EMITTER_H_
10 #include "atom/common/api/event_emitter_caller.h"
11 #include "native_mate/wrappable.h"
25 v8::Local<v8::Object> CreateJSEvent(v8::Isolate* isolate,
26 v8::Local<v8::Object> object,
27 content::WebContents* sender,
28 IPC::Message* message);
29 v8::Local<v8::Object> CreateCustomEvent(
31 v8::Local<v8::Object> object,
32 v8::Local<v8::Object> event);
33 v8::Local<v8::Object> CreateEventFromFlags(v8::Isolate* isolate, int flags);
35 } // namespace internal
37 // Provide helperers to emit event in JavaScript.
39 class EventEmitter : public Wrappable<T> {
41 typedef std::vector<v8::Local<v8::Value>> ValueArray;
43 // Make the convinient methods visible:
44 // https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-members
45 v8::Local<v8::Object> GetWrapper() { return Wrappable<T>::GetWrapper(); }
46 v8::Isolate* isolate() const { return Wrappable<T>::isolate(); }
48 // this.emit(name, event, args...);
49 template<typename... Args>
50 bool EmitCustomEvent(const base::StringPiece& name,
51 v8::Local<v8::Object> event,
52 const Args&... args) {
55 internal::CreateCustomEvent(isolate(), GetWrapper(), event), args...);
58 // this.emit(name, new Event(flags), args...);
59 template<typename... Args>
60 bool EmitWithFlags(const base::StringPiece& name,
62 const Args&... args) {
63 return EmitCustomEvent(
65 internal::CreateEventFromFlags(isolate(), flags), args...);
68 // this.emit(name, new Event(), args...);
69 template<typename... Args>
70 bool Emit(const base::StringPiece& name, const Args&... args) {
71 return EmitWithSender(name, nullptr, nullptr, args...);
74 // this.emit(name, new Event(sender, message), args...);
75 template<typename... Args>
76 bool EmitWithSender(const base::StringPiece& name,
77 content::WebContents* sender,
78 IPC::Message* message,
79 const Args&... args) {
80 v8::Locker locker(isolate());
81 v8::HandleScope handle_scope(isolate());
82 v8::Local<v8::Object> event = internal::CreateJSEvent(
83 isolate(), GetWrapper(), sender, message);
84 return EmitWithEvent(name, event, args...);
91 // this.emit(name, event, args...);
92 template<typename... Args>
93 bool EmitWithEvent(const base::StringPiece& name,
94 v8::Local<v8::Object> event,
95 const Args&... args) {
96 v8::Locker locker(isolate());
97 v8::HandleScope handle_scope(isolate());
98 EmitEvent(isolate(), GetWrapper(), name, event, args...);
100 StringToV8(isolate(), "defaultPrevented"))->BooleanValue();
103 DISALLOW_COPY_AND_ASSIGN(EventEmitter);
108 #endif // ATOM_BROWSER_API_EVENT_EMITTER_H_