Index: bindings/scripts/v8_utilities.py |
diff --git a/bindings/scripts/v8_utilities.py b/bindings/scripts/v8_utilities.py |
index 80675951b52752a864be669d06c4a22e96f97df1..4a2b46a5d9587cd743faf5a0bca009a477833c60 100644 |
--- a/bindings/scripts/v8_utilities.py |
+++ b/bindings/scripts/v8_utilities.py |
@@ -28,14 +28,14 @@ |
"""Functions shared by various parts of the code generator. |
-Extends IdlType and IdlUnion type with |enum_validation_expression| property. |
+Extends IdlTypeBase type with |enum_validation_expression| property. |
Design doc: http://www.chromium.org/developers/design-documents/idl-compiler |
""" |
import re |
-from idl_types import IdlType, IdlUnionType |
+from idl_types import IdlTypeBase |
import idl_types |
from v8_globals import includes |
import v8_types |
@@ -60,7 +60,7 @@ ACRONYMS = [ |
def extended_attribute_value_contains(extended_attribute_value, value): |
return (extended_attribute_value and |
- value in re.split('[|&]', extended_attribute_value)) |
+ value in re.split('[|,]', extended_attribute_value)) |
def has_extended_attribute(definition_or_member, extended_attribute_list): |
@@ -74,6 +74,15 @@ def has_extended_attribute_value(definition_or_member, name, value): |
extended_attribute_value_contains(extended_attributes[name], value)) |
+def sorted_extended_attribute_set(definition_or_member, name): |
+ extended_attributes = definition_or_member.extended_attributes |
+ if name not in extended_attributes: |
+ return [] |
+ |
+ attribute_values = re.split('[|,]', extended_attributes[name]) |
+ return sorted(attribute_values) |
+ |
+ |
################################################################################ |
# String handling |
################################################################################ |
@@ -113,10 +122,12 @@ def enum_validation_expression(idl_type): |
return None |
return ' || '.join(['string == "%s"' % enum_value |
for enum_value in idl_type.enum_values]) |
-IdlType.enum_validation_expression = property(enum_validation_expression) |
+IdlTypeBase.enum_validation_expression = property(enum_validation_expression) |
def scoped_name(interface, definition, base_name): |
+ if 'ImplementedInPrivateScript' in definition.extended_attributes: |
+ return '%s::PrivateScript::%s' % (v8_class_name(interface), base_name) |
# partial interfaces are implemented as separate classes, with their members |
# implemented as static member functions |
partial_interface_implemented_as = definition.extended_attributes.get('PartialInterfaceImplementedAs') |
@@ -149,7 +160,7 @@ def activity_logging_world_list(member, access_type=''): |
if log_activity and not log_activity.startswith(access_type): |
return set() |
- includes.add('bindings/v8/V8DOMActivityLogger.h') |
+ includes.add('bindings/core/v8/V8DOMActivityLogger.h') |
if 'LogAllWorlds' in extended_attributes: |
return set(['', 'ForMainWorld']) |
return set(['']) # At minimum, include isolated worlds. |
@@ -201,15 +212,21 @@ def call_with_arguments(call_with_values): |
# [Conditional] |
+DELIMITER_TO_OPERATOR = { |
+ '|': '||', |
+ ',': '&&', |
+} |
+ |
+ |
def conditional_string(definition_or_member): |
extended_attributes = definition_or_member.extended_attributes |
if 'Conditional' not in extended_attributes: |
return None |
conditional = extended_attributes['Conditional'] |
- for operator in '&|': |
- if operator in conditional: |
- conditions = conditional.split(operator) |
- operator_separator = ' %s%s ' % (operator, operator) |
+ for delimiter in ',|': |
+ if delimiter in conditional: |
+ conditions = conditional.split(delimiter) |
+ operator_separator = ' %s ' % DELIMITER_TO_OPERATOR[delimiter] |
return operator_separator.join('ENABLE(%s)' % expression for expression in sorted(conditions)) |
return 'ENABLE(%s)' % conditional |
@@ -223,6 +240,48 @@ def deprecate_as(member): |
return extended_attributes['DeprecateAs'] |
+# [Exposed] |
+EXPOSED_EXECUTION_CONTEXT_METHOD = { |
+ 'DedicatedWorker': 'isDedicatedWorkerGlobalScope', |
+ 'ServiceWorker': 'isServiceWorkerGlobalScope', |
+ 'SharedWorker': 'isSharedWorkerGlobalScope', |
+ 'Window': 'isDocument', |
+ 'Worker': 'isWorkerGlobalScope', |
+} |
+ |
+ |
+def exposed(definition_or_member, interface): |
+ exposure_set = sorted_extended_attribute_set(definition_or_member, 'Exposed') |
+ if not exposure_set: |
+ return None |
+ |
+ interface_exposure_set = expanded_exposure_set_for_interface(interface) |
+ |
+ # Methods must not be exposed to a broader scope than their interface. |
+ if not set(exposure_set).issubset(interface_exposure_set): |
+ raise ValueError('Interface members\' exposure sets must be a subset of the interface\'s.') |
+ |
+ exposure_checks = [] |
+ for environment in exposure_set: |
+ # Methods must be exposed on one of the scopes known to Blink. |
+ if environment not in EXPOSED_EXECUTION_CONTEXT_METHOD: |
+ raise ValueError('Values for the [Exposed] annotation must reflect to a valid exposure scope.') |
+ |
+ exposure_checks.append('context->%s()' % EXPOSED_EXECUTION_CONTEXT_METHOD[environment]) |
+ |
+ return ' || '.join(exposure_checks) |
+ |
+ |
+def expanded_exposure_set_for_interface(interface): |
+ exposure_set = sorted_extended_attribute_set(interface, 'Exposed') |
+ |
+ # "Worker" is an aggregation for the different kinds of workers. |
+ if 'Worker' in exposure_set: |
+ exposure_set.extend(('DedicatedWorker', 'SharedWorker', 'ServiceWorker')) |
+ |
+ return sorted(set(exposure_set)) |
+ |
+ |
# [GarbageCollected], [WillBeGarbageCollected] |
def gc_type(definition): |
extended_attributes = definition.extended_attributes |