Notify all coverage listeners when coverage data is available

Since coverage data can be provided asynchronously
and the diff rendering won't wait for it. So its neccessary
to notify all listeners once data coming back.

Change-Id: I19625d6c53ad15491c3ec6f508a4bc076334e015
(cherry picked from commit d512905e6c5dcc285e8272735ce0d45d9120b778)
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html
index 9446845..40fbe3c 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html
@@ -77,7 +77,6 @@
 
         properties: {
           diff: Object,
-          diffPath: String,
           changeNum: String,
           patchNum: String,
           viewMode: String,
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.js b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.js
index b1ceb7e..95f3d53 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.js
@@ -285,7 +285,7 @@
       const layers = [this.$.syntaxLayer];
       // Get layers from plugins (if any).
       for (const pluginLayer of this.$.jsAPI.getDiffLayers(
-          this.diffPath, this.changeNum, this.patchNum)) {
+          this.path, this.changeNum, this.patchNum)) {
         layers.push(pluginLayer);
       }
       this._layers = layers;
@@ -297,7 +297,9 @@
 
       this._coverageRanges = [];
       const {changeNum, path, patchRange: {basePatchNum, patchNum}} = this;
-      this.$.jsAPI.getCoverageRanges(changeNum, path, basePatchNum, patchNum).
+      this.$.jsAPI.getCoverageRanges(
+          changeNum, path, basePatchNum, patchNum
+      ).
           then(coverageRanges => {
             if (changeNum !== this.changeNum ||
                 path !== this.path ||
@@ -328,6 +330,8 @@
         return this._loadDiffAssets(diff);
       });
 
+      // Not waiting for getCoverageRanges intentionally as
+      // plugin loading should not block the content rendering
       return Promise.all([diffRequest, assetRequest])
           .then(results => {
             const diff = results[0];
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
index aa69248..1c36745 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
@@ -366,7 +366,7 @@
               coverage-ranges="[[coverageRanges]]"
               project-name="[[projectName]]"
               diff="[[diff]]"
-              diff-path="[[path]]"
+              path="[[path]]"
               change-num="[[changeNum]]"
               patch-num="[[patchRange.patchNum]]"
               view-mode="[[viewMode]]"
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js
index b0996d6..dacf7ce 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js
@@ -272,10 +272,26 @@
           // Only one coverage provider makes sense. If there are more, then we
           // simply ignore them.
           if (provider) {
-            return provider(changeNum, path, basePatchNum, patchNum);
+            return annotationApi;
           }
         }
-        return [];
+        return null;
+      }).then(annotationApi => {
+        if (!annotationApi) return [];
+        const provider = annotationApi.getCoverageProvider();
+        return provider(changeNum, path, basePatchNum, patchNum)
+            .then(ranges => {
+              ranges = ranges || [];
+              // Notify with the coverage data.
+              ranges.forEach(range => {
+                annotationApi.notify(
+                    path,
+                    range.code_range.start_line,
+                    range.code_range.end_line,
+                    range.side);
+              });
+              return ranges;
+            });
       });
     },