[js-code-coverage] Pass monorail component mapping to JS metadata script

When generating the JavaScript code coverage, the monorail component
mapping is required for full repo coverage. Retrieving it for use later
when generating the JS coverage metadata.

Bug: 1113941
Test: ./recipes.py test run
Test: ./generate_coverage_metadata_for_javascript_test.py
Change-Id: Ib964fc60aa62c9f10a3477cfb1c08e26a4868ac8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/build/+/2550516
Commit-Queue: Ben Reich <benreich@chromium.org>
Auto-Submit: Ben Reich <benreich@chromium.org>
Reviewed-by: Zhaoyang Li <zhaoyangli@chromium.org>
diff --git a/recipes/recipe_modules/code_coverage/api.py b/recipes/recipe_modules/code_coverage/api.py
index 79471df..d5d9f01 100644
--- a/recipes/recipe_modules/code_coverage/api.py
+++ b/recipes/recipe_modules/code_coverage/api.py
@@ -543,6 +543,8 @@
 
     with self.m.step.nest('process javascript coverage'):
       try:
+        dir_metadata_path = self._generate_dir_metadata()
+
         coverage_dir = self.m.chromium.output_dir.join('devtools_code_coverage')
         args = [
             '--src-path',
@@ -551,6 +553,8 @@
             coverage_dir,
             '--coverage-dir',
             coverage_dir,
+            '--dir-metadata-path',
+            dir_metadata_path,
         ]
 
         self.m.python(
diff --git a/recipes/recipe_modules/code_coverage/resources/generate_coverage_metadata_for_javascript.py b/recipes/recipe_modules/code_coverage/resources/generate_coverage_metadata_for_javascript.py
index 14fb199..59f0ecd 100644
--- a/recipes/recipe_modules/code_coverage/resources/generate_coverage_metadata_for_javascript.py
+++ b/recipes/recipe_modules/code_coverage/resources/generate_coverage_metadata_for_javascript.py
@@ -58,15 +58,32 @@
       type=str,
       help='absolute path to the directory that contains merged JavaScript '
       'coverage data')
+  parser.add_argument(
+      '--dir-metadata-path',
+      type=str,
+      help='absolute path to json file mapping dirs to metadata')
   params = parser.parse_args(args=args)
 
+  if params.dir_metadata_path and not os.path.isfile(params.dir_metadata_path):
+    parser.error('Dir metadata %s is missing' % params.dir_metadata_path)
+
   return params
 
 
 def main():
   params = _parse_args(sys.argv[1:])
 
-  # TODO(benreich): Add monorail component mapping
+  component_mapping = None
+  if params.dir_metadata_path:
+    with open(params.dir_metadata_path) as f:
+      component_mapping = {
+          d: md['monorail']['component']
+          for d, md in json.load(f)['dirs'].iteritems()
+          if 'monorail' in md and 'component' in md['monorail']
+      }
+
+  assert component_mapping, (
+      'component_mapping (for full-repo coverage) must be specified')
 
   coverage_files = get_json_coverage_files(params.coverage_dir)
   if not coverage_files: