| Index: build/android/gyp/generate_v14_compatible_resources.py
|
| diff --git a/build/android/gyp/generate_v14_compatible_resources.py b/build/android/gyp/generate_v14_compatible_resources.py
|
| index 6b848082adc544605f1bb88269aa9c59229e0296..71557445aaf48e1dbc85d1321f8bac008839b8ad 100755
|
| --- a/build/android/gyp/generate_v14_compatible_resources.py
|
| +++ b/build/android/gyp/generate_v14_compatible_resources.py
|
| @@ -98,16 +98,17 @@ def ErrorIfStyleResourceExistsInDir(input_dir):
|
| if HasStyleResource(dom):
|
| raise Exception('error: style file ' + input_filename +
|
| ' should be under ' + input_dir +
|
| - '-v17 directory. Please refer to crbug.com/243952 '
|
| - 'for the details.')
|
| + '-v17 directory. Please refer to '
|
| + 'http://crbug.com/243952 for the details.')
|
|
|
|
|
| -def GenerateV14LayoutResourceDom(dom, filename):
|
| +def GenerateV14LayoutResourceDom(dom, filename_for_warning):
|
| """Convert layout resource to API 14 compatible layout resource.
|
|
|
| Args:
|
| dom: parsed minidom object to be modified.
|
| - filename: file name to display in case we print warnings.
|
| + filename_for_warning: file name to display in case we print warnings.
|
| + If None, do not print warning.
|
| Returns:
|
| True if dom is modified, False otherwise.
|
| """
|
| @@ -125,27 +126,35 @@ def GenerateV14LayoutResourceDom(dom, filename):
|
| element.setAttribute(ATTRIBUTES_TO_MAP[name], value)
|
| del element.attributes[name]
|
| is_modified = True
|
| - else:
|
| - WarnIfDeprecatedAttribute(name, value, filename)
|
| + elif filename_for_warning:
|
| + WarnIfDeprecatedAttribute(name, value, filename_for_warning)
|
|
|
| return is_modified
|
|
|
|
|
| -def GenerateV14StyleResourceDom(dom, filename):
|
| +def GenerateV14StyleResourceDom(dom, filename_for_warning):
|
| """Convert style resource to API 14 compatible style resource.
|
|
|
| Args:
|
| dom: parsed minidom object to be modified.
|
| - filename: file name to display in case we print warnings.
|
| + filename_for_warning: file name to display in case we print warnings.
|
| + If None, do not print warning.
|
| + Returns:
|
| + True if dom is modified, False otherwise.
|
| """
|
| + is_modified = False
|
| +
|
| for style_element in dom.getElementsByTagName('style'):
|
| for item_element in style_element.getElementsByTagName('item'):
|
| name = item_element.attributes['name'].value
|
| value = item_element.childNodes[0].nodeValue
|
| if name in ATTRIBUTES_TO_MAP:
|
| item_element.attributes['name'].value = ATTRIBUTES_TO_MAP[name]
|
| - else:
|
| - WarnIfDeprecatedAttribute(name, value, filename)
|
| + is_modified = True
|
| + elif filename_for_warning:
|
| + WarnIfDeprecatedAttribute(name, value, filename_for_warning)
|
| +
|
| + return is_modified
|
|
|
|
|
| def GenerateV14LayoutResource(input_filename, output_v14_filename,
|
| @@ -202,6 +211,36 @@ def GenerateV14StyleResourcesInDir(input_dir, output_v14_dir):
|
| GenerateV14StyleResource(input_filename, output_v14_filename)
|
|
|
|
|
| +def VerifyV14ResourcesInDir(input_dir, resource_type):
|
| + """Verify that the resources in input_dir is compatible with v14, i.e., they
|
| + don't use attributes that cause crashes on certain devices. Print an error if
|
| + they have."""
|
| + for input_filename in build_utils.FindInDirectory(input_dir, '*.xml'):
|
| + exception_message = ('error : ' + input_filename + ' has an RTL attribute, '
|
| + 'i.e., attribute that has "start" or "end" in its name.'
|
| + ' Pre-v17 resources should not include it because it '
|
| + 'can cause crashes on certain devices. Please refer to '
|
| + 'http://crbug.com/243952 for the details.')
|
| + dom = minidom.parse(input_filename)
|
| + if resource_type in ('layout', 'xml'):
|
| + if GenerateV14LayoutResourceDom(dom, None):
|
| + raise Exception(exception_message)
|
| + elif resource_type == 'values':
|
| + if GenerateV14StyleResourceDom(dom, None):
|
| + raise Exception(exception_message)
|
| +
|
| +
|
| +def WarnIfDeprecatedAttributeInDir(input_dir, resource_type):
|
| + """Print warning if resources in input_dir have deprecated attributes, e.g.,
|
| + paddingLeft, PaddingRight"""
|
| + for input_filename in build_utils.FindInDirectory(input_dir, '*.xml'):
|
| + dom = minidom.parse(input_filename)
|
| + if resource_type in ('layout', 'xml'):
|
| + GenerateV14LayoutResourceDom(dom, input_filename)
|
| + elif resource_type == 'values':
|
| + GenerateV14StyleResourceDom(dom, input_filename)
|
| +
|
| +
|
| def ParseArgs():
|
| """Parses command line options.
|
|
|
| @@ -216,6 +255,10 @@ def ParseArgs():
|
| help='output directory into which '
|
| 'v14 compatible resources will be generated')
|
| parser.add_option('--stamp', help='File to touch on success')
|
| + parser.add_option('--verify-only', action="store_true", help='Do not generate'
|
| + ' v14 resources. Instead, just verify that the resources are already '
|
| + "compatible with v14, i.e. they don't use attributes that cause crashes "
|
| + 'on certain devices.')
|
|
|
| options, args = parser.parse_args()
|
|
|
| @@ -254,29 +297,36 @@ def main(argv):
|
| if 'ldrtl' in qualifiers:
|
| continue
|
|
|
| - # We also need to copy the original v17 resource to *-v17 directory
|
| - # because the generated v14 resource will hide the original resource.
|
| - input_dir = os.path.join(options.res_dir, name)
|
| - output_v14_dir = os.path.join(options.res_v14_compatibility_dir, name)
|
| - output_v17_dir = os.path.join(options.res_v14_compatibility_dir, name +
|
| - '-v17')
|
| + input_dir = os.path.abspath(os.path.join(options.res_dir, name))
|
|
|
| - # We only convert layout resources under layout*/, xml*/,
|
| - # and style resources under values*/.
|
| - if resource_type in ('layout', 'xml'):
|
| - if not api_level_qualifier:
|
| - GenerateV14LayoutResourcesInDir(input_dir, output_v14_dir,
|
| - output_v17_dir)
|
| - elif resource_type == 'values':
|
| - if api_level_qualifier == 'v17':
|
| - output_qualifiers = qualifiers[:]
|
| - del output_qualifiers[api_level_qualifier_index]
|
| - output_v14_dir = os.path.join(options.res_v14_compatibility_dir,
|
| - '-'.join([resource_type] +
|
| - output_qualifiers))
|
| - GenerateV14StyleResourcesInDir(input_dir, output_v14_dir)
|
| - elif not api_level_qualifier:
|
| - ErrorIfStyleResourceExistsInDir(input_dir)
|
| + if options.verify_only:
|
| + if not api_level_qualifier or int(api_level_qualifier[1:]) < 17:
|
| + VerifyV14ResourcesInDir(input_dir, resource_type)
|
| + else:
|
| + WarnIfDeprecatedAttributeInDir(input_dir, resource_type)
|
| + else:
|
| + # We also need to copy the original v17 resource to *-v17 directory
|
| + # because the generated v14 resource will hide the original resource.
|
| + output_v14_dir = os.path.join(options.res_v14_compatibility_dir, name)
|
| + output_v17_dir = os.path.join(options.res_v14_compatibility_dir, name +
|
| + '-v17')
|
| +
|
| + # We only convert layout resources under layout*/, xml*/,
|
| + # and style resources under values*/.
|
| + if resource_type in ('layout', 'xml'):
|
| + if not api_level_qualifier:
|
| + GenerateV14LayoutResourcesInDir(input_dir, output_v14_dir,
|
| + output_v17_dir)
|
| + elif resource_type == 'values':
|
| + if api_level_qualifier == 'v17':
|
| + output_qualifiers = qualifiers[:]
|
| + del output_qualifiers[api_level_qualifier_index]
|
| + output_v14_dir = os.path.join(options.res_v14_compatibility_dir,
|
| + '-'.join([resource_type] +
|
| + output_qualifiers))
|
| + GenerateV14StyleResourcesInDir(input_dir, output_v14_dir)
|
| + elif not api_level_qualifier:
|
| + ErrorIfStyleResourceExistsInDir(input_dir)
|
|
|
| if options.stamp:
|
| build_utils.Touch(options.stamp)
|
|
|