# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Chromium presubmit script for src/components/autofill/content/renderer.

See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
for more details on the presubmit API built into depot_tools.
"""

PRESUBMIT_VERSION = '2.0.0'

def CheckNoBannedFunctions(input_api, output_api):
    """Makes sure that banned functions are not used."""
    errors = []
    file_filter = lambda f: (
        f.LocalPath().startswith('components/autofill/content/renderer/')
        and f.LocalPath().endswith(('.h', '.cc'))
    )
    banned_functions = [
        (r'\bFormControlType\(',
         'Consider FormControlTypeForAutofill() instead.'),
        (r'\bIsConnected\b',
         'Consider IsAccessible() instead.'),
        (r'\bForm\b',
         'Consider GetOwningFormForAutofill() instead.'),
        (r'\bGetFormControlElements\b',
         'Consider GetOwnedFormControls() instead.'),
        (r'\bUnassociatedFormControls\b',
         'Consider GetOwnedFormControls() instead.'),
    ]
    for f in input_api.AffectedSourceFiles(file_filter):
        for line_num, line in f.ChangedContents():
            if line.endswith("// nocheck"):
                continue
            line = line.split('//')[0]
            for regex, explanation in banned_functions:
                match = input_api.re.search(regex, line)
                if match:
                    errors.append(
                        output_api.PresubmitError(
                            f'{f.LocalPath()}:{line_num}: {match.group(0)}: '
                            f'{explanation} (see '
                            f'//components/autofill/content/renderer/README.md)'
                            f'. Or append // nocheck if you have to.'
                        )
                    )
    return errors
