Commit 18c57323 authored by bashi's avatar bashi Committed by Commit bot

Add [PrefixGet] extended attribute

When this extended attribute is specified on a dictionary member
called 'foo', impl class will have getFoo() method instead of
foo().

BUG=673039

Review-Url: https://codereview.chromium.org/2587383002
Cr-Commit-Position: refs/heads/master@{#439778}
parent 374735e0
CONSOLE WARNING: line 227: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead. CONSOLE WARNING: line 230: '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".
...@@ -30,6 +30,7 @@ PASS dict.objectOrNullMemberWithDefault is null ...@@ -30,6 +30,7 @@ PASS dict.objectOrNullMemberWithDefault is null
PASS dict.doubleOrStringMember is undefined. PASS dict.doubleOrStringMember is undefined.
PASS dict.doubleOrStringSequenceMember is undefined. PASS dict.doubleOrStringSequenceMember is undefined.
PASS dict.eventTargetOrNullMember is null PASS dict.eventTargetOrNullMember is null
PASS dict.prefixGetMember is undefined.
Test for setting undefined Test for setting undefined
PASS dict.longMember is undefined. PASS dict.longMember is undefined.
...@@ -78,6 +79,7 @@ PASS dict.objectOrNullMemberWithDefault is testObject2 ...@@ -78,6 +79,7 @@ PASS dict.objectOrNullMemberWithDefault is testObject2
PASS dict.doubleOrStringMember is 3.14 PASS dict.doubleOrStringMember is 3.14
PASS dict.doubleOrStringSequenceMember is [3.14, "Hello"] PASS dict.doubleOrStringSequenceMember is [3.14, "Hello"]
PASS dict.eventTargetOrNullMember is element1 PASS dict.eventTargetOrNullMember is element1
PASS dict.prefixGetMember is testObject1
Additional test for union type members Additional test for union type members
PASS dict.doubleOrStringMember is "foo" PASS dict.doubleOrStringMember is "foo"
......
...@@ -37,6 +37,7 @@ if (window.internals && internals.dictionaryTest) { ...@@ -37,6 +37,7 @@ if (window.internals && internals.dictionaryTest) {
shouldBeUndefined('dict.doubleOrStringMember'); shouldBeUndefined('dict.doubleOrStringMember');
shouldBeUndefined('dict.doubleOrStringSequenceMember'); shouldBeUndefined('dict.doubleOrStringSequenceMember');
shouldBeNull('dict.eventTargetOrNullMember'); shouldBeNull('dict.eventTargetOrNullMember');
shouldBeUndefined('dict.prefixGetMember');
debug(''); debug('');
debug('Test for setting undefined'); debug('Test for setting undefined');
...@@ -91,7 +92,8 @@ if (window.internals && internals.dictionaryTest) { ...@@ -91,7 +92,8 @@ if (window.internals && internals.dictionaryTest) {
objectOrNullMemberWithDefault: testObject2, objectOrNullMemberWithDefault: testObject2,
doubleOrStringMember: 3.14, doubleOrStringMember: 3.14,
doubleOrStringSequenceMember: [3.14, 'Hello'], doubleOrStringSequenceMember: [3.14, 'Hello'],
eventTargetOrNullMember: element1 eventTargetOrNullMember: element1,
prefixGetMember: testObject1,
}); });
dict = dictionaryTest.get(); dict = dictionaryTest.get();
shouldBe('dict.longMember', '1'); shouldBe('dict.longMember', '1');
...@@ -120,6 +122,7 @@ if (window.internals && internals.dictionaryTest) { ...@@ -120,6 +122,7 @@ if (window.internals && internals.dictionaryTest) {
shouldBe('dict.doubleOrStringMember', '3.14'); shouldBe('dict.doubleOrStringMember', '3.14');
shouldBe('dict.doubleOrStringSequenceMember', '[3.14, "Hello"]'); shouldBe('dict.doubleOrStringSequenceMember', '[3.14, "Hello"]');
shouldBe('dict.eventTargetOrNullMember', 'element1'); shouldBe('dict.eventTargetOrNullMember', 'element1');
shouldBe('dict.prefixGetMember', 'testObject1');
debug(''); debug('');
debug('Additional test for union type members'); debug('Additional test for union type members');
......
...@@ -1076,6 +1076,10 @@ Usage: `[PostMessage]` can be specified on methods ...@@ -1076,6 +1076,10 @@ Usage: `[PostMessage]` can be specified on methods
[PostMessage] void postMessage(any message, optional sequence<Transferable> transfer); [PostMessage] void postMessage(any message, optional sequence<Transferable> transfer);
``` ```
### [PrefixGet] _(d)_
Summary: If this extended attribute is specified on a dictionary member, the code generator adds 'get' prefix to the getter method of the member.
### [RaisesException] _(i, m, a)_ ### [RaisesException] _(i, m, a)_
Summary: Tells the code generator to append an `ExceptionState&` argument when calling the Blink implementation. Summary: Tells the code generator to append an `ExceptionState&` argument when calling the Blink implementation.
......
...@@ -25,6 +25,13 @@ DICTIONARY_CPP_INCLUDES = frozenset([ ...@@ -25,6 +25,13 @@ DICTIONARY_CPP_INCLUDES = frozenset([
]) ])
def getter_name_for_dictionary_member(member):
name = v8_utilities.cpp_name(member)
if 'PrefixGet' in member.extended_attributes:
return 'get%s' % v8_utilities.capitalize(name)
return name
def setter_name_for_dictionary_member(member): def setter_name_for_dictionary_member(member):
name = v8_utilities.cpp_name(member) name = v8_utilities.cpp_name(member)
return 'set%s' % v8_utilities.capitalize(name) return 'set%s' % v8_utilities.capitalize(name)
...@@ -114,6 +121,7 @@ def member_context(dictionary, member): ...@@ -114,6 +121,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)
getter_name = getter_name_for_dictionary_member(member)
is_deprecated_dictionary = unwrapped_idl_type.name == 'Dictionary' is_deprecated_dictionary = unwrapped_idl_type.name == 'Dictionary'
return { return {
...@@ -121,12 +129,13 @@ def member_context(dictionary, member): ...@@ -121,12 +129,13 @@ def member_context(dictionary, member):
'cpp_name': cpp_name, 'cpp_name': cpp_name,
'cpp_type': unwrapped_idl_type.cpp_type, 'cpp_type': unwrapped_idl_type.cpp_type,
'cpp_value_to_v8_value': unwrapped_idl_type.cpp_value_to_v8_value( 'cpp_value_to_v8_value': unwrapped_idl_type.cpp_value_to_v8_value(
cpp_value='impl.%s()' % cpp_name, isolate='isolate', cpp_value='impl.%s()' % getter_name, isolate='isolate',
creation_context='creationContext', creation_context='creationContext',
extended_attributes=extended_attributes), extended_attributes=extended_attributes),
'deprecate_as': v8_utilities.deprecate_as(member), 'deprecate_as': v8_utilities.deprecate_as(member),
'enum_type': idl_type.enum_type, 'enum_type': idl_type.enum_type,
'enum_values': unwrapped_idl_type.enum_values, 'enum_values': unwrapped_idl_type.enum_values,
'getter_name': getter_name,
'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,
...@@ -223,6 +232,7 @@ def member_impl_context(member, interfaces_info, header_includes, ...@@ -223,6 +232,7 @@ def member_impl_context(member, interfaces_info, header_includes,
'cpp_default_value': cpp_default_value, 'cpp_default_value': cpp_default_value,
'cpp_name': cpp_name, 'cpp_name': cpp_name,
'getter_expression': 'm_' + cpp_name, 'getter_expression': 'm_' + cpp_name,
'getter_name': getter_name_for_dictionary_member(member),
'has_method_expression': has_method_expression(), 'has_method_expression': has_method_expression(),
'has_method_name': has_method_name_for_dictionary_member(member), 'has_method_name': has_method_name_for_dictionary_member(member),
'is_nullable': idl_type.is_nullable, 'is_nullable': idl_type.is_nullable,
......
...@@ -26,7 +26,7 @@ namespace blink { ...@@ -26,7 +26,7 @@ namespace blink {
bool {{cpp_class}}::{{member.has_method_name}}() const { bool {{cpp_class}}::{{member.has_method_name}}() const {
return {{member.has_method_expression}}; return {{member.has_method_expression}};
} }
{{member.rvalue_cpp_type}} {{cpp_class}}::{{member.cpp_name}}() const { {{member.rvalue_cpp_type}} {{cpp_class}}::{{member.getter_name}}() const {
{% if member.nullable_indicator_name %} {% if member.nullable_indicator_name %}
DCHECK({{member.nullable_indicator_name}}); DCHECK({{member.nullable_indicator_name}});
{% endif %} {% endif %}
......
...@@ -25,7 +25,7 @@ class {{exported}}{{cpp_class}}{% if parent_cpp_class %} : public {{parent_cpp_c ...@@ -25,7 +25,7 @@ class {{exported}}{{cpp_class}}{% if parent_cpp_class %} : public {{parent_cpp_c
{% for member in members %} {% for member in members %}
bool {{member.has_method_name}}() const; bool {{member.has_method_name}}() const;
{{member.rvalue_cpp_type}} {{member.cpp_name}}() const; {{member.rvalue_cpp_type}} {{member.getter_name}}() const;
void {{member.setter_name}}({{member.rvalue_cpp_type}}); void {{member.setter_name}}({{member.rvalue_cpp_type}});
{% if member.null_setter_name %} {% if member.null_setter_name %}
void {{member.null_setter_name}}(); void {{member.null_setter_name}}();
......
...@@ -105,7 +105,7 @@ bool toV8{{cpp_class}}(const {{cpp_class}}& impl, v8::Local<v8::Object> dictiona ...@@ -105,7 +105,7 @@ bool toV8{{cpp_class}}(const {{cpp_class}}& impl, v8::Local<v8::Object> dictiona
{% for member in members %} {% for member in members %}
if (impl.{{member.has_method_name}}()) { if (impl.{{member.has_method_name}}()) {
{% if member.is_object %} {% if member.is_object %}
DCHECK(impl.{{member.cpp_name}}().isObject()); DCHECK(impl.{{member.getter_name}}().isObject());
{% endif %} {% endif %}
if (!v8CallBoolean(dictionary->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, "{{member.name}}"), {{member.cpp_value_to_v8_value}}))) if (!v8CallBoolean(dictionary->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, "{{member.name}}"), {{member.cpp_value_to_v8_value}})))
return false; return false;
......
...@@ -36,4 +36,5 @@ dictionary TestDictionary { ...@@ -36,4 +36,5 @@ dictionary TestDictionary {
any anyMember = null; any anyMember = null;
Dictionary dictionaryMember; Dictionary dictionaryMember;
[RuntimeEnabled=runtimeFeature] boolean runtimeMember; [RuntimeEnabled=runtimeFeature] boolean runtimeMember;
[PrefixGet] object prefixGetMember;
}; };
...@@ -208,6 +208,15 @@ const DoubleOrString& TestDictionary::otherDoubleOrStringMember() const { ...@@ -208,6 +208,15 @@ const DoubleOrString& TestDictionary::otherDoubleOrStringMember() const {
void TestDictionary::setOtherDoubleOrStringMember(const DoubleOrString& value) { void TestDictionary::setOtherDoubleOrStringMember(const DoubleOrString& value) {
m_otherDoubleOrStringMember = value; m_otherDoubleOrStringMember = value;
} }
bool TestDictionary::hasPrefixGetMember() const {
return !(m_prefixGetMember.isEmpty() || m_prefixGetMember.isNull() || m_prefixGetMember.isUndefined());
}
ScriptValue TestDictionary::getPrefixGetMember() const {
return m_prefixGetMember;
}
void TestDictionary::setPrefixGetMember(ScriptValue value) {
m_prefixGetMember = value;
}
bool TestDictionary::hasRestrictedDoubleMember() const { bool TestDictionary::hasRestrictedDoubleMember() const {
return m_hasRestrictedDoubleMember; return m_hasRestrictedDoubleMember;
} }
......
...@@ -108,6 +108,10 @@ class CORE_EXPORT TestDictionary : public IDLDictionaryBase { ...@@ -108,6 +108,10 @@ class CORE_EXPORT TestDictionary : public IDLDictionaryBase {
const DoubleOrString& otherDoubleOrStringMember() const; const DoubleOrString& otherDoubleOrStringMember() const;
void setOtherDoubleOrStringMember(const DoubleOrString&); void setOtherDoubleOrStringMember(const DoubleOrString&);
bool hasPrefixGetMember() const;
ScriptValue getPrefixGetMember() const;
void setPrefixGetMember(ScriptValue);
bool hasRestrictedDoubleMember() const; bool hasRestrictedDoubleMember() const;
double restrictedDoubleMember() const; double restrictedDoubleMember() const;
void setRestrictedDoubleMember(double); void setRestrictedDoubleMember(double);
...@@ -202,6 +206,7 @@ class CORE_EXPORT TestDictionary : public IDLDictionaryBase { ...@@ -202,6 +206,7 @@ class CORE_EXPORT TestDictionary : public IDLDictionaryBase {
ScriptValue m_objectMember; ScriptValue m_objectMember;
ScriptValue m_objectOrNullMember; ScriptValue m_objectOrNullMember;
DoubleOrString m_otherDoubleOrStringMember; DoubleOrString m_otherDoubleOrStringMember;
ScriptValue m_prefixGetMember;
bool m_hasRestrictedDoubleMember = false; bool m_hasRestrictedDoubleMember = false;
double m_restrictedDoubleMember; double m_restrictedDoubleMember;
bool m_hasRuntimeMember = false; bool m_hasRuntimeMember = false;
......
...@@ -319,6 +319,22 @@ void V8TestDictionary::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value ...@@ -319,6 +319,22 @@ void V8TestDictionary::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value
impl.setOtherDoubleOrStringMember(otherDoubleOrStringMember); impl.setOtherDoubleOrStringMember(otherDoubleOrStringMember);
} }
v8::Local<v8::Value> prefixGetMemberValue;
if (!v8Object->Get(isolate->GetCurrentContext(), v8String(isolate, "prefixGetMember")).ToLocal(&prefixGetMemberValue)) {
exceptionState.rethrowV8Exception(block.Exception());
return;
}
if (prefixGetMemberValue.IsEmpty() || prefixGetMemberValue->IsUndefined()) {
// Do nothing.
} else {
ScriptValue prefixGetMember = ScriptValue(ScriptState::current(isolate), prefixGetMemberValue);
if (!prefixGetMember.isObject()) {
exceptionState.throwTypeError("member prefixGetMember is not an object.");
return;
}
impl.setPrefixGetMember(prefixGetMember);
}
v8::Local<v8::Value> restrictedDoubleMemberValue; v8::Local<v8::Value> restrictedDoubleMemberValue;
if (!v8Object->Get(isolate->GetCurrentContext(), v8String(isolate, "restrictedDoubleMember")).ToLocal(&restrictedDoubleMemberValue)) { if (!v8Object->Get(isolate->GetCurrentContext(), v8String(isolate, "restrictedDoubleMember")).ToLocal(&restrictedDoubleMemberValue)) {
exceptionState.rethrowV8Exception(block.Exception()); exceptionState.rethrowV8Exception(block.Exception());
...@@ -683,6 +699,12 @@ bool toV8TestDictionary(const TestDictionary& impl, v8::Local<v8::Object> dictio ...@@ -683,6 +699,12 @@ bool toV8TestDictionary(const TestDictionary& impl, v8::Local<v8::Object> dictio
return false; return false;
} }
if (impl.hasPrefixGetMember()) {
DCHECK(impl.getPrefixGetMember().isObject());
if (!v8CallBoolean(dictionary->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, "prefixGetMember"), impl.getPrefixGetMember().v8Value())))
return false;
}
if (impl.hasRestrictedDoubleMember()) { if (impl.hasRestrictedDoubleMember()) {
if (!v8CallBoolean(dictionary->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, "restrictedDoubleMember"), v8::Number::New(isolate, impl.restrictedDoubleMember())))) if (!v8CallBoolean(dictionary->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, "restrictedDoubleMember"), v8::Number::New(isolate, impl.restrictedDoubleMember()))))
return false; return false;
......
...@@ -73,6 +73,7 @@ void DictionaryTest::set(const InternalDictionary& testingDictionary) { ...@@ -73,6 +73,7 @@ void DictionaryTest::set(const InternalDictionary& testingDictionary) {
testingDictionary.dictionaryMember().getOwnPropertiesAsStringHashMap( testingDictionary.dictionaryMember().getOwnPropertiesAsStringHashMap(
exceptionState); exceptionState);
} }
m_prefixGetMember = testingDictionary.getPrefixGetMember();
} }
void DictionaryTest::get(InternalDictionary& result) { void DictionaryTest::get(InternalDictionary& result) {
...@@ -119,6 +120,7 @@ void DictionaryTest::get(InternalDictionary& result) { ...@@ -119,6 +120,7 @@ void DictionaryTest::get(InternalDictionary& result) {
result.setDoubleOrStringSequenceMember( result.setDoubleOrStringSequenceMember(
m_doubleOrStringSequenceMember.get()); m_doubleOrStringSequenceMember.get());
result.setEventTargetOrNullMember(m_eventTargetOrNullMember); result.setEventTargetOrNullMember(m_eventTargetOrNullMember);
result.setPrefixGetMember(m_prefixGetMember);
} }
ScriptValue DictionaryTest::getDictionaryMemberProperties( ScriptValue DictionaryTest::getDictionaryMemberProperties(
...@@ -218,6 +220,7 @@ void DictionaryTest::reset() { ...@@ -218,6 +220,7 @@ void DictionaryTest::reset() {
m_derivedStringMemberWithDefault = String(); m_derivedStringMemberWithDefault = String();
m_requiredBooleanMember = false; m_requiredBooleanMember = false;
m_dictionaryMemberProperties = nullptr; m_dictionaryMemberProperties = nullptr;
m_prefixGetMember = ScriptValue();
} }
DEFINE_TRACE(DictionaryTest) { DEFINE_TRACE(DictionaryTest) {
......
...@@ -91,6 +91,7 @@ class DictionaryTest : public GarbageCollectedFinalized<DictionaryTest>, ...@@ -91,6 +91,7 @@ class DictionaryTest : public GarbageCollectedFinalized<DictionaryTest>,
String m_derivedDerivedStringMember; String m_derivedDerivedStringMember;
bool m_requiredBooleanMember; bool m_requiredBooleanMember;
Nullable<HashMap<String, String>> m_dictionaryMemberProperties; Nullable<HashMap<String, String>> m_dictionaryMemberProperties;
ScriptValue m_prefixGetMember;
}; };
} // namespace blink } // namespace blink
......
...@@ -35,4 +35,5 @@ dictionary InternalDictionary { ...@@ -35,4 +35,5 @@ dictionary InternalDictionary {
sequence<(double or DOMString)> doubleOrStringSequenceMember; sequence<(double or DOMString)> doubleOrStringSequenceMember;
EventTarget? eventTargetOrNullMember = null; EventTarget? eventTargetOrNullMember = null;
Dictionary dictionaryMember; Dictionary dictionaryMember;
[PrefixGet] object prefixGetMember;
}; };
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