// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef GIN_INTERCEPTOR_H_
#define GIN_INTERCEPTOR_H_

#include <string>
#include <vector>

#include "base/basictypes.h"
#include "gin/gin_export.h"
#include "v8/include/v8.h"

namespace gin {

class WrappableBase;

// Base class for gin::Wrappable-derived classes that want to implement a
// property interceptor.
class GIN_EXPORT NamedPropertyInterceptor {
 public:
  NamedPropertyInterceptor(v8::Isolate* isolate, WrappableBase* base);
  virtual ~NamedPropertyInterceptor();

  virtual v8::Local<v8::Value> GetNamedProperty(v8::Isolate* isolate,
                                                const std::string& property);
  virtual void SetNamedProperty(v8::Isolate* isolate,
                                const std::string& property,
                                v8::Local<v8::Value> value);
  virtual std::vector<std::string> EnumerateNamedProperties(
      v8::Isolate* isolate);

 private:
  v8::Isolate* isolate_;
  WrappableBase* base_;

  DISALLOW_COPY_AND_ASSIGN(NamedPropertyInterceptor);
};

class GIN_EXPORT IndexedPropertyInterceptor {
 public:
  IndexedPropertyInterceptor(v8::Isolate* isolate, WrappableBase* base);
  virtual ~IndexedPropertyInterceptor();

  virtual v8::Local<v8::Value> GetIndexedProperty(v8::Isolate* isolate,
                                                  uint32_t index);
  virtual void SetIndexedProperty(v8::Isolate* isolate,
                                  uint32_t index,
                                  v8::Local<v8::Value> value);
  virtual std::vector<uint32_t> EnumerateIndexedProperties(
      v8::Isolate* isolate);

 private:
  v8::Isolate* isolate_;
  WrappableBase* base_;

  DISALLOW_COPY_AND_ASSIGN(IndexedPropertyInterceptor);
};

}  // namespace gin

#endif  // GIN_INTERCEPTOR_H_
