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

Side by Side Diff: third_party/WebKit/Source/bindings/scripts/v8_interface.py

Issue 1531443003: [bindings] Implement an ExperimentEnabled IDL extended attribute. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years 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
OLDNEW
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 30 matching lines...) Expand all
41 import idl_types 41 import idl_types
42 from idl_types import IdlType, inherits_interface 42 from idl_types import IdlType, inherits_interface
43 import v8_attributes 43 import v8_attributes
44 from v8_globals import includes 44 from v8_globals import includes
45 import v8_methods 45 import v8_methods
46 import v8_types 46 import v8_types
47 from v8_types import cpp_ptr_type, cpp_template_type 47 from v8_types import cpp_ptr_type, cpp_template_type
48 import v8_utilities 48 import v8_utilities
49 from v8_utilities import (cpp_name_or_partial, capitalize, conditional_string, c pp_name, gc_type, 49 from v8_utilities import (cpp_name_or_partial, capitalize, conditional_string, c pp_name, gc_type,
50 has_extended_attribute_value, runtime_enabled_function _name, 50 has_extended_attribute_value, runtime_enabled_function _name,
51 extended_attribute_value_as_list, is_legacy_interface_ type_checking) 51 extended_attribute_value_as_list, is_legacy_interface_ type_checking,
52 experimental_api_name)
52 53
53 54
54 INTERFACE_H_INCLUDES = frozenset([ 55 INTERFACE_H_INCLUDES = frozenset([
55 'bindings/core/v8/ScriptWrappable.h', 56 'bindings/core/v8/ScriptWrappable.h',
56 'bindings/core/v8/ToV8.h', 57 'bindings/core/v8/ToV8.h',
57 'bindings/core/v8/V8Binding.h', 58 'bindings/core/v8/V8Binding.h',
58 'bindings/core/v8/V8DOMWrapper.h', 59 'bindings/core/v8/V8DOMWrapper.h',
59 'bindings/core/v8/WrapperTypeInfo.h', 60 'bindings/core/v8/WrapperTypeInfo.h',
60 'platform/heap/Handle.h', 61 'platform/heap/Handle.h',
61 ]) 62 ])
62 INTERFACE_CPP_INCLUDES = frozenset([ 63 INTERFACE_CPP_INCLUDES = frozenset([
63 'bindings/core/v8/ExceptionState.h', 64 'bindings/core/v8/ExceptionState.h',
64 'bindings/core/v8/V8DOMConfiguration.h', 65 'bindings/core/v8/V8DOMConfiguration.h',
65 'bindings/core/v8/V8ObjectConstructor.h', 66 'bindings/core/v8/V8ObjectConstructor.h',
66 'core/dom/ContextFeatures.h', 67 'core/dom/ContextFeatures.h',
67 'core/dom/Document.h', 68 'core/dom/Document.h',
69 'core/experiments/Experiments.h',
haraken 2015/12/16 02:16:41 I feel that "Experiments" sounds a bit too general
Daniel Nishi 2015/12/16 21:42:02 core/experiments/* is already landed by a differen
68 'platform/RuntimeEnabledFeatures.h', 70 'platform/RuntimeEnabledFeatures.h',
69 'platform/TraceEvent.h', 71 'platform/TraceEvent.h',
70 'wtf/GetPtr.h', 72 'wtf/GetPtr.h',
71 'wtf/RefPtr.h', 73 'wtf/RefPtr.h',
72 ]) 74 ])
73 75
74 76
75 def interface_context(interface): 77 def interface_context(interface):
76 includes.clear() 78 includes.clear()
77 includes.update(INTERFACE_CPP_INCLUDES) 79 includes.update(INTERFACE_CPP_INCLUDES)
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 v8_class_name = v8_utilities.v8_class_name(interface) 162 v8_class_name = v8_utilities.v8_class_name(interface)
161 cpp_class_name = cpp_name(interface) 163 cpp_class_name = cpp_name(interface)
162 cpp_class_name_or_partial = cpp_name_or_partial(interface) 164 cpp_class_name_or_partial = cpp_name_or_partial(interface)
163 v8_class_name_or_partial = v8_utilities.v8_class_name_or_partial(interface) 165 v8_class_name_or_partial = v8_utilities.v8_class_name_or_partial(interface)
164 166
165 context = { 167 context = {
166 'conditional_string': conditional_string(interface), # [Conditional] 168 'conditional_string': conditional_string(interface), # [Conditional]
167 'cpp_class': cpp_class_name, 169 'cpp_class': cpp_class_name,
168 'cpp_class_or_partial': cpp_class_name_or_partial, 170 'cpp_class_or_partial': cpp_class_name_or_partial,
169 'event_target_inheritance': 'InheritFromEventTarget' if is_event_target else 'NotInheritFromEventTarget', 171 'event_target_inheritance': 'InheritFromEventTarget' if is_event_target else 'NotInheritFromEventTarget',
172 'experimental_api_name': v8_utilities.experimental_api_name(interface),
170 'gc_type': this_gc_type, 173 'gc_type': this_gc_type,
171 # FIXME: Remove 'EventTarget' special handling, http://crbug.com/383699 174 # FIXME: Remove 'EventTarget' special handling, http://crbug.com/383699
172 'has_access_check_callbacks': (is_check_security and 175 'has_access_check_callbacks': (is_check_security and
173 interface.name != 'Window' and 176 interface.name != 'Window' and
174 interface.name != 'EventTarget'), 177 interface.name != 'EventTarget'),
175 'has_custom_legacy_call_as_function': has_extended_attribute_value(inter face, 'Custom', 'LegacyCallAsFunction'), # [Custom=LegacyCallAsFunction] 178 'has_custom_legacy_call_as_function': has_extended_attribute_value(inter face, 'Custom', 'LegacyCallAsFunction'), # [Custom=LegacyCallAsFunction]
176 'has_partial_interface': len(interface.partial_interfaces) > 0, 179 'has_partial_interface': len(interface.partial_interfaces) > 0,
177 'has_visit_dom_wrapper': has_visit_dom_wrapper, 180 'has_visit_dom_wrapper': has_visit_dom_wrapper,
178 'header_includes': header_includes, 181 'header_includes': header_includes,
179 'interface_name': interface.name, 182 'interface_name': interface.name,
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 includes.add('bindings/core/v8/V8ObjectConstructor.h') 235 includes.add('bindings/core/v8/V8ObjectConstructor.h')
233 includes.add('core/frame/LocalDOMWindow.h') 236 includes.add('core/frame/LocalDOMWindow.h')
234 elif 'Measure' in extended_attributes or 'MeasureAs' in extended_attributes: 237 elif 'Measure' in extended_attributes or 'MeasureAs' in extended_attributes:
235 raise Exception('[Measure] or [MeasureAs] specified for interface withou t a constructor: ' 238 raise Exception('[Measure] or [MeasureAs] specified for interface withou t a constructor: '
236 '%s' % interface.name) 239 '%s' % interface.name)
237 240
238 # [Unscopeable] attributes and methods 241 # [Unscopeable] attributes and methods
239 unscopeables = [] 242 unscopeables = []
240 for attribute in interface.attributes: 243 for attribute in interface.attributes:
241 if 'Unscopeable' in attribute.extended_attributes: 244 if 'Unscopeable' in attribute.extended_attributes:
242 unscopeables.append((attribute.name, v8_utilities.runtime_enabled_fu nction_name(attribute))) 245 unscopeables.append((attribute.name, v8_utilities.runtime_enabled_fu nction_name(attribute), v8_utilities.experimental_api_name(attribute)))
243 for method in interface.operations: 246 for method in interface.operations:
244 if 'Unscopeable' in method.extended_attributes: 247 if 'Unscopeable' in method.extended_attributes:
245 unscopeables.append((method.name, v8_utilities.runtime_enabled_funct ion_name(method))) 248 unscopeables.append((method.name, v8_utilities.runtime_enabled_funct ion_name(method), v8_utilities.experimental_api_name(method)))
246 249
247 context.update({ 250 context.update({
248 'constructors': constructors, 251 'constructors': constructors,
249 'has_custom_constructor': bool(custom_constructors), 252 'has_custom_constructor': bool(custom_constructors),
250 'interface_length': 253 'interface_length':
251 interface_length(interface, constructors + custom_constructors), 254 interface_length(interface, constructors + custom_constructors),
252 'is_constructor_raises_exception': extended_attributes.get('RaisesExcept ion') == 'Constructor', # [RaisesException=Constructor] 255 'is_constructor_raises_exception': extended_attributes.get('RaisesExcept ion') == 'Constructor', # [RaisesException=Constructor]
253 'named_constructor': named_constructor, 256 'named_constructor': named_constructor,
254 'unscopeables': sorted(unscopeables), 257 'unscopeables': sorted(unscopeables),
255 }) 258 })
256 259
257 constants = [constant_context(constant, interface) for constant in interface .constants] 260 constants = [constant_context(constant, interface) for constant in interface .constants]
258 261
259 special_getter_constants = [] 262 special_getter_constants = []
260 runtime_enabled_constants = dict() 263 runtime_enabled_constants = dict()
264 experimental_enabled_constants = dict()
265 experimental_only_enabled_constants = []
261 constant_configuration_constants = [] 266 constant_configuration_constants = []
262 267
263 for constant in constants: 268 for constant in constants:
269 experimental_api_name = constant['experimental_api_name']
264 if constant['measure_as'] or constant['deprecate_as']: 270 if constant['measure_as'] or constant['deprecate_as']:
265 special_getter_constants.append(constant) 271 special_getter_constants.append(constant)
266 continue 272 continue
267 runtime_enabled_function = constant['runtime_enabled_function'] 273 runtime_enabled_function = constant['runtime_enabled_function']
268 if runtime_enabled_function: 274 if runtime_enabled_function:
269 if runtime_enabled_function not in runtime_enabled_constants: 275 if runtime_enabled_function not in runtime_enabled_constants:
270 runtime_enabled_constants[runtime_enabled_function] = [] 276 runtime_enabled_constants[runtime_enabled_function] = []
271 runtime_enabled_constants[runtime_enabled_function].append(constant) 277 runtime_enabled_constants[runtime_enabled_function].append(constant)
278 if experimental_api_name:
279 experimental_enabled_constants[constant['name']] = experimental_ api_name
280 continue
281 if experimental_api_name:
282 experimental_only_enabled_constants.append(constant)
272 continue 283 continue
273 constant_configuration_constants.append(constant) 284 constant_configuration_constants.append(constant)
274 285
275 # Constants 286 # Constants
276 context.update({ 287 context.update({
277 'constant_configuration_constants': constant_configuration_constants, 288 'constant_configuration_constants': constant_configuration_constants,
278 'constants': constants, 289 'constants': constants,
279 'do_not_check_constants': 'DoNotCheckConstants' in extended_attributes, 290 'do_not_check_constants': 'DoNotCheckConstants' in extended_attributes,
291 'experimental_enabled_constants': experimental_enabled_constants,
292 'experimental_only_constants': experimental_only_enabled_constants,
280 'has_constant_configuration': any( 293 'has_constant_configuration': any(
281 not constant['runtime_enabled_function'] 294 (constant['runtime_enabled_function'] is None and constant['experime ntal_api_name'] is None)
282 for constant in constants), 295 for constant in constants),
283 'runtime_enabled_constants': sorted(runtime_enabled_constants.iteritems( )), 296 'runtime_enabled_constants': sorted(runtime_enabled_constants.iteritems( )),
284 'special_getter_constants': special_getter_constants, 297 'special_getter_constants': special_getter_constants,
285 }) 298 })
286 299
287 # Attributes 300 # Attributes
288 attributes = [v8_attributes.attribute_context(interface, attribute) 301 attributes = [v8_attributes.attribute_context(interface, attribute)
289 for attribute in interface.attributes] 302 for attribute in interface.attributes]
290 303
291 has_conditional_attributes = any(attribute['exposed_test'] for attribute in attributes) 304 has_conditional_attributes = any(attribute['exposed_test'] for attribute in attributes)
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 529
517 if 'overloads' in method: 530 if 'overloads' in method:
518 overloads = method['overloads'] 531 overloads = method['overloads']
519 if not overloads['visible']: 532 if not overloads['visible']:
520 continue 533 continue
521 # original interface will register instead of partial interface. 534 # original interface will register instead of partial interface.
522 if overloads['has_partial_overloads'] and interface.is_partial: 535 if overloads['has_partial_overloads'] and interface.is_partial:
523 continue 536 continue
524 conditionally_exposed_function = overloads['exposed_test_all'] 537 conditionally_exposed_function = overloads['exposed_test_all']
525 runtime_enabled_function = overloads['runtime_enabled_function_all'] 538 runtime_enabled_function = overloads['runtime_enabled_function_all']
539 experimental_api_name = overloads['experimental_api_name_all']
526 has_custom_registration = (overloads['has_custom_registration_all'] or 540 has_custom_registration = (overloads['has_custom_registration_all'] or
527 overloads['runtime_determined_lengths']) 541 overloads['runtime_determined_lengths'])
528 else: 542 else:
529 if not method['visible']: 543 if not method['visible']:
530 continue 544 continue
531 conditionally_exposed_function = method['exposed_test'] 545 conditionally_exposed_function = method['exposed_test']
532 runtime_enabled_function = method['runtime_enabled_function'] 546 runtime_enabled_function = method['runtime_enabled_function']
547 experimental_api_name = method['experimental_api_name']
533 has_custom_registration = method['has_custom_registration'] 548 has_custom_registration = method['has_custom_registration']
534 549
535 if has_custom_registration: 550 if has_custom_registration:
536 custom_registration_methods.append(method) 551 custom_registration_methods.append(method)
537 continue 552 continue
538 if conditionally_exposed_function: 553 if conditionally_exposed_function:
539 conditionally_enabled_methods.append(method) 554 conditionally_enabled_methods.append(method)
540 continue 555 continue
541 if runtime_enabled_function: 556 if runtime_enabled_function:
542 custom_registration_methods.append(method) 557 custom_registration_methods.append(method)
543 continue 558 continue
559 if experimental_api_name:
560 custom_registration_methods.append(method)
561 continue
544 if method['should_be_exposed_to_script']: 562 if method['should_be_exposed_to_script']:
545 method_configuration_methods.append(method) 563 method_configuration_methods.append(method)
546 564
547 for method in methods: 565 for method in methods:
548 # The value of the Function object’s “length” property is a Number 566 # The value of the Function object’s “length” property is a Number
549 # determined as follows: 567 # determined as follows:
550 # 1. Let S be the effective overload set for regular operations (if the 568 # 1. Let S be the effective overload set for regular operations (if the
551 # operation is a regular operation) or for static operations (if the 569 # operation is a regular operation) or for static operations (if the
552 # operation is a static operation) with identifier id on interface I and 570 # operation is a static operation) with identifier id on interface I and
553 # with argument count 0. 571 # with argument count 0.
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 extended_attributes = constant.extended_attributes 626 extended_attributes = constant.extended_attributes
609 return { 627 return {
610 'cpp_class': extended_attributes.get('PartialInterfaceImplementedAs'), 628 'cpp_class': extended_attributes.get('PartialInterfaceImplementedAs'),
611 'deprecate_as': v8_utilities.deprecate_as(constant), # [DeprecateAs] 629 'deprecate_as': v8_utilities.deprecate_as(constant), # [DeprecateAs]
612 'idl_type': constant.idl_type.name, 630 'idl_type': constant.idl_type.name,
613 'measure_as': v8_utilities.measure_as(constant, interface), # [MeasureA s] 631 'measure_as': v8_utilities.measure_as(constant, interface), # [MeasureA s]
614 'name': constant.name, 632 'name': constant.name,
615 # FIXME: use 'reflected_name' as correct 'name' 633 # FIXME: use 'reflected_name' as correct 'name'
616 'reflected_name': extended_attributes.get('Reflect', constant.name), 634 'reflected_name': extended_attributes.get('Reflect', constant.name),
617 'runtime_enabled_function': runtime_enabled_function_name(constant), 635 'runtime_enabled_function': runtime_enabled_function_name(constant),
636 'experimental_api_name': extended_attributes.get('ExperimentEnabled'),
618 'value': constant.value, 637 'value': constant.value,
619 } 638 }
620 639
621 640
622 ################################################################################ 641 ################################################################################
623 # Overloads 642 # Overloads
624 ################################################################################ 643 ################################################################################
625 644
626 def compute_method_overloads_context(interface, methods): 645 def compute_method_overloads_context(interface, methods):
627 # Regular methods 646 # Regular methods
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 has_overload_not_visible = True 781 has_overload_not_visible = True
763 782
764 # If some overloads are not visible and others are visible, 783 # If some overloads are not visible and others are visible,
765 # the method is overloaded between core and modules. 784 # the method is overloaded between core and modules.
766 has_partial_overloads = has_overload_visible and has_overload_not_visible 785 has_partial_overloads = has_overload_visible and has_overload_not_visible
767 786
768 return { 787 return {
769 'deprecate_all_as': common_value(overloads, 'deprecate_as'), # [Depreca teAs] 788 'deprecate_all_as': common_value(overloads, 'deprecate_as'), # [Depreca teAs]
770 'exposed_test_all': common_value(overloads, 'exposed_test'), # [Exposed ] 789 'exposed_test_all': common_value(overloads, 'exposed_test'), # [Exposed ]
771 'has_custom_registration_all': common_value(overloads, 'has_custom_regis tration'), 790 'has_custom_registration_all': common_value(overloads, 'has_custom_regis tration'),
791 'experimental_api_name_all': common_value(overloads, 'experimental_api_n ame'), # [ExperimentEnabled]
772 'length': function_length, 792 'length': function_length,
773 'length_tests_methods': length_tests_methods(effective_overloads_by_leng th), 793 'length_tests_methods': length_tests_methods(effective_overloads_by_leng th),
774 # 1. Let maxarg be the length of the longest type list of the 794 # 1. Let maxarg be the length of the longest type list of the
775 # entries in S. 795 # entries in S.
776 'maxarg': maxarg, 796 'maxarg': maxarg,
777 'measure_all_as': common_value(overloads, 'measure_as'), # [MeasureAs] 797 'measure_all_as': common_value(overloads, 'measure_as'), # [MeasureAs]
778 'returns_promise_all': promise_overload_count > 0, 798 'returns_promise_all': promise_overload_count > 0,
779 'runtime_determined_lengths': runtime_determined_lengths, 799 'runtime_determined_lengths': runtime_determined_lengths,
780 'runtime_determined_maxargs': runtime_determined_maxargs, 800 'runtime_determined_maxargs': runtime_determined_maxargs,
781 'runtime_enabled_function_all': common_value(overloads, 'runtime_enabled _function'), # [RuntimeEnabled] 801 'runtime_enabled_function_all': common_value(overloads, 'runtime_enabled _function'), # [RuntimeEnabled]
(...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after
1385 1405
1386 extended_attributes = deleter.extended_attributes 1406 extended_attributes = deleter.extended_attributes
1387 idl_type = deleter.idl_type 1407 idl_type = deleter.idl_type
1388 is_call_with_script_state = v8_utilities.has_extended_attribute_value(delete r, 'CallWith', 'ScriptState') 1408 is_call_with_script_state = v8_utilities.has_extended_attribute_value(delete r, 'CallWith', 'ScriptState')
1389 return { 1409 return {
1390 'is_call_with_script_state': is_call_with_script_state, 1410 'is_call_with_script_state': is_call_with_script_state,
1391 'is_custom': 'Custom' in extended_attributes, 1411 'is_custom': 'Custom' in extended_attributes,
1392 'is_raises_exception': 'RaisesException' in extended_attributes, 1412 'is_raises_exception': 'RaisesException' in extended_attributes,
1393 'name': cpp_name(deleter), 1413 'name': cpp_name(deleter),
1394 } 1414 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698