Commit f98a635c authored by bashi@chromium.org's avatar bashi@chromium.org

bindings: Support (deprecated) Dictionary in IDL dictionary

Supporting deprecated Dictionary enables us to do step-by-step refactoring.

Note for tests:
Since Dictionary instances cannot outlive an event loop, DictionaryTest
stores its properties intead of instances itself. Added
getDictionaryMemberProperties() to retrieve these properties.

BUG=524357

Review URL: https://codereview.chromium.org/1316833003

git-svn-id: svn://svn.chromium.org/blink/trunk@201199 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent aec98be7
...@@ -141,6 +141,14 @@ PASS dictionaryTest.set({eventTargetOrNullMember: 42}) threw exception TypeError ...@@ -141,6 +141,14 @@ PASS dictionaryTest.set({eventTargetOrNullMember: 42}) threw exception TypeError
PASS dictionaryTest.set({eventTargetOrNullMember: []}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member eventTargetOrNullMember is not of type EventTarget.. PASS dictionaryTest.set({eventTargetOrNullMember: []}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member eventTargetOrNullMember is not of type EventTarget..
PASS dictionaryTest.set({eventTargetOrNullMember: {}}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member eventTargetOrNullMember is not of type EventTarget.. PASS dictionaryTest.set({eventTargetOrNullMember: {}}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member eventTargetOrNullMember is not of type EventTarget..
Test for passing Dictionary (not IDL dictionary)
PASS properties.foo is "x"
PASS properties.bar is "y"
PASS properties.baz is undefined.
PASS properties is {}
PASS dictionaryTest.set({dictionaryMember: 42}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member dictionaryMember is not an object..
PASS dictionaryTest.set({dictionaryMember: 'foo'}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member dictionaryMember is not an object..
Test for derived dictionary Test for derived dictionary
PASS derived.longMember is undefined. PASS derived.longMember is undefined.
PASS derived.longMemberWithDefault is 42 PASS derived.longMemberWithDefault is 42
......
...@@ -253,6 +253,21 @@ if (window.internals && internals.dictionaryTest) { ...@@ -253,6 +253,21 @@ if (window.internals && internals.dictionaryTest) {
shouldThrow("dictionaryTest.set({eventTargetOrNullMember: {}})"); shouldThrow("dictionaryTest.set({eventTargetOrNullMember: {}})");
debug(''); debug('');
debug('Test for passing Dictionary (not IDL dictionary)');
dictionaryTest.set({
dictionaryMember: {'foo': 'x', 'bar': 'y'}
});
properties = dictionaryTest.getDictionaryMemberProperties();
shouldBeEqualToString('properties.foo', 'x');
shouldBeEqualToString('properties.bar', 'y');
shouldBeUndefined('properties.baz');
dictionaryTest.set({dictionaryMember: undefined});
properties = dictionaryTest.getDictionaryMemberProperties();
shouldBe('properties', '{}');
shouldThrow("dictionaryTest.set({dictionaryMember: 42})");
shouldThrow("dictionaryTest.set({dictionaryMember: 'foo'})");
debug('');
debug('Test for derived dictionary'); debug('Test for derived dictionary');
dictionaryTest.setDerived({ requiredBooleanMember: true }); dictionaryTest.setDerived({ requiredBooleanMember: true });
derived = dictionaryTest.getDerived(); derived = dictionaryTest.getDerived();
......
...@@ -99,6 +99,7 @@ def member_context(dictionary, member): ...@@ -99,6 +99,7 @@ def member_context(dictionary, member):
cpp_default_value, v8_default_value = default_values() cpp_default_value, v8_default_value = default_values()
cpp_name = v8_utilities.cpp_name(member) cpp_name = v8_utilities.cpp_name(member)
is_deprecated_dictionary = unwrapped_idl_type.name == 'Dictionary'
return { return {
'cpp_default_value': cpp_default_value, 'cpp_default_value': cpp_default_value,
...@@ -113,9 +114,9 @@ def member_context(dictionary, member): ...@@ -113,9 +114,9 @@ def member_context(dictionary, member):
'enum_values': unwrapped_idl_type.enum_values, 'enum_values': unwrapped_idl_type.enum_values,
'has_method_name': has_method_name_for_dictionary_member(member), 'has_method_name': has_method_name_for_dictionary_member(member),
'idl_type': idl_type.base_type, 'idl_type': idl_type.base_type,
'is_interface_type': idl_type.is_interface_type and not idl_type.is_dictionary, 'is_interface_type': idl_type.is_interface_type and not (idl_type.is_dictionary_type or is_deprecated_dictionary),
'is_nullable': idl_type.is_nullable, 'is_nullable': idl_type.is_nullable,
'is_object': unwrapped_idl_type.name == 'Object', 'is_object': unwrapped_idl_type.name == 'Object' or is_deprecated_dictionary,
'is_required': member.is_required, 'is_required': member.is_required,
'name': member.name, 'name': member.name,
'setter_name': setter_name_for_dictionary_member(member), 'setter_name': setter_name_for_dictionary_member(member),
...@@ -177,6 +178,8 @@ def member_impl_context(member, interfaces_info, header_includes): ...@@ -177,6 +178,8 @@ def member_impl_context(member, interfaces_info, header_includes):
return '!m_%s.isNull()' % cpp_name return '!m_%s.isNull()' % cpp_name
elif idl_type.name in ['Any', 'Object']: elif idl_type.name in ['Any', 'Object']:
return '!(m_{0}.isEmpty() || m_{0}.isNull() || m_{0}.isUndefined())'.format(cpp_name) return '!(m_{0}.isEmpty() || m_{0}.isNull() || m_{0}.isUndefined())'.format(cpp_name)
elif idl_type.name == 'Dictionary':
return '!m_%s.isUndefinedOrNull()' % cpp_name
else: else:
return 'm_%s' % cpp_name return 'm_%s' % cpp_name
......
...@@ -36,4 +36,5 @@ dictionary TestDictionary { ...@@ -36,4 +36,5 @@ dictionary TestDictionary {
Uint8Array uint8ArrayMember; Uint8Array uint8ArrayMember;
EventTarget eventTargetMember; EventTarget eventTargetMember;
any anyMember = null; any anyMember = null;
Dictionary dictionaryMember;
}; };
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#ifndef TestDictionary_h #ifndef TestDictionary_h
#define TestDictionary_h #define TestDictionary_h
#include "bindings/core/v8/Dictionary.h"
#include "bindings/core/v8/Nullable.h" #include "bindings/core/v8/Nullable.h"
#include "bindings/core/v8/ScriptValue.h" #include "bindings/core/v8/ScriptValue.h"
#include "bindings/core/v8/UnionTypesCore.h" #include "bindings/core/v8/UnionTypesCore.h"
...@@ -42,6 +43,10 @@ public: ...@@ -42,6 +43,10 @@ public:
bool createMember() const { return m_createMember.get(); } bool createMember() const { return m_createMember.get(); }
void setCreateMember(bool value) { m_createMember = value; } void setCreateMember(bool value) { m_createMember = value; }
bool hasDictionaryMember() const { return !m_dictionaryMember.isUndefinedOrNull(); }
Dictionary dictionaryMember() const { return m_dictionaryMember; }
void setDictionaryMember(Dictionary value) { m_dictionaryMember = value; }
bool hasDoubleOrNullMember() const { return !m_doubleOrNullMember.isNull(); } bool hasDoubleOrNullMember() const { return !m_doubleOrNullMember.isNull(); }
double doubleOrNullMember() const { return m_doubleOrNullMember.get(); } double doubleOrNullMember() const { return m_doubleOrNullMember.get(); }
void setDoubleOrNullMember(double value) { m_doubleOrNullMember = value; } void setDoubleOrNullMember(double value) { m_doubleOrNullMember = value; }
...@@ -171,6 +176,7 @@ private: ...@@ -171,6 +176,7 @@ private:
ScriptValue m_anyMember; ScriptValue m_anyMember;
Nullable<bool> m_booleanMember; Nullable<bool> m_booleanMember;
Nullable<bool> m_createMember; Nullable<bool> m_createMember;
Dictionary m_dictionaryMember;
Nullable<double> m_doubleOrNullMember; Nullable<double> m_doubleOrNullMember;
DoubleOrString m_doubleOrStringMember; DoubleOrString m_doubleOrStringMember;
Nullable<HeapVector<DoubleOrString>> m_doubleOrStringSequenceMember; Nullable<HeapVector<DoubleOrString>> m_doubleOrStringSequenceMember;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "config.h" #include "config.h"
#include "V8TestDictionary.h" #include "V8TestDictionary.h"
#include "bindings/core/v8/Dictionary.h"
#include "bindings/core/v8/ExceptionState.h" #include "bindings/core/v8/ExceptionState.h"
#include "bindings/core/v8/ScriptValue.h" #include "bindings/core/v8/ScriptValue.h"
#include "bindings/core/v8/UnionTypesCore.h" #include "bindings/core/v8/UnionTypesCore.h"
...@@ -102,6 +103,26 @@ void V8TestDictionary::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value ...@@ -102,6 +103,26 @@ void V8TestDictionary::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value
} }
} }
{
v8::Local<v8::Value> dictionaryMemberValue;
if (!v8Object->Get(isolate->GetCurrentContext(), v8String(isolate, "dictionaryMember")).ToLocal(&dictionaryMemberValue)) {
exceptionState.rethrowV8Exception(block.Exception());
return;
}
if (dictionaryMemberValue.IsEmpty() || dictionaryMemberValue->IsUndefined()) {
// Do nothing.
} else {
Dictionary dictionaryMember = Dictionary(dictionaryMemberValue, isolate, exceptionState);
if (exceptionState.hadException())
return;
if (!dictionaryMember.isObject()) {
exceptionState.throwTypeError("member dictionaryMember is not an object.");
return;
}
impl.setDictionaryMember(dictionaryMember);
}
}
{ {
v8::Local<v8::Value> doubleOrNullMemberValue; v8::Local<v8::Value> doubleOrNullMemberValue;
if (!v8Object->Get(isolate->GetCurrentContext(), v8String(isolate, "doubleOrNullMember")).ToLocal(&doubleOrNullMemberValue)) { if (!v8Object->Get(isolate->GetCurrentContext(), v8String(isolate, "doubleOrNullMember")).ToLocal(&doubleOrNullMemberValue)) {
...@@ -656,6 +677,12 @@ bool toV8TestDictionary(const TestDictionary& impl, v8::Local<v8::Object> dictio ...@@ -656,6 +677,12 @@ bool toV8TestDictionary(const TestDictionary& impl, v8::Local<v8::Object> dictio
return false; return false;
} }
if (impl.hasDictionaryMember()) {
ASSERT(impl.dictionaryMember().isObject());
if (!v8CallBoolean(dictionary->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, "dictionaryMember"), impl.dictionaryMember().v8Value())))
return false;
}
if (impl.hasDoubleOrNullMember()) { if (impl.hasDoubleOrNullMember()) {
if (!v8CallBoolean(dictionary->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, "doubleOrNullMember"), v8::Number::New(isolate, impl.doubleOrNullMember())))) if (!v8CallBoolean(dictionary->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, "doubleOrNullMember"), v8::Number::New(isolate, impl.doubleOrNullMember()))))
return false; return false;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "config.h" #include "config.h"
#include "DictionaryTest.h" #include "DictionaryTest.h"
#include "bindings/core/v8/V8ObjectBuilder.h"
#include "core/testing/InternalDictionary.h" #include "core/testing/InternalDictionary.h"
#include "core/testing/InternalDictionaryDerived.h" #include "core/testing/InternalDictionaryDerived.h"
...@@ -66,6 +67,11 @@ void DictionaryTest::set(const InternalDictionary& testingDictionary) ...@@ -66,6 +67,11 @@ void DictionaryTest::set(const InternalDictionary& testingDictionary)
if (testingDictionary.hasDoubleOrStringSequenceMember()) if (testingDictionary.hasDoubleOrStringSequenceMember())
m_doubleOrStringSequenceMember = testingDictionary.doubleOrStringSequenceMember(); m_doubleOrStringSequenceMember = testingDictionary.doubleOrStringSequenceMember();
m_eventTargetOrNullMember = testingDictionary.eventTargetOrNullMember(); m_eventTargetOrNullMember = testingDictionary.eventTargetOrNullMember();
if (testingDictionary.hasDictionaryMember()) {
HashMap<String, String> properties;
testingDictionary.dictionaryMember().getOwnPropertiesAsStringHashMap(properties);
m_dictionaryMemberProperties = properties;
}
} }
void DictionaryTest::get(InternalDictionary& result) void DictionaryTest::get(InternalDictionary& result)
...@@ -114,6 +120,17 @@ void DictionaryTest::get(InternalDictionary& result) ...@@ -114,6 +120,17 @@ void DictionaryTest::get(InternalDictionary& result)
result.setEventTargetOrNullMember(m_eventTargetOrNullMember); result.setEventTargetOrNullMember(m_eventTargetOrNullMember);
} }
ScriptValue DictionaryTest::getDictionaryMemberProperties(ScriptState* scriptState)
{
if (!m_dictionaryMemberProperties)
return ScriptValue();
V8ObjectBuilder builder(scriptState);
HashMap<String, String> properties = m_dictionaryMemberProperties.get();
for (HashMap<String, String>::iterator it = properties.begin(); it != properties.end(); ++it)
builder.addString(it->key, it->value);
return builder.scriptValue();
}
void DictionaryTest::setDerived(const InternalDictionaryDerived& derived) void DictionaryTest::setDerived(const InternalDictionaryDerived& derived)
{ {
ASSERT(derived.hasRequiredBooleanMember()); ASSERT(derived.hasRequiredBooleanMember());
...@@ -161,6 +178,7 @@ void DictionaryTest::reset() ...@@ -161,6 +178,7 @@ void DictionaryTest::reset()
m_derivedStringMember = String(); m_derivedStringMember = String();
m_derivedStringMemberWithDefault = String(); m_derivedStringMemberWithDefault = String();
m_requiredBooleanMember = false; m_requiredBooleanMember = false;
m_dictionaryMemberProperties = nullptr;
} }
DEFINE_TRACE(DictionaryTest) DEFINE_TRACE(DictionaryTest)
......
...@@ -6,11 +6,13 @@ ...@@ -6,11 +6,13 @@
#define DictionaryTest_h #define DictionaryTest_h
#include "bindings/core/v8/Nullable.h" #include "bindings/core/v8/Nullable.h"
#include "bindings/core/v8/ScriptState.h"
#include "bindings/core/v8/ScriptValue.h" #include "bindings/core/v8/ScriptValue.h"
#include "bindings/core/v8/ScriptWrappable.h" #include "bindings/core/v8/ScriptWrappable.h"
#include "bindings/core/v8/UnionTypesCore.h" #include "bindings/core/v8/UnionTypesCore.h"
#include "core/dom/Element.h" #include "core/dom/Element.h"
#include "platform/heap/Handle.h" #include "platform/heap/Handle.h"
#include "wtf/HashMap.h"
#include "wtf/text/WTFString.h" #include "wtf/text/WTFString.h"
namespace blink { namespace blink {
...@@ -31,6 +33,9 @@ public: ...@@ -31,6 +33,9 @@ public:
void set(const InternalDictionary&); void set(const InternalDictionary&);
// Sets each member of the given TestDictionary from fields // Sets each member of the given TestDictionary from fields
void get(InternalDictionary&); void get(InternalDictionary&);
// Returns properties of the latest |dictionaryMember| which was set via
// set().
ScriptValue getDictionaryMemberProperties(ScriptState*);
void setDerived(const InternalDictionaryDerived&); void setDerived(const InternalDictionaryDerived&);
void getDerived(InternalDictionaryDerived&); void getDerived(InternalDictionaryDerived&);
...@@ -77,6 +82,7 @@ private: ...@@ -77,6 +82,7 @@ private:
String m_derivedStringMember; String m_derivedStringMember;
String m_derivedStringMemberWithDefault; String m_derivedStringMemberWithDefault;
bool m_requiredBooleanMember; bool m_requiredBooleanMember;
Nullable<HashMap<String, String>> m_dictionaryMemberProperties;
}; };
} // namespace blink } // namespace blink
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
] interface DictionaryTest { ] interface DictionaryTest {
void set(optional InternalDictionary testingDictionary); void set(optional InternalDictionary testingDictionary);
InternalDictionary get(); InternalDictionary get();
[CallWith=ScriptState] object getDictionaryMemberProperties();
void setDerived(InternalDictionaryDerived derived); void setDerived(InternalDictionaryDerived derived);
InternalDictionaryDerived getDerived(); InternalDictionaryDerived getDerived();
......
...@@ -34,4 +34,5 @@ dictionary InternalDictionary { ...@@ -34,4 +34,5 @@ dictionary InternalDictionary {
(double or DOMString) doubleOrStringMember; (double or DOMString) doubleOrStringMember;
sequence<(double or DOMString)> doubleOrStringSequenceMember; sequence<(double or DOMString)> doubleOrStringSequenceMember;
EventTarget? eventTargetOrNullMember = null; EventTarget? eventTargetOrNullMember = null;
Dictionary dictionaryMember;
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment