# Copyright 2022 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Presubmit tests for //android_webview/
Gates against using Context#bindService API before upload.
"""
def CheckChangeOnCommit(input_api, output_api):
results = []
results.extend(_CheckNoContextBindServiceAdded(input_api, output_api))
return results
def CheckChangeOnUpload(input_api, output_api):
results = []
results.extend(_CheckNoContextBindServiceAdded(input_api, output_api))
return results
def _CheckNoContextBindServiceAdded(input_api, output_api):
"""Checks that new no files under //android_webview directly use the
Context#bindService. This is because Android platform disallows calling
Context#bindService() from within a BroadcastReceiver context.
"""
errors = []
bind_service_pattern = input_api.re.compile(
r'.*\.bindService\(.*')
def _FilterFile(affected_file):
skip_files = (input_api.DEFAULT_FILES_TO_SKIP +
(r'.*android_webview[/\\]common[/\\]services[/\\]ServiceHelper\.java',
r'.*android_webview[/\\]support_library[/\\]boundary_interfaces[/\\].*',
r'.*android_webview[/\\]js_sandbox[/\\].*',))
return input_api.FilterSourceFile(
affected_file,
files_to_skip=skip_files,
files_to_check=[r'.+\.java$'])
for f in input_api.AffectedSourceFiles(_FilterFile):
for line_num, line in f.ChangedContents():
match = bind_service_pattern.search(line)
if match:
if "ServiceHelper.bindService" not in line:
errors.append("%s:%d:%s" % (f.LocalPath(), line_num, line))
results = []
if errors:
results.append(output_api.PresubmitPromptWarning("""
New code in //android_webview should not use \
android.content.Context#bindService. Instead use \
android_webview.common.services.ServiceHelper#bindService.
""", errors))
return results