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
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
PASS derived.longMember is undefined.
PASS derived.longMemberWithDefault is 42
......
......@@ -253,6 +253,21 @@ if (window.internals && internals.dictionaryTest) {
shouldThrow("dictionaryTest.set({eventTargetOrNullMember: {}})");
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');
dictionaryTest.setDerived({ requiredBooleanMember: true });
derived = dictionaryTest.getDerived();
......
......@@ -99,6 +99,7 @@ def member_context(dictionary, member):
cpp_default_value, v8_default_value = default_values()
cpp_name = v8_utilities.cpp_name(member)
is_deprecated_dictionary = unwrapped_idl_type.name == 'Dictionary'
return {
'cpp_default_value': cpp_default_value,
......@@ -113,9 +114,9 @@ def member_context(dictionary, member):
'enum_values': unwrapped_idl_type.enum_values,
'has_method_name': has_method_name_for_dictionary_member(member),
'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_object': unwrapped_idl_type.name == 'Object',
'is_object': unwrapped_idl_type.name == 'Object' or is_deprecated_dictionary,
'is_required': member.is_required,
'name': member.name,
'setter_name': setter_name_for_dictionary_member(member),
......@@ -177,6 +178,8 @@ def member_impl_context(member, interfaces_info, header_includes):
return '!m_%s.isNull()' % cpp_name
elif idl_type.name in ['Any', 'Object']:
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:
return 'm_%s' % cpp_name
......
......@@ -36,4 +36,5 @@ dictionary TestDictionary {
Uint8Array uint8ArrayMember;
EventTarget eventTargetMember;
any anyMember = null;
Dictionary dictionaryMember;
};
......@@ -7,6 +7,7 @@
#ifndef TestDictionary_h
#define TestDictionary_h
#include "bindings/core/v8/Dictionary.h"
#include "bindings/core/v8/Nullable.h"
#include "bindings/core/v8/ScriptValue.h"
#include "bindings/core/v8/UnionTypesCore.h"
......@@ -42,6 +43,10 @@ public:
bool createMember() const { return m_createMember.get(); }
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(); }
double doubleOrNullMember() const { return m_doubleOrNullMember.get(); }
void setDoubleOrNullMember(double value) { m_doubleOrNullMember = value; }
......@@ -171,6 +176,7 @@ private:
ScriptValue m_anyMember;
Nullable<bool> m_booleanMember;
Nullable<bool> m_createMember;
Dictionary m_dictionaryMember;
Nullable<double> m_doubleOrNullMember;
DoubleOrString m_doubleOrStringMember;
Nullable<HeapVector<DoubleOrString>> m_doubleOrStringSequenceMember;
......
......@@ -7,6 +7,7 @@
#include "config.h"
#include "V8TestDictionary.h"
#include "bindings/core/v8/Dictionary.h"
#include "bindings/core/v8/ExceptionState.h"
#include "bindings/core/v8/ScriptValue.h"
#include "bindings/core/v8/UnionTypesCore.h"
......@@ -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;
if (!v8Object->Get(isolate->GetCurrentContext(), v8String(isolate, "doubleOrNullMember")).ToLocal(&doubleOrNullMemberValue)) {
......@@ -656,6 +677,12 @@ bool toV8TestDictionary(const TestDictionary& impl, v8::Local<v8::Object> dictio
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 (!v8CallBoolean(dictionary->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, "doubleOrNullMember"), v8::Number::New(isolate, impl.doubleOrNullMember()))))
return false;
......
......@@ -5,6 +5,7 @@
#include "config.h"
#include "DictionaryTest.h"
#include "bindings/core/v8/V8ObjectBuilder.h"
#include "core/testing/InternalDictionary.h"
#include "core/testing/InternalDictionaryDerived.h"
......@@ -66,6 +67,11 @@ void DictionaryTest::set(const InternalDictionary& testingDictionary)
if (testingDictionary.hasDoubleOrStringSequenceMember())
m_doubleOrStringSequenceMember = testingDictionary.doubleOrStringSequenceMember();
m_eventTargetOrNullMember = testingDictionary.eventTargetOrNullMember();
if (testingDictionary.hasDictionaryMember()) {
HashMap<String, String> properties;
testingDictionary.dictionaryMember().getOwnPropertiesAsStringHashMap(properties);
m_dictionaryMemberProperties = properties;
}
}
void DictionaryTest::get(InternalDictionary& result)
......@@ -114,6 +120,17 @@ void DictionaryTest::get(InternalDictionary& result)
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)
{
ASSERT(derived.hasRequiredBooleanMember());
......@@ -161,6 +178,7 @@ void DictionaryTest::reset()
m_derivedStringMember = String();
m_derivedStringMemberWithDefault = String();
m_requiredBooleanMember = false;
m_dictionaryMemberProperties = nullptr;
}
DEFINE_TRACE(DictionaryTest)
......
......@@ -6,11 +6,13 @@
#define DictionaryTest_h
#include "bindings/core/v8/Nullable.h"
#include "bindings/core/v8/ScriptState.h"
#include "bindings/core/v8/ScriptValue.h"
#include "bindings/core/v8/ScriptWrappable.h"
#include "bindings/core/v8/UnionTypesCore.h"
#include "core/dom/Element.h"
#include "platform/heap/Handle.h"
#include "wtf/HashMap.h"
#include "wtf/text/WTFString.h"
namespace blink {
......@@ -31,6 +33,9 @@ public:
void set(const InternalDictionary&);
// Sets each member of the given TestDictionary from fields
void get(InternalDictionary&);
// Returns properties of the latest |dictionaryMember| which was set via
// set().
ScriptValue getDictionaryMemberProperties(ScriptState*);
void setDerived(const InternalDictionaryDerived&);
void getDerived(InternalDictionaryDerived&);
......@@ -77,6 +82,7 @@ private:
String m_derivedStringMember;
String m_derivedStringMemberWithDefault;
bool m_requiredBooleanMember;
Nullable<HashMap<String, String>> m_dictionaryMemberProperties;
};
} // namespace blink
......
......@@ -7,6 +7,7 @@
] interface DictionaryTest {
void set(optional InternalDictionary testingDictionary);
InternalDictionary get();
[CallWith=ScriptState] object getDictionaryMemberProperties();
void setDerived(InternalDictionaryDerived derived);
InternalDictionaryDerived getDerived();
......
......@@ -34,4 +34,5 @@ dictionary InternalDictionary {
(double or DOMString) doubleOrStringMember;
sequence<(double or DOMString)> doubleOrStringSequenceMember;
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