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

#include <memory>

#include "bindings/core/v8/ScopedPersistent.h"
#include "bindings/core/v8/ScriptPromiseProperties.h"
#include "core/CoreExport.h"
#include "v8/include/v8.h"
#include "wtf/Allocator.h"
#include "wtf/PtrUtil.h"

namespace blink {

class ScriptState;
class ScriptWrappable;

#define V8_HIDDEN_VALUES(V)                  \
  V(customElementAttachedCallback)           \
  V(customElementAttributeChangedCallback)   \
  V(customElementCreatedCallback)            \
  V(customElementDetachedCallback)           \
  V(customElementDocument)                   \
  V(customElementIsInterfacePrototypeObject) \
  V(customElementNamespaceURI)               \
  V(customElementTagName)                    \
  V(customElementType)                       \
  V(customElementsRegistryMap)               \
  V(event)                                   \
  V(idbCursorRequest)                        \
  V(internalBodyBuffer)                      \
  V(internalBodyStream)                      \
  V(port1)                                   \
  V(port2)                                   \
  V(requestInFetchEvent)                     \
  V(state)                                   \
  V(testInterfaces)                          \
  V(thenableHiddenPromise)                   \
  V(toStringString)                          \
  V(injectedScriptNative)                    \
  SCRIPT_PROMISE_PROPERTIES(V, Promise)      \
  SCRIPT_PROMISE_PROPERTIES(V, Resolver)

class CORE_EXPORT V8HiddenValue {
  USING_FAST_MALLOC(V8HiddenValue);
  WTF_MAKE_NONCOPYABLE(V8HiddenValue);

 public:
  static std::unique_ptr<V8HiddenValue> create() {
    return WTF::wrapUnique(new V8HiddenValue());
  }

#define V8_DECLARE_METHOD(name) \
  static v8::Local<v8::String> name(v8::Isolate* isolate);
  V8_HIDDEN_VALUES(V8_DECLARE_METHOD);
#undef V8_DECLARE_METHOD

  static v8::Local<v8::Value> getHiddenValue(ScriptState*,
                                             v8::Local<v8::Object>,
                                             v8::Local<v8::String>);
  static bool setHiddenValue(ScriptState*,
                             v8::Local<v8::Object>,
                             v8::Local<v8::String>,
                             v8::Local<v8::Value>);
  static bool deleteHiddenValue(ScriptState*,
                                v8::Local<v8::Object>,
                                v8::Local<v8::String>);
  static v8::Local<v8::Value> getHiddenValueFromMainWorldWrapper(
      ScriptState*,
      ScriptWrappable*,
      v8::Local<v8::String>);

 private:
  V8HiddenValue() {}

#define V8_DECLARE_FIELD(name) ScopedPersistent<v8::String> m_##name;
  V8_HIDDEN_VALUES(V8_DECLARE_FIELD);
#undef V8_DECLARE_FIELD
};

}  // namespace blink

#endif  // V8HiddenValue_h
