Skip to content

Commit

Permalink
bindings: Update idl-dictionary-unittest
Browse files Browse the repository at this point in the history
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: Kentaro Hara <haraken@chromium.org>
Reviewed-by: Kenichi Ishibashi <bashi@chromium.org>
Reviewed-by: Dominic Farolino <domfarolino@gmail.com>
Cr-Commit-Position: refs/heads/master@{#575548}
  • Loading branch information
peria authored and Commit Bot committed Jul 17, 2018
1 parent 9f049de commit 53e0267
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 19 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
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

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Expand All @@ -20,7 +20,7 @@ PASS dict.stringSequenceMember is undefined.
PASS dict.stringSequenceMemberWithDefault is []
PASS dict.stringSequenceOrNullMember is null
PASS dict.elementMember is undefined.
PASS dict.elementOrNullMember is null
PASS dict.elementOrNullMember is undefined.
PASS dict.enumMember is undefined.
PASS dict.enumMemberWithDefault is "foo"
PASS dict.enumOrNullMember is null
Expand All @@ -47,7 +47,7 @@ PASS dict.stringSequenceMember is undefined.
PASS dict.stringSequenceMemberWithDefault is []
PASS dict.stringSequenceOrNullMember is null
PASS dict.elementMember is undefined.
PASS dict.elementOrNullMember is null
PASS dict.elementOrNullMember is undefined.
PASS dict.objectMember is undefined.
PASS dict.objectOrNullMemberWithDefault is null
PASS dict.eventTargetOrNullMember is null
Expand Down Expand Up @@ -176,7 +176,7 @@ PASS derived.stringSequenceMember is undefined.
PASS derived.stringSequenceMemberWithDefault is []
PASS derived.stringSequenceOrNullMember is null
PASS derived.elementMember is undefined.
PASS derived.elementOrNullMember is null
PASS derived.elementOrNullMember is undefined.
PASS derived.enumMember is undefined.
PASS derived.enumMemberWithDefault is "foo"
PASS derived.enumOrNullMember is null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
shouldBe('dict.stringSequenceMemberWithDefault', '[]');
shouldBeNull('dict.stringSequenceOrNullMember');
shouldBeUndefined('dict.elementMember');
shouldBeNull('dict.elementOrNullMember');
shouldBeUndefined('dict.elementOrNullMember');
shouldBeUndefined('dict.enumMember');
shouldBeEqualToString('dict.enumMemberWithDefault', 'foo');
shouldBeNull('dict.enumOrNullMember');
Expand Down Expand Up @@ -57,7 +57,7 @@
shouldBe('dict.stringSequenceMemberWithDefault', '[]');
shouldBeNull('dict.stringSequenceOrNullMember');
shouldBeUndefined('dict.elementMember');
shouldBeNull('dict.elementOrNullMember');
shouldBeUndefined('dict.elementOrNullMember');
shouldBeUndefined('dict.objectMember');
shouldBeNull('dict.objectOrNullMemberWithDefault');
shouldBeNull('dict.eventTargetOrNullMember');
Expand Down Expand Up @@ -111,7 +111,6 @@
shouldBe('dict.stringSequenceMemberWithDefault', '["foo", "bar", "baz"]');
shouldBe('dict.stringSequenceOrNullMember', '[]');
shouldBe('dict.elementMember', 'element1');
// This will be undefined as the spec says
shouldBeNull('dict.elementOrNullMember');
shouldBeEqualToString('dict.enumMember', 'foo');
shouldBeEqualToString('dict.enumMemberWithDefault', 'bar');
Expand Down Expand Up @@ -326,7 +325,7 @@
shouldBe('derived.stringSequenceMemberWithDefault', '[]');
shouldBeNull('derived.stringSequenceOrNullMember');
shouldBeUndefined('derived.elementMember');
shouldBeNull('derived.elementOrNullMember');
shouldBeUndefined('derived.elementOrNullMember');
shouldBeUndefined('derived.enumMember');
shouldBeEqualToString('derived.enumMemberWithDefault', 'foo');
shouldBeNull('derived.enumOrNullMember');
Expand Down
9 changes: 9 additions & 0 deletions third_party/blink/renderer/bindings/scripts/v8_dictionary.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,14 @@ def member_context(dictionary, member):
raise Exception(
'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():
if not member.default_value:
return None, None
Expand Down Expand Up @@ -145,6 +153,7 @@ def default_values():
'enum_type': idl_type.enum_type,
'enum_values': idl_type.enum_values,
'getter_name': getter_name,
'has_explicit_presence': has_explicit_presence,
'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 is_deprecated_dictionary,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ bool toV8{{cpp_class}}(const {{cpp_class}}& impl, v8::Local<v8::Object> dictiona
} else {
{{member.name}}Value = {{member.v8_default_value}};
{{member.name}}HasValueOrDefault = true;
{% elif member.is_nullable %}
{% elif member.is_nullable and not member.has_explicit_presence %}
} else {
{{member.name}}Value = v8::Null(isolate);
{{member.name}}HasValueOrDefault = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1170,9 +1170,6 @@ bool toV8TestDictionary(const TestDictionary& impl, v8::Local<v8::Object> dictio
if (impl.hasElementOrNullMember()) {
elementOrNullMemberValue = ToV8(impl.elementOrNullMember(), creationContext, isolate);
elementOrNullMemberHasValueOrDefault = true;
} else {
elementOrNullMemberValue = v8::Null(isolate);
elementOrNullMemberHasValueOrDefault = true;
}
if (elementOrNullMemberHasValueOrDefault &&
!V8CallBoolean(dictionary->CreateDataProperty(context, keys[15].Get(isolate), elementOrNullMemberValue))) {
Expand Down Expand Up @@ -1485,9 +1482,6 @@ bool toV8TestDictionary(const TestDictionary& impl, v8::Local<v8::Object> dictio
if (impl.hasTestInterfaceOrNullMember()) {
testInterfaceOrNullMemberValue = ToV8(impl.testInterfaceOrNullMember(), creationContext, isolate);
testInterfaceOrNullMemberHasValueOrDefault = true;
} else {
testInterfaceOrNullMemberValue = v8::Null(isolate);
testInterfaceOrNullMemberHasValueOrDefault = true;
}
if (testInterfaceOrNullMemberHasValueOrDefault &&
!V8CallBoolean(dictionary->CreateDataProperty(context, keys[45].Get(isolate), testInterfaceOrNullMemberValue))) {
Expand Down
6 changes: 3 additions & 3 deletions third_party/blink/renderer/core/testing/dictionary_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,8 @@ void DictionaryTest::get(InternalDictionary& result) {
result.setEnumOrNullMember(enum_or_null_member_);
if (element_member_)
result.setElementMember(element_member_);
if (element_or_null_member_)
result.setElementOrNullMember(element_or_null_member_);
if (element_or_null_member_.has_value())
result.setElementOrNullMember(element_or_null_member_.value());
result.setObjectMember(object_member_);
result.setObjectOrNullMemberWithDefault(object_or_null_member_with_default_);
if (!double_or_string_member_.IsNull())
Expand Down Expand Up @@ -246,7 +246,7 @@ void DictionaryTest::Reset() {
enum_member_with_default_ = String();
enum_or_null_member_ = String();
element_member_ = nullptr;
element_or_null_member_ = nullptr;
element_or_null_member_.reset();
object_member_ = ScriptValue();
object_or_null_member_with_default_ = ScriptValue();
double_or_string_member_ = DoubleOrString();
Expand Down
2 changes: 1 addition & 1 deletion third_party/blink/renderer/core/testing/dictionary_test.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class DictionaryTest : public ScriptWrappable {
String enum_member_with_default_;
String enum_or_null_member_;
Member<Element> element_member_;
Member<Element> element_or_null_member_;
base::Optional<Member<Element>> element_or_null_member_;
ScriptValue object_member_;
ScriptValue object_or_null_member_with_default_;
DoubleOrString double_or_string_member_;
Expand Down

0 comments on commit 53e0267

Please sign in to comment.