Fix loading _dynamicTabHeaderEndpoints in time under Polymer 2

We use an observer to make sure '_change' and '_selectedRevision'
are defined. This ensures that when we load the dynamic plugins, these
variables are defined. This also allows us to call _performPostLoadTasks
after the plugins are loaded to ensure the primary tab is selected.

Bug: Issue 11173
Change-Id: I0701f028f14bda23f0e017f0cbb1c82a58fab45e
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
index b61062a..66667ba 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
@@ -303,6 +303,7 @@
       '_labelsChanged(_change.labels.*)',
       '_paramsAndChangeChanged(params, _change)',
       '_patchNumChanged(_patchRange.patchNum)',
+      '_loadDynamicTabHeaderAndContent(_change, _selectedRevision)',
     ],
 
     keyboardShortcuts() {
@@ -337,17 +338,6 @@
         this._setDiffViewMode();
       });
 
-      Gerrit.awaitPluginsLoaded().then(() => {
-        this._dynamicTabHeaderEndpoints =
-            Gerrit._endpoints.getDynamicEndpoints('change-view-tab-header');
-        this._dynamicTabContentEndpoints =
-            Gerrit._endpoints.getDynamicEndpoints('change-view-tab-content');
-        if (this._dynamicTabContentEndpoints.length
-            !== this._dynamicTabHeaderEndpoints.length) {
-          console.warn('Different number of tab headers and tab content.');
-        }
-      });
-
       this.addEventListener('comment-save', this._handleCommentSave.bind(this));
       this.addEventListener('comment-refresh', this._reloadDrafts.bind(this));
       this.addEventListener('comment-discard',
@@ -770,6 +760,41 @@
       });
     },
 
+    /**
+     * We use an observer to observe 'change' and 'selectedRevision'
+     * variables. This fixes an issue under Polymer 2 so that the dynamic
+     * plugins loads when these variables load.
+     */
+    _loadDynamicTabHeaderAndContent(change, selectedRevision) {
+      // These vars are unused, but because primaryTabs extension point
+      // uses it, we makes sure we doin't load the plugin until these vars
+      // exist.
+      if (!change || !selectedRevision) return;
+
+      // We cache the _dynamicTabHeaderEndpoints and _dynamicTabContentEndpoints
+      // var so that we doin't keep loading the same dynamic plugin
+      // over and over when 'change' or 'selectedRevision' change.
+      if (this._dynamicTabHeaderEndpoints || this._dynamicTabContentEndpoints) {
+        return;
+      }
+
+      Gerrit.awaitPluginsLoaded().then(() => {
+        this._dynamicTabHeaderEndpoints =
+            Gerrit._endpoints.getDynamicEndpoints('change-view-tab-header');
+        this._dynamicTabContentEndpoints =
+            Gerrit._endpoints.getDynamicEndpoints('change-view-tab-content');
+        if (this._dynamicTabContentEndpoints.length
+            !== this._dynamicTabHeaderEndpoints.length) {
+          console.warn('Different number of tab headers and tab content.');
+        }
+      }).then(() => {
+        // We need a second then(..) to ensure that the dynamic endpoints
+        // are created before we call _performPostLoadTasks(). This ensures it has
+        // enough time before the primary tab gets selected.
+        this._performPostLoadTasks();
+      });
+    },
+
     _paramsAndChangeChanged(value) {
       // If the change number or patch range is different, then reset the
       // selected file index.