Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(290)

Side by Side Diff: Source/bindings/templates/interface.cpp

Issue 140663012: IDL compiler: Window-specific code + Window-only features (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: No headers for named constructor attributes Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 {% extends 'interface_base.cpp' %} 1 {% extends 'interface_base.cpp' %}
2 2
3 3
4 {##############################################################################} 4 {##############################################################################}
5 {% macro attribute_configuration(attribute) %} 5 {% macro attribute_configuration(attribute) %}
6 {% set getter_callback = 6 {% set getter_callback =
7 '%sV8Internal::%sAttributeGetterCallback' % 7 '%sV8Internal::%sAttributeGetterCallback' %
8 (cpp_class, attribute.name) 8 (cpp_class, attribute.name)
9 if not attribute.constructor_type else 9 if not attribute.constructor_type else
10 '{0}V8Internal::{0}ConstructorGetter'.format(interface_name) %} 10 '{0}V8Internal::{0}ConstructorGetter'.format(cpp_class) %}
11 {% set getter_callback_for_main_world = 11 {% set getter_callback_for_main_world =
12 '%sV8Internal::%sAttributeGetterCallbackForMainWorld' % 12 '%sV8Internal::%sAttributeGetterCallbackForMainWorld' %
13 (cpp_class, attribute.name) 13 (cpp_class, attribute.name)
14 if attribute.is_per_world_bindings else '0' %} 14 if attribute.is_per_world_bindings else '0' %}
15 {% set setter_callback = attribute.setter_callback %} 15 {% set setter_callback = attribute.setter_callback %}
16 {% set setter_callback_for_main_world = 16 {% set setter_callback_for_main_world =
17 '%sV8Internal::%sAttributeSetterCallbackForMainWorld' % 17 '%sV8Internal::%sAttributeSetterCallbackForMainWorld' %
18 (cpp_class, attribute.name) 18 (cpp_class, attribute.name)
19 if attribute.is_per_world_bindings and 19 if attribute.is_per_world_bindings and
20 (not attribute.is_read_only or attribute.put_forwards) else '0' %} 20 (not attribute.is_read_only or attribute.put_forwards) else '0' %}
21 {% set wrapper_type_info = 21 {% set wrapper_type_info =
22 'const_cast<WrapperTypeInfo*>(&V8%s::wrapperTypeInfo)' % 22 'const_cast<WrapperTypeInfo*>(&V8%s::wrapperTypeInfo)' %
23 attribute.constructor_type 23 attribute.constructor_type
24 if attribute.constructor_type else '0' %} 24 if attribute.constructor_type else '0' %}
25 {% set access_control = 'static_cast<v8::AccessControl>(%s)' % 25 {% set access_control = 'static_cast<v8::AccessControl>(%s)' %
26 ' | '.join(attribute.access_control_list) %} 26 ' | '.join(attribute.access_control_list) %}
27 {% set property_attribute = 'static_cast<v8::PropertyAttribute>(%s)' % 27 {% set property_attribute = 'static_cast<v8::PropertyAttribute>(%s)' %
28 ' | '.join(attribute.property_attributes) %} 28 ' | '.join(attribute.property_attributes) %}
29 {% set on_prototype = ', 0 /* on instance */' 29 {% set on_prototype = '1 /* on prototype */'
30 if not attribute.is_expose_js_accessors else '' %} 30 if interface_name == 'Window' and attribute.idl_type == 'EventHandler'
31 {"{{attribute.name}}", {{getter_callback}}, {{setter_callback}}, {{getter_callba ck_for_main_world}}, {{setter_callback_for_main_world}}, {{wrapper_type_info}}, {{access_control}}, {{property_attribute}}{{on_prototype}}} 31 else '0 /* on instance */' %}
haraken 2014/02/06 07:57:44 I don't fully understand why we need to treat Even
Nils Barth (inactive) 2014/02/06 08:40:14 Got it; agreed it would be simpler to eliminate th
32 {% set attribute_configuration_list = [
33 '"%s"' % attribute.name,
34 getter_callback,
35 setter_callback,
36 getter_callback_for_main_world,
37 setter_callback_for_main_world,
38 wrapper_type_info,
39 access_control,
40 property_attribute,
41 ] %}
42 {% if not attribute.is_expose_js_accessors %}
43 {% set attribute_configuration_list = attribute_configuration_list
44 + [on_prototype] %}
45 {% endif %}
46 {{'{'}}{{attribute_configuration_list|join(', ')}}{{'}'}}
32 {%- endmacro %} 47 {%- endmacro %}
33 48
34 49
35 {##############################################################################} 50 {##############################################################################}
36 {% macro method_configuration(method) %} 51 {% macro method_configuration(method) %}
37 {% set method_callback = 52 {% set method_callback =
38 '%sV8Internal::%sMethodCallback' % (cpp_class, method.name) %} 53 '%sV8Internal::%sMethodCallback' % (cpp_class, method.name) %}
39 {% set method_callback_for_main_world = 54 {% set method_callback_for_main_world =
40 '%sV8Internal::%sMethodCallbackForMainWorld' % (cpp_class, method.name) 55 '%sV8Internal::%sMethodCallbackForMainWorld' % (cpp_class, method.name)
41 if method.is_per_world_bindings else '0' %} 56 if method.is_per_world_bindings else '0' %}
42 {"{{method.name}}", {{method_callback}}, {{method_callback_for_main_world}}, {{m ethod.number_of_required_or_variadic_arguments}}} 57 {"{{method.name}}", {{method_callback}}, {{method_callback_for_main_world}}, {{m ethod.number_of_required_or_variadic_arguments}}}
43 {%- endmacro %} 58 {%- endmacro %}
44 59
45 60
46 {##############################################################################} 61 {##############################################################################}
47 {% block constructor_getter %} 62 {% block constructor_getter %}
48 {% if has_constructor_attributes %} 63 {% if has_constructor_attributes %}
49 static void {{interface_name}}ConstructorGetter(v8::Local<v8::String>, const v8: :PropertyCallbackInfo<v8::Value>& info) 64 static void {{cpp_class}}ConstructorGetter(v8::Local<v8::String>, const v8::Prop ertyCallbackInfo<v8::Value>& info)
50 { 65 {
51 v8::Handle<v8::Value> data = info.Data(); 66 v8::Handle<v8::Value> data = info.Data();
52 ASSERT(data->IsExternal()); 67 ASSERT(data->IsExternal());
53 V8PerContextData* perContextData = V8PerContextData::from(info.Holder()->Cre ationContext()); 68 V8PerContextData* perContextData = V8PerContextData::from(info.Holder()->Cre ationContext());
54 if (!perContextData) 69 if (!perContextData)
55 return; 70 return;
56 v8SetReturnValue(info, perContextData->constructorForType(WrapperTypeInfo::u nwrap(data))); 71 v8SetReturnValue(info, perContextData->constructorForType(WrapperTypeInfo::u nwrap(data)));
57 } 72 }
58 73
59 {% endif %} 74 {% endif %}
60 {% endblock %} 75 {% endblock %}
61 76
62 77
63 {##############################################################################} 78 {##############################################################################}
64 {% block replaceable_attribute_setter_and_callback %} 79 {% block replaceable_attribute_setter_and_callback %}
65 {% if has_replaceable_attributes or has_constructor_attributes %} 80 {% if has_replaceable_attributes or has_constructor_attributes %}
66 {# FIXME: rename to ForceSetAttributeOnThis, since also used for Constructors #} 81 {# FIXME: rename to ForceSetAttributeOnThis, since also used for Constructors #}
67 static void {{interface_name}}ReplaceableAttributeSetter(v8::Local<v8::String> n ame, v8::Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<void>& info) 82 static void {{cpp_class}}ReplaceableAttributeSetter(v8::Local<v8::String> name, v8::Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<void>& info)
68 { 83 {
84 {% if is_check_security %}
85 {{cpp_class}}* imp = {{v8_class}}::toNative(info.Holder());
86 v8::String::Utf8Value attributeName(name);
87 ExceptionState exceptionState(ExceptionState::SetterContext, *attributeName, "{{interface_name}}", info.Holder(), info.GetIsolate());
88 if (!BindingSecurity::shouldAllowAccessToFrame(info.GetIsolate(), imp->frame (), exceptionState)) {
89 exceptionState.throwIfNeeded();
90 return;
91 }
92 {% endif %}
69 info.This()->ForceSet(name, jsValue); 93 info.This()->ForceSet(name, jsValue);
70 } 94 }
71 95
72 {# FIXME: rename to ForceSetAttributeOnThisCallback, since also used for Constru ctors #} 96 {# FIXME: rename to ForceSetAttributeOnThisCallback, since also used for Constru ctors #}
73 static void {{interface_name}}ReplaceableAttributeSetterCallback(v8::Local<v8::S tring> name, v8::Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<void>& info) 97 static void {{cpp_class}}ReplaceableAttributeSetterCallback(v8::Local<v8::String > name, v8::Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<void>& info )
74 { 98 {
75 {{interface_name}}V8Internal::{{interface_name}}ReplaceableAttributeSetter(n ame, jsValue, info); 99 {{cpp_class}}V8Internal::{{cpp_class}}ReplaceableAttributeSetter(name, jsVal ue, info);
76 } 100 }
77 101
78 {% endif %} 102 {% endif %}
79 {% endblock %} 103 {% endblock %}
80 104
81 105
82 {##############################################################################} 106 {##############################################################################}
83 {% block security_check_functions %} 107 {% block security_check_functions %}
84 {% if is_check_security and interface_name != 'Window' %} 108 {% if is_check_security and interface_name != 'Window' %}
85 bool indexedSecurityCheck(v8::Local<v8::Object> host, uint32_t index, v8::Access Type type, v8::Local<v8::Value>) 109 bool indexedSecurityCheck(v8::Local<v8::Object> host, uint32_t index, v8::Access Type type, v8::Local<v8::Value>)
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 } 399 }
376 400
377 {% endif %} 401 {% endif %}
378 {% endblock %} 402 {% endblock %}
379 403
380 404
381 {##############################################################################} 405 {##############################################################################}
382 {% block named_property_query %} 406 {% block named_property_query %}
383 {% if named_property_getter and named_property_getter.is_enumerable and 407 {% if named_property_getter and named_property_getter.is_enumerable and
384 not named_property_getter.is_custom_property_query %} 408 not named_property_getter.is_custom_property_query %}
409 {# If there is an enumerator, there MUST be a query method to properly
410 communicate property attributes. #}
385 static void namedPropertyQuery(v8::Local<v8::String> name, const v8::PropertyCal lbackInfo<v8::Integer>& info) 411 static void namedPropertyQuery(v8::Local<v8::String> name, const v8::PropertyCal lbackInfo<v8::Integer>& info)
386 { 412 {
387 {{cpp_class}}* collection = {{v8_class}}::toNative(info.Holder()); 413 {{cpp_class}}* collection = {{v8_class}}::toNative(info.Holder());
388 AtomicString propertyName = toCoreAtomicString(name); 414 AtomicString propertyName = toCoreAtomicString(name);
389 ExceptionState exceptionState(info.Holder(), info.GetIsolate()); 415 ExceptionState exceptionState(info.Holder(), info.GetIsolate());
390 bool result = collection->namedPropertyQuery(propertyName, exceptionState); 416 bool result = collection->namedPropertyQuery(propertyName, exceptionState);
391 if (exceptionState.throwIfNeeded()) 417 if (exceptionState.throwIfNeeded())
392 return; 418 return;
393 if (!result) 419 if (!result)
394 return; 420 return;
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 } 718 }
693 {% endif %} 719 {% endif %}
694 setObjectGroup(object, wrapper, isolate); 720 setObjectGroup(object, wrapper, isolate);
695 } 721 }
696 722
697 {% endif %} 723 {% endif %}
698 {% endblock %} 724 {% endblock %}
699 725
700 726
701 {##############################################################################} 727 {##############################################################################}
728 {% block shadow_attributes %}
729 {% if interface_name == 'Window' %}
730 static const V8DOMConfiguration::AttributeConfiguration shadowAttributes[] = {
731 {% for attribute in attributes if attribute.is_unforgeable %}
732 {{attribute_configuration(attribute)}},
733 {% endfor %}
734 };
735
736 {% endif %}
737 {% endblock %}
738
739
740 {##############################################################################}
702 {% block class_attributes %} 741 {% block class_attributes %}
703 {# FIXME: rename to install_attributes and put into configure_class_template #} 742 {# FIXME: rename to install_attributes and put into configure_class_template #}
704 {% if has_attribute_configuration %} 743 {% if has_attribute_configuration %}
705 static const V8DOMConfiguration::AttributeConfiguration {{v8_class}}Attributes[] = { 744 static const V8DOMConfiguration::AttributeConfiguration {{v8_class}}Attributes[] = {
706 {% for attribute in attributes 745 {% for attribute in attributes
707 if not (attribute.is_expose_js_accessors or 746 if not (attribute.is_expose_js_accessors or
708 attribute.is_static or 747 attribute.is_static or
709 attribute.runtime_enabled_function or 748 attribute.runtime_enabled_function or
710 attribute.per_context_enabled_function) %} 749 attribute.per_context_enabled_function or
750 (interface_name == 'Window' and attribute.is_unforgeable)) %}
haraken 2014/02/06 07:57:44 Do we need interface_name=='Window'?
Nils Barth (inactive) 2014/02/06 08:40:14 Yes - this is exactly the shadowAttributes, direct
711 {% filter conditional(attribute.conditional_string) %} 751 {% filter conditional(attribute.conditional_string) %}
712 {{attribute_configuration(attribute)}}, 752 {{attribute_configuration(attribute)}},
713 {% endfilter %} 753 {% endfilter %}
714 {% endfor %} 754 {% endfor %}
715 }; 755 };
716 756
717 {% endif %} 757 {% endif %}
718 {% endblock %} 758 {% endblock %}
719 759
720 760
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
806 {% else %} 846 {% else %}
807 {{cpp_class}}V8Internal::constructor(info); 847 {{cpp_class}}V8Internal::constructor(info);
808 {% endif %} 848 {% endif %}
809 } 849 }
810 850
811 {% endif %} 851 {% endif %}
812 {% endblock %} 852 {% endblock %}
813 853
814 854
815 {##############################################################################} 855 {##############################################################################}
856 {% block configure_shadow_object_template %}
857 {% if interface_name == 'Window' %}
858 static void configureShadowObjectTemplate(v8::Handle<v8::ObjectTemplate> templ, v8::Isolate* isolate, WrapperWorldType currentWorldType)
859 {
860 V8DOMConfiguration::installAttributes(templ, v8::Handle<v8::ObjectTemplate>( ), shadowAttributes, WTF_ARRAY_LENGTH(shadowAttributes), isolate, currentWorldTy pe);
861
862 // Install a security handler with V8.
863 templ->SetAccessCheckCallbacks(V8Window::namedSecurityCheckCustom, V8Window: :indexedSecurityCheckCustom, v8::External::New(isolate, const_cast<WrapperTypeIn fo*>(&V8Window::wrapperTypeInfo)));
864 templ->SetInternalFieldCount(V8Window::internalFieldCount);
865 }
866
867 {% endif %}
868 {% endblock %}
869
870
871 {##############################################################################}
816 {% block configure_class_template %} 872 {% block configure_class_template %}
817 {# FIXME: rename to install_dom_template and Install{{v8_class}}DOMTemplate #} 873 {# FIXME: rename to install_dom_template and Install{{v8_class}}DOMTemplate #}
818 static void configure{{v8_class}}Template(v8::Handle<v8::FunctionTemplate> funct ionTemplate, v8::Isolate* isolate, WrapperWorldType currentWorldType) 874 static void configure{{v8_class}}Template(v8::Handle<v8::FunctionTemplate> funct ionTemplate, v8::Isolate* isolate, WrapperWorldType currentWorldType)
819 { 875 {
820 functionTemplate->ReadOnlyPrototype(); 876 functionTemplate->ReadOnlyPrototype();
821 877
822 v8::Local<v8::Signature> defaultSignature; 878 v8::Local<v8::Signature> defaultSignature;
823 {% set parent_template = 879 {% set parent_template =
824 'V8%s::domTemplate(isolate, currentWorldType)' % parent_interface 880 'V8%s::domTemplate(isolate, currentWorldType)' % parent_interface
825 if parent_interface else 'v8::Local<v8::FunctionTemplate>()' %} 881 if parent_interface else 'v8::Local<v8::FunctionTemplate>()' %}
(...skipping 27 matching lines...) Expand all
853 {% if constructors or has_custom_constructor or has_event_constructor %} 909 {% if constructors or has_custom_constructor or has_event_constructor %}
854 functionTemplate->SetCallHandler({{v8_class}}::constructorCallback); 910 functionTemplate->SetCallHandler({{v8_class}}::constructorCallback);
855 functionTemplate->SetLength({{interface_length}}); 911 functionTemplate->SetLength({{interface_length}});
856 {% endif %} 912 {% endif %}
857 v8::Local<v8::ObjectTemplate> ALLOW_UNUSED instanceTemplate = functionTempla te->InstanceTemplate(); 913 v8::Local<v8::ObjectTemplate> ALLOW_UNUSED instanceTemplate = functionTempla te->InstanceTemplate();
858 v8::Local<v8::ObjectTemplate> ALLOW_UNUSED prototypeTemplate = functionTempl ate->PrototypeTemplate(); 914 v8::Local<v8::ObjectTemplate> ALLOW_UNUSED prototypeTemplate = functionTempl ate->PrototypeTemplate();
859 {% if is_check_security and interface_name != 'Window' %} 915 {% if is_check_security and interface_name != 'Window' %}
860 instanceTemplate->SetAccessCheckCallbacks({{cpp_class}}V8Internal::namedSecu rityCheck, {{cpp_class}}V8Internal::indexedSecurityCheck, v8::External::New(isol ate, const_cast<WrapperTypeInfo*>(&{{v8_class}}::wrapperTypeInfo))); 916 instanceTemplate->SetAccessCheckCallbacks({{cpp_class}}V8Internal::namedSecu rityCheck, {{cpp_class}}V8Internal::indexedSecurityCheck, v8::External::New(isol ate, const_cast<WrapperTypeInfo*>(&{{v8_class}}::wrapperTypeInfo)));
861 {% endif %} 917 {% endif %}
862 {% for attribute in attributes 918 {% for attribute in attributes
863 if attribute.runtime_enabled_function and not attribute.is_static %} 919 if attribute.runtime_enabled_function and
920 not attribute.per_context_enabled_function and
921 not attribute.is_static %}
864 {% filter conditional(attribute.conditional_string) %} 922 {% filter conditional(attribute.conditional_string) %}
865 if ({{attribute.runtime_enabled_function}}()) { 923 if ({{attribute.runtime_enabled_function}}()) {
866 static const V8DOMConfiguration::AttributeConfiguration attributeConfigu ration =\ 924 static const V8DOMConfiguration::AttributeConfiguration attributeConfigu ration =\
867 {{attribute_configuration(attribute)}}; 925 {{attribute_configuration(attribute)}};
868 V8DOMConfiguration::installAttribute(instanceTemplate, prototypeTemplate , attributeConfiguration, isolate, currentWorldType); 926 V8DOMConfiguration::installAttribute(instanceTemplate, prototypeTemplate , attributeConfiguration, isolate, currentWorldType);
869 } 927 }
870 {% endfilter %} 928 {% endfilter %}
871 {% endfor %} 929 {% endfor %}
872 {% if constants %} 930 {% if constants %}
873 {{install_constants() | indent}} 931 {{install_constants() | indent}}
874 {% endif %} 932 {% endif %}
933 {# Special operations #}
934 {# V8 has access-check callback API and it's used on Window instead of
935 deleters or enumerators; see ObjectTemplate::SetAccessCheckCallbacks.
936 In addition, the getter should be set on the prototype template, to get
937 the implementation straight out of the Window prototype, regardless of
938 what prototype is actually set on the object. #}
939 {% set set_on_template = 'PrototypeTemplate' if interface_name == 'Window'
940 else 'InstanceTemplate' %}
875 {% if indexed_property_getter %} 941 {% if indexed_property_getter %}
876 {# if have indexed properties, MUST have an indexed property getter #} 942 {# if have indexed properties, MUST have an indexed property getter #}
877 {% set indexed_property_getter_callback = 943 {% set indexed_property_getter_callback =
878 '%sV8Internal::indexedPropertyGetterCallback' % cpp_class %} 944 '%sV8Internal::indexedPropertyGetterCallback' % cpp_class %}
879 {% set indexed_property_setter_callback = 945 {% set indexed_property_setter_callback =
880 '%sV8Internal::indexedPropertySetterCallback' % cpp_class 946 '%sV8Internal::indexedPropertySetterCallback' % cpp_class
881 if indexed_property_setter else '0' %} 947 if indexed_property_setter else '0' %}
882 {% set indexed_property_query_callback = '0' %}{# Unused #} 948 {% set indexed_property_query_callback = '0' %}{# Unused #}
883 {% set indexed_property_deleter_callback = 949 {% set indexed_property_deleter_callback =
884 '%sV8Internal::indexedPropertyDeleterCallback' % cpp_class 950 '%sV8Internal::indexedPropertyDeleterCallback' % cpp_class
885 if indexed_property_deleter else '0' %} 951 if indexed_property_deleter else '0' %}
886 {% set indexed_property_enumerator_callback = 952 {% set indexed_property_enumerator_callback =
887 'indexedPropertyEnumerator<%s>' % cpp_class 953 'indexedPropertyEnumerator<%s>' % cpp_class
888 if indexed_property_getter.is_enumerable else '0' %} 954 if indexed_property_getter.is_enumerable else '0' %}
889 functionTemplate->InstanceTemplate()->SetIndexedPropertyHandler({{indexed_pr operty_getter_callback}}, {{indexed_property_setter_callback}}, {{indexed_proper ty_query_callback}}, {{indexed_property_deleter_callback}}, {{indexed_property_e numerator_callback}}); 955 functionTemplate->{{set_on_template}}()->SetIndexedPropertyHandler({{indexed _property_getter_callback}}, {{indexed_property_setter_callback}}, {{indexed_pro perty_query_callback}}, {{indexed_property_deleter_callback}}, {{indexed_propert y_enumerator_callback}});
890 {% endif %} 956 {% endif %}
891 {% if named_property_getter %} 957 {% if named_property_getter %}
892 {# if have named properties, MUST have a named property getter #} 958 {# if have named properties, MUST have a named property getter #}
893 {% set named_property_getter_callback = 959 {% set named_property_getter_callback =
894 '%sV8Internal::namedPropertyGetterCallback' % cpp_class %} 960 '%sV8Internal::namedPropertyGetterCallback' % cpp_class %}
895 {% set named_property_setter_callback = 961 {% set named_property_setter_callback =
896 '%sV8Internal::namedPropertySetterCallback' % cpp_class 962 '%sV8Internal::namedPropertySetterCallback' % cpp_class
897 if named_property_setter else '0' %} 963 if named_property_setter else '0' %}
898 {% set named_property_query_callback = 964 {% set named_property_query_callback =
899 '%sV8Internal::namedPropertyQueryCallback' % cpp_class 965 '%sV8Internal::namedPropertyQueryCallback' % cpp_class
900 if named_property_getter.is_enumerable else '0' %} 966 if named_property_getter.is_enumerable else '0' %}
901 {% set named_property_deleter_callback = 967 {% set named_property_deleter_callback =
902 '%sV8Internal::namedPropertyDeleterCallback' % cpp_class 968 '%sV8Internal::namedPropertyDeleterCallback' % cpp_class
903 if named_property_deleter else '0' %} 969 if named_property_deleter else '0' %}
904 {% set named_property_enumerator_callback = 970 {% set named_property_enumerator_callback =
905 '%sV8Internal::namedPropertyEnumeratorCallback' % cpp_class 971 '%sV8Internal::namedPropertyEnumeratorCallback' % cpp_class
906 if named_property_getter.is_enumerable else '0' %} 972 if named_property_getter.is_enumerable else '0' %}
907 functionTemplate->InstanceTemplate()->SetNamedPropertyHandler({{named_proper ty_getter_callback}}, {{named_property_setter_callback}}, {{named_property_query _callback}}, {{named_property_deleter_callback}}, {{named_property_enumerator_ca llback}}); 973 functionTemplate->{{set_on_template}}()->SetNamedPropertyHandler({{named_pro perty_getter_callback}}, {{named_property_setter_callback}}, {{named_property_qu ery_callback}}, {{named_property_deleter_callback}}, {{named_property_enumerator _callback}});
908 {% endif %} 974 {% endif %}
975 {# End special operations #}
909 {% if has_custom_legacy_call_as_function %} 976 {% if has_custom_legacy_call_as_function %}
910 functionTemplate->InstanceTemplate()->SetCallAsFunctionHandler({{v8_class}}: :legacyCallCustom); 977 functionTemplate->InstanceTemplate()->SetCallAsFunctionHandler({{v8_class}}: :legacyCallCustom);
911 {% endif %} 978 {% endif %}
912 {% if interface_name == 'HTMLAllCollection' %} 979 {% if interface_name == 'HTMLAllCollection' %}
913 {# Needed for legacy support of document.all #} 980 {# Needed for legacy support of document.all #}
914 functionTemplate->InstanceTemplate()->MarkAsUndetectable(); 981 functionTemplate->InstanceTemplate()->MarkAsUndetectable();
915 {% endif %} 982 {% endif %}
916 {% for method in methods if not method.do_not_check_signature %} 983 {% for method in methods if not method.do_not_check_signature %}
917 {# install_custom_signature #} 984 {# install_custom_signature #}
918 {% if not method.overload_index or method.overload_index == 1 %} 985 {% if not method.overload_index or method.overload_index == 1 %}
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 EventTarget* {{v8_class}}::toEventTarget(v8::Handle<v8::Object> object) 1191 EventTarget* {{v8_class}}::toEventTarget(v8::Handle<v8::Object> object)
1125 { 1192 {
1126 return toNative(object); 1193 return toNative(object);
1127 } 1194 }
1128 1195
1129 {% endif %} 1196 {% endif %}
1130 {% endblock %} 1197 {% endblock %}
1131 1198
1132 1199
1133 {##############################################################################} 1200 {##############################################################################}
1201 {% block get_shadow_object_template %}
1202 {% if interface_name == 'Window' %}
1203 v8::Handle<v8::ObjectTemplate> V8Window::getShadowObjectTemplate(v8::Isolate* is olate, WrapperWorldType currentWorldType)
1204 {
1205 if (currentWorldType == MainWorld) {
1206 DEFINE_STATIC_LOCAL(v8::Persistent<v8::ObjectTemplate>, V8WindowShadowOb jectCacheForMainWorld, ());
1207 if (V8WindowShadowObjectCacheForMainWorld.IsEmpty()) {
1208 TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "BuildDOMTemplate");
1209 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isola te);
1210 configureShadowObjectTemplate(templ, isolate, currentWorldType);
1211 V8WindowShadowObjectCacheForMainWorld.Reset(isolate, templ);
1212 return templ;
1213 }
1214 return v8::Local<v8::ObjectTemplate>::New(isolate, V8WindowShadowObjectC acheForMainWorld);
1215 } else {
1216 DEFINE_STATIC_LOCAL(v8::Persistent<v8::ObjectTemplate>, V8WindowShadowOb jectCacheForNonMainWorld, ());
1217 if (V8WindowShadowObjectCacheForNonMainWorld.IsEmpty()) {
1218 TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "BuildDOMTemplate");
1219 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isola te);
1220 configureShadowObjectTemplate(templ, isolate, currentWorldType);
1221 V8WindowShadowObjectCacheForNonMainWorld.Reset(isolate, templ);
1222 return templ;
1223 }
1224 return v8::Local<v8::ObjectTemplate>::New(isolate, V8WindowShadowObjectC acheForNonMainWorld);
1225 }
1226 }
1227
1228 {% endif %}
1229 {% endblock %}
1230
1231
1232 {##############################################################################}
1134 {% block wrap %} 1233 {% block wrap %}
1135 {% if special_wrap_for or is_document %} 1234 {% if special_wrap_for or is_document %}
1136 v8::Handle<v8::Object> wrap({{cpp_class}}* impl, v8::Handle<v8::Object> creation Context, v8::Isolate* isolate) 1235 v8::Handle<v8::Object> wrap({{cpp_class}}* impl, v8::Handle<v8::Object> creation Context, v8::Isolate* isolate)
1137 { 1236 {
1138 ASSERT(impl); 1237 ASSERT(impl);
1139 {% for special_wrap_interface in special_wrap_for %} 1238 {% for special_wrap_interface in special_wrap_for %}
1140 if (impl->is{{special_wrap_interface}}()) 1239 if (impl->is{{special_wrap_interface}}())
1141 return wrap(to{{special_wrap_interface}}(impl), creationContext, isolate ); 1240 return wrap(to{{special_wrap_interface}}(impl), creationContext, isolate );
1142 {% endfor %} 1241 {% endfor %}
1143 v8::Handle<v8::Object> wrapper = {{v8_class}}::createWrapper(impl, creationC ontext, isolate); 1242 v8::Handle<v8::Object> wrapper = {{v8_class}}::createWrapper(impl, creationC ontext, isolate);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1217 fromInternalPointer(object)->deref(); 1316 fromInternalPointer(object)->deref();
1218 } 1317 }
1219 1318
1220 template<> 1319 template<>
1221 v8::Handle<v8::Value> toV8NoInline({{cpp_class}}* impl, v8::Handle<v8::Object> c reationContext, v8::Isolate* isolate) 1320 v8::Handle<v8::Value> toV8NoInline({{cpp_class}}* impl, v8::Handle<v8::Object> c reationContext, v8::Isolate* isolate)
1222 { 1321 {
1223 return toV8(impl, creationContext, isolate); 1322 return toV8(impl, creationContext, isolate);
1224 } 1323 }
1225 1324
1226 {% endblock %} 1325 {% endblock %}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698