Commit 1ec68ac2 authored by dbeam's avatar dbeam Committed by Commit bot

ES6 Style: add presubmit prompt about => in code that might run on iOS9

An action item from this ES6 proposal:
https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/iJrC4PVSfoU

R=dpranke@chromium.org
BUG=671426

Review-Url: https://codereview.chromium.org/2576253002
Cr-Commit-Position: refs/heads/master@{#438754}
parent d55955b1
...@@ -1925,7 +1925,7 @@ def _CheckSingletonInHeaders(input_api, output_api): ...@@ -1925,7 +1925,7 @@ def _CheckSingletonInHeaders(input_api, output_api):
return [] return []
def _CheckNoDeprecatedCompiledResourcesGYP(input_api, output_api): def _CheckNoDeprecatedCompiledResourcesGyp(input_api, output_api):
"""Checks for old style compiled_resources.gyp files.""" """Checks for old style compiled_resources.gyp files."""
is_compiled_resource = lambda fp: fp.endswith('compiled_resources.gyp') is_compiled_resource = lambda fp: fp.endswith('compiled_resources.gyp')
...@@ -1969,7 +1969,7 @@ _DEPRECATED_CSS = [ ...@@ -1969,7 +1969,7 @@ _DEPRECATED_CSS = [
( "-webkit-repeating-radial-gradient", "repeating-radial-gradient" ), ( "-webkit-repeating-radial-gradient", "repeating-radial-gradient" ),
] ]
def _CheckNoDeprecatedCSS(input_api, output_api): def _CheckNoDeprecatedCss(input_api, output_api):
""" Make sure that we don't use deprecated CSS """ Make sure that we don't use deprecated CSS
properties, functions or values. Our external properties, functions or values. Our external
documentation and iOS CSS for dom distiller documentation and iOS CSS for dom distiller
...@@ -2004,7 +2004,7 @@ _DEPRECATED_JS = [ ...@@ -2004,7 +2004,7 @@ _DEPRECATED_JS = [
( "__defineSetter__", "Object.defineProperty" ), ( "__defineSetter__", "Object.defineProperty" ),
] ]
def _CheckNoDeprecatedJS(input_api, output_api): def _CheckNoDeprecatedJs(input_api, output_api):
"""Make sure that we don't use deprecated JS in Chrome code.""" """Make sure that we don't use deprecated JS in Chrome code."""
results = [] results = []
file_inclusion_pattern = (r".+\.js$",) # TODO(dbeam): .html? file_inclusion_pattern = (r".+\.js$",) # TODO(dbeam): .html?
...@@ -2022,6 +2022,27 @@ def _CheckNoDeprecatedJS(input_api, output_api): ...@@ -2022,6 +2022,27 @@ def _CheckNoDeprecatedJS(input_api, output_api):
return results return results
def _CheckForRiskyJsFeatures(input_api, output_api):
maybe_ios_js = (r"^(ios|components|ui\/webui\/resources)\/.+\.js$", )
file_filter = lambda f: input_api.FilterSourceFile(f, white_list=maybe_ios_js)
arrow_lines = []
for f in input_api.AffectedFiles(file_filter=file_filter):
for lnum, line in f.ChangedContents():
if ' => ' in line:
arrow_lines.append((f.LocalPath(), lnum))
if not arrow_lines:
return []
return [output_api.PresubmitPromptWarning("""
Use of => operator detected in:
%s
Please ensure your code does not run on iOS9 (=> (arrow) does not work there).
https://chromium.googlesource.com/chromium/src/+/master/docs/es6_chromium.md#Arrow-Functions
""" % "\n".join(" %s:%d\n" % line for line in arrow_lines))]
def _AndroidSpecificOnUploadChecks(input_api, output_api): def _AndroidSpecificOnUploadChecks(input_api, output_api):
"""Groups checks that target android code.""" """Groups checks that target android code."""
results = [] results = []
...@@ -2070,18 +2091,19 @@ def _CommonChecks(input_api, output_api): ...@@ -2070,18 +2091,19 @@ def _CommonChecks(input_api, output_api):
results.extend(_CheckForAnonymousVariables(input_api, output_api)) results.extend(_CheckForAnonymousVariables(input_api, output_api))
results.extend(_CheckCygwinShell(input_api, output_api)) results.extend(_CheckCygwinShell(input_api, output_api))
results.extend(_CheckUserActionUpdate(input_api, output_api)) results.extend(_CheckUserActionUpdate(input_api, output_api))
results.extend(_CheckNoDeprecatedCSS(input_api, output_api)) results.extend(_CheckNoDeprecatedCss(input_api, output_api))
results.extend(_CheckNoDeprecatedJS(input_api, output_api)) results.extend(_CheckNoDeprecatedJs(input_api, output_api))
results.extend(_CheckParseErrors(input_api, output_api)) results.extend(_CheckParseErrors(input_api, output_api))
results.extend(_CheckForIPCRules(input_api, output_api)) results.extend(_CheckForIPCRules(input_api, output_api))
results.extend(_CheckForWindowsLineEndings(input_api, output_api)) results.extend(_CheckForWindowsLineEndings(input_api, output_api))
results.extend(_CheckSingletonInHeaders(input_api, output_api)) results.extend(_CheckSingletonInHeaders(input_api, output_api))
results.extend(_CheckNoDeprecatedCompiledResourcesGYP(input_api, output_api)) results.extend(_CheckNoDeprecatedCompiledResourcesGyp(input_api, output_api))
results.extend(_CheckPydepsNeedsUpdating(input_api, output_api)) results.extend(_CheckPydepsNeedsUpdating(input_api, output_api))
results.extend(_CheckJavaStyle(input_api, output_api)) results.extend(_CheckJavaStyle(input_api, output_api))
results.extend(_CheckIpcOwners(input_api, output_api)) results.extend(_CheckIpcOwners(input_api, output_api))
results.extend(_CheckMojoUsesNewWrapperTypes(input_api, output_api)) results.extend(_CheckMojoUsesNewWrapperTypes(input_api, output_api))
results.extend(_CheckUselessForwardDeclarations(input_api, output_api)) results.extend(_CheckUselessForwardDeclarations(input_api, output_api))
results.extend(_CheckForRiskyJsFeatures(input_api, output_api))
if any('PRESUBMIT.py' == f.LocalPath() for f in input_api.AffectedFiles()): if any('PRESUBMIT.py' == f.LocalPath() for f in input_api.AffectedFiles()):
results.extend(input_api.canned_checks.RunUnitTestsInDirectory( results.extend(input_api.canned_checks.RunUnitTestsInDirectory(
......
...@@ -412,16 +412,16 @@ class CheckSingletonInHeadersTest(unittest.TestCase): ...@@ -412,16 +412,16 @@ class CheckSingletonInHeadersTest(unittest.TestCase):
self.assertEqual(0, len(warnings)) self.assertEqual(0, len(warnings))
class CheckNoDeprecatedCompiledResourcesGYPTest(unittest.TestCase): class CheckNoDeprecatedCompiledResourcesGypTest(unittest.TestCase):
def testNoDeprecatedCompiledResourcsGYP(self): def testNoDeprecatedCompiledResourcsGyp(self):
mock_input_api = MockInputApi() mock_input_api = MockInputApi()
mock_input_api.files = [MockFile('some/js/compiled_resources.gyp', [])] mock_input_api.files = [MockFile('some/js/compiled_resources.gyp', [])]
errors = PRESUBMIT._CheckNoDeprecatedCompiledResourcesGYP(mock_input_api, errors = PRESUBMIT._CheckNoDeprecatedCompiledResourcesGyp(mock_input_api,
MockOutputApi()) MockOutputApi())
self.assertEquals(1, len(errors)) self.assertEquals(1, len(errors))
mock_input_api.files = [MockFile('some/js/compiled_resources2.gyp', [])] mock_input_api.files = [MockFile('some/js/compiled_resources2.gyp', [])]
errors = PRESUBMIT._CheckNoDeprecatedCompiledResourcesGYP(mock_input_api, errors = PRESUBMIT._CheckNoDeprecatedCompiledResourcesGyp(mock_input_api,
MockOutputApi()) MockOutputApi())
self.assertEquals(0, len(errors)) self.assertEquals(0, len(errors))
...@@ -1188,5 +1188,41 @@ class ForwardDeclarationTest(unittest.TestCase): ...@@ -1188,5 +1188,41 @@ class ForwardDeclarationTest(unittest.TestCase):
self.assertEqual(4, len(warnings)) self.assertEqual(4, len(warnings))
class RiskyJsTest(unittest.TestCase):
def testArrowWarnInIos9Code(self):
mock_input_api = MockInputApi()
mock_output_api = MockOutputApi()
mock_input_api.files = [
MockAffectedFile('components/blah.js', ["shouldn't use => here"]),
]
warnings = PRESUBMIT._CheckForRiskyJsFeatures(
mock_input_api, mock_output_api)
self.assertEqual(1, len(warnings))
mock_input_api.files = [
MockAffectedFile('ios/blee.js', ['might => break folks']),
]
warnings = PRESUBMIT._CheckForRiskyJsFeatures(
mock_input_api, mock_output_api)
self.assertEqual(1, len(warnings))
mock_input_api.files = [
MockAffectedFile('ui/webui/resources/blarg.js', ['on => iOS9']),
]
warnings = PRESUBMIT._CheckForRiskyJsFeatures(
mock_input_api, mock_output_api)
self.assertEqual(1, len(warnings))
def testArrowsAllowedInChromeCode(self):
mock_input_api = MockInputApi()
mock_input_api.files = [
MockAffectedFile('chrome/browser/resources/blah.js', 'arrow => OK here'),
]
warnings = PRESUBMIT._CheckForRiskyJsFeatures(
mock_input_api, MockOutputApi())
self.assertEqual(0, len(warnings))
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment