// 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 EXTENSIONS_RENDERER_SCOPED_PERSISTENT_H_
#define EXTENSIONS_RENDERER_SCOPED_PERSISTENT_H_

#include "base/logging.h"
#include "v8/include/v8.h"

namespace extensions {

// A v8::Persistent handle to a V8 value which destroys and clears the
// underlying handle on destruction.
template <typename T>
class ScopedPersistent {
 public:
  ScopedPersistent() {}

  explicit ScopedPersistent(v8::Handle<T> handle) { reset(handle); }

  ~ScopedPersistent() { reset(); }

  void reset(v8::Handle<T> handle) {
    if (!handle.IsEmpty())
      handle_.Reset(GetIsolate(handle), handle);
    else
      reset();
  }

  void reset() { handle_.Reset(); }

  bool IsEmpty() const { return handle_.IsEmpty(); }

  v8::Handle<T> NewHandle() const {
    if (handle_.IsEmpty())
      return v8::Local<T>();
    return v8::Local<T>::New(GetIsolate(handle_), handle_);
  }

  v8::Handle<T> NewHandle(v8::Isolate* isolate) const {
    if (handle_.IsEmpty())
      return v8::Local<T>();
    return v8::Local<T>::New(isolate, handle_);
  }

  template <typename P>
  void SetWeak(P* parameters,
               typename v8::WeakCallbackData<T, P>::Callback callback) {
    handle_.SetWeak(parameters, callback);
  }

 private:
  template <typename U>
  static v8::Isolate* GetIsolate(v8::Handle<U> object_handle) {
    // Only works for v8::Object and its subclasses. Add specialisations for
    // anything else.
    if (!object_handle.IsEmpty())
      return GetIsolate(object_handle->CreationContext());
    return v8::Isolate::GetCurrent();
  }
  static v8::Isolate* GetIsolate(v8::Handle<v8::Context> context_handle) {
    if (!context_handle.IsEmpty())
      return context_handle->GetIsolate();
    return v8::Isolate::GetCurrent();
  }
  static v8::Isolate* GetIsolate(
      v8::Handle<v8::ObjectTemplate> template_handle) {
    return v8::Isolate::GetCurrent();
  }

  v8::Persistent<T> handle_;

  DISALLOW_COPY_AND_ASSIGN(ScopedPersistent);
};

}  // namespace extensions

#endif  // EXTENSIONS_RENDERER_SCOPED_PERSISTENT_H_
