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"
12 #include "tizen/common/env_variables.h"
26 v8::Local<v8::Object> CreateJSEvent(v8::Isolate* isolate,
27 v8::Local<v8::Object> object,
28 content::WebContents* sender,
29 IPC::Message* message);
30 v8::Local<v8::Object> CreateCustomEvent(
32 v8::Local<v8::Object> object,
33 v8::Local<v8::Object> event);
34 v8::Local<v8::Object> CreateEventFromFlags(v8::Isolate* isolate, int flags);
36 } // namespace internal
38 // Provide helperers to emit event in JavaScript.
40 class EventEmitter : public Wrappable<T> {
42 typedef std::vector<v8::Local<v8::Value>> ValueArray;
44 // Make the convinient methods visible:
45 // https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-members
46 v8::Local<v8::Object> GetWrapper() { return Wrappable<T>::GetWrapper(); }
47 v8::Isolate* isolate() const { return Wrappable<T>::isolate(); }
49 // this.emit(name, event, args...);
50 template<typename... Args>
51 bool EmitCustomEvent(const base::StringPiece& name,
52 v8::Local<v8::Object> event,
53 const Args&... args) {
56 internal::CreateCustomEvent(isolate(), GetWrapper(), event), args...);
59 // this.emit(name, new Event(flags), args...);
60 template<typename... Args>
61 bool EmitWithFlags(const base::StringPiece& name,
63 const Args&... args) {
64 return EmitCustomEvent(
66 internal::CreateEventFromFlags(isolate(), flags), args...);
69 // this.emit(name, new Event(), args...);
70 template<typename... Args>
71 bool Emit(const base::StringPiece& name, const Args&... args) {
72 return EmitWithSender(name, nullptr, nullptr, args...);
75 // this.emit(name, new Event(sender, message), args...);
76 template<typename... Args>
77 bool EmitWithSender(const base::StringPiece& name,
78 content::WebContents* sender,
79 IPC::Message* message,
80 const Args&... args) {
81 if (!::tizen::is_single_process)
82 v8::Locker locker(isolate());
83 v8::HandleScope handle_scope(isolate());
84 v8::Local<v8::Object> event = internal::CreateJSEvent(
85 isolate(), GetWrapper(), sender, message);
86 return EmitWithEvent(name, event, args...);
93 // this.emit(name, event, args...);
94 template<typename... Args>
95 bool EmitWithEvent(const base::StringPiece& name,
96 v8::Local<v8::Object> event,
97 const Args&... args) {
98 if (!::tizen::is_single_process)
99 v8::Locker locker(isolate());
100 v8::HandleScope handle_scope(isolate());
101 EmitEvent(isolate(), GetWrapper(), name, event, args...);
103 StringToV8(isolate(), "defaultPrevented"))->BooleanValue();
106 DISALLOW_COPY_AND_ASSIGN(EventEmitter);
111 #endif // ATOM_BROWSER_API_EVENT_EMITTER_H_