| 
									
										
										
										
											2013-04-13 18:39:09 +08:00
										 |  |  | // Copyright (c) 2013 GitHub, Inc. All rights reserved.
 | 
					
						
							|  |  |  | // Use of this source code is governed by a BSD-style license that can be
 | 
					
						
							|  |  |  | // found in the LICENSE file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef RAVE_COMMON_NODE_BINDINGS_
 | 
					
						
							|  |  |  | #define RAVE_COMMON_NODE_BINDINGS_
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "base/basictypes.h"
 | 
					
						
							| 
									
										
										
										
											2013-07-22 14:58:25 +08:00
										 |  |  | #include "vendor/node/deps/uv/include/uv.h"
 | 
					
						
							| 
									
										
										
										
											2013-04-13 18:39:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-20 11:13:06 +08:00
										 |  |  | namespace WebKit { | 
					
						
							|  |  |  | class WebFrame; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-22 14:58:25 +08:00
										 |  |  | namespace base { | 
					
						
							|  |  |  | class MessageLoop; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-13 18:39:09 +08:00
										 |  |  | namespace atom { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class NodeBindings { | 
					
						
							|  |  |  |  public: | 
					
						
							| 
									
										
										
										
											2013-07-22 16:05:35 +08:00
										 |  |  |   static NodeBindings* Create(bool is_browser); | 
					
						
							| 
									
										
										
										
											2013-04-13 23:05:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-13 18:39:09 +08:00
										 |  |  |   virtual ~NodeBindings(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-11 15:48:19 +08:00
										 |  |  |   // Setup V8, libuv and the process object, then load the node.js script.
 | 
					
						
							| 
									
										
										
										
											2013-04-13 23:05:13 +08:00
										 |  |  |   virtual void Initialize(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-20 11:13:06 +08:00
										 |  |  |   // Load cefode.js script under web frame.
 | 
					
						
							|  |  |  |   virtual void BindTo(WebKit::WebFrame* frame); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-13 23:05:13 +08:00
										 |  |  |   // Prepare for message loop integration.
 | 
					
						
							| 
									
										
										
										
											2013-07-22 14:58:25 +08:00
										 |  |  |   virtual void PrepareMessageLoop(); | 
					
						
							| 
									
										
										
										
											2013-04-13 23:05:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Do message loop integration.
 | 
					
						
							| 
									
										
										
										
											2013-07-22 14:58:25 +08:00
										 |  |  |   virtual void RunMessageLoop(); | 
					
						
							| 
									
										
										
										
											2013-04-13 23:05:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |  protected: | 
					
						
							|  |  |  |   explicit NodeBindings(bool is_browser); | 
					
						
							| 
									
										
										
										
											2013-04-13 18:39:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-22 14:58:25 +08:00
										 |  |  |   // Called to poll events in new thread.
 | 
					
						
							|  |  |  |   virtual void PollEvents() = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Run the libuv loop for once.
 | 
					
						
							|  |  |  |   void UvRunOnce(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Make the main thread run libuv loop.
 | 
					
						
							|  |  |  |   void WakeupMainThread(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-23 13:08:40 +08:00
										 |  |  |   // Interrupt the PollEvents.
 | 
					
						
							|  |  |  |   void WakeupEmbedThread(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-22 14:58:25 +08:00
										 |  |  |   // Are we running in browser.
 | 
					
						
							| 
									
										
										
										
											2013-04-13 21:10:41 +08:00
										 |  |  |   bool is_browser_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-22 14:58:25 +08:00
										 |  |  |   // Main thread's MessageLoop.
 | 
					
						
							|  |  |  |   base::MessageLoop* message_loop_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Main thread's libuv loop.
 | 
					
						
							|  |  |  |   uv_loop_t* uv_loop_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-22 15:25:39 +08:00
										 |  |  |  private: | 
					
						
							|  |  |  |   // Thread to poll uv events.
 | 
					
						
							|  |  |  |   static void EmbedThreadRunner(void *arg); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-29 20:50:03 +08:00
										 |  |  |   // Do idle GC.
 | 
					
						
							|  |  |  |   static void IdleCallback(uv_timer_t*, int); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-22 15:25:39 +08:00
										 |  |  |   // Whether the libuv loop has ended.
 | 
					
						
							|  |  |  |   bool embed_closed_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-22 14:58:25 +08:00
										 |  |  |   // Dummy handle to make uv's loop not quit.
 | 
					
						
							|  |  |  |   uv_async_t dummy_uv_handle_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-29 20:50:03 +08:00
										 |  |  |   // Timer to do idle GC.
 | 
					
						
							|  |  |  |   uv_timer_t idle_timer_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-22 14:58:25 +08:00
										 |  |  |   // Thread for polling events.
 | 
					
						
							|  |  |  |   uv_thread_t embed_thread_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Semaphore to wait for main loop in the embed thread.
 | 
					
						
							|  |  |  |   uv_sem_t embed_sem_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-13 18:39:09 +08:00
										 |  |  |   DISALLOW_COPY_AND_ASSIGN(NodeBindings); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-14 17:33:44 +08:00
										 |  |  | }  // namespace atom
 | 
					
						
							| 
									
										
										
										
											2013-04-13 18:39:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif  // RAVE_COMMON_NODE_BINDINGS_
 |