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_CONTEXT_HOLDER_H_
6#define GIN_PUBLIC_CONTEXT_HOLDER_H_
7
8#include <list>
9
10#include "base/basictypes.h"
11#include "base/memory/scoped_ptr.h"
12#include "gin/gin_export.h"
13#include "v8/include/v8.h"
14
15namespace gin {
16
17// Gin embedder that store embedder data in v8::Contexts must do so in a
18// single field with the index kPerContextDataStartIndex + GinEmbedder-enum.
19// The field at kDebugIdIndex is treated specially by V8 and is reserved for
20// a V8 debugger implementation (not used by gin).
21enum ContextEmbedderDataFields {
22  kDebugIdIndex = 0,
23  kPerContextDataStartIndex,
24};
25
26class PerContextData;
27
28// ContextHolder is a generic class for holding a v8::Context.
29class GIN_EXPORT ContextHolder {
30 public:
31  explicit ContextHolder(v8::Isolate* isolate);
32  ~ContextHolder();
33
34  v8::Isolate* isolate() const { return isolate_; }
35
36  v8::Handle<v8::Context> context() const {
37    return v8::Local<v8::Context>::New(isolate_, context_);
38  }
39
40  void SetContext(v8::Handle<v8::Context> context);
41
42 private:
43  v8::Isolate* isolate_;
44  v8::UniquePersistent<v8::Context> context_;
45  scoped_ptr<PerContextData> data_;
46
47  DISALLOW_COPY_AND_ASSIGN(ContextHolder);
48};
49
50}  // namespace gin
51
52#endif  // GIN_PUBLIC_CONTEXT_HOLDER_H_
53