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

"""Presubmit script for content/renderer

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

import re

def _FilterFile(affected_file):
  """Return true if the file could contain code requiring a presubmit check."""
  return affected_file.LocalPath().endswith(
      ('.h', '.cc', '.cpp', '.cxx', '.mm'))

def _CheckForUseOfGlobalTaskRunnerGetter(input_api, output_api):
  """Check that base::ThreadTaskRunnerHandle::Get() or
  base::SequencedTaskRunnerHandle::Get() is not used."""

  problems = []
  getter_re = input_api.re.compile(
      r'(^|\b)base::(Thread|Sequenced)TaskRunnerHandle::Get\(\)')
  for f in input_api.AffectedSourceFiles(_FilterFile):
    for line_number, line in f.ChangedContents():
      if getter_re.search(line):
        problems.append('%s:%d' % (f, line_number))

  if problems:
    return [output_api.PresubmitError(
      'base::ThreadTaskRunnerHandle::Get() and'
      ' base::SequencedTaskRunnerHandle::Get() are deprecated in renderer;'
      ' please use RenderFrame::GetTaskRunner for production code and'
      ' blink::scheduler::Get*TaskRunnerForTesting for tests. Please reach'
      ' out to scheduler-dev@ if you have any questions.', problems)]
  return []

def _CommonCheck(input_api, output_api):
  results = []
  results.extend(_CheckForUseOfGlobalTaskRunnerGetter(input_api, output_api))
  return results

def CheckChangeOnUpload(input_api, output_api):
  return _CommonCheck(input_api, output_api)

def CheckChangeOnCommit(input_api, output_api):
  return _CommonCheck(input_api, output_api)
