ead3beddaac5467f569a688424b376bcc2247386
[platform/framework/web/crosswalk-tizen.git] / atom / browser / api / event_emitter.h
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
5 #ifndef ATOM_BROWSER_API_EVENT_EMITTER_H_
6 #define ATOM_BROWSER_API_EVENT_EMITTER_H_
7
8 #include <vector>
9
10 #include "atom/common/api/event_emitter_caller.h"
11 #include "native_mate/wrappable.h"
12
13 namespace content {
14 class WebContents;
15 }
16
17 namespace IPC {
18 class Message;
19 }
20
21 namespace mate {
22
23 namespace internal {
24
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(
30     v8::Isolate* isolate,
31     v8::Local<v8::Object> object,
32     v8::Local<v8::Object> event);
33 v8::Local<v8::Object> CreateEventFromFlags(v8::Isolate* isolate, int flags);
34
35 }  // namespace internal
36
37 // Provide helperers to emit event in JavaScript.
38 template<typename T>
39 class EventEmitter : public Wrappable<T> {
40  public:
41   typedef std::vector<v8::Local<v8::Value>> ValueArray;
42
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(); }
47
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) {
53     return EmitWithEvent(
54         name,
55         internal::CreateCustomEvent(isolate(), GetWrapper(), event), args...);
56   }
57
58   // this.emit(name, new Event(flags), args...);
59   template<typename... Args>
60   bool EmitWithFlags(const base::StringPiece& name,
61                      int flags,
62                      const Args&... args) {
63     return EmitCustomEvent(
64         name,
65         internal::CreateEventFromFlags(isolate(), flags), args...);
66   }
67
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...);
72   }
73
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...);
85   }
86
87  protected:
88   EventEmitter() {}
89
90  private:
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...);
99     return event->Get(
100         StringToV8(isolate(), "defaultPrevented"))->BooleanValue();
101   }
102
103   DISALLOW_COPY_AND_ASSIGN(EventEmitter);
104 };
105
106 }  // namespace mate
107
108 #endif  // ATOM_BROWSER_API_EVENT_EMITTER_H_