Merge "Remove dependency on gr-js-api from gr-diff-builder"
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 ca2c928..4a98ef3 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
@@ -138,6 +138,10 @@
            * @type {?Object}
            */
           _cancelableRenderPromise: Object,
+          pluginLayers: {
+            type: Array,
+            value: [],
+          },
         },
 
         behaviors: [
@@ -223,12 +227,7 @@
             this.$.coverageLayerLeft,
             this.$.coverageLayerRight,
           ];
-
-          // Get layers from plugins (if any).
-          for (const pluginLayer of this.$.jsAPI.getDiffLayers(
-              this.diffPath, this.changeNum, this.patchNum)) {
-            layers.push(pluginLayer);
-          }
+          layers.push(...this.pluginLayers);
 
           this._layers = layers;
         },
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html
index b917845..325ac05 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html
@@ -36,8 +36,8 @@
 <script>void(0);</script>
 
 <test-fixture id="basic">
-  <template>
-    <gr-diff-builder>
+  <template is="dom-template">
+    <gr-diff-builder plugin-layers="[[pluginLayers]]">
       <table id="diffTable"></table>
     </gr-diff-builder>
   </template>
@@ -593,28 +593,34 @@
     suite('layers from plugins', () => {
       let element;
       let initialLayersCount;
-
+      let withPluginLayerCount;
       setup(() => {
-        element = fixture('basic');
+        const pluginLayers = [];
+        element = fixture('basic', {pluginLayers});
         element._showTrailingWhitespace = true;
         element._setupAnnotationLayers();
         initialLayersCount = element._layers.length;
       });
 
       test('no plugin layers', () => {
-        const getDiffLayersStub = sinon.stub(element.$.jsAPI, 'getDiffLayers')
-                                       .returns([]);
         element._setupAnnotationLayers();
-        assert.isTrue(getDiffLayersStub.called);
         assert.equal(element._layers.length, initialLayersCount);
       });
 
-      test('with plugin layers', () => {
-        const getDiffLayersStub = sinon.stub(element.$.jsAPI, 'getDiffLayers')
-                                       .returns([{}, {}]);
-        element._setupAnnotationLayers();
-        assert.isTrue(getDiffLayersStub.called);
-        assert.equal(element._layers.length, initialLayersCount + 2);
+      suite('with plugin layers', () => {
+        const pluginLayers = [{}, {}];
+        setup(() => {
+          element = fixture('basic', {pluginLayers});
+          element._showTrailingWhitespace = true;
+          element._setupAnnotationLayers();
+          withPluginLayerCount = element._layers.length;
+        });
+        test('with plugin layers', () => {
+          element._setupAnnotationLayers();
+          assert.equal(element._layers.length, withPluginLayerCount);
+          assert.equal(initialLayersCount + pluginLayers.length,
+              withPluginLayerCount);
+        });
       });
     });
 
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.html b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.html
index f25d56e..13b2269 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.html
@@ -49,6 +49,7 @@
         revision-image=[[_revisionImage]]
         coverage-ranges="[[_coverageRanges]]"
         blame="[[_blame]]"
+        plugin-layers="[[pluginLayers]]"
         diff="[[_diff]]"></gr-diff>
     <gr-js-api-interface id="jsAPI"></gr-js-api-interface>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
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 bce3d07..79135a7 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
@@ -204,6 +204,11 @@
         type: Number,
         computed: '_computeParentIndex(patchRange.*)',
       },
+
+      pluginLayers: {
+        type: Array,
+        value: [],
+      },
     },
 
     behaviors: [
@@ -253,6 +258,14 @@
       this._errorMessage = null;
       const whitespaceLevel = this._getIgnoreWhitespace();
 
+      const pluginLayers = [];
+      // Get layers from plugins (if any).
+      for (const pluginLayer of this.$.jsAPI.getDiffLayers(
+          this.diffPath, this.changeNum, this.patchNum)) {
+        pluginLayers.push(pluginLayer);
+      }
+      this.push('pluginLayers', ...pluginLayers);
+
       this._coverageRanges = [];
       const {changeNum, path, patchRange: {basePatchNum, patchNum}} = this;
       this.$.jsAPI.getCoverageRanges(changeNum, path, basePatchNum, patchNum).
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.html b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.html
index 104c0c2..db3f4a3 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.html
@@ -51,7 +51,6 @@
         time: sandbox.stub(),
         timeEnd: sandbox.stub(),
       });
-
       element = fixture('basic');
     });
 
@@ -59,6 +58,22 @@
       sandbox.restore();
     });
 
+
+    suite('plugin layers', () => {
+      const pluginLayers = [{}, {}];
+      setup(() => {
+        stub('gr-js-api-interface', {
+          getDiffLayers() { return pluginLayers; },
+        });
+        element = fixture('basic');
+      });
+      test('plugin layers requested', () => {
+        element.patchRange = {};
+        element.reload();
+        assert(element.$.jsAPI.getDiffLayers.called);
+      });
+    });
+
     suite('handle comment-update', () => {
       setup(() => {
         sandbox.stub(element, '_commentsChanged');
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 bc8af9d..b30cc5c 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
@@ -378,6 +378,7 @@
               line-wrapping="[[lineWrapping]]"
               is-image-diff="[[isImageDiff]]"
               base-image="[[baseImage]]"
+              plugin-layers="[[pluginLayers]]"
               revision-image="[[revisionImage]]">
             <table
                 id="diffTable"
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
index 6787183..16c92b1 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
@@ -271,6 +271,7 @@
 
       /** Set by Polymer. */
       isAttached: Boolean,
+      pluginLayers: Array,
     },
 
     behaviors: [