Run Tizen Webapps in single process mode
[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 #include "tizen/common/env_variables.h"
13
14 namespace content {
15 class WebContents;
16 }
17
18 namespace IPC {
19 class Message;
20 }
21
22 namespace mate {
23
24 namespace internal {
25
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(
31     v8::Isolate* isolate,
32     v8::Local<v8::Object> object,
33     v8::Local<v8::Object> event);
34 v8::Local<v8::Object> CreateEventFromFlags(v8::Isolate* isolate, int flags);
35
36 }  // namespace internal
37
38 // Provide helperers to emit event in JavaScript.
39 template<typename T>
40 class EventEmitter : public Wrappable<T> {
41  public:
42   typedef std::vector<v8::Local<v8::Value>> ValueArray;
43
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(); }
48
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) {
54     return EmitWithEvent(
55         name,
56         internal::CreateCustomEvent(isolate(), GetWrapper(), event), args...);
57   }
58
59   // this.emit(name, new Event(flags), args...);
60   template<typename... Args>
61   bool EmitWithFlags(const base::StringPiece& name,
62                      int flags,
63                      const Args&... args) {
64     return EmitCustomEvent(
65         name,
66         internal::CreateEventFromFlags(isolate(), flags), args...);
67   }
68
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...);
73   }
74
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...);
87   }
88
89  protected:
90   EventEmitter() {}
91
92  private:
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...);
102     return event->Get(
103         StringToV8(isolate(), "defaultPrevented"))->BooleanValue();
104   }
105
106   DISALLOW_COPY_AND_ASSIGN(EventEmitter);
107 };
108
109 }  // namespace mate
110
111 #endif  // ATOM_BROWSER_API_EVENT_EMITTER_H_