| Index: content/common/PRESUBMIT.py
|
| diff --git a/content/common/PRESUBMIT.py b/content/common/PRESUBMIT.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5716b45c1a38ebf49f50520655af5b577c9c9f60
|
| --- /dev/null
|
| +++ b/content/common/PRESUBMIT.py
|
| @@ -0,0 +1,89 @@
|
| +# Copyright 2017 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +"""Presubmit script for content/common."""
|
| +
|
| +import os, re
|
| +
|
| +AX_JS_FILE = 'content/browser/resources/accessibility/accessibility.js'
|
| +AX_MODE_HEADER = 'content/common/accessibility_mode.h'
|
| +
|
| +# Given a full path to c++ header, return an array of the first static
|
| +# constexpr defined. (Note there can be more than one defined in a C++
|
| +# header)
|
| +def GetConstexprFromFile(fullpath):
|
| + values = []
|
| + for line in open(fullpath).readlines():
|
| + # Strip out comments
|
| + line = re.sub('//.*', '', line)
|
| +
|
| + # Look for lines of the form "static constexpr <type> NAME "
|
| + m = re.search('static constexpr [\w]+ ([\w]+)', line)
|
| + if m:
|
| + values.append(m.group(1))
|
| +
|
| + return values
|
| +
|
| +# Given a full path to js file, return the AccessibilityMode consts
|
| +# defined
|
| +def GetAccessibilityModesFromFile(fullpath):
|
| + values = []
|
| + inside = False
|
| + for line in open(fullpath).readlines():
|
| + # Strip out comments
|
| + line = re.sub('//.*', '', line)
|
| +
|
| + # Look for the block of code that defines AccessibilityMode
|
| + m = re.search('const AccessibilityMode = {', line)
|
| + if m:
|
| + inside = True
|
| + continue
|
| +
|
| + # Look for a "}" character signifying the end of an enum
|
| + if line.find('};') >= 0:
|
| + return values
|
| +
|
| + if not inside:
|
| + continue
|
| +
|
| + m = re.search('([\w]+):', line)
|
| + if m:
|
| + values.append(m.group(1))
|
| + continue
|
| +
|
| + # getters
|
| + m = re.search('get ([\w]+)\(\)', line)
|
| + if m:
|
| + values.append(m.group(1))
|
| + return values
|
| +
|
| +# Make sure that the modes defined in the C++ header match those defined in
|
| +# the js file. Note that this doesn't guarantee that the values are the same,
|
| +# but does make sure if we add or remove we can signal to the developer that
|
| +# they should be aware that this dependency exists.
|
| +def CheckModesMatch(input_api, output_api):
|
| + errs = []
|
| + repo_root = input_api.change.RepositoryRoot()
|
| +
|
| + ax_modes_in_header = GetConstexprFromFile(
|
| + os.path.join(repo_root,AX_MODE_HEADER))
|
| + ax_modes_in_js = GetAccessibilityModesFromFile(
|
| + os.path.join(repo_root, AX_JS_FILE))
|
| +
|
| + for value in ax_modes_in_header:
|
| + if value not in ax_modes_in_js:
|
| + errs.append(output_api.PresubmitError(
|
| + 'Found %s in %s, but did not find %s in %s' % (
|
| + value, AX_MODE_HEADER, value, AX_JS_FILE)))
|
| + return errs
|
| +
|
| +def CheckChangeOnUpload(input_api, output_api):
|
| + if AX_MODE_HEADER not in input_api.LocalPaths():
|
| + return []
|
| + return CheckModesMatch(input_api, output_api)
|
| +
|
| +def CheckChangeOnCommit(input_api, output_api):
|
| + if AX_MODE_HEADER not in input_api.LocalPaths():
|
| + return []
|
| + return CheckModesMatch(input_api, output_api)
|
|
|