Commit 53e02676 authored by Hitoshi Yoshida's avatar Hitoshi Yoshida Committed by Commit Bot

bindings: Update idl-dictionary-unittest

Updates idl-dictionary-unittest to test the change http://crrev.com/574083
Because we can't test IDL dictionary types directly in JS,
we use an interface DictionaryTest as a intermediate path.
This CL also updates the behavior of DictionaryTest to be
consistent with InternalDictionary.


Bug: 855968
Change-Id: I0ad4530a0143185bbf859a0e0b5371e5e0aefa26
Reviewed-on: https://chromium-review.googlesource.com/1136331
Commit-Queue: Hitoshi Yoshida <peria@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarKenichi Ishibashi <bashi@chromium.org>
Reviewed-by: default avatarDominic Farolino <domfarolino@gmail.com>
Cr-Commit-Position: refs/heads/master@{#575548}
parent 9f049de7
CONSOLE WARNING: line 270: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead. CONSOLE WARNING: line 269: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
IDL dictionary unittest IDL dictionary unittest
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
...@@ -20,7 +20,7 @@ PASS dict.stringSequenceMember is undefined. ...@@ -20,7 +20,7 @@ PASS dict.stringSequenceMember is undefined.
PASS dict.stringSequenceMemberWithDefault is [] PASS dict.stringSequenceMemberWithDefault is []
PASS dict.stringSequenceOrNullMember is null PASS dict.stringSequenceOrNullMember is null
PASS dict.elementMember is undefined. PASS dict.elementMember is undefined.
PASS dict.elementOrNullMember is null PASS dict.elementOrNullMember is undefined.
PASS dict.enumMember is undefined. PASS dict.enumMember is undefined.
PASS dict.enumMemberWithDefault is "foo" PASS dict.enumMemberWithDefault is "foo"
PASS dict.enumOrNullMember is null PASS dict.enumOrNullMember is null
...@@ -47,7 +47,7 @@ PASS dict.stringSequenceMember is undefined. ...@@ -47,7 +47,7 @@ PASS dict.stringSequenceMember is undefined.
PASS dict.stringSequenceMemberWithDefault is [] PASS dict.stringSequenceMemberWithDefault is []
PASS dict.stringSequenceOrNullMember is null PASS dict.stringSequenceOrNullMember is null
PASS dict.elementMember is undefined. PASS dict.elementMember is undefined.
PASS dict.elementOrNullMember is null PASS dict.elementOrNullMember is undefined.
PASS dict.objectMember is undefined. PASS dict.objectMember is undefined.
PASS dict.objectOrNullMemberWithDefault is null PASS dict.objectOrNullMemberWithDefault is null
PASS dict.eventTargetOrNullMember is null PASS dict.eventTargetOrNullMember is null
...@@ -176,7 +176,7 @@ PASS derived.stringSequenceMember is undefined. ...@@ -176,7 +176,7 @@ PASS derived.stringSequenceMember is undefined.
PASS derived.stringSequenceMemberWithDefault is [] PASS derived.stringSequenceMemberWithDefault is []
PASS derived.stringSequenceOrNullMember is null PASS derived.stringSequenceOrNullMember is null
PASS derived.elementMember is undefined. PASS derived.elementMember is undefined.
PASS derived.elementOrNullMember is null PASS derived.elementOrNullMember is undefined.
PASS derived.enumMember is undefined. PASS derived.enumMember is undefined.
PASS derived.enumMemberWithDefault is "foo" PASS derived.enumMemberWithDefault is "foo"
PASS derived.enumOrNullMember is null PASS derived.enumOrNullMember is null
......
...@@ -27,7 +27,7 @@ if (window.internals && internals.dictionaryTest) { ...@@ -27,7 +27,7 @@ if (window.internals && internals.dictionaryTest) {
shouldBe('dict.stringSequenceMemberWithDefault', '[]'); shouldBe('dict.stringSequenceMemberWithDefault', '[]');
shouldBeNull('dict.stringSequenceOrNullMember'); shouldBeNull('dict.stringSequenceOrNullMember');
shouldBeUndefined('dict.elementMember'); shouldBeUndefined('dict.elementMember');
shouldBeNull('dict.elementOrNullMember'); shouldBeUndefined('dict.elementOrNullMember');
shouldBeUndefined('dict.enumMember'); shouldBeUndefined('dict.enumMember');
shouldBeEqualToString('dict.enumMemberWithDefault', 'foo'); shouldBeEqualToString('dict.enumMemberWithDefault', 'foo');
shouldBeNull('dict.enumOrNullMember'); shouldBeNull('dict.enumOrNullMember');
...@@ -57,7 +57,7 @@ if (window.internals && internals.dictionaryTest) { ...@@ -57,7 +57,7 @@ if (window.internals && internals.dictionaryTest) {
shouldBe('dict.stringSequenceMemberWithDefault', '[]'); shouldBe('dict.stringSequenceMemberWithDefault', '[]');
shouldBeNull('dict.stringSequenceOrNullMember'); shouldBeNull('dict.stringSequenceOrNullMember');
shouldBeUndefined('dict.elementMember'); shouldBeUndefined('dict.elementMember');
shouldBeNull('dict.elementOrNullMember'); shouldBeUndefined('dict.elementOrNullMember');
shouldBeUndefined('dict.objectMember'); shouldBeUndefined('dict.objectMember');
shouldBeNull('dict.objectOrNullMemberWithDefault'); shouldBeNull('dict.objectOrNullMemberWithDefault');
shouldBeNull('dict.eventTargetOrNullMember'); shouldBeNull('dict.eventTargetOrNullMember');
...@@ -111,7 +111,6 @@ if (window.internals && internals.dictionaryTest) { ...@@ -111,7 +111,6 @@ if (window.internals && internals.dictionaryTest) {
shouldBe('dict.stringSequenceMemberWithDefault', '["foo", "bar", "baz"]'); shouldBe('dict.stringSequenceMemberWithDefault', '["foo", "bar", "baz"]');
shouldBe('dict.stringSequenceOrNullMember', '[]'); shouldBe('dict.stringSequenceOrNullMember', '[]');
shouldBe('dict.elementMember', 'element1'); shouldBe('dict.elementMember', 'element1');
// This will be undefined as the spec says
shouldBeNull('dict.elementOrNullMember'); shouldBeNull('dict.elementOrNullMember');
shouldBeEqualToString('dict.enumMember', 'foo'); shouldBeEqualToString('dict.enumMember', 'foo');
shouldBeEqualToString('dict.enumMemberWithDefault', 'bar'); shouldBeEqualToString('dict.enumMemberWithDefault', 'bar');
...@@ -326,7 +325,7 @@ if (window.internals && internals.dictionaryTest) { ...@@ -326,7 +325,7 @@ if (window.internals && internals.dictionaryTest) {
shouldBe('derived.stringSequenceMemberWithDefault', '[]'); shouldBe('derived.stringSequenceMemberWithDefault', '[]');
shouldBeNull('derived.stringSequenceOrNullMember'); shouldBeNull('derived.stringSequenceOrNullMember');
shouldBeUndefined('derived.elementMember'); shouldBeUndefined('derived.elementMember');
shouldBeNull('derived.elementOrNullMember'); shouldBeUndefined('derived.elementOrNullMember');
shouldBeUndefined('derived.enumMember'); shouldBeUndefined('derived.enumMember');
shouldBeEqualToString('derived.enumMemberWithDefault', 'foo'); shouldBeEqualToString('derived.enumMemberWithDefault', 'foo');
shouldBeNull('derived.enumOrNullMember'); shouldBeNull('derived.enumOrNullMember');
......
...@@ -116,6 +116,14 @@ def member_context(dictionary, member): ...@@ -116,6 +116,14 @@ def member_context(dictionary, member):
raise Exception( raise Exception(
'Required member %s must not have a default value.' % member.name) 'Required member %s must not have a default value.' % member.name)
# In most cases, we don't have to distinguish `null` and `not present`,
# and use null-states (e.g. nullptr, foo.IsUndefinedOrNull()) to show such
# states for some types for memory usage and performance.
# For types whose |has_explicit_presence| is True, we provide explicit
# states of presence.
has_explicit_presence = (
idl_type.is_nullable and idl_type.inner_type.is_interface_type)
def default_values(): def default_values():
if not member.default_value: if not member.default_value:
return None, None return None, None
...@@ -145,6 +153,7 @@ def member_context(dictionary, member): ...@@ -145,6 +153,7 @@ def member_context(dictionary, member):
'enum_type': idl_type.enum_type, 'enum_type': idl_type.enum_type,
'enum_values': idl_type.enum_values, 'enum_values': idl_type.enum_values,
'getter_name': getter_name, 'getter_name': getter_name,
'has_explicit_presence': has_explicit_presence,
'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 is_deprecated_dictionary, 'is_interface_type': idl_type.is_interface_type and not is_deprecated_dictionary,
......
...@@ -150,7 +150,7 @@ bool toV8{{cpp_class}}(const {{cpp_class}}& impl, v8::Local<v8::Object> dictiona ...@@ -150,7 +150,7 @@ bool toV8{{cpp_class}}(const {{cpp_class}}& impl, v8::Local<v8::Object> dictiona
} else { } else {
{{member.name}}Value = {{member.v8_default_value}}; {{member.name}}Value = {{member.v8_default_value}};
{{member.name}}HasValueOrDefault = true; {{member.name}}HasValueOrDefault = true;
{% elif member.is_nullable %} {% elif member.is_nullable and not member.has_explicit_presence %}
} else { } else {
{{member.name}}Value = v8::Null(isolate); {{member.name}}Value = v8::Null(isolate);
{{member.name}}HasValueOrDefault = true; {{member.name}}HasValueOrDefault = true;
......
...@@ -1170,9 +1170,6 @@ bool toV8TestDictionary(const TestDictionary& impl, v8::Local<v8::Object> dictio ...@@ -1170,9 +1170,6 @@ bool toV8TestDictionary(const TestDictionary& impl, v8::Local<v8::Object> dictio
if (impl.hasElementOrNullMember()) { if (impl.hasElementOrNullMember()) {
elementOrNullMemberValue = ToV8(impl.elementOrNullMember(), creationContext, isolate); elementOrNullMemberValue = ToV8(impl.elementOrNullMember(), creationContext, isolate);
elementOrNullMemberHasValueOrDefault = true; elementOrNullMemberHasValueOrDefault = true;
} else {
elementOrNullMemberValue = v8::Null(isolate);
elementOrNullMemberHasValueOrDefault = true;
} }
if (elementOrNullMemberHasValueOrDefault && if (elementOrNullMemberHasValueOrDefault &&
!V8CallBoolean(dictionary->CreateDataProperty(context, keys[15].Get(isolate), elementOrNullMemberValue))) { !V8CallBoolean(dictionary->CreateDataProperty(context, keys[15].Get(isolate), elementOrNullMemberValue))) {
...@@ -1485,9 +1482,6 @@ bool toV8TestDictionary(const TestDictionary& impl, v8::Local<v8::Object> dictio ...@@ -1485,9 +1482,6 @@ bool toV8TestDictionary(const TestDictionary& impl, v8::Local<v8::Object> dictio
if (impl.hasTestInterfaceOrNullMember()) { if (impl.hasTestInterfaceOrNullMember()) {
testInterfaceOrNullMemberValue = ToV8(impl.testInterfaceOrNullMember(), creationContext, isolate); testInterfaceOrNullMemberValue = ToV8(impl.testInterfaceOrNullMember(), creationContext, isolate);
testInterfaceOrNullMemberHasValueOrDefault = true; testInterfaceOrNullMemberHasValueOrDefault = true;
} else {
testInterfaceOrNullMemberValue = v8::Null(isolate);
testInterfaceOrNullMemberHasValueOrDefault = true;
} }
if (testInterfaceOrNullMemberHasValueOrDefault && if (testInterfaceOrNullMemberHasValueOrDefault &&
!V8CallBoolean(dictionary->CreateDataProperty(context, keys[45].Get(isolate), testInterfaceOrNullMemberValue))) { !V8CallBoolean(dictionary->CreateDataProperty(context, keys[45].Get(isolate), testInterfaceOrNullMemberValue))) {
......
...@@ -141,8 +141,8 @@ void DictionaryTest::get(InternalDictionary& result) { ...@@ -141,8 +141,8 @@ void DictionaryTest::get(InternalDictionary& result) {
result.setEnumOrNullMember(enum_or_null_member_); result.setEnumOrNullMember(enum_or_null_member_);
if (element_member_) if (element_member_)
result.setElementMember(element_member_); result.setElementMember(element_member_);
if (element_or_null_member_) if (element_or_null_member_.has_value())
result.setElementOrNullMember(element_or_null_member_); result.setElementOrNullMember(element_or_null_member_.value());
result.setObjectMember(object_member_); result.setObjectMember(object_member_);
result.setObjectOrNullMemberWithDefault(object_or_null_member_with_default_); result.setObjectOrNullMemberWithDefault(object_or_null_member_with_default_);
if (!double_or_string_member_.IsNull()) if (!double_or_string_member_.IsNull())
...@@ -246,7 +246,7 @@ void DictionaryTest::Reset() { ...@@ -246,7 +246,7 @@ void DictionaryTest::Reset() {
enum_member_with_default_ = String(); enum_member_with_default_ = String();
enum_or_null_member_ = String(); enum_or_null_member_ = String();
element_member_ = nullptr; element_member_ = nullptr;
element_or_null_member_ = nullptr; element_or_null_member_.reset();
object_member_ = ScriptValue(); object_member_ = ScriptValue();
object_or_null_member_with_default_ = ScriptValue(); object_or_null_member_with_default_ = ScriptValue();
double_or_string_member_ = DoubleOrString(); double_or_string_member_ = DoubleOrString();
......
...@@ -79,7 +79,7 @@ class DictionaryTest : public ScriptWrappable { ...@@ -79,7 +79,7 @@ class DictionaryTest : public ScriptWrappable {
String enum_member_with_default_; String enum_member_with_default_;
String enum_or_null_member_; String enum_or_null_member_;
Member<Element> element_member_; Member<Element> element_member_;
Member<Element> element_or_null_member_; base::Optional<Member<Element>> element_or_null_member_;
ScriptValue object_member_; ScriptValue object_member_;
ScriptValue object_or_null_member_with_default_; ScriptValue object_or_null_member_with_default_;
DoubleOrString double_or_string_member_; DoubleOrString double_or_string_member_;
......
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