Commit 05865333 authored by Raphael Kubo da Costa's avatar Raphael Kubo da Costa Committed by Commit Bot

bindings: Allow `any' dictionary members to be null.

We had been using the same checks for both object and any Web IDL types to
determine if they were present, namely

    !(member.IsEmpty() || member.IsNull() || member.IsUndefined())

However, both `null' and `undefined' are valid values for the any type, and
they should be considered distinct.

Add a separate check for any types without the "member.IsNull()" part of the
above one, so that one can pass `null' to an any member and get it back
instead of `undefined'.

Bug: 803448
Change-Id: I90dce8f0fc6c0f4d4764d724501a58cf26e92526
Reviewed-on: https://chromium-review.googlesource.com/895304Reviewed-by: default avatarYuki Shiino <yukishiino@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarKenichi Ishibashi <bashi@chromium.org>
Reviewed-by: default avatarHitoshi Yoshida <peria@chromium.org>
Commit-Queue: Raphael Kubo da Costa <raphael.kubo.da.costa@intel.com>
Cr-Commit-Position: refs/heads/master@{#533601}
parent e66051e0
CONSOLE WARNING: line 234: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
CONSOLE WARNING: line 266: '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".
......@@ -29,6 +29,7 @@ PASS dict.objectOrNullMemberWithDefault is null
PASS dict.doubleOrStringMember is undefined.
PASS dict.doubleOrStringSequenceMember is undefined.
PASS dict.eventTargetOrNullMember is null
PASS dict.anyMember is undefined.
Test for setting undefined
PASS dict.longMember is undefined.
......@@ -50,6 +51,7 @@ PASS dict.elementOrNullMember is null
PASS dict.objectMember is undefined.
PASS dict.objectOrNullMemberWithDefault is null
PASS dict.eventTargetOrNullMember is null
PASS dict.anyMember is undefined.
Test for setting valid values
PASS dict.longMember is 1
......@@ -77,6 +79,7 @@ PASS dict.doubleOrStringMember is 3.14
PASS dict.doubleOrStringSequenceMember is [3.14, "Hello"]
PASS dict.eventTargetOrNullMember is element1
PASS dict.internalEnumOrInternalEnumSequenceMember is "foo"
PASS dict.anyMember is 42
Additional test for union type members
PASS dict.doubleOrStringMember is "foo"
......@@ -92,6 +95,13 @@ PASS dict.longMemberWithDefault is 0
PASS dict.longOrNullMember is null
PASS dict.longOrNullMemberWithDefault is null
Test for different values for the any type
PASS dict.anyMember is ""
PASS dict.anyMember is 0
PASS dict.anyMember is undefined.
PASS dict.anyMember is false
PASS dict.anyMember is null
Test for setting invalid member
PASS dict.invalidMember is undefined.
......
......@@ -36,6 +36,7 @@ if (window.internals && internals.dictionaryTest) {
shouldBeUndefined('dict.doubleOrStringMember');
shouldBeUndefined('dict.doubleOrStringSequenceMember');
shouldBeNull('dict.eventTargetOrNullMember');
shouldBeUndefined('dict.anyMember');
debug('');
debug('Test for setting undefined');
......@@ -60,6 +61,7 @@ if (window.internals && internals.dictionaryTest) {
shouldBeUndefined('dict.objectMember');
shouldBeNull('dict.objectOrNullMemberWithDefault');
shouldBeNull('dict.eventTargetOrNullMember');
shouldBeUndefined('dict.anyMember');
debug('');
var element1 = document.createElement('div');
......@@ -91,6 +93,7 @@ if (window.internals && internals.dictionaryTest) {
doubleOrStringSequenceMember: [3.14, 'Hello'],
eventTargetOrNullMember: element1,
internalEnumOrInternalEnumSequenceMember: 'foo',
anyMember: 42
});
dict = dictionaryTest.get();
shouldBe('dict.longMember', '1');
......@@ -119,6 +122,7 @@ if (window.internals && internals.dictionaryTest) {
shouldBe('dict.doubleOrStringSequenceMember', '[3.14, "Hello"]');
shouldBe('dict.eventTargetOrNullMember', 'element1');
shouldBeEqualToString('dict.internalEnumOrInternalEnumSequenceMember', 'foo');
shouldBe('dict.anyMember', '42');
debug('');
debug('Additional test for union type members');
......@@ -172,6 +176,34 @@ if (window.internals && internals.dictionaryTest) {
shouldBeNull('dict.longOrNullMemberWithDefault');
debug('');
debug('Test for different values for the any type');
dictionaryTest.set({
anyMember: '',
});
dict = dictionaryTest.get();
shouldBeEmptyString('dict.anyMember');
dictionaryTest.set({
anyMember: 0,
});
dict = dictionaryTest.get();
shouldBeZero('dict.anyMember');
dictionaryTest.set({
anyMember: undefined,
});
dict = dictionaryTest.get();
shouldBeUndefined('dict.anyMember');
dictionaryTest.set({
anyMember: false,
});
dict = dictionaryTest.get();
shouldBeFalse('dict.anyMember');
dictionaryTest.set({
anyMember: null,
});
dict = dictionaryTest.get();
shouldBeNull('dict.anyMember');
debug('');
debug('Test for setting invalid member');
dictionaryTest.set({invalidMember: 'shouldNotBeSet'});
dict = dictionaryTest.get();
......
......@@ -33,7 +33,7 @@ test(function() {
// reason is passed.
var r = new Error();
assert_equals(new PromiseRejectionEvent('eventType', { promise: p, reason: r }).reason, r);
assert_equals(new PromiseRejectionEvent('eventType', { promise: p, reason: null }).reason, null);
// All initializers are passed.
assert_equals(new PromiseRejectionEvent('eventType', { bubbles: true, cancelable: true, promise: p, reason: r }).bubbles, true);
......
......@@ -219,7 +219,9 @@ def member_impl_context(member, interfaces_info, header_includes,
return nullable_indicator_name
if idl_type.is_union_type or idl_type.is_enum or idl_type.is_string_type:
return '!%s_.IsNull()' % cpp_name
if idl_type.name in ['Any', 'Object']:
if idl_type.name == 'Any':
return '!({0}_.IsEmpty() || {0}_.IsUndefined())'.format(cpp_name)
if idl_type.name == 'Object':
return '!({0}_.IsEmpty() || {0}_.IsNull() || {0}_.IsUndefined())'.format(cpp_name)
if idl_type.name == 'Dictionary':
return '!%s_.IsUndefinedOrNull()' % cpp_name
......
......@@ -53,7 +53,7 @@ class CORE_EXPORT TestDictionary : public IDLDictionaryBase {
}
void setAnyInRecordMember(const Vector<std::pair<String, ScriptValue>>&);
bool hasAnyMember() const { return !(any_member_.IsEmpty() || any_member_.IsNull() || any_member_.IsUndefined()); }
bool hasAnyMember() const { return !(any_member_.IsEmpty() || any_member_.IsUndefined()); }
ScriptValue anyMember() const {
return any_member_;
}
......
......@@ -77,6 +77,7 @@ void DictionaryTest::set(const InternalDictionary& testing_dictionary) {
internal_enum_or_internal_enum_sequence_ =
testing_dictionary.internalEnumOrInternalEnumSequenceMember();
}
any_member_ = testing_dictionary.anyMember();
}
void DictionaryTest::get(InternalDictionary& result) {
......@@ -131,6 +132,7 @@ void DictionaryTest::get(InternalDictionary& result) {
result.setEventTargetOrNullMember(event_target_or_null_member_);
result.setInternalEnumOrInternalEnumSequenceMember(
internal_enum_or_internal_enum_sequence_);
result.setAnyMember(any_member_);
}
ScriptValue DictionaryTest::getDictionaryMemberProperties(
......@@ -233,6 +235,7 @@ void DictionaryTest::Reset() {
dictionary_member_properties_ = WTF::nullopt;
internal_enum_or_internal_enum_sequence_ =
InternalEnumOrInternalEnumSequence();
any_member_ = ScriptValue();
}
void DictionaryTest::Trace(blink::Visitor* visitor) {
......
......@@ -91,6 +91,7 @@ class DictionaryTest : public ScriptWrappable {
bool required_boolean_member_;
Optional<HashMap<String, String>> dictionary_member_properties_;
InternalEnumOrInternalEnumSequence internal_enum_or_internal_enum_sequence_;
ScriptValue any_member_;
};
} // namespace blink
......
......@@ -35,4 +35,5 @@ dictionary InternalDictionary {
EventTarget? eventTargetOrNullMember = null;
Dictionary dictionaryMember;
(InternalEnum or sequence<InternalEnum>) internalEnumOrInternalEnumSequenceMember;
any anyMember;
};
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