Navigate benchmarks on perf using arrow left/right

Change-Id: I4b52b0765c6705cdf5c26387fea732b781c88844
diff --git a/tools/perf/chart.js b/tools/perf/chart.js
index 96c7f07..baaa33b 100644
--- a/tools/perf/chart.js
+++ b/tools/perf/chart.js
@@ -69,6 +69,9 @@
   } else {
     update(false, false);
   }
+  document.addEventListener('keydown', e => {
+    state.handleKeyDownEvent(e, () => update(true, false));
+  });
 }
 
 function setDataProvider(theDataProvider) {
diff --git a/tools/perf/state.js b/tools/perf/state.js
index 4d0128f..ed07b39 100644
--- a/tools/perf/state.js
+++ b/tools/perf/state.js
@@ -99,6 +99,34 @@
   }
 }
 
+function handleKeyDownEvent(e, callback) {
+  if (selectedBenchmarks.size != 1) {
+    return;
+  }
+  const [selectedBenchmark] = selectedBenchmarks;
+  var benchmarkToSelect = null;
+  var previousBenchmark = null;
+  for (const benchmark of benchmarks.values()) {
+    if (previousBenchmark != null) {
+      if (e.key == 'ArrowLeft' && benchmark == selectedBenchmark) {
+        benchmarkToSelect = previousBenchmark;
+        break;
+      } else if (e.key === 'ArrowRight' && previousBenchmark == selectedBenchmark) {
+        benchmarkToSelect = benchmark;
+        break;
+      }
+    }
+    previousBenchmark = benchmark;
+  }
+  if (benchmarkToSelect != null) {
+    selectedBenchmarks.clear();
+    selectedBenchmarks.add(benchmarkToSelect);
+    document.getElementById(selectedBenchmark).checked = false;
+    document.getElementById(benchmarkToSelect).checked = true;
+    callback();
+  }
+}
+
 function isLegendSelected(legend) {
   return selectedLegends.has(legend);
 }
@@ -111,6 +139,7 @@
   selectedLegends: selectedLegends,
   forEachBenchmark: forEachBenchmark,
   forEachSelectedBenchmark: forEachSelectedBenchmark,
+  handleKeyDownEvent: handleKeyDownEvent,
   hasLegend: hasLegend,
   initializeBenchmarks: initializeBenchmarks,
   initializeLegends: initializeLegends,