| Index: third_party/WebKit/Source/build/scripts/make_computed_style_base.py
 | 
| diff --git a/third_party/WebKit/Source/build/scripts/make_computed_style_base.py b/third_party/WebKit/Source/build/scripts/make_computed_style_base.py
 | 
| index dd1dd2867930463b507693a7df43bfef1ed14867..f9773d2f7537984066a4d669f817979c83cb2518 100755
 | 
| --- a/third_party/WebKit/Source/build/scripts/make_computed_style_base.py
 | 
| +++ b/third_party/WebKit/Source/build/scripts/make_computed_style_base.py
 | 
| @@ -73,6 +73,10 @@ class Group(object):
 | 
|          # Recursively get all the fields in the subgroups as well
 | 
|          self.all_fields = _flatten_list(subgroup.all_fields for subgroup in subgroups) + fields
 | 
|  
 | 
| +        # Link group
 | 
| +        for field in fields:
 | 
| +            field.group = self
 | 
| +
 | 
|  
 | 
|  class DiffGroup(object):
 | 
|      """Represents a group of expressions and subgroups that need to be diffed
 | 
| @@ -85,6 +89,7 @@ class DiffGroup(object):
 | 
|      def __init__(self, group_name):
 | 
|          self.group_name = group_name
 | 
|          self.subgroups = []
 | 
| +        self.fields = []
 | 
|          self.expressions = []
 | 
|          self.predicates = []
 | 
|  
 | 
| @@ -114,13 +119,12 @@ class Field(object):
 | 
|          wrapper_pointer_name: Name of the pointer type that wraps this field (e.g. RefPtr).
 | 
|          field_template: Determines the interface generated for the field. Can be one of:
 | 
|             keyword, flag, or monotonic_flag.
 | 
| -        field_group: The name of the group that this field is inside.
 | 
|          size: Number of bits needed for storage.
 | 
|          default_value: Default value for this field when it is first initialized.
 | 
|      """
 | 
|  
 | 
|      def __init__(self, field_role, name_for_methods, property_name, type_name, wrapper_pointer_name,
 | 
| -                 field_template, field_group, size, default_value, custom_copy, custom_compare,
 | 
| +                 field_template, size, default_value, custom_copy, custom_compare,
 | 
|                   getter_method_name, setter_method_name, initial_method_name, **kwargs):
 | 
|          """Creates a new field."""
 | 
|          self.name = class_member_name(name_for_methods)
 | 
| @@ -129,12 +133,11 @@ class Field(object):
 | 
|          self.wrapper_pointer_name = wrapper_pointer_name
 | 
|          self.alignment_type = self.wrapper_pointer_name or self.type_name
 | 
|          self.field_template = field_template
 | 
| -        self.group_name = field_group
 | 
| -        self.group_member_name = class_member_name(join_name(field_group, 'data')) if field_group else None
 | 
|          self.size = size
 | 
|          self.default_value = default_value
 | 
|          self.custom_copy = custom_copy
 | 
|          self.custom_compare = custom_compare
 | 
| +        self.group = None
 | 
|  
 | 
|          # Field role: one of these must be true
 | 
|          self.is_property = field_role == 'property'
 | 
| @@ -158,10 +161,6 @@ class Field(object):
 | 
|          self.internal_setter_method_name = method_name(join_name(setter_method_name, 'Internal'))
 | 
|          self.initial_method_name = initial_method_name
 | 
|          self.resetter_method_name = method_name(join_name('Reset', name_for_methods))
 | 
| -        if self.group_name:
 | 
| -            self.getter_expression = self.group_member_name + '->' + class_member_name(self.name)
 | 
| -        else:
 | 
| -            self.getter_expression = class_member_name(self.name)
 | 
|  
 | 
|          # If the size of the field is not None, it means it is a bit field
 | 
|          self.is_bit_field = self.size is not None
 | 
| @@ -179,11 +178,11 @@ def _get_include_paths(properties):
 | 
|      return list(sorted(include_paths))
 | 
|  
 | 
|  
 | 
| -def _group_fields(fields):
 | 
| +def _create_groups(properties):
 | 
|      """Groups a list of fields by their group_name and returns the root group."""
 | 
|      groups = defaultdict(list)
 | 
| -    for field in fields:
 | 
| -        groups[field.group_name].append(field)
 | 
| +    for property_ in properties:
 | 
| +        groups[property_['field_group']].extend(_create_fields(property_))
 | 
|  
 | 
|      no_group = groups.pop(None)
 | 
|      subgroups = [Group(group_name, [], _reorder_fields(fields)) for group_name, fields in groups.items()]
 | 
| @@ -214,7 +213,7 @@ def _create_diff_groups(fields_to_diff, methods_to_diff, predicates_to_test, roo
 | 
|      for entry in fields_to_diff:
 | 
|          for field in root_group.fields:
 | 
|              if not field.is_inherited_flag and entry == field.property_name:
 | 
| -                diff_group.expressions.append(field.getter_expression)
 | 
| +                diff_group.fields.append(field)
 | 
|      for entry in methods_to_diff:
 | 
|          for field in root_group.fields:
 | 
|              if not field.is_inherited_flag and field.property_name in entry['field_dependencies']:
 | 
| @@ -296,7 +295,6 @@ def _create_property_field(property_):
 | 
|          type_name=type_name,
 | 
|          wrapper_pointer_name=property_['wrapper_pointer_name'],
 | 
|          field_template=property_['field_template'],
 | 
| -        field_group=property_['field_group'],
 | 
|          size=size,
 | 
|          default_value=default_value,
 | 
|          custom_copy=property_['custom_copy'],
 | 
| @@ -320,7 +318,6 @@ def _create_inherited_flag_field(property_):
 | 
|          type_name='bool',
 | 
|          wrapper_pointer_name=None,
 | 
|          field_template='primitive',
 | 
| -        field_group=property_['field_group'],
 | 
|          size=1,
 | 
|          default_value='true',
 | 
|          custom_copy=False,
 | 
| @@ -331,20 +328,19 @@ def _create_inherited_flag_field(property_):
 | 
|      )
 | 
|  
 | 
|  
 | 
| -def _create_fields(properties):
 | 
| +def _create_fields(property_):
 | 
|      """
 | 
| -    Create ComputedStyle fields from properties and return a list of Field objects.
 | 
| +    Create ComputedStyle fields from a property and return a list of Field objects.
 | 
|      """
 | 
|      fields = []
 | 
| -    for property_ in properties:
 | 
| -        # Only generate properties that have a field template
 | 
| -        if property_['field_template'] is not None:
 | 
| -            # If the property is independent, add the single-bit sized isInherited flag
 | 
| -            # to the list of Fields as well.
 | 
| -            if property_['independent']:
 | 
| -                fields.append(_create_inherited_flag_field(property_))
 | 
| +    # Only generate properties that have a field template
 | 
| +    if property_['field_template'] is not None:
 | 
| +        # If the property is independent, add the single-bit sized isInherited flag
 | 
| +        # to the list of Fields as well.
 | 
| +        if property_['independent']:
 | 
| +            fields.append(_create_inherited_flag_field(property_))
 | 
|  
 | 
| -            fields.append(_create_property_field(property_))
 | 
| +        fields.append(_create_property_field(property_))
 | 
|  
 | 
|      return fields
 | 
|  
 | 
| @@ -430,11 +426,9 @@ class ComputedStyleBaseWriter(make_style_builder.StyleBuilderWriter):
 | 
|  
 | 
|          self._generated_enums = _create_enums(all_properties)
 | 
|  
 | 
| -        all_fields = _create_fields(all_properties)
 | 
| -
 | 
|          # Organise fields into a tree structure where the root group
 | 
|          # is ComputedStyleBase.
 | 
| -        self._root_group = _group_fields(all_fields)
 | 
| +        self._root_group = _create_groups(all_properties)
 | 
|          self._diff_functions_map = _create_diff_groups_map(json5_generator.Json5File.load_from_files(
 | 
|              [json5_file_paths[2]]
 | 
|          ).name_dictionaries, self._root_group)
 | 
| 
 |