Merge "Add the description of the checker in CheckInfo."
diff --git a/gr-checks/gr-checks-chip-view.js b/gr-checks/gr-checks-chip-view.js
index e96cdd3..cd07acb 100644
--- a/gr-checks/gr-checks-chip-view.js
+++ b/gr-checks/gr-checks-chip-view.js
@@ -84,7 +84,16 @@
         type: Boolean,
         value: false
       },
-      pollChecksInterval: Object
+      pollChecksInterval: Object,
+      visibilityChangeListenerAdded: {
+        type: Boolean,
+        value: false
+      }
+    },
+
+    detached() {
+      clearInterval(this.pollChecksInterval);
+      this.unlisten(document, 'visibilitychange', '_onVisibililityChange');
     },
 
     observers: [
@@ -124,6 +133,14 @@
       });
     },
 
+    _onVisibililityChange() {
+      if (document.hidden) {
+        clearInterval(this.pollChecksInterval);
+        return;
+      }
+      this._pollChecksRegularly(this.change, this.revision, this.getChecks);
+    },
+
     _pollChecksRegularly(change, revision, getChecks) {
       if (this.pollChecksInterval) {
         clearInterval(this.pollChecksInterval);
@@ -131,6 +148,10 @@
       const poll = () => this._fetchChecks(change, revision, getChecks);
       poll();
       this.pollChecksInterval = setInterval(poll, CHECKS_POLL_INTERVAL_MS)
+      if (!this.visibilityChangeListenerAdded) {
+        this.visibilityChangeListenerAdded = true;
+        this.listen(document, 'visibilitychange', '_onVisibililityChange');
+      }
     },
 
     /**
diff --git a/gr-checks/gr-checks-view.js b/gr-checks/gr-checks-view.js
index 43643f0..f5d083f 100644
--- a/gr-checks/gr-checks-view.js
+++ b/gr-checks/gr-checks-view.js
@@ -53,13 +53,21 @@
         type: Object,
         value: LoadingStatus.LOADING,
       },
-      pollChecksInterval: Object
+      pollChecksInterval: Object,
+      visibilityChangeListenerAdded: {
+        type: Boolean,
+        value: false
+      }
     },
 
     observers: [
       '_pollChecksRegularly(change, revision, getChecks)',
     ],
 
+    detached() {
+      clearInterval(this.pollChecksInterval);
+      this.unlisten(document, 'visibilitychange', '_onVisibililityChange');
+    },
 
     _orderChecks(a, b) {
       if (a.state != b.state) {
@@ -95,6 +103,14 @@
       });
     },
 
+    _onVisibililityChange() {
+      if (document.hidden) {
+        clearInterval(this.pollChecksInterval);
+        return;
+      }
+      this._pollChecksRegularly(this.change, this.revision, this.getChecks);
+    },
+
     _pollChecksRegularly(change, revision, getChecks) {
       if (this.pollChecksInterval) {
         clearInterval(this.pollChecksInterval);
@@ -102,6 +118,10 @@
       const poll = () => this._fetchChecks(change, revision, getChecks);
       poll();
       this.pollChecksInterval = setInterval(poll, CHECKS_POLL_INTERVAL_MS)
+      if (!this.visibilityChangeListenerAdded) {
+        this.visibilityChangeListenerAdded = true;
+        this.listen(document, 'visibilitychange', '_onVisibililityChange');
+      }
     },
 
     _checkConfigured() {
diff --git a/java/com/google/gerrit/plugins/checks/acceptance/AbstractCheckersTest.java b/java/com/google/gerrit/plugins/checks/acceptance/AbstractCheckersTest.java
index e476537..51fcc41 100644
--- a/java/com/google/gerrit/plugins/checks/acceptance/AbstractCheckersTest.java
+++ b/java/com/google/gerrit/plugins/checks/acceptance/AbstractCheckersTest.java
@@ -38,7 +38,7 @@
     sysModule = "com.google.gerrit.plugins.checks.acceptance.TestModule",
     httpModule = "com.google.gerrit.plugins.checks.HttpModule")
 public class AbstractCheckersTest extends LightweightPluginDaemonTest {
-  @Inject protected ProjectOperations projectOperations;
+  @Inject private ProjectOperations projectOperations;
 
   protected CheckerOperations checkerOperations;
   protected CheckOperations checkOperations;
diff --git a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
index 7600dcb..984cd31 100644
--- a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
+++ b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
@@ -277,8 +277,9 @@
       }
 
       if (testCheckerInvalidation.nonParseableConfig()) {
-        try (Repository repo = repoManager.openRepository(allProjectsName)) {
-          new TestRepository<>(repo)
+        try (Repository repo = repoManager.openRepository(allProjectsName);
+            TestRepository<Repository> testRepo = new TestRepository<>(repo)) {
+          testRepo
               .branch(checkerUuid.toRefName())
               .commit()
               .add(CheckerConfig.CHECKER_CONFIG_FILE, "non-parseable-config")
@@ -287,9 +288,9 @@
       }
 
       if (testCheckerInvalidation.deleteRef()) {
-        try (Repository repo = repoManager.openRepository(allProjectsName)) {
-          RefUpdate ru =
-              new TestRepository<>(repo).getRepository().updateRef(checkerUuid.toRefName(), true);
+        try (Repository repo = repoManager.openRepository(allProjectsName);
+            TestRepository<Repository> testRepo = new TestRepository<>(repo)) {
+          RefUpdate ru = testRepo.getRepository().updateRef(checkerUuid.toRefName(), true);
           ru.setForceUpdate(true);
           ru.delete();
         }
diff --git a/java/com/google/gerrit/plugins/checks/db/CheckerConfig.java b/java/com/google/gerrit/plugins/checks/db/CheckerConfig.java
index 61bd436..3adb2dd 100644
--- a/java/com/google/gerrit/plugins/checks/db/CheckerConfig.java
+++ b/java/com/google/gerrit/plugins/checks/db/CheckerConfig.java
@@ -28,7 +28,6 @@
 import com.google.gerrit.plugins.checks.Checkers;
 import com.google.gerrit.plugins.checks.CheckersUpdate;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.NameKey;
 import com.google.gerrit.server.git.meta.MetaDataUpdate;
 import com.google.gerrit.server.git.meta.VersionedMetaData;
 import com.google.gerrit.server.util.time.TimeUtil;
@@ -152,7 +151,8 @@
    * @throws IOException if the repository can't be accessed for some reason
    * @throws ConfigInvalidException if the checker exists but can't be read due to an invalid format
    */
-  public static CheckerConfig loadForChecker(NameKey projectName, Repository repository, Ref ref)
+  public static CheckerConfig loadForChecker(
+      Project.NameKey projectName, Repository repository, Ref ref)
       throws IOException, ConfigInvalidException {
     CheckerConfig checkerConfig = new CheckerConfig(ref.getName());
     checkerConfig.load(projectName, repository);
diff --git a/java/com/google/gerrit/plugins/checks/db/NoteDbChecks.java b/java/com/google/gerrit/plugins/checks/db/NoteDbChecks.java
index 02847e8..0d97576 100644
--- a/java/com/google/gerrit/plugins/checks/db/NoteDbChecks.java
+++ b/java/com/google/gerrit/plugins/checks/db/NoteDbChecks.java
@@ -34,9 +34,7 @@
 import com.google.gerrit.plugins.checks.api.CombinedCheckState;
 import com.google.gerrit.plugins.checks.api.CombinedCheckState.CheckStateCount;
 import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSet.Id;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.NameKey;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
@@ -131,15 +129,15 @@
   }
 
   @Override
-  public CombinedCheckState getCombinedCheckState(NameKey projectName, Id patchSetId)
-      throws IOException, StorageException {
+  public CombinedCheckState getCombinedCheckState(
+      Project.NameKey projectName, PatchSet.Id patchSetId) throws IOException, StorageException {
     ImmutableListMultimap<CheckState, Boolean> statesAndRequired =
         getStatesAndRequiredMap(projectName, patchSetId);
     return CombinedCheckState.combine(statesAndRequired);
   }
 
   @Override
-  public boolean areAllRequiredCheckersPassing(NameKey projectName, Id patchSetId)
+  public boolean areAllRequiredCheckersPassing(Project.NameKey projectName, PatchSet.Id patchSetId)
       throws IOException, StorageException {
     ImmutableListMultimap<CheckState, Boolean> statesAndRequired =
         getStatesAndRequiredMap(projectName, patchSetId);
@@ -149,7 +147,7 @@
   }
 
   private ImmutableListMultimap<CheckState, Boolean> getStatesAndRequiredMap(
-      NameKey projectName, Id patchSetId) throws IOException, StorageException {
+      Project.NameKey projectName, PatchSet.Id patchSetId) throws IOException, StorageException {
     ChangeData changeData = changeDataFactory.create(projectName, patchSetId.changeId());
     ImmutableMap<String, Checker> allCheckersOfProject =
         checkers.checkersOf(projectName).stream()
diff --git a/java/com/google/gerrit/plugins/checks/testing/CheckerConfigSubject.java b/java/com/google/gerrit/plugins/checks/testing/CheckerConfigSubject.java
index e74f050..8e5bb2c 100644
--- a/java/com/google/gerrit/plugins/checks/testing/CheckerConfigSubject.java
+++ b/java/com/google/gerrit/plugins/checks/testing/CheckerConfigSubject.java
@@ -32,6 +32,7 @@
 import com.google.gerrit.plugins.checks.db.CheckerConfig;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.truth.OptionalSubject;
+import java.sql.Timestamp;
 import java.util.Optional;
 import org.eclipse.jgit.lib.Config;
 
@@ -87,7 +88,7 @@
     check("query()").about(optionals()).that(checker().getQuery()).isEmpty();
   }
 
-  public ComparableSubject hasCreatedThat() {
+  public ComparableSubject<Timestamp> hasCreatedThat() {
     return check("created()").that(checker().getCreated());
   }
 
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/CheckerRefsIT.java b/javatests/com/google/gerrit/plugins/checks/acceptance/CheckerRefsIT.java
index e87dd42..71d468d 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/CheckerRefsIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/CheckerRefsIT.java
@@ -24,6 +24,7 @@
 
 import com.google.gerrit.acceptance.PushOneCommit;
 import com.google.gerrit.acceptance.SkipProjectClone;
+import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
 import com.google.gerrit.common.data.Permission;
 import com.google.gerrit.extensions.client.ChangeStatus;
 import com.google.gerrit.extensions.common.ChangeInput;
@@ -51,6 +52,7 @@
 
 @SkipProjectClone
 public class CheckerRefsIT extends AbstractCheckersTest {
+  @Inject private ProjectOperations projectOperations;
   @Inject private Sequences seq;
   @Inject private ChangeInserter.Factory changeInserterFactory;
   @Inject private BatchUpdate.Factory updateFactory;
@@ -354,10 +356,11 @@
     try (Repository git = repoManager.openRepository(project);
         ObjectInserter oi = git.newObjectInserter();
         ObjectReader reader = oi.newReader();
-        RevWalk rw = new RevWalk(reader)) {
+        RevWalk rw = new RevWalk(reader);
+        TestRepository<Repository> testRepo = new TestRepository<>(git)) {
       RevCommit head = rw.parseCommit(git.exactRef(targetRef).getObjectId());
       RevCommit commit =
-          new TestRepository<>(git)
+          testRepo
               .commit()
               .author(admin.newIdent())
               .message("A change.")
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/api/QueryPendingChecksIT.java b/javatests/com/google/gerrit/plugins/checks/acceptance/api/QueryPendingChecksIT.java
index 5bfbee0..2727203 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/api/QueryPendingChecksIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/api/QueryPendingChecksIT.java
@@ -23,6 +23,7 @@
 
 import com.google.common.collect.Iterables;
 import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
 import com.google.gerrit.acceptance.testsuite.request.RequestScopeOperations;
 import com.google.gerrit.common.data.Permission;
 import com.google.gerrit.extensions.restapi.BadRequestException;
@@ -50,6 +51,7 @@
 import org.junit.Test;
 
 public class QueryPendingChecksIT extends AbstractCheckersTest {
+  @Inject private ProjectOperations projectOperations;
   @Inject private RequestScopeOperations requestScopeOperations;
 
   private PatchSet.Id patchSetId;
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImplTest.java b/javatests/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImplTest.java
index 403a3a7..f78fee2 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImplTest.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImplTest.java
@@ -682,8 +682,9 @@
     CheckerUuid checkerUuid1 = CheckerUuid.parse("test:my-checker1");
     CheckerUuid checkerUuid2 = CheckerUuid.parse("test:my-checker2");
 
-    try (Repository repo = repoManager.openRepository(allProjects)) {
-      new TestRepository<>(repo)
+    try (Repository repo = repoManager.openRepository(allProjects);
+        TestRepository<Repository> testRepo = new TestRepository<>(repo)) {
+      testRepo
           .branch(CheckerRef.REFS_META_CHECKERS)
           .commit()
           .add(
@@ -710,8 +711,9 @@
     CheckerUuid checkerUuid1 = CheckerUuid.parse("test:my-checker1");
     CheckerUuid checkerUuid2 = CheckerUuid.parse("test:my-checker2");
 
-    try (Repository repo = repoManager.openRepository(allProjects)) {
-      new TestRepository<>(repo)
+    try (Repository repo = repoManager.openRepository(allProjects);
+        TestRepository<Repository> testRepo = new TestRepository<>(repo)) {
+      testRepo
           .branch(CheckerRef.REFS_META_CHECKERS)
           .commit()
           .add(
diff --git a/resources/Documentation/rest-api-checks.md b/resources/Documentation/rest-api-checks.md
index 65ac15c..4bcd1a1 100644
--- a/resources/Documentation/rest-api-checks.md
+++ b/resources/Documentation/rest-api-checks.md
@@ -184,7 +184,7 @@
 
 | Field Name      |          | Description |
 | --------------- | -------- | ----------- |
-| `checker_uuid`  | optional | The name of the checker. Must be specified for checker creation. Optional only if updating a check and referencing the checker using the [UUID](./rest-api-checkers.md#checker-id) in the URL.
+| `checker_uuid`  | optional | The [UUID](#checker-id) of the checker. Must be specified for check creation. Optional only if updating a check and referencing the checker using the [UUID](./rest-api-checkers.md#checker-id) in the URL.
 | `state`         | optional | The state as string-serialized form of [CheckState](#check-state)
 | `message`       | optional | Short message explaining the check state.
 | `url`           | optional | A fully-qualified URL pointing to the result of the check on the checker's infrastructure.
diff --git a/resources/Documentation/rest-api-pending-checks.md b/resources/Documentation/rest-api-pending-checks.md
index c28c0a1..91771e3 100644
--- a/resources/Documentation/rest-api-pending-checks.md
+++ b/resources/Documentation/rest-api-pending-checks.md
@@ -44,7 +44,7 @@
 #### Request by checker
 
 ```
-  GET /plugins/@PLUGIN@/checks.pending/?query=checker=test:my-checker+(state:NOT_STARTED+OR+state:SCHEDULED) HTTP/1.0
+  GET /plugins/@PLUGIN@/checks.pending/?query=checker:test:my-checker+(state:NOT_STARTED+OR+state:SCHEDULED) HTTP/1.0
 ```
 
 As response a list of [PendingChecksInfo](#pending-checks-info)