Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Unified Diff: Source/bindings/core/v8/Dictionary.h

Issue 534133002: [WIP] bindings: Introduce PropertyBag (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/bindings/core/v8/CustomElementConstructorBuilder.cpp ('k') | Source/bindings/core/v8/Dictionary.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/bindings/core/v8/Dictionary.h
diff --git a/Source/bindings/core/v8/Dictionary.h b/Source/bindings/core/v8/Dictionary.h
index 573932f2c83d587d339bb7e0409fb94809438061..2623c2688f43aaecd747727427e013f3b4d3ba86 100644
--- a/Source/bindings/core/v8/Dictionary.h
+++ b/Source/bindings/core/v8/Dictionary.h
@@ -26,119 +26,108 @@
#ifndef Dictionary_h
#define Dictionary_h
-#include "bindings/core/v8/ExceptionMessages.h"
#include "bindings/core/v8/ExceptionState.h"
-#include "bindings/core/v8/Nullable.h"
-#include "bindings/core/v8/ScriptValue.h"
+#include "bindings/core/v8/PropertyBag.h"
#include "bindings/core/v8/V8Binding.h"
-#include "bindings/core/v8/V8BindingMacros.h"
+#include "bindings/core/v8/V8Element.h"
+#include "bindings/core/v8/V8Path2D.h"
#include "core/dom/MessagePort.h"
#include "core/events/EventListener.h"
-#include "wtf/HashMap.h"
-#include "wtf/HashSet.h"
-#include "wtf/Vector.h"
-#include "wtf/text/AtomicString.h"
+#include "wtf/OwnPtr.h"
#include "wtf/text/WTFString.h"
-#include <v8.h>
namespace blink {
-class Element;
-class Path2D;
-
+// NOTE: I don't intend to land this; just to show how we can remove DictionaryHelper.
+// We should remove Dictionary class at all.
class Dictionary {
ALLOW_ONLY_INLINE_ALLOCATION();
public:
- Dictionary();
- Dictionary(const v8::Handle<v8::Value>& options, v8::Isolate*);
- ~Dictionary();
+ Dictionary()
+ {
+ }
+
+ Dictionary(const v8::Handle<v8::Value>& options, v8::Isolate* isolate)
+ : m_options(options)
+ {
+ if (!m_options.IsEmpty() && m_options->IsObject()) {
+ v8::Handle<v8::Object> v8Object = options->ToObject();
+ m_propertyBag = adoptPtr(new PropertyBag(isolate, v8Object, m_exceptionState));
+ }
+ }
- Dictionary& operator=(const Dictionary&);
+ Dictionary(const Dictionary& rhs)
+ {
+ m_options = rhs.m_options;
+ if (rhs.m_propertyBag)
+ m_propertyBag = adoptPtr(new PropertyBag(rhs.m_propertyBag->m_isolate, rhs.m_propertyBag->m_object, m_exceptionState));
+ }
// This is different from the default constructor:
// * isObject() is true when using createEmpty().
// * isUndefinedOrNull() is true when using default constructor.
- static Dictionary createEmpty(v8::Isolate*);
-
- bool isObject() const;
- bool isUndefinedOrNull() const;
-
- bool get(const String&, Dictionary&) const;
- bool get(const String&, v8::Local<v8::Value>&) const;
-
- // Sets properties using default attributes.
- bool set(const String&, const v8::Handle<v8::Value>&);
- bool set(const String&, const String&);
- bool set(const String&, unsigned);
- bool set(const String&, const Dictionary&);
-
- v8::Handle<v8::Value> v8Value() const { return m_options; }
-
- class ConversionContext {
- public:
- ConversionContext(const String& interfaceName, const String& methodName, ExceptionState& exceptionState)
- : m_interfaceName(interfaceName)
- , m_methodName(methodName)
- , m_exceptionState(exceptionState)
- , m_dirty(true)
- {
- resetPerPropertyContext();
- }
-
- const String& interfaceName() const { return m_interfaceName; }
- const String& methodName() const { return m_methodName; }
- bool forConstructor() const { return m_methodName.isEmpty(); }
- ExceptionState& exceptionState() const { return m_exceptionState; }
+ static Dictionary createEmpty(v8::Isolate* isolate)
+ {
+ return Dictionary(v8::Object::New(isolate), isolate);
+ }
- bool isNullable() const { return m_isNullable; }
- String typeName() const { return m_propertyTypeName; }
+ ~Dictionary() { }
- ConversionContext& setConversionType(const String&, bool);
+ Dictionary& operator=(const Dictionary& rhs)
+ {
+ m_options = rhs.m_options;
+ if (rhs.m_propertyBag)
+ m_propertyBag = adoptPtr(new PropertyBag(rhs.m_propertyBag->m_isolate, rhs.m_propertyBag->m_object, m_exceptionState));
+ else
+ m_propertyBag.clear();
+ return *this;
+ }
- void throwTypeError(const String& detail);
+ bool isObject() const
+ {
+ return !m_options.IsEmpty() && m_options->IsObject();
+ }
- void resetPerPropertyContext();
+ bool isUndefinedOrNull() const
+ {
+ return m_options.IsEmpty() || blink::isUndefinedOrNull(m_options);
+ }
- private:
- const String m_interfaceName;
- const String m_methodName;
- ExceptionState& m_exceptionState;
- bool m_dirty;
+ template <typename T>
+ bool get(const String& key, T& value) const { return m_propertyBag && m_propertyBag->get(key, value, PropertyBag::IsNotNullable); }
- bool m_isNullable;
- String m_propertyTypeName;
- };
+ template <typename T>
+ bool get(const String& key, T& value, bool& hasValue) const { return m_propertyBag && m_propertyBag->get(key, value, hasValue); }
+ template <typename T>
+ bool getWithUndefinedOrNullCheck(const String& key, T& value) const { return get(key, value); }
- class ConversionContextScope {
- public:
- ConversionContextScope(ConversionContext& context)
- : m_context(context) { }
- ~ConversionContextScope()
- {
- m_context.resetPerPropertyContext();
- }
- private:
- ConversionContext& m_context;
- };
+ // Sets properties using default attributes.
+ template <typename T>
+ bool set(const String& key, const T& value) { return m_propertyBag && m_propertyBag->set(key, value); }
- bool convert(ConversionContext&, const String&, Dictionary&) const;
+ v8::Handle<v8::Value> v8Value() const
+ {
+ return m_options;
+ }
+ // FIXME: These should be gone.
bool getOwnPropertiesAsStringHashMap(HashMap<String, String>&) const;
bool getOwnPropertyNames(Vector<String>&) const;
- bool getWithUndefinedOrNullCheck(const String&, String&) const;
- bool getWithUndefinedOrNullCheck(const String&, RefPtrWillBeMember<Element>&) const;
- bool getWithUndefinedOrNullCheck(const String&, RefPtrWillBeMember<Path2D>&) const;
-
- bool hasProperty(const String&) const;
-
- v8::Isolate* isolate() const { return m_isolate; }
+ bool hasProperty(const String& key) const { return m_propertyBag && m_propertyBag->hasProperty(key); }
private:
- bool getKey(const String& key, v8::Local<v8::Value>&) const;
-
v8::Handle<v8::Value> m_options;
- v8::Isolate* m_isolate;
+ TrackExceptionState m_exceptionState;
+ OwnPtr<PropertyBag> m_propertyBag;
+};
+
+template <>
+struct V8ValueTraits<Dictionary> {
+ static v8::Handle<v8::Value> toV8Value(const Dictionary& value, v8::Handle<v8::Object>, v8::Isolate*)
+ {
+ return value.v8Value();
+ }
};
template<>
@@ -147,23 +136,13 @@ struct NativeValueTraits<Dictionary> {
{
return Dictionary(value, isolate);
}
-};
-
-// DictionaryHelper is a collection of static methods for getting or
-// converting a value from Dictionary.
-struct DictionaryHelper {
- template <typename T>
- static bool get(const Dictionary&, const String& key, T& value);
- template <typename T>
- static bool get(const Dictionary&, const String& key, T& value, bool& hasValue);
- template <template <typename> class PointerType, typename T>
- static bool get(const Dictionary&, const String& key, PointerType<T>& value);
- template <typename T>
- static bool convert(const Dictionary&, Dictionary::ConversionContext&, const String& key, T& value);
- template <typename T>
- static bool convert(const Dictionary&, Dictionary::ConversionContext&, const String& key, Nullable<T>& value);
- template <template <typename> class PointerType, typename T>
- static bool convert(const Dictionary&, Dictionary::ConversionContext&, const String& key, PointerType<T>& value);
+ static inline Dictionary nativeValueMayFail(v8::Isolate* isolate, const v8::Handle<v8::Value>& value, ExceptionState& exceptionState)
+ {
+ if (value->IsObject()) {
+ return Dictionary(value, isolate);
+ }
+ return Dictionary();
+ }
};
}
« no previous file with comments | « Source/bindings/core/v8/CustomElementConstructorBuilder.cpp ('k') | Source/bindings/core/v8/Dictionary.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698