chromium/chrome/browser/resources/ash/settings/os_settings_presubmit_checker.py

# 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.


def _TypeScriptPrepCheckNoAddSingletonGetter(file):
    """Checks that there are no uses of addSingletonGetter()

    Args:
        file: A changed file

    Returns:
        A list of error messages (strings)
    """

    error_messages = []
    if file.LocalPath().endswith('js'):
        for line_num, line in file.ChangedContents():
            if 'addSingletonGetter' in line:
                error_messages.append(
                    "%s:%d:\n%s\n\n"
                    "Avoid using addSingletonGetter() in ChromeOS Settings app"
                    "due to incompatibility with TypeScript. Refer to "
                    "crrev.com/c/3582712 for an alternate solution." %
                    (file.LocalPath(), line_num, line.strip()))

    return error_messages


def _TypeScriptPrepCheckNoLegacyPolymerSyntax(file):
    """Checks that there are no uses of the legacy Polymer element syntax

    Args:
        file: A changed file

    Returns:
        A list of error messages (strings)
    """

    error_messages = []
    if file.LocalPath().endswith('js'):
        for line_num, line in file.ChangedContents():
            if 'Polymer({' in line:
                error_messages.append(
                    "%s:%d:\n%s\n\n"
                    "Avoid using the legacy Polymer element syntax in "
                    "ChromeOS Settings app due to incompatibility with "
                    "TypeScript. Instead use the class-based syntax documented "
                    "in Polymer 3." %
                    (file.LocalPath(), line_num, line.strip()))

    return error_messages


def _EnforceSchemeSpecificURLs(file):
    """Checks that only scheme-specific URLs are used and scheme relative URLs
      are avoided. (i.e. 'chrome://' is preferred over '//')

    Args:
        file: A changed file

    Returns:
        A list of error messages (strings)
    """

    error_messages = []
    if file.LocalPath().endswith('js'):
        for line_num, line in file.ChangedContents():
            if '\'//' in line:
                error_messages.append(
                    "%s:%d:\n%s\n\n"
                    "Prefer using scheme-specific URLs (i.e. 'chrome://')" %
                    (file.LocalPath(), line_num, line.strip()))

    return error_messages


class OSSettingsPresubmitChecker(object):
    """Checks that the changes comply with ChromeOS Settings code style.

    Checks:
      - addSingletonGetter() is not used
      - No legacy Polymer syntax (1.x, 2.x) is used
    """

    @staticmethod
    def RunChecks(input_api, output_api):
        """Runs checks for ChromeOS Settings

        Args:
            input_api: presubmit.InputApi containing information of the files
            in the change.
            output_api: presubmit.OutputApi used to display the warnings.

        Returns:
            A list of presubmit warnings, each containing the line the violation
            occurred and the warning message.
        """

        error_messages = []
        for file in input_api.AffectedFiles():
            error_messages += _TypeScriptPrepCheckNoAddSingletonGetter(file)
            error_messages += _TypeScriptPrepCheckNoLegacyPolymerSyntax(file)
            error_messages += _EnforceSchemeSpecificURLs(file)

        errors = list(map(output_api.PresubmitPromptWarning, error_messages))
        return errors