OLD | NEW |
---|---|
1 # Copyright (C) 2013 Google Inc. All rights reserved. | 1 # Copyright (C) 2013 Google Inc. All rights reserved. |
2 # coding=utf-8 | 2 # coding=utf-8 |
3 # | 3 # |
4 # Redistribution and use in source and binary forms, with or without | 4 # Redistribution and use in source and binary forms, with or without |
5 # modification, are permitted provided that the following conditions are | 5 # modification, are permitted provided that the following conditions are |
6 # met: | 6 # met: |
7 # | 7 # |
8 # * Redistributions of source code must retain the above copyright | 8 # * Redistributions of source code must retain the above copyright |
9 # notice, this list of conditions and the following disclaimer. | 9 # notice, this list of conditions and the following disclaimer. |
10 # * Redistributions in binary form must reproduce the above | 10 # * Redistributions in binary form must reproduce the above |
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
363 if has_conditional_attributes and interface.is_partial: | 363 if has_conditional_attributes and interface.is_partial: |
364 raise Exception('Conditional attributes between partial interfaces in mo dules and the original interfaces(%s) in core are not allowed.' % interface.name ) | 364 raise Exception('Conditional attributes between partial interfaces in mo dules and the original interfaces(%s) in core are not allowed.' % interface.name ) |
365 | 365 |
366 context.update({ | 366 context.update({ |
367 'attributes': attributes, | 367 'attributes': attributes, |
368 }) | 368 }) |
369 | 369 |
370 # Methods | 370 # Methods |
371 methods, iterator_method = methods_context(interface) | 371 methods, iterator_method = methods_context(interface) |
372 context.update({ | 372 context.update({ |
373 'has_origin_safe_method_setter': is_global and any( | |
374 method['is_check_security_for_receiver'] and not method['is_unforgea ble'] | |
375 for method in methods), | |
376 'has_private_script': (any(attribute['is_implemented_in_private_script'] for attribute in attributes) or | 373 'has_private_script': (any(attribute['is_implemented_in_private_script'] for attribute in attributes) or |
377 any(method['is_implemented_in_private_script'] fo r method in methods)), | 374 any(method['is_implemented_in_private_script'] fo r method in methods)), |
378 'iterator_method': iterator_method, | 375 'iterator_method': iterator_method, |
379 'methods': methods, | 376 'methods': methods, |
380 }) | 377 }) |
381 | 378 |
382 # Window.idl in Blink has indexed properties, but the spec says Window | 379 # Window.idl in Blink has indexed properties, but the spec says Window |
383 # interface doesn't have indexed properties, instead the WindowProxy exotic | 380 # interface doesn't have indexed properties, instead the WindowProxy exotic |
384 # object has indexed properties. Thus, Window interface must not support | 381 # object has indexed properties. Thus, Window interface must not support |
385 # iterators. | 382 # iterators. |
(...skipping 23 matching lines...) Expand all Loading... | |
409 'named_property_deleter': property_deleter(interface.named_property_dele ter), | 406 'named_property_deleter': property_deleter(interface.named_property_dele ter), |
410 }) | 407 }) |
411 context.update({ | 408 context.update({ |
412 'has_named_properties_object': is_global and context['named_property_get ter'], | 409 'has_named_properties_object': is_global and context['named_property_get ter'], |
413 }) | 410 }) |
414 | 411 |
415 # Origin Trials | 412 # Origin Trials |
416 context.update({ | 413 context.update({ |
417 'origin_trial_features': origin_trial_features(interface, context['const ants'], context['attributes'], context['methods']), | 414 'origin_trial_features': origin_trial_features(interface, context['const ants'], context['attributes'], context['methods']), |
418 }) | 415 }) |
416 | |
417 # Cross-origin interceptors | |
418 has_cross_origin_named_getter = False | |
419 has_cross_origin_named_setter = False | |
420 has_cross_origin_indexed_getter = False | |
haraken
2016/11/02 04:30:32
What about an indexed setter?
dcheng
2016/11/02 07:45:32
There are no cross-origin indexed setters. We can
Yuki
2016/11/02 08:26:39
I'm happy with raising an exception in the binding
dcheng
2016/11/03 07:44:45
I updated the bindings generator to raise exceptio
| |
421 | |
422 for attribute in attributes: | |
423 if attribute['has_cross_origin_getter']: | |
424 has_cross_origin_named_getter = True | |
425 elif attribute['has_cross_origin_setter']: | |
426 has_cross_origin_named_setter = True | |
427 | |
428 for method in methods: | |
429 if method['is_cross_origin']: | |
430 has_cross_origin_named_getter = True | |
haraken
2016/11/02 04:30:32
Why do we treat cross-origin methods as named gett
dcheng
2016/11/02 07:45:32
Added a comment.
| |
431 | |
432 if context['named_property_getter'] and context['named_property_getter']['is _cross_origin']: | |
433 has_cross_origin_named_getter = True | |
434 | |
435 if context['indexed_property_getter'] and context['indexed_property_getter'] ['is_cross_origin']: | |
436 has_cross_origin_indexed_getter = True | |
437 | |
438 context.update({ | |
439 'has_cross_origin_named_getter': has_cross_origin_named_getter, | |
440 'has_cross_origin_named_setter': has_cross_origin_named_setter, | |
441 'has_cross_origin_indexed_getter': has_cross_origin_indexed_getter, | |
442 }) | |
443 | |
419 return context | 444 return context |
420 | 445 |
421 | 446 |
422 def methods_context(interface): | 447 def methods_context(interface): |
423 """Creates a list of Jinja template contexts for methods of an interface. | 448 """Creates a list of Jinja template contexts for methods of an interface. |
424 | 449 |
425 Args: | 450 Args: |
426 interface: An interface to create contexts for | 451 interface: An interface to create contexts for |
427 | 452 |
428 Returns: | 453 Returns: |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
784 if method.get('runtime_enabled_function')) | 809 if method.get('runtime_enabled_function')) |
785 if not runtime_enabled_functions: | 810 if not runtime_enabled_functions: |
786 # This "length" is unconditionally enabled, so stop here. | 811 # This "length" is unconditionally enabled, so stop here. |
787 runtime_determined_maxargs.append((length, [None])) | 812 runtime_determined_maxargs.append((length, [None])) |
788 break | 813 break |
789 runtime_determined_maxargs.append( | 814 runtime_determined_maxargs.append( |
790 (length, sorted(runtime_enabled_functions))) | 815 (length, sorted(runtime_enabled_functions))) |
791 maxarg = ('%sV8Internal::%sMethodMaxArg()' | 816 maxarg = ('%sV8Internal::%sMethodMaxArg()' |
792 % (cpp_name_or_partial(interface), name)) | 817 % (cpp_name_or_partial(interface), name)) |
793 | 818 |
794 # Check and fail if overloads disagree on any of the extended attributes | |
795 # that affect how the method should be registered. | |
796 # Skip the check for overloaded constructors, since they don't support any | |
797 # of the extended attributes in question. | |
798 if not overloads[0].get('is_constructor'): | |
799 overload_extended_attributes = [ | |
800 method['custom_registration_extended_attributes'] | |
801 for method in overloads] | |
802 for extended_attribute in v8_methods.CUSTOM_REGISTRATION_EXTENDED_ATTRIB UTES: | |
803 if common_key(overload_extended_attributes, extended_attribute) is N one: | |
804 raise ValueError('Overloads of %s have conflicting extended attr ibute %s' | |
805 % (name, extended_attribute)) | |
806 | |
807 # Check and fail if overloads disagree about whether the return type | 819 # Check and fail if overloads disagree about whether the return type |
808 # is a Promise or not. | 820 # is a Promise or not. |
809 promise_overload_count = sum(1 for method in overloads if method.get('return s_promise')) | 821 promise_overload_count = sum(1 for method in overloads if method.get('return s_promise')) |
810 if promise_overload_count not in (0, len(overloads)): | 822 if promise_overload_count not in (0, len(overloads)): |
811 raise ValueError('Overloads of %s have conflicting Promise/non-Promise t ypes' | 823 raise ValueError('Overloads of %s have conflicting Promise/non-Promise t ypes' |
812 % (name)) | 824 % (name)) |
813 | 825 |
814 has_overload_visible = False | 826 has_overload_visible = False |
815 has_overload_not_visible = False | 827 has_overload_not_visible = False |
816 for overload in overloads: | 828 for overload in overloads: |
817 if overload.get('visible', True): | 829 if overload.get('visible', True): |
818 # If there exists an overload which is visible, need to generate | 830 # If there exists an overload which is visible, need to generate |
819 # overload_resolution, i.e. overlods_visible should be True. | 831 # overload_resolution, i.e. overlods_visible should be True. |
820 has_overload_visible = True | 832 has_overload_visible = True |
821 else: | 833 else: |
822 has_overload_not_visible = True | 834 has_overload_not_visible = True |
823 | 835 |
824 # If some overloads are not visible and others are visible, | 836 # If some overloads are not visible and others are visible, |
825 # the method is overloaded between core and modules. | 837 # the method is overloaded between core and modules. |
826 has_partial_overloads = has_overload_visible and has_overload_not_visible | 838 has_partial_overloads = has_overload_visible and has_overload_not_visible |
827 | 839 |
828 return { | 840 return { |
829 'deprecate_all_as': common_value(overloads, 'deprecate_as'), # [Depreca teAs] | 841 'deprecate_all_as': common_value(overloads, 'deprecate_as'), # [Depreca teAs] |
830 'exposed_test_all': common_value(overloads, 'exposed_test'), # [Exposed ] | 842 'exposed_test_all': common_value(overloads, 'exposed_test'), # [Exposed ] |
831 'has_custom_registration_all': common_value(overloads, 'has_custom_regis tration'), | |
832 'length': function_length, | 843 'length': function_length, |
833 'length_tests_methods': length_tests_methods(effective_overloads_by_leng th), | 844 'length_tests_methods': length_tests_methods(effective_overloads_by_leng th), |
834 # 1. Let maxarg be the length of the longest type list of the | 845 # 1. Let maxarg be the length of the longest type list of the |
835 # entries in S. | 846 # entries in S. |
836 'maxarg': maxarg, | 847 'maxarg': maxarg, |
837 'measure_all_as': common_value(overloads, 'measure_as'), # [MeasureAs] | 848 'measure_all_as': common_value(overloads, 'measure_as'), # [MeasureAs] |
838 'returns_promise_all': promise_overload_count > 0, | 849 'returns_promise_all': promise_overload_count > 0, |
839 'runtime_determined_lengths': runtime_determined_lengths, | 850 'runtime_determined_lengths': runtime_determined_lengths, |
840 'runtime_determined_maxargs': runtime_determined_maxargs, | 851 'runtime_determined_maxargs': runtime_determined_maxargs, |
841 'runtime_enabled_function_all': common_value(overloads, 'runtime_enabled _function'), # [RuntimeEnabled] | 852 'runtime_enabled_function_all': common_value(overloads, 'runtime_enabled _function'), # [RuntimeEnabled] |
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1385 if is_raises_exception: | 1396 if is_raises_exception: |
1386 cpp_arguments.append('exceptionState') | 1397 cpp_arguments.append('exceptionState') |
1387 if use_output_parameter_for_result: | 1398 if use_output_parameter_for_result: |
1388 cpp_arguments.append('result') | 1399 cpp_arguments.append('result') |
1389 | 1400 |
1390 cpp_value = '%s(%s)' % (cpp_method_name, ', '.join(cpp_arguments)) | 1401 cpp_value = '%s(%s)' % (cpp_method_name, ', '.join(cpp_arguments)) |
1391 | 1402 |
1392 return { | 1403 return { |
1393 'cpp_type': idl_type.cpp_type, | 1404 'cpp_type': idl_type.cpp_type, |
1394 'cpp_value': cpp_value, | 1405 'cpp_value': cpp_value, |
1395 'do_not_check_security': 'DoNotCheckSecurity' in extended_attributes, | |
1396 'is_call_with_script_state': is_call_with_script_state, | 1406 'is_call_with_script_state': is_call_with_script_state, |
1407 'is_cross_origin': 'CrossOrigin' in extended_attributes, | |
1397 'is_custom': | 1408 'is_custom': |
1398 'Custom' in extended_attributes and | 1409 'Custom' in extended_attributes and |
1399 (not extended_attributes['Custom'] or | 1410 (not extended_attributes['Custom'] or |
1400 has_extended_attribute_value(getter, 'Custom', 'PropertyGetter')), | 1411 has_extended_attribute_value(getter, 'Custom', 'PropertyGetter')), |
1401 'is_custom_property_enumerator': has_extended_attribute_value( | 1412 'is_custom_property_enumerator': has_extended_attribute_value( |
1402 getter, 'Custom', 'PropertyEnumerator'), | 1413 getter, 'Custom', 'PropertyEnumerator'), |
1403 'is_custom_property_query': has_extended_attribute_value( | 1414 'is_custom_property_query': has_extended_attribute_value( |
1404 getter, 'Custom', 'PropertyQuery'), | 1415 getter, 'Custom', 'PropertyQuery'), |
1405 'is_enumerable': 'NotEnumerable' not in extended_attributes, | 1416 'is_enumerable': 'NotEnumerable' not in extended_attributes, |
1406 'is_null_expression': is_null_expression(idl_type), | 1417 'is_null_expression': is_null_expression(idl_type), |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1450 extended_attributes = deleter.extended_attributes | 1461 extended_attributes = deleter.extended_attributes |
1451 is_call_with_script_state = v8_utilities.has_extended_attribute_value(delete r, 'CallWith', 'ScriptState') | 1462 is_call_with_script_state = v8_utilities.has_extended_attribute_value(delete r, 'CallWith', 'ScriptState') |
1452 is_ce_reactions = 'CEReactions' in extended_attributes | 1463 is_ce_reactions = 'CEReactions' in extended_attributes |
1453 return { | 1464 return { |
1454 'is_call_with_script_state': is_call_with_script_state, | 1465 'is_call_with_script_state': is_call_with_script_state, |
1455 'is_ce_reactions': is_ce_reactions, | 1466 'is_ce_reactions': is_ce_reactions, |
1456 'is_custom': 'Custom' in extended_attributes, | 1467 'is_custom': 'Custom' in extended_attributes, |
1457 'is_raises_exception': 'RaisesException' in extended_attributes, | 1468 'is_raises_exception': 'RaisesException' in extended_attributes, |
1458 'name': cpp_name(deleter), | 1469 'name': cpp_name(deleter), |
1459 } | 1470 } |
OLD | NEW |