| # 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)) |
| results.extend(_CheckTargetSdkVersionNotDeleted(input_api, output_api)) |
| return results |
| |
| def CheckChangeOnUpload(input_api, output_api): |
| results = [] |
| results.extend(_CheckNoContextBindServiceAdded(input_api, output_api)) |
| results.extend(_CheckTargetSdkVersionNotDeleted(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 |
| |
| def _CheckTargetSdkVersionNotDeleted(input_api, output_api): |
| """Checks that we keep any checks related to targetSdkVersion in place. It's |
| OK for WebView to drop support for old OS versions (SDK_INT), however we do |
| not yet want to drop support for old targetSdks (targetSdkVersion). It's |
| possible for apps to specify a really old targetSdkVersion even if the app is |
| installed on new OS versions. |
| """ |
| errors = [] |
| target_sdk_version_pattern = input_api.re.compile( |
| r'.*[tT]argetSdkVersion.*') |
| |
| def _FilterFile(affected_file): |
| return input_api.FilterSourceFile( |
| affected_file, |
| files_to_skip=input_api.DEFAULT_FILES_TO_SKIP, |
| files_to_check=[r'.+\.java$']) |
| |
| for f in input_api.AffectedSourceFiles(_FilterFile): |
| old_target_sdk_checks = [] |
| new_target_sdk_checks = [] |
| for line in f.OldContents(): |
| match = target_sdk_version_pattern.search(line) |
| if match: |
| old_target_sdk_checks.append(line.strip()) |
| for line in f.NewContents(): |
| match = target_sdk_version_pattern.search(line) |
| if match: |
| new_target_sdk_checks.append(line.strip()) |
| for line in old_target_sdk_checks: |
| if line not in new_target_sdk_checks: |
| errors.append("%s: %s" % (f.LocalPath(), line)) |
| |
| results = [] |
| |
| if errors: |
| results.append(output_api.PresubmitError(""" |
| Code in //android_webview should not ever get rid of checks to targetSdkVersion. |
| This code is not dead code, even when we drop support for old SDK_INT versions. |
| It is possible for apps to specify a really old targetSdkVersion even if the app |
| is installed on new OS versions, and this is something we want to support. |
| |
| If you are just moving an existing check (but not deleting it), then you can |
| ignore this warning. If you are completely deleting a check, then please undo |
| the change or raise this issue with //android_webview/OWNERS to get their |
| explicit approval before you ignore the warning. |
| """, errors)) |
| |
| return results |