| // Copyright (c) 2012 The Chromium Embedded Framework 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 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" |
| |
| // CefValue implementation |
| class CefValueImpl : public CefValue { |
| public: |
| // Get or create a reference to a complex value or copy a simple value. |
| static CefRefPtr<CefValue> GetOrCreateRefOrCopy( |
| base::Value* value, |
| void* parent_value, |
| bool read_only, |
| CefValueController* controller); |
| |
| CefValueImpl(); |
| |
| // Take ownership of |value|. Do not pass in a value owned by something else |
| // (use GetOrCreateRefOrCopy instead). |
| explicit CefValueImpl(base::Value* value); |
| |
| // Keep a reference to |value|. |
| explicit CefValueImpl(CefRefPtr<CefBinaryValue> value); |
| explicit CefValueImpl(CefRefPtr<CefDictionaryValue> value); |
| explicit CefValueImpl(CefRefPtr<CefListValue> value); |
| |
| ~CefValueImpl() override; |
| |
| // Take ownership of |value|. Do not pass in a value owned by something else |
| // (use GetOrCreateRefOrCopy or Set*() instead). |
| void SetValue(base::Value* value); |
| |
| // Copy a simple value or transfer ownership of a complex value. If ownership |
| // of the value is tranferred then this object's internal reference to the |
| // value will be updated and remain valid. base::Value now uses move semantics |
| // so we need to perform the copy and swap in two steps. |
| base::Value* CopyOrDetachValue(CefValueController* new_controller); |
| void SwapValue(base::Value* new_value, |
| void* new_parent_value, |
| CefValueController* new_controller); |
| |
| // Returns a reference to the underlying data. Access must be protected by |
| // calling AcquireLock/ReleaseLock. |
| base::Value* GetValueUnsafe() const; |
| |
| // CefValue methods. |
| 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; |
| |
| // Ensures exclusive access to the underlying data for the life of this scoped |
| // object. |
| class ScopedLockedValue { |
| public: |
| explicit ScopedLockedValue(CefRefPtr<CefValueImpl> impl) : impl_(impl) { |
| impl_->AcquireLock(); |
| } |
| ~ScopedLockedValue() { impl_->ReleaseLock(); } |
| |
| base::Value* value() const { return impl_->GetValueUnsafe(); } |
| |
| private: |
| CefRefPtr<CefValueImpl> impl_; |
| DISALLOW_COPY_AND_ASSIGN(ScopedLockedValue); |
| }; |
| |
| private: |
| void SetValueInternal(base::Value* value); |
| |
| // Returns the controller for the current value, if any. |
| CefValueController* GetValueController() const; |
| |
| // Explicitly lock/unlock this object and the underlying data. |
| void AcquireLock(); |
| void ReleaseLock(); |
| |
| // Access to all members must be protected by |lock_|. |
| base::Lock lock_; |
| |
| // Simple values only. |
| std::unique_ptr<base::Value> value_; |
| |
| // Complex values. |
| CefRefPtr<CefBinaryValue> binary_value_; |
| CefRefPtr<CefDictionaryValue> dictionary_value_; |
| CefRefPtr<CefListValue> list_value_; |
| |
| IMPLEMENT_REFCOUNTING(CefValueImpl); |
| DISALLOW_COPY_AND_ASSIGN(CefValueImpl); |
| }; |
| |
| // CefBinaryValue implementation |
| class CefBinaryValueImpl : public CefValueBase<CefBinaryValue, base::Value> { |
| public: |
| // Get or create a reference value. |
| static CefRefPtr<CefBinaryValue> GetOrCreateRef( |
| base::Value* value, |
| void* parent_value, |
| CefValueController* controller); |
| |
| // Reference an existing value (set |will_delete| to false) or take ownership |
| // of an existing value (set |will_delete| to true). When referencing an |
| // existing value you must explicitly call Detach(nullptr) when |value| is no |
| // longer valid. Use GetOrCreateRef instead of this constructor if |value| is |
| // owned by some other object and you do not plan to explicitly call |
| // Detach(nullptr). |
| CefBinaryValueImpl(base::Value* value, bool will_delete); |
| |
| // The data will always be copied. |
| CefBinaryValueImpl(char* data, size_t data_size); |
| |
| // Return a copy of the value. |
| base::Value* CopyValue(); |
| |
| // If this value is a reference then return a copy. Otherwise, detach and |
| // transfer ownership of the value. |
| base::Value* CopyOrDetachValue(CefValueController* new_controller); |
| |
| bool IsSameValue(const base::Value* that); |
| bool IsEqualValue(const base::Value* that); |
| |
| // Returns the underlying value. Access must be protected by calling |
| // lock/unlock on the controller. |
| base::Value* GetValueUnsafe(); |
| |
| // CefBinaryValue methods. |
| 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: |
| // See the CefValueBase constructor for usage. Binary values are always |
| // read-only. |
| CefBinaryValueImpl(base::Value* value, |
| void* parent_value, |
| ValueMode value_mode, |
| CefValueController* controller); |
| |
| DISALLOW_COPY_AND_ASSIGN(CefBinaryValueImpl); |
| }; |
| |
| // CefDictionaryValue implementation |
| class CefDictionaryValueImpl |
| : public CefValueBase<CefDictionaryValue, base::DictionaryValue> { |
| public: |
| // Get or create a reference value. |
| static CefRefPtr<CefDictionaryValue> GetOrCreateRef( |
| base::DictionaryValue* value, |
| void* parent_value, |
| bool read_only, |
| CefValueController* controller); |
| |
| // Reference an existing value (set |will_delete| to false) or take ownership |
| // of an existing value (set |will_delete| to true). When referencing an |
| // existing value you must explicitly call Detach(nullptr) when |value| is no |
| // longer valid. Use GetOrCreateRef instead of this constructor if |value| is |
| // owned by some other object and you do not plan to explicitly call |
| // Detach(nullptr). |
| CefDictionaryValueImpl(base::DictionaryValue* value, |
| bool will_delete, |
| bool read_only); |
| |
| // Return a copy of the value. |
| base::DictionaryValue* CopyValue(); |
| |
| // If this value is a reference then return a copy. Otherwise, detach and |
| // transfer ownership of the value. |
| base::DictionaryValue* CopyOrDetachValue(CefValueController* new_controller); |
| |
| bool IsSameValue(const base::DictionaryValue* that); |
| bool IsEqualValue(const base::DictionaryValue* that); |
| |
| // Returns the underlying value. Access must be protected by calling |
| // lock/unlock on the controller. |
| base::DictionaryValue* GetValueUnsafe(); |
| |
| // CefDictionaryValue methods. |
| 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: |
| // See the CefValueBase constructor for usage. |
| 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); |
| |
| DISALLOW_COPY_AND_ASSIGN(CefDictionaryValueImpl); |
| }; |
| |
| // CefListValue implementation |
| class CefListValueImpl : public CefValueBase<CefListValue, base::ListValue> { |
| public: |
| // Get or create a reference value. |
| static CefRefPtr<CefListValue> GetOrCreateRef(base::ListValue* value, |
| void* parent_value, |
| bool read_only, |
| CefValueController* controller); |
| |
| // Reference an existing value (set |will_delete| to false) or take ownership |
| // of an existing value (set |will_delete| to true). When referencing an |
| // existing value you must explicitly call Detach(nullptr) when |value| is no |
| // longer valid. Use GetOrCreateRef instead of this constructor if |value| is |
| // owned by some other object and you do not plan to explicitly call |
| // Detach(nullptr). |
| CefListValueImpl(base::ListValue* value, bool will_delete, bool read_only); |
| |
| // Return a copy of the value. |
| base::ListValue* CopyValue(); |
| |
| // If this value is a reference then return a copy. Otherwise, detach and |
| // transfer ownership of the value. |
| base::ListValue* CopyOrDetachValue(CefValueController* new_controller); |
| |
| bool IsSameValue(const base::ListValue* that); |
| bool IsEqualValue(const base::ListValue* that); |
| |
| // Returns the underlying value. Access must be protected by calling |
| // lock/unlock on the controller. |
| base::ListValue* GetValueUnsafe(); |
| |
| // CefListValue methods. |
| 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: |
| // See the CefValueBase constructor for usage. |
| 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); |
| |
| DISALLOW_COPY_AND_ASSIGN(CefListValueImpl); |
| }; |
| |
| #endif // CEF_LIBCEF_COMMON_VALUES_IMPL_H_ |