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
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
......@@ -30,6 +30,7 @@ PASS dict.objectOrNullMemberWithDefault is null
PASS dict.doubleOrStringMember is undefined.
PASS dict.doubleOrStringSequenceMember is undefined.
PASS dict.eventTargetOrNullMember is null
PASS dict.prefixGetMember is undefined.
Test for setting undefined
PASS dict.longMember is undefined.
......@@ -78,6 +79,7 @@ PASS dict.objectOrNullMemberWithDefault is testObject2
PASS dict.doubleOrStringMember is 3.14
PASS dict.doubleOrStringSequenceMember is [3.14, "Hello"]
PASS dict.eventTargetOrNullMember is element1
PASS dict.prefixGetMember is testObject1
Additional test for union type members
PASS dict.doubleOrStringMember is "foo"
......
......@@ -37,6 +37,7 @@ if (window.internals && internals.dictionaryTest) {
shouldBeUndefined('dict.doubleOrStringMember');
shouldBeUndefined('dict.doubleOrStringSequenceMember');
shouldBeNull('dict.eventTargetOrNullMember');
shouldBeUndefined('dict.prefixGetMember');
debug('');
debug('Test for setting undefined');
......@@ -91,7 +92,8 @@ if (window.internals && internals.dictionaryTest) {
objectOrNullMemberWithDefault: testObject2,
doubleOrStringMember: 3.14,
doubleOrStringSequenceMember: [3.14, 'Hello'],
eventTargetOrNullMember: element1
eventTargetOrNullMember: element1,
prefixGetMember: testObject1,
});
dict = dictionaryTest.get();
shouldBe('dict.longMember', '1');
......@@ -120,6 +122,7 @@ if (window.internals && internals.dictionaryTest) {
shouldBe('dict.doubleOrStringMember', '3.14');
shouldBe('dict.doubleOrStringSequenceMember', '[3.14, "Hello"]');
shouldBe('dict.eventTargetOrNullMember', 'element1');
shouldBe('dict.prefixGetMember', 'testObject1');
debug('');
debug('Additional test for union type members');
......
......@@ -1076,6 +1076,10 @@ Usage: `[PostMessage]` can be specified on methods
[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)_
Summary: Tells the code generator to append an `ExceptionState&` argument when calling the Blink implementation.
......
......@@ -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):
name = v8_utilities.cpp_name(member)
return 'set%s' % v8_utilities.capitalize(name)
......@@ -114,6 +121,7 @@ def member_context(dictionary, member):
cpp_default_value, v8_default_value = default_values()
cpp_name = v8_utilities.cpp_name(member)
getter_name = getter_name_for_dictionary_member(member)
is_deprecated_dictionary = unwrapped_idl_type.name == 'Dictionary'
return {
......@@ -121,12 +129,13 @@ def member_context(dictionary, member):
'cpp_name': cpp_name,
'cpp_type': unwrapped_idl_type.cpp_type,
'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',
extended_attributes=extended_attributes),
'deprecate_as': v8_utilities.deprecate_as(member),
'enum_type': idl_type.enum_type,
'enum_values': unwrapped_idl_type.enum_values,
'getter_name': getter_name,
'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,
......@@ -223,6 +232,7 @@ def member_impl_context(member, interfaces_info, header_includes,
'cpp_default_value': cpp_default_value,
'cpp_name': cpp_name,
'getter_expression': 'm_' + cpp_name,
'getter_name': getter_name_for_dictionary_member(member),
'has_method_expression': has_method_expression(),
'has_method_name': has_method_name_for_dictionary_member(member),
'is_nullable': idl_type.is_nullable,
......
......@@ -26,7 +26,7 @@ namespace blink {
bool {{cpp_class}}::{{member.has_method_name}}() const {
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 %}
DCHECK({{member.nullable_indicator_name}});
{% endif %}
......
......@@ -25,7 +25,7 @@ class {{exported}}{{cpp_class}}{% if parent_cpp_class %} : public {{parent_cpp_c
{% for member in members %}
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}});
{% if 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
{% for member in members %}
if (impl.{{member.has_method_name}}()) {
{% if member.is_object %}
DCHECK(impl.{{member.cpp_name}}().isObject());
DCHECK(impl.{{member.getter_name}}().isObject());
{% endif %}
if (!v8CallBoolean(dictionary->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, "{{member.name}}"), {{member.cpp_value_to_v8_value}})))
return false;
......
......@@ -36,4 +36,5 @@ dictionary TestDictionary {
any anyMember = null;
Dictionary dictionaryMember;
[RuntimeEnabled=runtimeFeature] boolean runtimeMember;
[PrefixGet] object prefixGetMember;
};
......@@ -208,6 +208,15 @@ const DoubleOrString& TestDictionary::otherDoubleOrStringMember() const {
void TestDictionary::setOtherDoubleOrStringMember(const DoubleOrString& 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 {
return m_hasRestrictedDoubleMember;
}
......
......@@ -108,6 +108,10 @@ class CORE_EXPORT TestDictionary : public IDLDictionaryBase {
const DoubleOrString& otherDoubleOrStringMember() const;
void setOtherDoubleOrStringMember(const DoubleOrString&);
bool hasPrefixGetMember() const;
ScriptValue getPrefixGetMember() const;
void setPrefixGetMember(ScriptValue);
bool hasRestrictedDoubleMember() const;
double restrictedDoubleMember() const;
void setRestrictedDoubleMember(double);
......@@ -202,6 +206,7 @@ class CORE_EXPORT TestDictionary : public IDLDictionaryBase {
ScriptValue m_objectMember;
ScriptValue m_objectOrNullMember;
DoubleOrString m_otherDoubleOrStringMember;
ScriptValue m_prefixGetMember;
bool m_hasRestrictedDoubleMember = false;
double m_restrictedDoubleMember;
bool m_hasRuntimeMember = false;
......
......@@ -319,6 +319,22 @@ void V8TestDictionary::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value
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;
if (!v8Object->Get(isolate->GetCurrentContext(), v8String(isolate, "restrictedDoubleMember")).ToLocal(&restrictedDoubleMemberValue)) {
exceptionState.rethrowV8Exception(block.Exception());
......@@ -683,6 +699,12 @@ bool toV8TestDictionary(const TestDictionary& impl, v8::Local<v8::Object> dictio
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 (!v8CallBoolean(dictionary->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, "restrictedDoubleMember"), v8::Number::New(isolate, impl.restrictedDoubleMember()))))
return false;
......
......@@ -73,6 +73,7 @@ void DictionaryTest::set(const InternalDictionary& testingDictionary) {
testingDictionary.dictionaryMember().getOwnPropertiesAsStringHashMap(
exceptionState);
}
m_prefixGetMember = testingDictionary.getPrefixGetMember();
}
void DictionaryTest::get(InternalDictionary& result) {
......@@ -119,6 +120,7 @@ void DictionaryTest::get(InternalDictionary& result) {
result.setDoubleOrStringSequenceMember(
m_doubleOrStringSequenceMember.get());
result.setEventTargetOrNullMember(m_eventTargetOrNullMember);
result.setPrefixGetMember(m_prefixGetMember);
}
ScriptValue DictionaryTest::getDictionaryMemberProperties(
......@@ -218,6 +220,7 @@ void DictionaryTest::reset() {
m_derivedStringMemberWithDefault = String();
m_requiredBooleanMember = false;
m_dictionaryMemberProperties = nullptr;
m_prefixGetMember = ScriptValue();
}
DEFINE_TRACE(DictionaryTest) {
......
......@@ -91,6 +91,7 @@ class DictionaryTest : public GarbageCollectedFinalized<DictionaryTest>,
String m_derivedDerivedStringMember;
bool m_requiredBooleanMember;
Nullable<HashMap<String, String>> m_dictionaryMemberProperties;
ScriptValue m_prefixGetMember;
};
} // namespace blink
......
......@@ -35,4 +35,5 @@ dictionary InternalDictionary {
sequence<(double or DOMString)> doubleOrStringSequenceMember;
EventTarget? eventTargetOrNullMember = null;
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