1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef GIN_PUBLIC_ISOLATE_HOLDER_H_ 6 #define GIN_PUBLIC_ISOLATE_HOLDER_H_ 7 8 #include "base/basictypes.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "gin/gin_export.h" 11 #include "v8/include/v8.h" 12 13 namespace gin { 14 15 class PerIsolateData; 16 class RunMicrotasksObserver; 17 18 // To embed Gin, first initialize gin using IsolateHolder::Initialize and then 19 // create an instance of IsolateHolder to hold the v8::Isolate in which you 20 // will execute JavaScript. You might wish to subclass IsolateHolder if you 21 // want to tie more state to the lifetime of the isolate. 22 class GIN_EXPORT IsolateHolder { 23 public: 24 // Controls whether or not V8 should only accept strict mode scripts. 25 enum ScriptMode { 26 kNonStrictMode, 27 kStrictMode 28 }; 29 30 IsolateHolder(); 31 ~IsolateHolder(); 32 33 // Should be invoked once before creating IsolateHolder instances to 34 // initialize V8 and Gin. 35 static void Initialize(ScriptMode mode, 36 v8::ArrayBuffer::Allocator* allocator); 37 isolate()38 v8::Isolate* isolate() { return isolate_; } 39 40 // The implementations of Object.observe() and Promise enqueue v8 Microtasks 41 // that should be executed just before control is returned to the message 42 // loop. This method adds a MessageLoop TaskObserver which runs any pending 43 // Microtasks each time a Task is completed. This method should be called 44 // once, when a MessageLoop is created and it should be called on the 45 // MessageLoop's thread. 46 void AddRunMicrotasksObserver(); 47 48 // This method should also only be called once, and on the MessageLoop's 49 // thread. 50 void RemoveRunMicrotasksObserver(); 51 52 private: 53 v8::Isolate* isolate_; 54 scoped_ptr<PerIsolateData> isolate_data_; 55 scoped_ptr<RunMicrotasksObserver> task_observer_; 56 57 DISALLOW_COPY_AND_ASSIGN(IsolateHolder); 58 }; 59 60 } // namespace gin 61 62 #endif // GIN_PUBLIC_ISOLATE_HOLDER_H_ 63