#ifndef CEF_LIBCEF_COMMON_VALUES_IMPL_H_
#define CEF_LIBCEF_COMMON_VALUES_IMPL_H_
#pragma once
#include <vector>
#include "include/cef_values.h"
#include "libcef/common/value_base.h"
#include "base/threading/platform_thread.h"
#include "base/values.h"
class CefValueImpl : public CefValue {
public:
static CefRefPtr<CefValue> GetOrCreateRefOrCopy(
base::Value* value,
void* parent_value,
bool read_only,
CefValueController* controller);
CefValueImpl();
explicit CefValueImpl(base::Value* value);
explicit CefValueImpl(CefRefPtr<CefBinaryValue> value);
explicit CefValueImpl(CefRefPtr<CefDictionaryValue> value);
explicit CefValueImpl(CefRefPtr<CefListValue> value);
CefValueImpl(const CefValueImpl&) = delete;
CefValueImpl& operator=(const CefValueImpl&) = delete;
~CefValueImpl() override;
void SetValue(base::Value* value);
base::Value* CopyOrDetachValue(CefValueController* new_controller);
void SwapValue(base::Value* new_value,
void* new_parent_value,
CefValueController* new_controller);
base::Value* GetValueUnsafe() const;
bool IsValid() override;
bool IsOwned() override;
bool IsReadOnly() override;
bool IsSame(CefRefPtr<CefValue> that) override;
bool IsEqual(CefRefPtr<CefValue> that) override;
CefRefPtr<CefValue> Copy() override;
CefValueType GetType() override;
bool GetBool() override;
int GetInt() override;
double GetDouble() override;
CefString GetString() override;
CefRefPtr<CefBinaryValue> GetBinary() override;
CefRefPtr<CefDictionaryValue> GetDictionary() override;
CefRefPtr<CefListValue> GetList() override;
bool SetNull() override;
bool SetBool(bool value) override;
bool SetInt(int value) override;
bool SetDouble(double value) override;
bool SetString(const CefString& value) override;
bool SetBinary(CefRefPtr<CefBinaryValue> value) override;
bool SetDictionary(CefRefPtr<CefDictionaryValue> value) override;
bool SetList(CefRefPtr<CefListValue> value) override;
class ScopedLockedValue {
public:
explicit ScopedLockedValue(CefRefPtr<CefValueImpl> impl) : impl_(impl) {
impl_->AcquireLock();
}
ScopedLockedValue(const ScopedLockedValue&) = delete;
ScopedLockedValue& operator=(const ScopedLockedValue&) = delete;
~ScopedLockedValue() { impl_->ReleaseLock(); }
base::Value* value() const { return impl_->GetValueUnsafe(); }
private:
CefRefPtr<CefValueImpl> impl_;
};
private:
void SetValueInternal(base::Value* value);
CefValueController* GetValueController() const;
void AcquireLock();
void ReleaseLock();
base::Lock lock_;
std::unique_ptr<base::Value> value_;
CefRefPtr<CefBinaryValue> binary_value_;
CefRefPtr<CefDictionaryValue> dictionary_value_;
CefRefPtr<CefListValue> list_value_;
IMPLEMENT_REFCOUNTING(CefValueImpl);
};
class CefBinaryValueImpl : public CefValueBase<CefBinaryValue, base::Value> {
public:
static CefRefPtr<CefBinaryValue> GetOrCreateRef(
base::Value* value,
void* parent_value,
CefValueController* controller);
CefBinaryValueImpl(base::Value* value, bool will_delete);
CefBinaryValueImpl(char* data, size_t data_size);
CefBinaryValueImpl(const CefBinaryValueImpl&) = delete;
CefBinaryValueImpl& operator=(const CefBinaryValueImpl&) = delete;
base::Value* CopyValue() WARN_UNUSED_RESULT;
base::Value* CopyOrDetachValue(CefValueController* new_controller)
WARN_UNUSED_RESULT;
bool IsSameValue(const base::Value* that);
bool IsEqualValue(const base::Value* that);
base::Value* GetValueUnsafe();
bool IsValid() override;
bool IsOwned() override;
bool IsSame(CefRefPtr<CefBinaryValue> that) override;
bool IsEqual(CefRefPtr<CefBinaryValue> that) override;
CefRefPtr<CefBinaryValue> Copy() override;
size_t GetSize() override;
size_t GetData(void* buffer, size_t buffer_size, size_t data_offset) override;
private:
CefBinaryValueImpl(base::Value* value,
void* parent_value,
ValueMode value_mode,
CefValueController* controller);
};
class CefDictionaryValueImpl
: public CefValueBase<CefDictionaryValue, base::DictionaryValue> {
public:
static CefRefPtr<CefDictionaryValue> GetOrCreateRef(
base::DictionaryValue* value,
void* parent_value,
bool read_only,
CefValueController* controller);
CefDictionaryValueImpl(base::DictionaryValue* value,
bool will_delete,
bool read_only);
CefDictionaryValueImpl(const CefDictionaryValueImpl&) = delete;
CefDictionaryValueImpl& operator=(const CefDictionaryValueImpl&) = delete;
base::DictionaryValue* CopyValue() WARN_UNUSED_RESULT;
base::DictionaryValue* CopyOrDetachValue(CefValueController* new_controller)
WARN_UNUSED_RESULT;
bool IsSameValue(const base::DictionaryValue* that);
bool IsEqualValue(const base::DictionaryValue* that);
base::DictionaryValue* GetValueUnsafe();
bool IsValid() override;
bool IsOwned() override;
bool IsReadOnly() override;
bool IsSame(CefRefPtr<CefDictionaryValue> that) override;
bool IsEqual(CefRefPtr<CefDictionaryValue> that) override;
CefRefPtr<CefDictionaryValue> Copy(bool exclude_empty_children) override;
size_t GetSize() override;
bool Clear() override;
bool HasKey(const CefString& key) override;
bool GetKeys(KeyList& keys) override;
bool Remove(const CefString& key) override;
CefValueType GetType(const CefString& key) override;
CefRefPtr<CefValue> GetValue(const CefString& key) override;
bool GetBool(const CefString& key) override;
int GetInt(const CefString& key) override;
double GetDouble(const CefString& key) override;
CefString GetString(const CefString& key) override;
CefRefPtr<CefBinaryValue> GetBinary(const CefString& key) override;
CefRefPtr<CefDictionaryValue> GetDictionary(const CefString& key) override;
CefRefPtr<CefListValue> GetList(const CefString& key) override;
bool SetValue(const CefString& key, CefRefPtr<CefValue> value) override;
bool SetNull(const CefString& key) override;
bool SetBool(const CefString& key, bool value) override;
bool SetInt(const CefString& key, int value) override;
bool SetDouble(const CefString& key, double value) override;
bool SetString(const CefString& key, const CefString& value) override;
bool SetBinary(const CefString& key,
CefRefPtr<CefBinaryValue> value) override;
bool SetDictionary(const CefString& key,
CefRefPtr<CefDictionaryValue> value) override;
bool SetList(const CefString& key, CefRefPtr<CefListValue> value) override;
private:
CefDictionaryValueImpl(base::DictionaryValue* value,
void* parent_value,
ValueMode value_mode,
bool read_only,
CefValueController* controller);
bool RemoveInternal(const CefString& key);
base::Value* SetInternal(const CefString& key, base::Value* value);
};
class CefListValueImpl : public CefValueBase<CefListValue, base::ListValue> {
public:
static CefRefPtr<CefListValue> GetOrCreateRef(base::ListValue* value,
void* parent_value,
bool read_only,
CefValueController* controller);
CefListValueImpl(base::ListValue* value, bool will_delete, bool read_only);
CefListValueImpl(const CefListValueImpl&) = delete;
CefListValueImpl& operator=(const CefListValueImpl&) = delete;
base::ListValue* CopyValue() WARN_UNUSED_RESULT;
base::ListValue* CopyOrDetachValue(CefValueController* new_controller)
WARN_UNUSED_RESULT;
bool IsSameValue(const base::ListValue* that);
bool IsEqualValue(const base::ListValue* that);
base::ListValue* GetValueUnsafe();
bool IsValid() override;
bool IsOwned() override;
bool IsReadOnly() override;
bool IsSame(CefRefPtr<CefListValue> that) override;
bool IsEqual(CefRefPtr<CefListValue> that) override;
CefRefPtr<CefListValue> Copy() override;
bool SetSize(size_t size) override;
size_t GetSize() override;
bool Clear() override;
bool Remove(size_t index) override;
CefValueType GetType(size_t index) override;
CefRefPtr<CefValue> GetValue(size_t index) override;
bool GetBool(size_t index) override;
int GetInt(size_t index) override;
double GetDouble(size_t index) override;
CefString GetString(size_t index) override;
CefRefPtr<CefBinaryValue> GetBinary(size_t index) override;
CefRefPtr<CefDictionaryValue> GetDictionary(size_t index) override;
CefRefPtr<CefListValue> GetList(size_t index) override;
bool SetValue(size_t index, CefRefPtr<CefValue> value) override;
bool SetNull(size_t index) override;
bool SetBool(size_t index, bool value) override;
bool SetInt(size_t index, int value) override;
bool SetDouble(size_t index, double value) override;
bool SetString(size_t index, const CefString& value) override;
bool SetBinary(size_t index, CefRefPtr<CefBinaryValue> value) override;
bool SetDictionary(size_t index,
CefRefPtr<CefDictionaryValue> value) override;
bool SetList(size_t index, CefRefPtr<CefListValue> value) override;
private:
CefListValueImpl(base::ListValue* value,
void* parent_value,
ValueMode value_mode,
bool read_only,
CefValueController* controller);
bool RemoveInternal(size_t index);
base::Value* SetInternal(size_t index, base::Value* value);
};
#endif