Index: third_party/WebKit/PRESUBMIT.py |
diff --git a/third_party/WebKit/PRESUBMIT.py b/third_party/WebKit/PRESUBMIT.py |
index 435286ee50fd0507caafd9f6502e6221b6d17e70..f303d152047377a7ab54ccf65214ab92229de3b4 100644 |
--- a/third_party/WebKit/PRESUBMIT.py |
+++ b/third_party/WebKit/PRESUBMIT.py |
@@ -225,6 +225,37 @@ def _CheckForInvalidPreferenceError(input_api, output_api): |
results.append(output_api.PresubmitError('Found an invalid preference %s in expected result %s:%s' % (error.group(1), f, line_num))) |
return results |
+ |
+def _CheckForForbiddenNamespace(input_api, output_api): |
+ """Checks that Blink uses Chromium namespaces only in permitted code.""" |
+ # This list is not exhaustive, but covers likely ones. |
+ chromium_namespaces = ["base", "cc", "content", "gfx", "net", "ui"] |
+ chromium_classes = ["scoped_ptr", "scoped_refptr"] |
+ |
+ def source_file_filter(path): |
+ return input_api.FilterSourceFile(path, |
+ white_list=[r'third_party/WebKit/Source/.*\.(h|cpp)$'], |
+ black_list=[r'third_party/WebKit/Source/(platform|wtf|web)/']) |
+ |
+ comment_re = input_api.re.compile(r'^\s*//') |
+ result = [] |
+ for namespace in chromium_namespaces: |
+ namespace_re = input_api.re.compile(r'\b{0}::|^\s*using namespace {0};|^\s*namespace {0} \{{'.format(input_api.re.escape(namespace))) |
+ uses_namespace_outside_comments = lambda line: namespace_re.search(line) and not comment_re.search(line) |
+ errors = input_api.canned_checks._FindNewViolationsOfRule(lambda _, line: not uses_namespace_outside_comments(line), |
+ input_api, source_file_filter) |
+ if errors: |
+ result += [output_api.PresubmitError('Do not use Chromium namespace {} inside Blink core:\n{}'.format(namespace, '\n'.join(errors)))] |
+ for class_name in chromium_classes: |
+ class_re = input_api.re.compile(r'\b{0}\b'.format(input_api.re.escape(class_name))) |
+ uses_class_outside_comments = lambda line: class_re.search(line) and not comment_re.search(line) |
+ errors = input_api.canned_checks._FindNewViolationsOfRule(lambda _, line: not uses_class_outside_comments(line), |
+ input_api, source_file_filter) |
+ if errors: |
+ result += [output_api.PresubmitError('Do not use Chromium class {} inside Blink core:\n{}'.format(class_name, '\n'.join(errors)))] |
+ return result |
+ |
+ |
def CheckChangeOnUpload(input_api, output_api): |
results = [] |
results.extend(_CommonChecks(input_api, output_api)) |
@@ -232,6 +263,7 @@ def CheckChangeOnUpload(input_api, output_api): |
results.extend(_CheckForPrintfDebugging(input_api, output_api)) |
results.extend(_CheckForDangerousTestFunctions(input_api, output_api)) |
results.extend(_CheckForInvalidPreferenceError(input_api, output_api)) |
+ results.extend(_CheckForForbiddenNamespace(input_api, output_api)) |
return results |